【问题标题】:What can cause a variable to be present in linker map file but not ELF symbol table?什么会导致变量出现在链接器映射文件中而不是 ELF 符号表中?
【发布时间】:2021-12-06 17:40:55
【问题描述】:

一个变量被声明为

volatile bool is_usage_mode_convenience_activated = true;

它以正确的地址显示在链接器映射文件中,但我在 ELF 符号表中找不到它(使用 readelf -s 检查)。

dwarf调试信息(readelf --debug-dump=info)如下

<2><42019>: Abbrev Number: 104 (DW_TAG_variable)
    <4201a>   DW_AT_name        : (indirect string, offset: 0x433aa): is_usage_mode_convenience_activated
    <4201e>   DW_AT_decl_file   : 3
    <4201f>   DW_AT_decl_line   : 21
    <42020>   DW_AT_linkage_name: (indirect string, offset: 0x49717): _ZN20vehiclemodesprovider35is_usage_mode_convenience_activatedE
    <42024>   DW_AT_type        : <0x392a3>
    <42028>   DW_AT_external    : 1
    <42028>   DW_AT_declaration : 1

我希望 a 找到 DW_AT_location 而不是 DW_AT_declaration。程序中没有此变量的外部声明,因此 DW_TAG_variable 确实描述了该变量的唯一声明。

什么情况会导致这种情况?变量声明没有什么奇怪的。

【问题讨论】:

  • gdb 看到了吗?
  • readelf -sreadelf -a 怎么样?
  • 这是vehiclemodesprovider 类的成员变量,对吧?
  • 我删除了c,因为这不是 C 程序;标签具有误导性。
  • @CraigEstey 没看到,这就是我所说的 readelf 检查的符号表的意思,已经在帖子中澄清了这一点。

标签: c++ gcc linker


【解决方案1】:

它实际上在符号表中,但由于 readelf 只写入第 n 个字符,因此 grep 错过了它。使用显示整个符号的不同工具显示它确实存在于符号表中。虽然它没有位置属性仍然很奇怪。

【讨论】:

    猜你喜欢
    • 2010-10-13
    • 2013-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多