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ę:
- Jaka jest różnica betwe en te 2 metody łączenia?
- Czy crtendS.o i crtn.o mają znaczenie dla funkcji w tworzonych bibliotekach?
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 . –