Я недавно получил:
... перемещение R_X86_64_32 против `локального символа 'нельзя использовать при создании общего объекта; перекомпилировать с -fPIC
ошибка при попытке скомпилировать программу как общую библиотеку.
Теперь решение этого не слишком сложно (перекомпилируйте все зависимости с -fPIC), но после некоторых исследований выясняется, что эта проблема присутствует только на платформах x86-64. На 32-битном языке любой позиционно-зависимый код все еще может быть перемещен динамическим загрузчиком.
Лучший ответ Я мог бы найти:
x86 имеет поддержку для перемещения .text (что происходит, когда у вас есть
позиционно-зависимый код). Эта поддержка платная, а именно:
страница, содержащая такое перемещение, становится практически не общей, даже если она
сидит в общей библиотеке, тем самым портя саму концепцию общего
ЛИЭС. Поэтому мы решили запретить это на amd64 (плюс он создает
проблемы, если значение требует более 32 бит, потому что все .text перемещает только
иметь размер 'word32')
Но я не считаю это вполне адекватным. Если в этом случае перемещение портит концепцию разделяемых библиотек, почему это можно сделать на 32-битных платформах? Кроме того, если были внесены изменения в формат ELF для поддержки 64-битного формата, то почему не все поля были увеличены в размере для размещения?
Это может быть второстепенным моментом, но оно мотивируется тем фактом, что а) рассматриваемый код является научным кодом, и было бы неплохо не испытывать снижения производительности и б) эту информацию было невозможно найди на первом месте!
[Редактировать: «Ответ»
@ awoodlands ответ , вероятно, лучший «буквальный ответ», @servn добавил некоторую полезную информацию.
В поиске, чтобы найти больше о различных типах перемещений, я нашел это и, в конечном итоге, x86_64 ABI Reference (см. Стр. 68)
]