Подтвердить что ты не робот

Что именно означает предупреждение о скрытом символе, на которое ссылается DSO?

У меня проблема с связыванием некоторой общей библиотеки с g++. Это дает мне предупреждение:

hidden symbol XXX in YYY is referenced by DSO /usr/lib/...

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

  • Что такое DSO?
  • Что такое скрытый символ?
  • Как он может ссылаться, если он скрыт?
4b9b3361

Ответ 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. Если нет, то я в тупике.