Связывание и загрузка библиотеки stati c - PullRequest
0 голосов
/ 07 августа 2020

Мой вопрос в том, как именно работает компоновщик.

  • Я связываю исполняемый файл с несколькими сторонними библиотеками c stati. Из этих библиотек stati c только некоторые из них используются исполняемым файлом. В приведенном выше случае связывает ли компоновщик только с библиотеками, на функции которых есть ссылки в исполняемом файле?
  • Если библиотека stati c имеет несколько объектных файлов и только один используется исполняемым файлом, ссылается ли он только на этот объектный файл? или его ссылки на всю библиотеку stati c, но загружает только тот объектный файл, который используется?

Ответы [ 2 ]

0 голосов
/ 07 августа 2020

... как именно работает компоновщик.

a) ... связывает ли компоновщик только с библиотеками, на функции которых есть ссылки в исполняемом файле?

b). .. Библиотека stati c имеет несколько объектных файлов, и только один используется исполняемым файлом, она связана только с этим объектным файлом?

Это зависит ... от Linux есть два вида библиотек ... ".so" и .a (архив).

пример:

 /usr/lib/x86_64-linux-gnu/libgmpxx.a
 /usr/lib/x86_64-linux-gnu/libgmpxx.so

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

Если вы укажете .so в части ссылки вашей команды сборки, и ваше приложение будет первым Чтобы использовать определенную библиотеку ".so", я считаю, что ваше приложение будет на короткое время приостановлено во время запуска, пока загружается ВСЕ библиотека ".so".

Если вы укажете .so в части ссылки вашей команды сборки, и ваше приложение не первым использует этот конкретный .so, тогда загрузчик добавит в ваше приложение сопоставление с уже загруженным - '. so' в системной памяти. (гораздо более быстрое соединение)

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

Я считаю, что ваша 'stati c библиотека' соответствует использованию библиотеки ".a" (архив).

a) да - компоновщик (иногда линковщик-загрузчик ) 'завершается', когда больше нет неразрешенных ссылок (на объекты или функции).

б) да - см. а)

0 голосов
/ 07 августа 2020

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

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