2014-10-02 13 views
7

Niedawno było stworzenie modułu obciążana i jest zarównoJaka jest różnica między łączeniem za pomocą GCC i LD?

gcc -fPIC --shared -o foo.so.1 foo.c 

i

gcc -fPIC --shared -c foo.c 
ld --shared -o foo.so.2 foo.o 

można osiągnąć ten sam efekt.

również odkrył, że foo.so.1 jest większa niż foo.so.2 o około 3 KB i

gcc -### -fPIC --shared -o foo.so.1 foo.c 

wykazały, że GCC dodano spożywczych innych niż foo.c do foo.so.1 (np crtendS.o i crtn.o):

/usr/lib/gcc/x86_64-linux-gnu/4.7/collect2 "--sysroot=/" --build-id --no-add-needed --eh-frame-hdr -m elf_x86_64 "--hash-style=both" -shared -o foo.so.1 /usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/4.7/crtbeginS.o -L/usr/lib/gcc/x86_64-linux-gnu/4.7 -L/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/4.7/../../.. /tmp/cc3JBdCJ.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/x86_64-linux-gnu/4.7/crtendS.o /usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/crtn.o 

Ponieważ zarówno foo.so.1 i foo.so.2 mogą być ładowane poprzez dlopen, zastanawiałem się:

  1. Jaka jest różnica betwe en te 2 metody łączenia?
  2. Czy crtendS.o i crtn.o mają znaczenie dla funkcji w tworzonych bibliotekach?

Odpowiedz

6

Nie ma różnicy w zasadzie. Kiedy "łączymy się przez gcc", to faktycznie wywołuje ld. Jeśli otrzymasz wiadomość na etapie łączenia, gdy "łączenie przez gcc" natychmiast zobaczysz, że faktycznie jest od ld. Jeśli chcesz przekazać pewne opcje wiersza polecenia specyficzne dla ld, to w interfejsie wiersza polecenia gcc znajdują się funkcje przeznaczone specjalnie do tego celu (opcje -Xlinker i -Wl).

Co do dodatkowych plików obiektów ... prawdopodobnie zawierają one globalny skrypt inicjalizacji/deinicjalizacji biblioteki load-time domyślnie dodany przez kompilator. (Wymagane przez standardową bibliotekę?) Możesz znaleźć tutaj informacje na ten temat: https://gcc.gnu.org/onlinedocs/gccint/Initialization.html

+0

Jeśli wynik "gcc linking" różni się od bezpośredniego wywołania ld, to gcc musi to osiągnąć, przekazując dodatkowe argumenty (opcje, biblioteki) do ld . –

Powiązane problemy