我正在学习如何使用函数dlopen,dlsym等来获取给定库中给定函数的地址,但是我该怎么做呢?例如,如果我知道我的进程当前位于libgtk-x11-2.0.so.0中的gtk_main + 0xa7,我该如何确定它是什么函数?
提前感谢您的帮助!
答案 0 :(得分:0)
如果您知道与对象空间相关的地址,则可以使用nm
。在我自己的libgtk-x11上......它给出了:
# nm -D /usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so.0.2400.23
000000000006da20 T gtk_about_dialog_get_artists
000000000006d800 T gtk_about_dialog_get_authors
000000000006d260 T gtk_about_dialog_get_comments
…
动态符号需要选项-D
,您应该只看一下" T"符号("真的"在对象内)。当然这些地址与对象有关,而不是你的程序空间。
请注意,您只会获得条目的起始地址,因此如果您在内部获得地址,则必须计算最近的地址。有关其他可用数据,请查看nm
联机帮助页。
至少可以通过查看/ proc / PID / maps找到给定程序的对象映射位置。