【发布时间】:2015-07-25 17:16:42
【问题描述】:
在尝试使用__gcclibcxx_demangle_callback 作为__cxa_demangle 的非分配替代方案时,我遇到了一个给我带来麻烦的问题。当我静态链接libstdc++ 时,符号已定位,但当我动态链接时,g++ 报告:
undefined reference to `__gcclibcxx_demangle_callback'
奇怪的是,nm 将其列在一个而不是另一个:
me@compy:/lib$ nm libstdc++.a | grep demangle
0000543d T __cxa_demangle
0000550d T __gcclibcxx_demangle_callback
me@compy:/lib$ nm -D libstdc++.so | grep demangle
0004eabd T __cxa_demangle
readelf 的输出提示了原因 - 它在静态中是全局的,在共享中是局部的:
me@compy:/lib$ readelf -s libstdc++.a | grep demangle
179: 0000543d 208 FUNC GLOBAL DEFAULT 1 __cxa_demangle
180: 0000550d 32 FUNC GLOBAL DEFAULT 1 __gcclibcxx_demangle_callback
me@compy:/lib$ readelf -s libstdc++.so | grep demangle
8313: 0004eb8d 32 FUNC LOCAL DEFAULT 12 __gcclibcxx_demangle_callback
10871: 0004eabd 208 FUNC GLOBAL DEFAULT 12 __cxa_demangle
将我的整个应用程序与libstdc++ 静态链接不是一种选择。
我的问题有两个:
- 为什么两者的可见性不同?
- 如何才能访问此符号?有没有办法动态获取它,或者仅针对该符号所在的目标文件静态链接?
【问题讨论】: