符号表

如何在gdb中加载多个符号文件.我有一个可执行的foo.out和加载模块栏.我创建了两个符号文件foo.symbol和bar.symbol.如何将两个文件加载到GDB中.

# gdb –core core

(gdb)

(gdb) symbol-file foo.symbol

如何加载第二个符号文件.或有什么方法可以加载gdb

中的所有目录文件

推荐答案

设置包含符号文件的目录use

set debug-file-directory

并使用

show debug-file-directory

显示当前设置为包含符号文件的目录.

符号文件是从此目录自动读取的,如果二进制文件以调试链接为单位.

二进制文件.

要添加其他符号,您可能会使用add-symbol-file.

(如 gdb onlinedocs 目前我在这里引用此信息,

附加符号文件的文件名地址

附加符号文件文件名地址[-readNow] [ - 映射]

附加符号文件文件名-Ssection地址…

附加符号文件命令从文件文件名中读取其他符号表信息.当将文件名(通过某些其他方式)动态加载到正在运行的程序中时,您将使用此命令.地址应为已加载文件的内存地址; GDB无法自行解决这个问题.您还可以指定任意数量的``ssection地址’’对,以提供该节的明确截面名称和基础地址.您可以将任何地址指定为表达式.

文件文件名的符号表被添加到最初使用符号文件命令读取的符号表中.您可以多次使用附加符号文件命令;因此,新的符号数据读取不断添加到旧.为了丢弃所有旧符号数据,请使用没有任何参数的符号文件命令.

尽管文件名通常是共享库文件,可执行文件或已完全重新安置以加载到过程中的其他对象文件,但您也可以从重新定位的.o文件加载符号信息,只要:

  • 文件的符号信息仅指该文件中定义的链接器符号,而不是由其他对象文件定义的符号,
  • 每节文件的符号信息涉及实际上已加载到文件中,并且
  • 您可以确定每个部分加载的地址,并将其提供给附加符号文件命令.

一些嵌入式操作系统,例如Sun Chorus和VXWorks,可以将可重定位的文件加载到已经运行的程序中;这样的系统通常使上述要求易于满足.但是,重要的是要认识到,许多天然系统都使用复杂的链接程序(例如,链接部分分解和C ++构造函数组件),使要求难以满足.通常,不能假设使用附加符号文件读取可重新定位对象文件的符号信息的效果与将可重定位对象文件链接到程序中的效果相同.

.

加上符号文件在使用后不重复.

与符号文件命令一样,您可以使用-mapped’ and -ReadNow’选项,以更改GDB管理文件名的符号表信息.

其他推荐答案

其他符号可以加载到gdb调试会话:

add-symbol-file filename address

参数address是.text节的地址.可以通过以下方式检索此地址

readelf -WS path/to/file.elf | grep .text | awk ‘{ print “0x”$5 }’

可以通过在gdb中自动化这可以通过添加以下输入到~/.gdbinit:

来自动化.

define add-symbol-file-auto

Parse .text address to temp file

shell echo set \$text_address=$(readelf -WS $arg0 | grep .text | awk ‘{ print “0x”$5 }’) >/tmp/temp_gdb_text_address.txt

Source .text address

source /tmp/temp_gdb_text_address.txt

Clean tempfile

shell rm -f /tmp/temp_gdb_text_address.txt

Load symbol table

add-symbol-file $arg0 $text_address
end

以上功能定义add-symbol-file-auto可以使用其他符号:

(gdb) add-symbol-file-auto path/to/bootloader.elf
add symbol table from file “path/to/bootloader.elf” at
.text_addr = 0x8010400
(gdb) add-symbol-file-auto path/to/application.elf
add symbol table from file “path/to/application.elf” at
.text_addr = 0x8000000
(gdb) break main
Breakpoint 1 at 0x8006cb0: main. (2 locations)
(gdb) info break
Num Type Disp Enb Address What
1 breakpoint keep y
1.1 y 0x08006cb0 in main() at ./source/main.cpp:114
1.2 y 0x080106a6 in main() at ./main.cpp:10
(gdb)