readelf查看符号表
时间: 2025-07-08 21:27:53 AIGC 浏览: 24
<think>好的,我现在需要回答用户的问题:“how to use readelf to view symbol table in Linux”。首先,我要确保自己对readelf工具足够了解,特别是查看符号表的部分。
首先,我应该回忆一下readelf的基本用途。readelf是GNU Binutils的一部分,用于显示ELF(Executable and Linkable Format)文件的信息,比如目标文件、可执行文件、共享库等。符号表是ELF文件中记录符号信息的部分,包括函数、变量等的名称和地址。
接下来,用户想知道如何查看符号表。我需要确定相关的命令行选项。记得readelf的-s选项是用来显示符号表的。因此,基本命令应该是readelf -s <文件名>。例如,查看a.out的符号表,命令是readelf -s a.out。
然后,可能需要解释输出结果的含义。符号表通常包含Num、Value、Size、Type、Bind、Vis、Ndx、Name等列。比如,Value是符号的地址,Type表示符号类型(如FUNC表示函数,OBJECT表示变量),Ndx指向所在的段索引,如.text段等。
用户可能还需要过滤特定的符号,比如只看函数或变量。这时候可以结合grep命令,例如readelf -s a.out | grep FUNC来筛选函数符号。
另外,可能需要提到如何查看动态符号表。动态符号表通常在共享库中使用,可以用--dyn-syms选项,即readelf --dyn-syms <文件名>,或者使用-s和--dyn-syms结合。
需要注意的是,符号表中的符号可能包含调试符号,如果文件被strip过,这些信息可能会丢失。因此,提醒用户在未strip的文件中使用该命令会更有效。
最后,确保步骤清晰,示例明确,用户能够按照步骤操作。如果有必要,可以提到其他相关工具,比如nm,但用户的问题明确提到readelf,所以主要围绕它展开。
现在需要验证这些步骤是否正确。比如,执行readelf -s是否正确显示符号表,是否支持动态符号表的选项。参考之前的知识,这些应该是正确的。同时,符号表的各列含义也需要准确,避免误导用户。
总结回答的结构:先介绍readelf和符号表,然后列出基本命令,解释输出,给出示例,再说明如何过滤符号,动态符号表的查看方法,以及注意事项。这样用户能一步步跟着操作,解决实际问题。</think>要使用`readelf`查看Linux中的符号表,可以按照以下步骤操作:
---
### **步骤1:基本命令格式**
使用`-s`或`--syms`选项查看符号表:
```bash
readelf -s <文件名>
```
例如:
```bash
readelf -s a.out # 查看可执行文件符号表
readelf -s libtest.so # 查看共享库符号表
```
---
### **步骤2:理解输出内容**
符号表输出包含以下关键列:
- **Num**:符号序号
- **Value**:符号的虚拟地址(如函数入口地址)
- **Size**:符号占用的字节大小
- **Type**:符号类型(`FUNC`=函数,`OBJECT`=变量,`NOTYPE`=未定义类型)
- **Bind**:绑定属性(`GLOBAL`全局符号,`LOCAL`局部符号)
- **Ndx**:所在段的索引(如`.text`段对应`PROGBITS`)
- **Name**:符号名称
示例输出片段:
```
Num: Value Size Type Bind Vis Ndx Name
1: 0000000000000000 0 FUNC GLOBAL DEFAULT UND puts@GLIBC_2.2.5
2: 0000000000001149 32 FUNC GLOBAL DEFAULT 16 main
```
---
### **步骤3:过滤特定符号**
结合`grep`筛选目标符号:
```bash
readelf -s a.out | grep 'main' # 查找main函数
readelf -s libtest.so | grep 'FUNC' # 仅显示函数符号
```
---
### **步骤4:查看动态符号表**
动态符号表记录动态链接时使用的符号,使用`--dyn-syms`选项:
```bash
readelf --dyn-syms libtest.so
# 或等效命令
readelf -sD libtest.so
```
---
### **注意事项**
- 若文件被`strip`处理过,符号表可能已被移除。
- 调试符号需编译时添加`-g`选项才会保留。
- 符号表与调试信息的区别:符号表记录基本符号信息,调试符号(如DWARF格式)包含更详细的源码级信息[^1]。
---
### **示例:完整流程**
1. 编译含调试信息的程序:
```bash
gcc -g test.c -o test
```
2. 查看符号表:
```bash
readelf -s test | grep 'FUNC' -A 5
```
3. 输出示例:
```
30: 0000000000001149 32 FUNC GLOBAL DEFAULT 16 main
31: 0000000000001040 43 FUNC GLOBAL DEFAULT 16 _start
```
---
阅读全文
相关推荐



















