Как компоновщик узнает, какие архивы связать вместе? - PullRequest
3 голосов
/ 14 декабря 2011

Предположим, что я компилирую простую 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, если ей дан каталог объектных файлов, содержащих определения этих функций, как узнать, какие файлы необходимы для передачи в компоновщик, чтобы он не жаловался на неизвестные символы?

1 Ответ

3 голосов
/ 15 декабря 2011

мы могли бы получить последнюю строку из вывода, который генерирует двоичный файл ELF

То, что на самом деле не является действительной командой, которая генерирует двоичный файл ELF.collect в свою очередь вызывает ld и , что команда генерирует двоичный файл.

как компоновщик узнает, что эти файлы должны быть связаны

Это не так.GCC сообщил об этом (предоставив их в командной строке).

GCC имеет встроенный файл specs, представляющий собой небольшую программу для конкретного домена, которая сообщает GCC, какие аргументыон должен предоставить компоновщик.

Вы можете проверить встроенный specs с помощью gcc -dumpspecs.Вы увидите, что программа на самом деле довольно сложная, и что crtbegin.o используется только тогда, когда -static и -pie или -shared нет.-shared означает crtbeginS.o, а -static означает crtbeginT.o.

, если я не хочу использовать стандартную библиотеку C

Use *В этом случае флаг 1040 *.

с учетом каталога объектных файлов, которые содержат определения этих функций, как узнать, какие файлы необходимы для передачи компоновщику

Те, которые определяют функции, которые вы используете. Это может помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...