我正在研究Ubuntu 14.04 LTS。
我有一个从exec
编译的可执行文件file.c
。 file.c
使用静态库中的函数。例如,假设fubar()
是file.c
中使用的静态库的函数。
这是我注意到的。
nm exec | grep fubar
给出了一定的价值
(在我的系统和我的可执行文件0808377f
)gdb ./exec
然后break fubar
会给出不同的值
(在我的系统和我的可执行文件0x8083785
)当我为另一个从exec1
编译的可执行文件(file1.c
执行类似操作时,它会为这两个命令输出相同的值。)
两个命令都应该输出相同的虚拟地址。不是吗?我显然缺少一些东西。有人可以解释究竟发生了什么吗?两个命令之间有什么区别。
答案 0 :(得分:2)
除了-fPIE
等不寻常的事情之外,这里发生的事情是gdb命令break function
实际上意味着“在function
的函数序言之后中断”。这样,在断点被击中时,参数就会正确设置。
如果要完全断开函数的第一条指令,请使用*
语法,如:
(gdb) break *function
如果这样做,地址可能会匹配。