2015-12-24 5 views
4

Я пытаюсь понять, как выглядит ELF для статически и динамически связанной программы.Static vs Dynamic Linking

Я понимаю, что это как статическое связывание работает: enter image description here

В моем случае, у меня есть два файла, foo.c и bar.c. У меня также есть их объектные файлы; foo.o и bar.o. С командой objdump я могу видеть перемещение в каждом файле.

Как сделать статически ссылки foo.o и bar.o?

Как сделать динамично ссылка foo.o и bar.o?

Как я могу видеть разницу в выходных файлах?

ответ

3

Связывание динамически является режимом по умолчанию для большинства компоновщиков в наши дни. Если вы хотите связать статически, вы должны использовать флаг -static при соединении. Чтобы пояснить, когда я говорю «динамически связывать» и «связывать статически», я имею в виду связь с внешними библиотеками, а не создание библиотеки, которая, в свою очередь, может быть связана (динамически или статически).

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

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

+5

Ваш ответ немного вводит в заблуждение. Объектные файлы в командной строке компоновщика всегда связаны статически друг с другом, флаг '-static' относится только к библиотечным операндам. Было бы здорово, если бы вы могли поставить это в контексте вопроса (как связать 'foo.o' и' bar.o' ...). – fuz

+0

В частности, ни 'main.o', ни' swap.o' не создадут динамически загруженные общие объекты. –

+0

@FUZxxl Можете ли вы дать команду для связывания исходных файлов статически и динамически? В чем разница между связыванием исходных файлов и библиотек? –