hidden symbol ... is referenced by DSO

http://stackoverflow.com/questions/23696585/what-does-exactly-the-warning-mean-about-hidden-symbol-being-referenced-by-dso


所犯的错误:

把代码中不需要的动态库进行了链接,被多余链接进来的动态库引用了隐藏符号,导致链接出错。

去除问题:把不需要的动态库取消链接。


What is a DSO?

DSO is a Dynamic Shared Object, or less formally a shared library.

What is a hidden symbol?

hidden symbol is a symbol (i.e. name of function or data object) that has been compiled with hidden linkage, e.g. as per the (GCC specific) declaration:

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

If x is defined in one DSO then dynamic linkage cannot reference it from a different DSO. The linker can see x (it is not static), but it is not available for dynamic linkage. Documentation here

How can it be referenced, if it's hidden?

It can't be, which is what you are being warned about. E.g. the linktime warning:

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

is telling you that a DSO in the linkage references the symbol stat, and the linker can locate a definition of stat in /usr/lib/libc_nonshared.a, but (obviously) that definition is not in the DSO that references it and cannot be referenced from that DSO, because it is hidden.

You get this problem if the problem DSO has not been built correctly for use as a DSO. See this example and follow the follow-ups for the solution.

Continued for OP's followups

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

The linker is saying:

The DSO X contains a reference to symbol S. I can find a definition of symbol S is another linked module Y, but that definition will not be available to satisfy the reference in X dynamically (i.e. at runtime) because S has hidden linkage in 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.

You may not have explicitly marked any symbols hidden in the non-shared object. Depending on how it was built, symbols may be hidden by default unless explicitly marked otherwise.

Say the non-shared object is libnonshared.a and the allegedly hidden symbol is foo. Run:

objdump -t libnonshared.a

to get info about the symbols in libnonshared.a. In the output, look for the entry for foo. Does it contain the tag .hidden? - e.g.

0000000000000000 g     F .text  000000000000000b .hidden foo

This entry says that foo is a global symbol (marked g - that's why the linker is able to see it) but it's hidden for dynamic linkage.

If this turns out to be the case then you need to go and fix the build of  libnonshared.a so that it doesn't hide  foo. If not, then I'm stumped
  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值