Ответ 1
Что такое DSO?
DSO - это динамический общий объект или менее формально общая библиотека.
Что такое скрытый символ?
Скрытый символ - это символ (т.е. имя функции или объекта данных), который был скомпилирован со скрытой связью, например. в соответствии с (специфическим для ССЗ) Объявление:
int x __attribute__ ((visibility ("hidden")));
Если x
определяется в одном DSO, тогда динамическая привязка не может ссылаться на него из
разные DSO. Линкер может видеть x
(это не static
), но это не
доступный для динамической связи. Документация здесь
Как это можно сделать, если он скрыт?
Этого не может быть, о чем вас предупреждают. Например. предупреждение linktime:
скрытый символ `stat 'в/usr/lib/libc_nonshared.a(stat.oS) ссылается на DSO
сообщает вам, что DSO в ссылке ссылается на символ stat
и
компоновщик может найти определение stat
в /usr/lib/libc_nonshared.a
,
но (очевидно), что определение не находится в DSO, который ссылается на него
и не может ссылаться на этот DSO, потому что он скрыт.
Вы получаете эту проблему, если проблема DSO не была построена правильно для использования как DSO. См. этот пример и следуйте рекомендациям для решения.
Продолжение для последующих операций OP
Если скрытый символ уже упоминается некоторыми DSO, то почему проблема связана с DSO?
Компонент говорит:
DSO x
содержит ссылку на символ S
. Я могу найти определение символа S
- это еще один связанный модуль Y
,
но это определение не будет доступно для динамического удовлетворения ссылки в x
(т.е. во время выполнения), поскольку S
имеет скрытую привязку в Y
.
Я могу подтвердить, что проблема связана с не общим объектом [...] [но] Я не скрываю эти символы в моем не shared-объекте.
Возможно, вы не указали явно никаких символов, скрытых в объекте, не являющемся общим. В зависимости от того, как он был построен, символы могут быть скрыты по умолчанию, если явно не указано иначе.
Скажите, что не общий объект libnonshared.a
, и предположительно скрытый символ foo
. Run:
objdump -t libnonshared.a
чтобы получить информацию о символах в libnonshared.a
. На выходе найдите запись для foo
. Он содержит тег .hidden
? - например,
0000000000000000 g F .text 000000000000000b .hidden foo
В этой записи указано, что foo
является глобальным символом (помечено g
- то, почему линкер способен его видеть), но он скрыт для динамической привязки.
Если это окажется так, вам нужно пойти и исправить сборку libnonshared.a
, чтобы она не скрывала foo
.
Если нет, то я в тупике.