Как общие объектные файлы могут быть связаны с другими общими или обычными объектами для создания новых объектных файлов? - PullRequest
2 голосов
/ 29 февраля 2020

Я читаю спецификацию ELF здесь: https://refspecs.linuxbase.org/elf/elf.pdf

На странице 15:

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

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

Либо я неправильно понимаю, что это говорит (возможно), либо нет единого мнения о том, что можно сделать с общими объектами.

Что означает этот абзац?

1 Ответ

1 голос
/ 02 марта 2020

Либо я неправильно понимаю, что это говорит (вероятно)

Что, по-видимому, пытается сказать абзац: существует два контекста, в которых может использоваться общая библиотека:

  1. С помощью компоновщика stati c (он же редактор ссылок), чтобы создать новую общую библиотеку или исполняемый файл из перемещаемых объектов (т. Е. Создать новый ET_DYN или ET_EXEC из ET_REL s) и
  2. с помощью динамического компоновщика c для создания образа процесса.

Обратите внимание, что новая общая библиотека, созданная в случае 1, выполняет не включать в него существующую общую библиотеку. Существующая библиотека нужна только для того, чтобы компоновщик stati c знал, как новая разделяемая библиотека (или исполняемый файл) должна ссылаться на символы из существующей библиотеки.

Большинство вопросов, которые я видел (и, вероятно, те, которые я видел) Вы имеете в виду) «Как я могу поместить существующий libfoo.so в новый libbar.so?», и это на самом деле невозможно.

Обновление:

Я все еще не уверен, что понимаю. Является ли # 1 первоначальным созданием общей библиотеки?

Да: создание новой общей библиотеки или исполняемого файла.

Поскольку исполняемый файл также имеет два контекста: 1) Статический компоновщик c, создающий исполняемый файл из перемещаемых объектов и 2) Использование загрузчика для создания образа процесса.

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

Я мог бы сказать то же самое и для перемещаемых объектов

Не совсем: перемещаемые объекты делают обычно не участвуют в построении образа процесса (есть исключения, но они действительно особенные и странные), и они, безусловно, не обрабатываются динамическим c компоновщиком (загрузчиком).

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

...