【问题标题】:Breakpoint has Two Addresses?断点有两个地址?
【发布时间】:2016-09-06 19:58:05
【问题描述】:

我最近在初始地址处设置了一个断点:

(gdb) b viewscreen_movieplayerst::create(char, viewscreenst*)
Breakpoint 1 at 0x804beec

第二个(通常的地址)是:

   (gdb) run

   Breakpoint 1, 0xf7b46630 
   in viewscreen_movieplayerst::create(char,viewscreenst*)()
   from/path/libs/libgraphics.so

这是因为可执行文件被剥离了吗?还是可执行文件执行完毕,执行后地址发生变化?

另外,主要是:

(gdb) b main 
Breakpoint 1 at 0x804bdec

地址好像很接近所以我把它包括在内。

编辑:

What does the concept of relocation mean?

So most of the binary is composed of reloc table?

【问题讨论】:

  • 你的问题对我来说并不完全清楚。如果你run时地址不同(你可以检查info break),那么是的,它可能是运行时重定位。如果它实际上有两个地址,那么这可能是由于各种编译器优化而发生的。
  • @Tom Tromey 在什么情况下它会有 2 个地址?如果没有,你给了我我一直在寻找的“运行时重定位”标语
  • 由于内联和重载解析,一个函数可能有多个地址。
  • 是的,内联。也有相关的优化,但它们很少见。此外,如果您设置了一个file:line 断点,由于模板实例化,您可以看到多个地址——通常每次实例化都会命中一次。

标签: debugging assembly gdb breakpoints


【解决方案1】:

也许您从 Unix 上的共享库函数中看到了过程链接表 (PLT) 地址?

编译器构建一个间接引用共享库依赖项的“trampoline”地址表。是个复杂的话题,有详细文章here

这是一个简单的例子。

lib.cpp

#include <iostream>


int foo()
{
  return 0;
}

垃圾.cpp

#include<iostream>

int foo();
int main(int argc, char* argv[])
{
  int k = foo();
  return 0;
}

编译

/tmp$ g++ -fPIC -g -std=c++11 -shared -o libtest_library.so lib.cpp
/tmp$ g++  -g -std=c++11  -o tramp junk.cpp -L . -l test_library

gdb 流浪汉

Reading symbols from tramp...done.
(gdb) p foo
$1 = (<text from jump slot in .got.plt, no debug info>) 0x4006d6 <foo()@plt+6>
(gdb) b foo
Breakpoint 1 at 0x4006d0
(gdb) d 1
(gdb) r
Starting program: /tmp/tramp 
lib:  0x602010
[Inferior 1 (process 12804) exited normally]
(gdb) b foo
Breakpoint 2 at 0x4006d0 (2 locations)
(gdb) info break
Num     Type           Disp Enb Address            What
2       breakpoint     keep y   <MULTIPLE>         
2.1                         y     0x00000000004006d0 <foo()@plt>
2.2                         y     0x00002aaaaacd0a99 in foo() at lib.cpp:6

如您所见,符号“foo”有两个地址和两个断点。一个是 PLT,另一个是共享库中的符号位置。

正如 cmets 所指出的,模板实例化和编译器优化还可以为一个符号或源代码行创建多个地址。

【讨论】:

  • 是的,define跟程序联动表有关。我意识到“预执行”地址对应于我制作的 objdump -d 文件中的地址。谢谢。
猜你喜欢
  • 2018-11-22
  • 2014-09-28
  • 2017-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多