2009-07-22 38 views
10

Łączę plik Makefile dla projektu, nad którym pracuję. W projekcie mam plik wykonywalny i bibliotekę współdzieloną. Oba używają niektórych z tych samych plików źródłowych, które są kompilowane oddzielnie do plików obiektów. Aby móc korzystać z tych obiektów w udostępnianej bibliotece, muszę użyć flagi -fPIC (kod niezależny od pozycji) w gcc. Czy są jakieś implikacje kompilowania obiektów za pomocą -fPIC, które zostaną użyte w pliku wykonywalnym?Co, jeśli w ogóle, są konsekwencje kompilowania obiektów z flagą gcc -fPIC, jeśli zostaną użyte w plikach wykonywalnych?

+0

Wygląda na to, że GCC7 wymaga teraz wszystkiego skompilowanego z opcją -fPIC. Przynajmniej dostałem n błąd i znalazłem to pytanie w poszukiwaniu dlaczego dostaję błąd? – Lothar

+0

@Lothar Nie, ogólnie nie jest potrzebny. Czy miksujesz obiekty skompilowane zi bez '-fPIC'? – ephemient

Odpowiedz

9

Kompilowanie niezależnego od pozycji kodu, gdy nie jest to konieczne, to przeciąganie wydajnościowe na niektórych platformach (przede wszystkim w architekturze x86 z brakiem rejestracji, ponieważ PIC usuwa rejestr, który może być swobodniej używany, gdy nie jest PIC), ale tam nie powinno być żadnych szkodliwych skutków.

Idąc dalej, możliwe jest nawet utworzenie niezależnego od pozycji pliku wykonywalnego (-fPIE) zbudowanego z kodu niezależnego od pozycji.

Zgodnie z powyższym, libtool może automatycznie generować zarówno obiekty PIC, jak i inne niż PIC dla każdego kompilowanego pliku źródłowego, i powinno być łatwo zrobić to samo nawet w systemie kompilacji bez integracji z libtool.

+0

Żaden PIC nie zabiera rejestru na x86. Ten procesor nie ma pośredniego kodu pozycji, dlatego zawsze dodaje do danych/funkcji kierunek pośredni. Możesz całkowicie zapomnieć o -fPIC na x86, ponieważ jeśli go nie określisz, otrzymasz szybki kod, a linker duplikuje segment kodu dla każdego pliku wykonywalnego. – Lothar

+0

@Lothar On x86-32, w zależności od kompilatora, PIC zabiera rejestr. GCC przed 5.0 rezerwuje '% ebx', co czyni go niedostępnym do ogólnego użytku. https://gccnunu.org/bugzilla/show_bug.cgi?id=54232 – ephemient