首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在gdb中加载多个符号文件

如何在gdb中加载多个符号文件
EN

Stack Overflow用户
提问于 2013-12-05 00:07:18
回答 7查看 100.5K关注 0票数 38

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

代码语言:javascript
复制
# gdb --core core
# (gdb) 
# (gdb) symbol-file foo.symbol

如何加载第二个符号文件。或者有没有办法加载gdb目录下的所有文件?

EN

回答 7

Stack Overflow用户

发布于 2013-12-05 02:27:44

要设置包含符号文件的目录,请使用

代码语言:javascript
复制
set debug-file-directory <directory>

并使用

代码语言:javascript
复制
show debug-file-directory

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

如果二进制文件以调试链接的形式提供了符号文件的名称(没有路径),则会自动从该目录中读取符号文件。

要添加其他符号,可以使用add-symbol-file

(因为我在这里引用的时候gdb onlinedocs似乎不可用)

添加符号文件文件名地址

添加-符号-文件文件名地址-readnow

添加符号文件文件名-ssection地址...

add- symbol -file命令从文件filename读取额外的符号表信息。当filename已动态加载(通过某种其他方式)到正在运行的程序中时,您可以使用此命令。address应该是加载文件的内存地址;gdb自己无法确定这一点。您还可以指定任意数量的“-ssection address”对,以给出该节的显式节名和基地址。您可以将任何地址指定为表达式。

文件文件名的符号表被添加到最初使用symbol-file命令读取的符号表中。您可以使用add- symbol -file命令任意次数;这样读取的新符号数据会一直与旧符号数据相加。要丢弃所有旧的符号数据,请使用不带任何参数的symbol-file命令。

尽管filename通常是共享库文件、可执行文件或已完全重新定位以加载到进程中的某些其他目标文件,但您也可以从可重新定位的.o文件加载符号信息,只要:

  • 文件的符号信息仅引用在该文件中定义的链接器符号,而不是由其他目标文件定义的符号,添加文件的符号信息引用的每个节实际上已加载到下级文件中,因为它显示在文件中,以及添加
  • 您可以确定每个节的加载地址,并将这些地址提供给

-

  • - file命令。

一些嵌入式操作系统,如Sun Chorus和VxWorks,可以将可重定位的文件加载到已经运行的程序中;这样的系统通常很容易满足上述要求。但是,重要的是要认识到,许多本机系统使用复杂的链接过程(例如,.linkonce段分解和C++构造函数表组装),这使得需求难以满足。一般来说,不能假设使用add-symbol-file读取可重定位目标文件的符号信息与以正常方式将可重定位目标文件链接到程序中具有相同的效果。

使用后按add-symbol-file不会重复。

您可以像使用-mapped' and--readnow命令一样使用符号文件的选项来更改gdb管理文件名的符号表信息的方式。

票数 31
EN

Stack Overflow用户

发布于 2019-04-18 19:16:24

可以使用以下命令将其他符号加载到gdb调试会话:

代码语言:javascript
复制
add-symbol-file filename address

其中,address.text段的地址。可以使用以下命令检索此地址:

代码语言:javascript
复制
readelf -WS path/to/file.elf | grep .text | awk '{ print "0x"$5 }'

通过将以下条目添加到~/.gdbinit,可以在gdb中自动执行此操作

代码语言:javascript
复制
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加载额外的符号:

代码语言:javascript
复制
(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   <MULTIPLE> 
1.1                         y     0x08006cb0 in main() at ./source/main.cpp:114
1.2                         y     0x080106a6 in main() at ./main.cpp:10
(gdb)
票数 19
EN

Stack Overflow用户

发布于 2014-12-18 17:06:14

除了alk的回答和评论之外,询问的地址是.text部分的地址。您可以使用readelf命令找到它

这里有一个用于二进制文件The address where filename has been loaded is missing [GDB]readelf示例

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20380204

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档