【问题标题】:Details on gdb memory access complaint有关 gdb 内存访问投诉的详细信息
【发布时间】:2011-05-15 16:26:27
【问题描述】:

我有一个使用 as 编译的目标文件(来自汇编代码)。

如果我使用 ld 链接它,当我尝试 stepi(或 nexti)时,gdb 会抱怨地址 0x0 的内存访问。如果我使用 gcc 链接它,一切都很好。

我猜这个问题是由 ld 引起的,与 gcc 的链接结果相比,它产生的部分更少。

有没有办法将 gdb 配置得更详细,这样我就可以找出可执行文件出了什么问题?

(gdb) b main
Breakpoint 1 at 0x100000f8e
(gdb) r
Breakpoint 1, 0x0000000100000f8e in main ()
(gdb) x/10i $pc
0x100000f8e <main>: fbld   0x6c(%rip)        # 0x100001000 <data1>
0x100000f94 <main+6>: fimul  0x7a(%rip)        # 0x100001014 <data2>
0x100000f9a <main+12>: fbstp  0x60(%rip)        # 0x100001000 <data1>
0x100000fa0 <main+18>: mov0x0    $0x2000001,%rax
0x100000fa7 <main+25>: mov    $,%rdi
0x100000fae <main+32>: syscall 
(gdb) si
Cannot access memory at address 0x0
0x0000000100000f94 in main ()

PS:可执行文件本身在两个版本中都按预期运行。

稍后编辑:我用来编译的命令:

as -arch x86_64 src.s -o src.o
ld -e _main -arch x86_64 src.o -o src
gcc -o src src.o

【问题讨论】:

  • 您是否尝试过在“stepi”命令之前和之后转储寄存器(信息寄存器)或堆栈?为什么要关心可执行文件是否运行正常?
  • 我可以在“stepi”之前和之后转储寄存器,但我看不到任何相关内容。我在乎,因为我不喜欢无法解释的行为。
  • 你怎么称呼'ld'和'gcc'(当然还有'as')?您使用了哪些标志?
  • @Bart - 我已经在答案中列出了命令。

标签: macos gdb ld gnu-assembler


【解决方案1】:

GCC 实际上并不进行链接,它只是代表您调用 ld。它提供的选项必须与您使用的选项不同。

根据这个帖子:

How to get GCC linker command?

您应该能够通过运行 gcc -v 查看 ld 调用的命令行。 这应该告诉你如何修改你的 ld 命令行,让事情对你有用。

【讨论】:

  • 感谢您的回答,我确实可以使用 ld 链接以这种方式收集的额外参数。
【解决方案2】:

gdb 有一个“show debug”命令,提供各种内部调试设置。例如。 “set debug target 1”将开启跟踪 gdb 与目标进程的交互。您可能想尝试他们拥有的每个标志(没有那么多)。

【讨论】:

  • 感谢您的回答。现在我看到了问题——对 ld 创建的二进制文件调用 frame_register_unwind 返回 0x0。我不知道为什么,但这是一个好的开始。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-27
  • 1970-01-01
  • 2013-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多