gdb打印一个文件的符号表
时间: 2023-11-27 08:51:32 浏览: 65
使用 `gdb` 打印一个文件的符号表可以通过以下步骤实现:
1. 打开要调试的可执行文件,例如 `test`,并运行 `gdb`:
```
gdb test
```
2. 在 `gdb` 中运行 `info files` 命令查看文件信息,找到可执行文件的加载地址:
```
(gdb) info files
Symbols from "/path/to/test".
Local exec file:
`/path/to/test', file type elf64-x86-64.
Entry point: 0x4003d0
0x0000000000400238 - 0x0000000000400264 is .interp
0x0000000000400264 - 0x0000000000400284 is .note.ABI-tag
0x0000000000400284 - 0x00000000004002a8 is .note.gnu.build-id
0x00000000004002a8 - 0x00000000004002c8 is .gnu.hash
0x00000000004002c8 - 0x00000000004003a8 is .dynsym
0x00000000004003a8 - 0x0000000000400404 is .dynstr
0x0000000000400404 - 0x000000000040041f is .gnu.version
0x0000000000400420 - 0x0000000000400450 is .gnu.version_r
0x0000000000400460 - 0x000000000040056a is .rela.dyn
0x000000000040056a - 0x00000000004005b9 is .rela.plt
0x00000000004005b9 - 0x00000000004005da is .init
0x00000000004005e0 - 0x00000000004007c0 is .plt
0x00000000004007c0 - 0x00000000004007e3 is .plt.got
0x00000000004007e3 - 0x0000000000400a04 is .text
0x0000000000400a05 - 0x0000000000400a08 is .fini
0x0000000000600e28 - 0x0000000000600e48 is .rodata
0x0000000000600e48 - 0x0000000000600e5f is .eh_frame_hdr
0x0000000000600e60 - 0x0000000000601018 is .eh_frame
0x0000000000601018 - 0x0000000000601030 is .init_array
0x0000000000601030 - 0x0000000000601038 is .fini_array
0x0000000000601038 - 0x000000000060103c is .jcr
0x000000000060103c - 0x000000000060105c is .dynamic
0x000000000060105c - 0x0000000000602000 is .got
0x0000000000602000 - 0x0000000000602010 is .got.plt
0x0000000000602010 - 0x0000000000602011 is .data
0x0000000000602018 - 0x000000000060201c is .bss
```
在本例中,可执行文件的加载地址为 `0x0000000000400000`。
3. 在 `gdb` 中运行 `info address <symbol>` 命令查看符号地址:
```
(gdb) info address main
Symbol "main" is at 0x4007e3 in a file compiled without debugging.
```
在本例中,`main` 函数的地址为 `0x4007e3`。
4. 在 `gdb` 中运行 `info symbol <address>` 命令打印符号表:
```
(gdb) info symbol 0x4007e3
main in section .text of /path/to/test
```
在本例中,打印出了 `main` 函数在 `.text` 段中的位置。
可以通过此方法逐个打印所有符号。如果要打印符号表中的所有符号,可以使用 `info functions` 命令打印出所有函数符号。