C++ DSO引用隐藏符号的警告到底是什么意思?

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特定) 声

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

hidden symbol XXX in YYY is referenced by DSO /usr/lib/...
我已经阅读了一些关于特定问题的相关问题,但我想从整体上理解这些问题——这个警告意味着什么,原因是什么:

  • 什么是DSO
  • 什么是隐藏的符号
  • 如果它是隐藏的,如何引用它

  • 什么是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会出现问题

    链接器说:

    DSO
    X
    包含对符号
    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知道这些符号是外部符号——它们是在另一个地方提供的。此外,我不会在非共享对象中显式隐藏这些符号。