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