Значение перемещения не помещается в 24 бит - PullRequest
4 голосов
/ 11 сентября 2011

Я попытался загрузить файл кода в память с помощью функции loadModule vxWorks, и он выдал ошибку:

Relocation value does not fit in 24 bits

Я попытался добавить флаг -mlongcall в свой компилятор, но это не такработа.

Ответы [ 2 ]

3 голосов
/ 16 августа 2013

Убедитесь, что ваш компилятор установлен в GNU для вашей Active Build Spec , если вы хотите использовать -mlongcall . Помните, что WindRiver также предоставляет компилятор Diab, который является их проприетарным компилятором. Если вы хотите использовать компилятор Diab, эквивалентный флаг для этого компилятора:

-Xcode-абсолют-далеко

Если вы используете Workbench, вы можете увидеть, какой компилятор вы используете (и, возможно, изменить его, если хотите), щелкнув правой кнопкой мыши по проекту в подокне Project Explorer, затем выберите

Свойства -> Свойства сборки -> Поддержка сборки и спецификации .

В этом диалоговом окне вы увидите (обычно внизу) кнопку выпадающего меню с именем Active Build Spec . Выберите желаемую комбинацию архитектуры и компилятора.

Если вы не нашли нужную комбинацию архитектура-компилятор, вы, скорее всего, не выбрали ее при создании проекта ИЛИ она не пришла с приобретенным вами пакетом VxWorks.

3 голосов
/ 21 декабря 2011

Я видел эту ошибку до работы в архитектуре PowerPC. Предполагая, что вы работаете в аналогичной среде, проблема связана именно с объемом памяти в системе и диапазоном инструкций относительного перехода.

Аргоннская национальная лаборатория имеет веб-страницу , в которой подробно рассказывается об этой проблеме . Следующая выдержка объясняет проблему с относительной адресацией ветви:

Команда относительного перехода PowerPC ограничена переходами между +/- 32 МБ текущей инструкции (24 бита = +/- 4 М инструкции, 4 байта на инструкцию = +/- 32 МБ). К сожалению, ядро ​​vxWorks помещается в нижнюю часть ОЗУ, но загружает весь код приложения на верхнем конце. Если два разделены более чем 32 МБ (если вы 64 МБ или более на борту), когда он пытается загрузить приложение закодировать те вызовы, которые используют эти относительные инструкции ветвления для Процедуры vxWorks не могут быть разрешены в течение 24 бит, и загрузчик печатает сообщение, которое вы видите.

Предлагаемое решение этой проблемы, как в Аргоннской национальной лаборатории, состоит в перекомпиляции загруженных модулей с включенным флагом -mlongcall.

Ваш первоначальный вопрос показал, что этот флаг не является решением вашей проблемы. Флаг gnu установлен, но никакой дополнительной информации для вашего компилятора не указано. Учитывая, что я могу только предложить вам проверить документацию вашего компилятора и убедиться, что флаг -mlongcall действителен.

Предполагая, что флаг поддерживается, это может быть вызвано связанной библиотекой, которая сама не была скомпилирована с флагом -mlongcall. Статья в ComplexIT подробно описывает аналогичную проблему, также в архитектуре PowerPC, с использованием QT. Чтобы решить эту проблему, необходимо перестроить все библиотеки, включая QT.

...