2015-10-27 31 views
0

我正在学习如何使用函数dlopen,dlsym等来获取给定库中给定函数的地址,但是如何执行对面?例如,如果我知道我的进程当前位于libgtk-x11-2.0.so.0中的gtk_main + 0xa7,那我该如何确定它是什么功能?如何从Linux中的库和地址获取函数名称C

感谢您的帮助提前!

+1

通过阅读加号前的内容。 :D 0xa7是gtk_main中的一个地方,它带有一些调试信息,可翻译成源文件中的一行。 – PSkocik

+1

您必须将符号转换为地址(和/或偏移量)。这只有在你有链接的代码可用符号时才有可能。如果你正在做一些以'gtk_main + 0xa7'结尾的东西,那么可能的符号不会比这更深(这将需要得到一个行号)。可能用'-g'标志重新编译你的库会产生更好的符号。 – mah

+0

您可以看看'nm'工具,它可以为您提供静态/动态对象的内容。 – hexasoft

回答

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找到给定程序映射的对象。

+0

这个效果很好。非常感谢你! – user2062604

相关问题