Компиляция кода в объектный файл должна выполняться не зависящим от положения, если объектный файл предназначен для загрузки в качестве общей библиотеки (.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, по-прежнему поставляются с отдельными версиями библиотек?