Значение перемещения не умещается в 24 бита

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

Relocation value does not fit in 24 bits

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


person kfir    schedule 11.09.2011    source источник
comment
Вам нужно указать архитектуру процессора, точный вызов loadModule() (включая определения любых переменных параметров) и некоторое представление о содержимом модуля.   -  person Amardeep AC9MF    schedule 11.09.2011


Ответы (3)


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

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

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

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

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

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

person Greg    schedule 21.12.2011

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

-Xcode-absolute-far

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

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

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

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

person DJ Serralta    schedule 16.08.2013

Флаг -mlongcall для компилятора GNU C. Windriver Diab не поддерживает это, включение _Xcode-absolute-far не решило проблему в моем случае, вместо этого привязка библиотек к образу VxWorks, похоже, решает проблему.

person Ravi Kumar    schedule 08.07.2020