Предположим, что я компилирую простую Hello World программу с GCC
.
При запуске с gcc -v hello-world.c
мы можем получить последнюю строку из вывода, который генерирует двоичный файл ELF:
/usr/libexec/gcc/x86_64-pc-linux-gnu/4.5.3/collect2 --eh-frame-hdr -m
elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2
/usr/lib/gcc/x86_64-pc-linux-gnu/4.5.3/../../../../lib64/crt1.o
/usr/lib/gcc/x86_64-pc-linux-gnu/4.5.3/../../../../lib64/crti.o
/usr/lib/gcc/x86_64-pc-linux-gnu/4.5.3/crtbegin.o
-L/usr/lib/gcc/x86_64-pc-linux-gnu/4.5.3 -L/usr/lib/gcc/x86_64-pc-linux-gnu/4.5.3/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/lib/gcc/x86_64-pc-linux-gnu/4.5.3/../../../../x86_64-pc-linux-gnu/lib
-L/usr/lib/gcc/x86_64-pc-linux-gnu/4.5.3/../../.. /tmp/ccRykv97.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/x86_64-pc-linux-gnu/4.5.3/crtend.o /usr/lib/gcc/x86_64-pc-linux-gnu/4.5.3/../../../../lib64/crtn.o
Из этого вывода мы можем видеть, что некоторые объекты, такие как crtbegin.o
и crtend.o
, связаны друг с другом. Но как компоновщик узнает, что эти файлы должны быть связаны с вместе?
Отдельный, но похожий вопрос заключается в том, что, если я не хочу использовать стандартную библиотеку C, если ей дан каталог объектных файлов, содержащих определения этих функций, как узнать, какие файлы необходимы для передачи в компоновщик, чтобы он не жаловался на неизвестные символы?