如何从 Linux C 中的库和地址获取函数名称

How to Get A Function Name From a Library and Address in Linux C

我正在学习如何使用函数 dlopen、dlsym 等来获取给定库中给定函数的地址,但我该如何做相反的事情?例如,如果我知道我的进程当前位于 libgtk-x11-2.0.so.0 中的 gtk_main+0xa7,我如何确定它是什么函数?

提前感谢您的帮助!

如果您知道与对象 space 相关的地址,您可以使用 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" 符号(在对象内部是 "really")。当然这些地址是跟对象相关的,不是你程序中的地址space。

请注意,您只会获得条目的起始地址,因此如果您在 函数中获得一个地址,您应该计算最近的地址。查看 nm 联机帮助页以获取其他可用数据。

您至少可以通过查看 /proc/PID/maps 找到给定程序的对象映射位置。