为什么内部链接的名称会出现在目标文件的符号表中?

b

为什么内部链接的名称会出现在目标文件的符号表中?

这个问题并不重要。我只是好奇。

这是示例代码:

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()

没有要求编译器发出调试符号。

我偶然发现,如果更改staticstatic inline,则符号消失。

供参考,请参阅此答案,该答案回答了另一个问题,解释了如何读取的输出readelf但是,我的问题不是将Readelf工具本身视为问题,而是为什么编译器在我所知的需要范围内不导出任何其他文件的符号。

受雇于俄罗斯

但是,我的问题不是将Readelf工具本身视为问题,而是为什么编译器在我所知的需要范围内不导出任何其他文件的符号。

编译器导出这些符号(它们具有LOCAL绑定)。

编译器仅为它们创建符号表条目,以简化调试。

没有要求编译器发出调试符号。

即使没有调试符号,符号表中的(非调试)符号对于调试也很有用。考虑:

#include <stdlib.h>

namespace {
    static int foo() {abort();}
}
static int bar() {return 20 + foo();}

int main() { return bar(); }


g++ t.cc && gdb -q ./a.out


(gdb) run
Starting program: /tmp/a.out 

Program received signal SIGABRT, Aborted.
__GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
51  ../sysdeps/unix/sysv/linux/raise.c: No such file or directory.
(gdb) bt
#0  __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
#1  0x00007ffff7a6e3fa in __GI_abort () at abort.c:89
#2  0x0000555555554653 in (anonymous namespace)::foo() ()
#3  0x000055555555465c in bar() ()
#4  0x000055555555466a in main ()

请注意第2帧和第3帧有多有用。如果您不希望这种情况发生,可以随时删除符号:

gcc t.cc -Wl,--strip-all && gdb -q ./a.out

(gdb) run
Starting program: /tmp/a.out 

Program received signal SIGABRT, Aborted.
__GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
51  ../sysdeps/unix/sysv/linux/raise.c: No such file or directory.
(gdb) bt
#0  __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
#1  0x00007ffff7a6e3fa in __GI_abort () at abort.c:89
#2  0x0000555555554653 in ?? ()
#3  0x000055555555465c in ?? ()
#4  0x000055555555466a in ?? ()
#5  0x00007ffff7a5a2b1 in __libc_start_main (main=0x555555554661, argc=1, argv=0x7fffffffde08, init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7fffffffddf8)
    at ../csu/libc-start.c:291
#6  0x000055555555456a in ?? ()

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Java

为什么会出现在导入处理核到Java中的错误?

来自分类Java

为什么会出现在Java中没有实例级Stream.concat方法?

来自分类Java

为什么会出现在Java中的HashMap重复键?

来自分类Linux

为什么常量名称会出现在已编译的二进制文件/共享库中?

来自分类Java

为什么实体名称必须紧随XML出现在实体引用中的“&”之后?

来自分类Dev

为什么即使未运行fsck,磁盘错误也会出现在dmesg输出中?

来自分类Dev

为什么生存期名称会出现在函数类型中?

来自分类Dev

为什么索引名称总是出现在用熊猫创建的镶木文件中?

来自分类Dev

链接中的符号表

来自分类Dev

为什么输入#名称会出现在输出中?

来自分类Dev

为什么我的CardView不会出现在我的片段中?

来自分类Dev

在R中,为什么变量名称以'。'开头 没有出现在我的环境中?

来自分类Dev

为什么在dialogflow中创建的丰富消息不会出现在经过Slack测试的机器人中?

来自分类Dev

为什么在视图内部使用Html.Action时,可选查询参数会出现在子操作中?

来自分类Dev

当有人登录时,为什么/ bin / login不会出现在ps输出中

来自分类Dev

为什么meta box不会出现在WordPress Add New UI中?

来自分类Dev

为什么到POP3服务器的Tracert会出现在IMAP服务器中?

来自分类Dev

readelf符号表名称中的数字是什么?

来自分类Dev

时代精神记录的假小子笔记不会出现在Unity破折号中。为什么不?

来自分类Dev

为什么链接在HTML中的链接之后,为什么出现在表格的前面?

来自分类Dev

为什么 MYVAR=something 不会出现在 printenv 中?这与 getenv 函数有关吗?

来自分类Dev

为什么我的内容会出现在外面?

来自分类Dev

有人知道为什么这些元素会出现在移动网站中吗?

来自分类Dev

为什么在发出发布请求时用户名不会出现在我的负载中?

来自分类Dev

为什么这个动画会出现在这个网页中?

来自分类Dev

我不知道为什么这个错误会出现在 Laravel 中?

来自分类Dev

为什么输入元素的“值”属性有时不会出现在 HTML 中?

来自分类Dev

为什么生物圈活动会出现在技术圈矩阵中?

来自分类Dev

为什么 Next.js 的编译指示器会出现在我的生产版本中?

Related 相关文章

  1. 1

    为什么会出现在导入处理核到Java中的错误?

  2. 2

    为什么会出现在Java中没有实例级Stream.concat方法?

  3. 3

    为什么会出现在Java中的HashMap重复键?

  4. 4

    为什么常量名称会出现在已编译的二进制文件/共享库中?

  5. 5

    为什么实体名称必须紧随XML出现在实体引用中的“&”之后?

  6. 6

    为什么即使未运行fsck,磁盘错误也会出现在dmesg输出中?

  7. 7

    为什么生存期名称会出现在函数类型中?

  8. 8

    为什么索引名称总是出现在用熊猫创建的镶木文件中?

  9. 9

    链接中的符号表

  10. 10

    为什么输入#名称会出现在输出中?

  11. 11

    为什么我的CardView不会出现在我的片段中?

  12. 12

    在R中,为什么变量名称以'。'开头 没有出现在我的环境中?

  13. 13

    为什么在dialogflow中创建的丰富消息不会出现在经过Slack测试的机器人中?

  14. 14

    为什么在视图内部使用Html.Action时,可选查询参数会出现在子操作中?

  15. 15

    当有人登录时,为什么/ bin / login不会出现在ps输出中

  16. 16

    为什么meta box不会出现在WordPress Add New UI中?

  17. 17

    为什么到POP3服务器的Tracert会出现在IMAP服务器中?

  18. 18

    readelf符号表名称中的数字是什么?

  19. 19

    时代精神记录的假小子笔记不会出现在Unity破折号中。为什么不?

  20. 20

    为什么链接在HTML中的链接之后,为什么出现在表格的前面?

  21. 21

    为什么 MYVAR=something 不会出现在 printenv 中?这与 getenv 函数有关吗?

  22. 22

    为什么我的内容会出现在外面?

  23. 23

    有人知道为什么这些元素会出现在移动网站中吗?

  24. 24

    为什么在发出发布请求时用户名不会出现在我的负载中?

  25. 25

    为什么这个动画会出现在这个网页中?

  26. 26

    我不知道为什么这个错误会出现在 Laravel 中?

  27. 27

    为什么输入元素的“值”属性有时不会出现在 HTML 中?

  28. 28

    为什么生物圈活动会出现在技术圈矩阵中?

  29. 29

    为什么 Next.js 的编译指示器会出现在我的生产版本中?

热门标签

归档