readelf显示的符号表各列的含义是啥?
Posted
技术标签:
【中文标题】readelf显示的符号表各列的含义是啥?【英文标题】:What are the meanings of the columns of the symbol table displayed by readelf?readelf显示的符号表各列的含义是什么? 【发布时间】:2011-03-05 04:17:16 【问题描述】:有人可以使用readelf
解释符号表中显示的列吗?
【问题讨论】:
【参考方案1】:考虑以下几点:
符号表 .symtab
包含 1203 个条目:
Num: Value Size Type Bind Vis Ndx Name
310: a0008120 0 NOTYPE GLOBAL DEFAULT ABS _gp
734: a0000010 32 OBJECT GLOBAL DEFAULT 77 v
818: 9d000018 496 FUNC GLOBAL DEFAULT 71 main
849: a0000124 4 OBJECT GLOBAL DEFAULT 78 phrase
955: a0000000 9 OBJECT GLOBAL DEFAULT 77 peppers
1020: a000023c 192 OBJECT GLOBAL DEFAULT 80 bins
Num:
= 符号编号
Value
= 符号地址
Size
= 符号的大小
Type
= 符号类型:Func
= 函数,Object
,File
(源文件名),Section
= 内存部分,Notype
= 无类型绝对符号或未定义
Bind
= GLOBAL
绑定意味着符号在文件外可见。 LOCAL
绑定仅在文件中可见。 WEAK
就像全局一样,符号可以被覆盖。
Vis
= 符号可以是默认的、受保护的、隐藏的或内部的。
Ndx
= 符号所在的节号。ABS 表示绝对:未调整到任何节地址的重定位
Name
= 符号名称
【讨论】:
作为绑定值的“UNIQUE”是什么意思?? @Caladin “符号的大小”是什么意思?比如说,如果符号是函数名,那么“Size”表示函数的大小(例如,这个函数有多少条指令)? 不是多少指令,而是多少字节(通常,可能因目标而异)。例如,在 gcc 的一些 asm 输出中,我在函数_main
的末尾看到以下代码:.size _main, .-_main
。该指令告诉 as 函数 _main
的大小是当前位置减去其起始地址。【参考方案2】:
我认为 Ndx 字段显示了定义该符号的部分编号。
执行readelf -a <file>
,并找出地址对应于给定符号的哪个部分。
我敢打赌,该节的节号会出现在 Ndx 字段中。
【讨论】:
【参考方案3】:好的,这个问题很老了,但是如果您正在寻找 readelf 符号表和 NDX,那么老 Google 会提供它;
这是我发现的:
用avr-gcc编译的C代码:
int XYZ = 123;
int ABC;
当使用分析生成的elf文件时
readelf --symbols KoreOS.elf
你得到输出:
Num: Value Size Type Bind Vis Ndx Name
...
148: 0080200b 2 OBJECT GLOBAL DEFAULT 2 XYZ
...
258: 00803878 2 OBJECT GLOBAL DEFAULT 3 ABC
...
我使用 NDX 列作为变量是否已初始化的提示。但是我在任何地方都没有找到任何文档,所以我只是在猜测。
问候, 多米尼克
【讨论】:
【参考方案4】:您可以:
man readelf
或查看这些教程:
The ELF Object File Format by Dissection Understanding ELF using readelf and objdump.【讨论】:
我也对这个问题的答案感兴趣。特别是,什么是 Ndx(来自 readelf -s)?对于了解精灵的人来说,这可能是显而易见的。我查看了手册页和您列出的文档,但在那里找不到信息。也许我只是错过了它?这不会是第一次。 最重要的是:阅读 LSB 指向的标准:sco.com/developers/gabi/2003-12-17/contents.html 是最有趣的。以上是关于readelf显示的符号表各列的含义是啥?的主要内容,如果未能解决你的问题,请参考以下文章
mysql中 show index from tb_name命令各列的含义