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