【发布时间】:2019-03-14 02:15:27
【问题描述】:
为什么内部链接的名称会出现在我的目标文件的符号表中?
这个问题并不重要。我只是好奇。
这里是示例代码:
namespace {
static int foo() {return 10;}
}
static int bar() {return 20;}
使用 GNU 的 readelf -s foobar.o | c++filt -t,可以在目标文件的符号表中找到这两个条目:
Value Size Type Bind Vis Ndx Name
00000000 11 FUNC LOCAL DEFAULT 1 (anonymous namespace)::foo()
0000000b 11 FUNC LOCAL DEFAULT 1 bar()
尚未要求编译器发出调试符号。
我偶然注意到,如果我将static 更改为static inline,符号就会消失。
作为参考,另请参阅this answer,,它回答了一个不同的问题,解释了如何读取readelf 的输出。然而,我的问题并不认为 Readelf 工具是这样的,而是为什么编译器会导出符号,而不是据我所知需要的其他文件。
【问题讨论】:
-
@S.M.谢谢你的链接。不过,我不相信我的问题会重复那个问题。
-
为什么您认为内部链接的名称应该在目标文件中消失?他们根据绑定列将那里标记为本地符号。目标文件在链接步骤之前生成,因此如果目标文件中出现本地名称,则不会损坏任何内容。从internally linked names这句话可以清楚地看出,链接器是对此类名称的某种障碍,在链接之前可以,在链接之后它们应该消失。尝试使用 readelf 解析您的可执行文件。这就是为什么我将您的问题标记为重复的原因,在原始问题中,Bind 列清楚地描述了。
标签: c++ elf linkage object-files