我最近设置了一个断点,其中初始地址为:
(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
看起来很接近地址,所以我把它写进去。
编辑:重定位的概念是什么?
所以大部分二进制文件都是由reloc表组成的?
也许您正在从Unix上的共享库函数看到过程链接表(PLT)地址?
编译器构建一个'trampoline'地址表,这些地址间接引用共享库依赖项。这是一个复杂的话题,这里有详细的文章
下面是一个简单的例子。
lib.cpp
#include <iostream>
int foo()
{
return 0;
}
junk.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,另一个是共享库中的符号位置。
正如注释所指出的,模板实例化和编译器优化也可以为一个符号或源代码行创建多个地址。