C++ DSO引用隐藏符号的警告到底是什么意思?
我在将某个共享库与g++链接时遇到问题。它给了我一个警告,比如:C++ DSO引用隐藏符号的警告到底是什么意思?,c++,gcc,linker,shared-libraries,elf,C++,Gcc,Linker,Shared Libraries,Elf,我在将某个共享库与g++链接时遇到问题。它给了我一个警告,比如: hidden symbol XXX in YYY is referenced by DSO /usr/lib/... 我已经阅读了一些关于特定问题的相关问题,但我想从整体上理解这些问题——这个警告意味着什么,原因是什么: 什么是DSO 什么是隐藏的符号 如果它是隐藏的,如何引用它 什么是DSO? DSO是一个动态的共享对象,或者不太正式的共享对象 什么是隐藏符号? 隐藏符号是指 已使用隐藏链接进行编译,例如根据(GCC特定) 声
hidden symbol XXX in YYY is referenced by DSO /usr/lib/...
我已经阅读了一些关于特定问题的相关问题,但我想从整体上理解这些问题——这个警告意味着什么,原因是什么:
什么是DSO? DSO是一个动态的共享对象,或者不太正式的共享对象 什么是隐藏符号? 隐藏符号是指 已使用隐藏链接进行编译,例如根据(GCC特定) 声明:
int x __attribute__ ((visibility ("hidden")));
如果在一个DSO中定义了x
,则动态链接无法从
不同的DSO。链接器可以看到x
(它不是static
),但不是
可用于动态连杆。文件
如果它是隐藏的,如何引用它?
不可能,这正是你被警告的。例如,链接时间警告:
DSO引用了/usr/lib/libc_nonshared.a(stat.oS)中的隐藏符号“stat”
正在告诉您链接中的DSO引用符号stat
,并且
链接器可以在/usr/lib/libc_nonshared.a
中找到stat
的定义,
但(显然)该定义不在引用它的DSO中
无法从该DSO引用,因为它是隐藏的
如果问题DSO未正确构建以供使用,则会出现此问题
作为DSO。看见
并跟进解决方案的后续工作
继续进行OP的后续行动
如果某些DSO已经引用了隐藏符号,那么为什么DSO会出现问题
链接器说:
DSOX
包含对符号S
的引用。我可以找到符号S
的定义是另一个链接模块Y
,
但该定义将无法动态(即在运行时)满足X
中的引用,因为S
在Y
中隐藏了链接
我可以确认问题来自非共享对象[…],但我没有在非共享对象中显式隐藏这些符号
您可能没有明确标记隐藏在非共享对象中的任何符号。根据它是如何建造的,符号
默认情况下可以隐藏,除非另有明确标记
假设非共享对象是libnonshared.a
,而据称隐藏的符号是foo
。运行:
objdump -t libnonshared.a
获取有关libnonshared.a
中符号的信息。在输出中,查找foo
的条目。它是否包含标签.hidden
?-e、 g
0000000000000000 g F .text 000000000000000b .hidden foo
此条目表示foo
是一个全局符号(标记为g
——这就是链接器能够看到它的原因),但它对于动态链接是隐藏的
如果事实证明是这样,那么您需要去修复libnonshared.a
的构建,这样它就不会隐藏foo
。
如果没有,那我就难倒了 DSO=动态共享对象我不明白你答案的最后一部分。如果某些DSO已经引用了隐藏符号,那么为什么DSO会出现问题?-事实上,我可以确认问题来自一个非共享对象,它定义了一些可能具有相同名称的符号,DSO知道这些符号是外部符号——它们是在另一个地方提供的。此外,我不会在非共享对象中显式隐藏这些符号。