Копирование символов из статического объекта в общий объект - PullRequest
2 голосов
/ 22 февраля 2012

У меня есть библиотека foo, для которой я создал статический объект (libfoo.a).

У меня есть вторая библиотека bar, для которой я создал общий объект (libbar.so), которая берет некоторые символы из libfoo.a.

У меня есть третья библиотека, baz, для которой я пытаюсь создать ссылку на bar.При вызове компоновщика я получаю ошибки об отсутствии символов в строке (соответствующих символам, которые находятся в foo).nm говорит мне, что эти символы существуют в libfoo.a, но не в libbar.so;однако в libbar.so есть некоторые символы из libfoo.a.

Почему не все символы копируются?

1 Ответ

5 голосов
/ 22 февраля 2012

A .a библиотека не является "статическим объектом". Файл .a представляет собой архив, теоретически похожий на tar, но другого формата и генерируемый командой ar. Каждый объект в архиве индивидуален и индивидуален. Обычно это объекты .o, представляющие собой скомпилированные несвязанные объекты. Все символы в одном из этих .o файлов будут включены в другие файлы во время компоновки (ld). Но не все объекты в архиве понадобятся при связывании, символы в других объектных файлах не будут видны в связанном файле.

Например, в libdialog.a имеются mouse.o и columns.o объектные файлы. Ваша программа использует столбцы, но не функции мыши. Таким образом, ваша программа включает все символы в columns.o, но ни один из символов в mouse.o не включен.

С «общим объектом» (.so) это отдельный объект, поэтому при связывании с ним будут включены все символы в объекте, необходимые или нет. В приведенном выше примере, если мы ссылаемся на libdialog.so, программа будет включать символы как columns.o, так и mouse.o, даже если код на основе мыши не используется.

При создании общего объекта (.so) те же правила связывания применяются при использовании архива (.a). Таким образом, файл .so будет включать только символы в файлах .o в используемом архиве.

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