nm 与 gdb 中断
nm versus gdb break
我正在开发 Ubuntu 14.04 LTS。
我有一个从 file.c
编译而来的可执行文件 exec
。 file.c
使用静态库中的函数。例如,假设 fubar()
是 file.c
中使用的静态库的函数。
这是我注意到的事情。
nm exec | grep fubar
给出一定的值。
(在我的系统和我的可执行文件中,0808377f
)
gdb ./exec
然后 break fubar
给出不同的值。
(在我的系统和我的可执行文件中,0x8083785
)
当我对另一个可执行文件(exec1
从 file1.c
编译而来)做类似的事情时,它为两个命令输出相同的值。
这两个命令应该输出相同的虚拟地址。不是吗?我显然错过了一些东西。有人可以解释到底发生了什么吗?这两个命令之间有什么区别。
除了像 -fPIE
这样的不寻常的事情,这里发生的是 gdb 命令 break function
实际上意味着 "break after the function prologue for function
"。这样,在命中断点时正确设置参数。
如果您想恰好在函数的第一条指令处中断,请使用 *
语法,例如:
(gdb) break *function
如果您这样做,地址可能会匹配。
我正在开发 Ubuntu 14.04 LTS。
我有一个从 file.c
编译而来的可执行文件 exec
。 file.c
使用静态库中的函数。例如,假设 fubar()
是 file.c
中使用的静态库的函数。
这是我注意到的事情。
nm exec | grep fubar
给出一定的值。
(在我的系统和我的可执行文件中,0808377f
)gdb ./exec
然后break fubar
给出不同的值。
(在我的系统和我的可执行文件中,0x8083785
)
当我对另一个可执行文件(exec1
从 file1.c
编译而来)做类似的事情时,它为两个命令输出相同的值。
这两个命令应该输出相同的虚拟地址。不是吗?我显然错过了一些东西。有人可以解释到底发生了什么吗?这两个命令之间有什么区别。
除了像 -fPIE
这样的不寻常的事情,这里发生的是 gdb 命令 break function
实际上意味着 "break after the function prologue for function
"。这样,在命中断点时正确设置参数。
如果您想恰好在函数的第一条指令处中断,请使用 *
语法,例如:
(gdb) break *function
如果您这样做,地址可能会匹配。