Компиляция кода в объектный файл должна выполняться не зависящим от положения, если объектный файл предназначен для загрузки в качестве общей библиотеки (.so
), поскольку базовый виртуальный адрес, в который загружен файл общих объектов в разные процессы, может быть разным,
Теперь я не сталкивался с ошибками, когда пытался загрузить файл .so
скомпилированный и связанный без -fpic
GCC на 32-разрядных компьютерах x86, в то время как он не работает на 64-битных компьютерах x86.
Случайные сайты, которые я нашел, говорят, что мне не нужно -fpic
на 32-битной основе, потому что код, скомпилированный без -fpic
работает по совпадению в соответствии с 32-разрядным ABI X86 также при использовании в независимом от позиции образом. Но я все еще нашел программное обеспечение, которое поставляется с отдельными версиями библиотек в их 32-битных версиях: один для ПОС и один для не-ПОС. Например, компилятор Intel поставляется с libirc.a
и libirc_pic.a
, последний компилируется для независимого от позиции режима (если вы хотите связать этот файл .a
файлом .so
).
Интересно, какая точная разница между использованием -fpic
и не использованием его для 32-битного кода и почему некоторые пакеты, такие как компилятор Intel, по-прежнему поставляются с отдельными версиями библиотек?