В чем разница между связыванием GCC и LD?

недавно я создавал загружаемый модуль и обнаружил, что оба

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

и

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

смогите достигнуть такого же влияния.

Я также обнаружил, что фу.Итак.1 больше, чем foo.Итак.2 примерно на 3 КБ, и

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

показал, что GCC добавил вещества, отличные от foo.c в foo.Итак.1 (e.g, crtendS.o и crtn.о):

/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

так как оба foo.Итак.1 и фу.Итак.2 можно загрузить через dlopen, я был интересно:

  1. в чем разница между этими 2 методами связывания?
  2. сделать crtendS.o и crtn.o имеет значение для функций в созданных библиотеках?

1 ответов


принципиальной разницы нет. Когда вы "ссылаетесь на gcc", он фактически вызывает ld. Если вы получите сообщение на этапе связывания, когда "связывание по gcc", вы сразу увидите, что это на самом деле из ld. Если вы хотите передать некоторые параметры командной строки LD в ld, интерфейс командной строки gcc имеет функции, предназначенные специально для этой цели (-Xlinker и -Wl параметры).

Что касается файлов дополнительных объектов... вероятно, они содержат глобальную библиотеку времени загрузки код инициализации / деинициализации неявно добавляется компилятором. (Запрошено стандартной библиотекой?) Вы можете найти некоторую информацию об этом здесь: https://gcc.gnu.org/onlinedocs/gccint/Initialization.html