Я попытался загрузить файл кода в память с помощью функции loadModule vxWorks, и это дало мне ошибку:
Relocation value does not fit in 24 bits
Я попытался добавить флаг -mlongcall
в свой компилятор, но он не работает.
Я попытался загрузить файл кода в память с помощью функции loadModule vxWorks, и это дало мне ошибку:
Relocation value does not fit in 24 bits
Я попытался добавить флаг -mlongcall
в свой компилятор, но он не работает.
Я видел эту ошибку до работы с архитектурой PowerPC. Предполагая, что вы работаете в аналогичной среде, проблема связана именно с объемом памяти в системе и диапазоном инструкции относительного перехода.
У Аргоннской национальной лаборатории есть веб-страница , на которой подробно описан их опыт работы с такая же проблема. Следующий отрывок объясняет проблему с относительной адресацией ветвей:
Инструкция относительного перехода PowerPC ограничена переходами между +/- 32 МБ текущей инструкции (24 бита = +/- 4 МБ инструкций, 4 байта на инструкцию = +/- 32 МБ). К сожалению, ядро vxWorks помещается в нижнюю часть оперативной памяти, но загружает весь код приложения в верхнюю часть. Если они разделены более чем 32 МБ (если у вас на борту 64 МБ или более), то при попытке загрузить код приложения те вызовы, которые используют эти инструкции относительного перехода к подпрограммам vxWorks, не могут быть разрешены в течение 24 бит, и загрузчик печатает сообщение, которое вы видите.
Предлагаемое решение этой проблемы, как в Аргоннских национальных лабораториях, так это перекомпилировать ваши загруженные модули с включенным флагом -mlongcall
.
Ваш первоначальный вопрос указывал на то, что этот флаг не является решением вашей проблемы. Флаг gnu
установлен, но никакой дополнительной информации для вашего компилятора нет. Учитывая, что я могу только предложить вам проверить документацию вашего компилятора и убедиться, что флаг -mlongcall
действителен.
Предполагая, что флаг поддерживается, это может быть вызвано связанной библиотекой, которая сама не была скомпилирована с флагом -mlongcall
. Статья по адресу ComplexIT описывает похожую проблему, также в архитектуре PowerPC, с использованием QT. Для решения этой проблемы потребовалась пересборка всех библиотек, включая QT.
Убедитесь, что ваш компилятор настроен на GNU для вашей Active Build Spec, если вы хотите использовать -mlongcall. Помните, что WindRiver также предоставляет компилятор Diab, который является их проприетарным компилятором. Если вы хотите использовать компилятор Diab, эквивалентный флаг для этого компилятора:
-Xcode-absolute-far
Если вы используете Workbench, вы можете увидеть, какой компилятор вы используете (и, возможно, изменить его, если хотите), щелкнув правой кнопкой мыши свой проект в подокне Project Explorer, а затем выберите
Свойства->Свойства сборки->Поддержка и спецификации сборки.
В этом диалоговом окне вы увидите (обычно внизу) кнопку раскрывающегося меню с названием Активная спецификация сборки. Выберите желаемую комбинацию архитектуры и компилятора.
Если вы не нашли нужную комбинацию архитектуры и компилятора, скорее всего, вы не выбрали ее при создании проекта ИЛИ она не поставлялась с приобретенным пакетом VxWorks.
Флаг -mlongcall для компилятора GNU C. Windriver Diab не поддерживает это, включение _Xcode-absolute-far не решило проблему в моем случае, вместо этого привязка библиотек к образу VxWorks, похоже, решает проблему.