Na komputerach docelowych gcc, gdy ktoś chciał skompilować bibliotekę współużytkowaną, musiałby podać -fpic lub -fPIC, aby poprawić działanie. Wynika to z faktu, że domyślnie używane było adresowanie bezwzględne, które nadaje się do plików wykonywalnych, które mają pełną kontrolę nad własną przestrzenią adresową, ale nie dzielą się bibliotekami, które mogłyby być ładowane w dowolnym miejscu w przestrzeni adresowej pliku wykonywalnego.Czy nadal trzeba używać -fPIC podczas kompilacji z GCC?
Jednak współczesne jądra wdrażają teraz randomizację przestrzeni adresowej, a wiele nowoczesnych architektur obsługuje adresowanie względne komputera. Wszystko to sprawia, że adresowanie bezwzględne nie nadaje się do użytku (randomizacja przestrzeni adresowej) lub niepotrzebne (adresowanie względne komputera osobistego).
Zauważyłem również, że klang nie ma opcji -fPIC, co czyni mnie rzeczą, która nie jest już potrzebna.
Czy więc -fpic jest teraz zbędny, czy trzeba wygenerować osobne pliki .o, jeden do korzystania z biblioteki statycznej i jeden do korzystania z biblioteki współdzielonej?
Kod PIC jest w większości przypadków wolniejszy, ponieważ dodatkowe przeskakiwanie przez PLT wymaga dodatkowego ograniczenia w przypadku wielu wywołań funkcji. Dobrym pomysłem jest budowanie bibliotek statycznych bez PIC. – Art
@Art: Może być wolniejszy, ale nie za dużo. I nie zgadzam się, że warto budować statyczne biblioteki bez. Biblioteki statyczne są nie tylko połączone z plikami wykonywalnymi, ale także z bibliotekami współdzielonymi. I, jak wspomniano, pliki wykonywalne ASLR muszą być niezależne od pozycji. Najbezpieczniej jest więc zawsze podawać '-fPIC'. –
@Art Problem na Intel nie jest wywołaniem funkcji lub skoków (które i tak są związane z PC), ale dostęp do danych globalnych. (W przypadku innych procesorów problemy będą się różnić.) –