使用 GDB Python API 从符号名称获取全局符号的地址
Get address of a global symbol from symbol name with GDB Python API
如果我在 GDB 中知道全局符号的名称,有没有办法在我的二进制文件中获取它的地址 Python API?
python print(gdb.parse_and_eval('symbol').address)
是获取此值的正确方法吗?
好吧,您已经正确回答了自己。很容易验证:
(gdb) p &t
= (time_t *) 0x562076476018 <t>
(gdb) python print(gdb.parse_and_eval('t').address)
0x562076476018 <t>
(gdb)
接受的答案并不完全正确。
它仅在当前范围内没有同名局部符号时有效。
举个例子:
int foo = 0;
int main(int argc, char **argv) {
int foo = 0;
return 0;
}
如果在 main()
处中断,gdb.parse_and_eval("foo")
将找到局部变量 foo
而不是全局符号。
您可以通过gdb.lookup_global_symbol("foo")
获取全局符号。
import gdb
gdb.execute("break main")
gdb.execute("run")
print("Global symbol:")
print(gdb.lookup_global_symbol("foo").value().address)
print("Local symbol:")
print(gdb.parse_and_eval("foo").address)
结果:
Breakpoint 1 at 0x1124: file symbol-tests.c, line 6.
Breakpoint 1, main (argc=1, argv=0x7fffffffdb68) at symbol-tests.c:6
6 int foo = 0;
Global symbol:
0x55555555802c <foo>
Local symbol:
0x7fffffffda6c
如果我在 GDB 中知道全局符号的名称,有没有办法在我的二进制文件中获取它的地址 Python API?
python print(gdb.parse_and_eval('symbol').address)
是获取此值的正确方法吗?
好吧,您已经正确回答了自己。很容易验证:
(gdb) p &t
= (time_t *) 0x562076476018 <t>
(gdb) python print(gdb.parse_and_eval('t').address)
0x562076476018 <t>
(gdb)
接受的答案并不完全正确。 它仅在当前范围内没有同名局部符号时有效。
举个例子:
int foo = 0;
int main(int argc, char **argv) {
int foo = 0;
return 0;
}
如果在 main()
处中断,gdb.parse_and_eval("foo")
将找到局部变量 foo
而不是全局符号。
您可以通过gdb.lookup_global_symbol("foo")
获取全局符号。
import gdb
gdb.execute("break main")
gdb.execute("run")
print("Global symbol:")
print(gdb.lookup_global_symbol("foo").value().address)
print("Local symbol:")
print(gdb.parse_and_eval("foo").address)
结果:
Breakpoint 1 at 0x1124: file symbol-tests.c, line 6.
Breakpoint 1, main (argc=1, argv=0x7fffffffdb68) at symbol-tests.c:6
6 int foo = 0;
Global symbol:
0x55555555802c <foo>
Local symbol:
0x7fffffffda6c