Лучшее объяснение, которое я смог найти, было из официального документа:
-r --relocateable Сгенерировать перемещаемый вывод - т.е. сгенерировать выходной файл, который в свою очередь может служить входом для ld. Это часто называют частичное связывание. В качестве побочного эффекта в средах, которые поддерживают стандартные магические числа Unix, этот параметр также устанавливает выходной файл магическое число для OMAGIC. Если эта опция не указана, абсолютная файл создается. При связывании программ на С++ эта опция не будет разрешать ссылки на конструкторы; для этого используйте -Ur. Этот параметр делает то же, что и `-i '.
Мне особенно интересно узнать, что происходит с символами, присутствующими в входах в компоновщик. Возьмем конкретный случай, когда у меня есть статическая библиотека libstatic.a, которая содержит один объектный файл component.o. Теперь я хочу создать еще одну статическую библиотеку libfinal.a, которая будет работать как интерфейс libstatic.a. Я использую эту команду для ее создания:
ld -r -o libfinal.a wrapper.o -L. -lstatic
Где wrapper.o предоставляет эксклюзивные API для вызова функций, определенных в libstatic.a
Будет ли libfinal.a быть только объединенный архив с wrapper.o и component.o или всеми ссылками, которые могут быть - разрешено между wrapper.o и component.o разрешено (связывание), а затем помещается в libfinal.a?
Edit_1: Обновление вопроса на основе достигнутого прогресса:
objdump библиотеки компонентов libstatic.a
(objdump -D libstatic.a
) показывает разделы .text
отдельно для каждой функции (как и ожидалось). Если в объединенной библиотеке libfinal.a
, которая была создана путем частичного связывания (флаг -r
), существует только один раздел .text
. Я предполагаю, что это означает, что произошло внутреннее связывание, и это не просто создание простого архива.