Нужно ли специально компилировать 32-битный код x86 для файлов разделяемых библиотек?

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

13
задан Johannes Schaub - litb 5 August 2011 в 19:50
поделиться