gpt4 book ai didi

c++ - 关于 DSO 引用隐藏符号的警告到底意味着什么?

转载 作者:IT老高 更新时间:2023-10-28 12:39:34 30 4
gpt4 key购买 nike

我在将某些共享库与 g++ 链接时遇到问题。它给了我一个警告,例如:

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

我已经阅读了一些关于特定问题的相关问题,但我想整体理解它——这个警告是什么意思,原因是什么:

  1. 什么是 DSO?
  2. 什么是隐藏符号?
  3. 如果隐藏了,如何引用?

最佳答案

什么是 DSO?

DSO 是一个动态共享对象,或者不太正式的 shared library .

什么是隐藏符号?

隐藏符号是一个符号(即函数或数据对象的名称)已使用隐藏链接编译,例如根据(特定于 GCC)声明:

int x __attribute__ ((visibility ("hidden")));

如果在一个 DSO 中定义了 x,则动态链接不能从一个 DSO 中引用它不同的 DSO。链接器可以看到x(不是static),但不是可用于动态链接。文档 here

如果隐藏了怎么引用?

不可能,这是你被警告的。例如。链接时警告:

hidden symbol `stat' in /usr/lib/libc_nonshared.a(stat.oS) is referenced by DSO

告诉您链接中的 DSO 引用了符号 stat,并且链接器可以在 /usr/lib/libc_nonshared.a 中找到 stat 的定义,但是(显然)该定义不在引用它的 DSO 中并且无法从该 DSO 中引用,因为它是隐藏的。

如果问题 DSO 未正确构建以供使用,则会出现此问题作为 DSO。见 this example并跟进解决方案。

继续 OP 的跟进

If hidden symbol is already referenced by some DSO, then why the problem is with DSO?

链接器说:

DSO X 包含对符号 S 的引用。我可以找到符号S的定义是另一个链接模块Y,但该定义将无法满足 X 动态 中的引用(即 在运行时),因为 S 具有Y 中的隐藏链接。

I can confirm that the problem comes with a non-shared object [...][but] I don't explicitly hide those symbols in my non-shared object.

您可能没有明确标记非共享对象中隐藏的任何符号。根据它的构建方式,符号默认情况下可能隐藏,除非明确标记否则

假设非共享对象是libnonshared.a,据称隐藏的符号是foo。运行:

objdump -t libnonshared.a

获取有关 libnonshared.a 中符号的信息。在输出中,查找 foo 的条目。它是否包含标签 .hidden? - 例如

0000000000000000 g     F .text  000000000000000b .hidden foo

这个条目说 foo 是一个全局符号(标记为 g - 这就是链接器能够看到它的原因)但是它是隐藏的用于动态链接。

如果是这种情况,那么您需要修复 libnonshared.a 的构建,以便它不会隐藏 foo。如果没有,那我就难住了。

关于c++ - 关于 DSO 引用隐藏符号的警告到底意味着什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23696585/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com