R_PPC_REL24 перемещение вне допустимого диапазона

Я работаю над встроенной платформой powerpc (e500v2). Я выполняю кросс-компиляцию с помощью gcc 4.6.3 и eglibc 2.13. Существует библиотека swig, которая скомпилирована и загружена на цель. Когда он загружается в python, я получаю эту ошибку в трассировке:

ImportError: /opt/load/lib/libISSDcn.so: R_PPC_REL24 relocation at 0x0ddc99c0 for symbol `longjmp' out of range

Раньше у меня были проблемы с этой библиотекой, я перехожу с Python 2.5 на нашу цель на 2.7. Когда я первоначально пытался скомпилировать эту библиотеку, я получал либо ошибки перемещения, либо ошибки операнда вне диапазона во время компиляции в зависимости от того, какие флаги я использовал. Я переключился на gcc 4.6.3, и теперь он собирается, но при загрузке я получаю эту ошибку.

Я пытаюсь понять ошибку, но пока не знаю, что именно она означает и как ее исправить. Я понимаю, что символ не может быть найден по какой-то причине, но я не понимаю, почему и как это исправить.


person Eric Seifert    schedule 12.10.2012    source источник


Ответы (1)


Перемещение R_PPC_REL24 используется для 24-битных относительных смещений. Релокации этого типа не должны появляться в таблицах динамических релокаций (они предназначены для ссылок внутри загружаемого объекта, а не между ними, так как библиотеки могут загружаться по адресам, отстоящим друг от друга более чем на 16 МБ).

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

Убедитесь, что для построения библиотеки использовался флаг -fPIC и что компоновщик также был уведомлен о создании общего объекта (обычно через -shared или -Bshared).

person Simon Richter    schedule 12.10.2012
comment
Хорошо, спасибо, я видел, что это предлагалось в другом месте. Мне сказали, что эта библиотека была скомпилирована с помощью fPIC, но вполне возможно, что это не так. Можно ли как-то сказать постфактум, является ли библиотека PIC или нет? - person Eric Seifert; 12.10.2012
comment
Или другой вопрос, который я могу задать: если я выполню readelf -r, должен ли я ожидать увидеть R_PPC_REL24 в общем объекте? Я вижу их много. Или этот список включает не внешние символы? - person Eric Seifert; 12.10.2012
comment
В библиотеке PIC не должны применяться динамические перемещения ни к чему, кроме областей PIC и GOT, и все эти перемещения должны охватывать все адресное пространство. - person Simon Richter; 15.10.2012
comment
readelf без опции -D показывает информацию для статического связывания -- после финального прохода ссылки эти перемещения уже были применены, за исключением тех, которые указывают на отсутствующие символы (которые были преобразованы в динамические перемещения). - person Simon Richter; 15.10.2012
comment
Хорошо, это было сложно отследить, потому что в моем проекте много кода и сторонних модулей, но был код, скомпилированный без -fPIC. Теперь все работает, спасибо! Для всех, кто столкнется с этим, просто запустите 'readelf -D -r | grep R_PPC_REL24». Если он находит какие-либо релоки R_PPC_REL24, некоторые объекты компилируются без -fPIC. - person Eric Seifert; 16.10.2012