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