Включает ли gcc ld только текст .text соответствующих функций, используемых внутри исполняемого файла? - PullRequest
1 голос
/ 19 сентября 2011

Я скомпилировал множество исходных кодов .c в соответствующие им объектные файлы .o и заархивировал их как архивный файл .a. Скажем, в функции main () я использую функцию foo (). После компиляции и компоновки, включает ли исполняемый файл 1) только .text функции foo (), а также все другие функции, рекурсивно вызываемые функцией foo (), или 2) включает ли он весь .o, где находится foo () или 3) .text во всем .a файле?

Желательно перейти к варианту 1), поскольку он будет включать только минимальное количество инструкций в условиях ограниченного пространства. Как мне добиться этого?

1 Ответ

1 голос
/ 19 сентября 2011

Обычно загрузчик включает весь материал во все объектные файлы (.o файлы в Unix / Linux), перечисленные в строке ссылки. Если он обрабатывает какие-либо статические библиотеки (.a файлы в Unix / Linux), то объектные файлы, необходимые из библиотеки, включаются в toto (но любые объектные файлы, которые не определяют символ, необходимый программе, остаются вне исполняемый файл). Если он обрабатывает какие-либо совместно используемые библиотеки (обычно .so файлы в Unix / Linux), то он не загружает какой-либо материал в двоичный файл, но он ведет учет всех символов, предоставленных совместно используемой библиотекой, так что он не пытается удовлетворить ни один из этих символов из более поздних файлов или библиотек.

Загрузчик обрабатывает список аргументов в порядке слева направо. Это означает, что вы должны перечислить статические библиотеки после объектных файлов. Не так важно перечислять общие библиотеки после объектных файлов, хотя все равно лучше это делать в любом случае, на случай, если программа когда-либо будет связана со статическими библиотеками, а не с общими библиотеками.

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

Я думаю, что это разумное резюме, написанное на высокой скорости и не слишком затерянное в деталях. Есть много «если» и «но», которые могут быть добавлены к обсуждению; целые книги были написаны на предмет того, как исполняемые файлы создаются из объектных файлов и библиотек.

...