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