Kompilowanie kodu do pliku obiektowego musi być wykonywane niezależnie od pozycji, jeśli plik obiektowy ma być załadowany jako biblioteka współdzielona (.so
), ponieważ podstawowy adres wirtualny, do którego jest ładowany plik obiektu współdzielonego w różnych procesach, może być różne.Czy 32-bitowy kod x86 musi być specjalnie skompilowany z PIC dla współdzielonych plików biblioteki?
Teraz nie wystąpiły błędy podczas próby załadowania pliku .so
skompilowanego i połączonego bez opcji -fpic
GCC na 32-bitowych komputerach x86, podczas gdy nie powiedzie się na 64-bitowych komputerach x86.
Losowe stron internetowych znalazłem, że nie muszę -fpic
na 32bit ponieważ kod skompilowany bez -fpic
prac przez przypadek według 32bit X86 ABI również, gdy są wykorzystywane w sposób niezależny od pozycji. Ale nadal znajdowałem oprogramowanie, które dostarczane jest z oddzielnymi wersjami bibliotek w 32-bitowych wersjach: jedna dla PIC i jedna dla innych niż PIC. Na przykład kompilator intel jest dostarczany z libirc.a
i libirc_pic.a
, ten ostatni jest kompilowany w trybie niezależnym od pozycji (jeśli chcemy połączyć ten plik .a
w plik .so
).
Zastanawiam się, jaka jest dokładna różnica między używaniem -fpic
i nie używanie go dla kodu 32-bitowego i dlaczego niektóre pakiety, takie jak kompilator intel, nadal są dostarczane z oddzielnymi wersjami bibliotek?
Czy wypróbowałeś nie-fikcyjną kompilację kodu przy użyciu TLS? Lub załadować kilka bibliotek non-pic z nakładającymi się zakresami pamięci? Oddzielne statyczne biblioteki są statycznie łączone z programami (libirc.a, nie pic jest nieco szybszy) i statycznie do bibliotek .so (wersja _pic.a). – osgx
Zobacz http://stackoverflow.com/questions/3146744/difference-in-position-independent-code-x86-vs-x86-64 – AProgrammer