1

与 Win32 相同:

GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, (LPCTSTR)(void*)(myFunc), &h);

http://www.kernel.org/doc/man-pages/online/pages/man3/dlsym.3.html没有帮助。

4

3 回答 3

2

使用dladdr. 文档在这里

于 2012-04-09T05:15:50.557 回答
0

本身不是,不;如果符号被编译而不是通过dlopen()/访问dlsym(),则没有要返回的句柄。(句柄抽象的存在只是为了dlsym()对它从何处加载符号进行精细控制;除了通过链接器脚本外,对原始链接没有这种控制。)在事件的正常过程中,对象只是简单地open()编辑和mmap()编辑,其他细节隐藏在ld.so其中,只能通过RTLD_DEFAULTRTLD_NEXT参数间接访问dlsym()。如果您正在使用dlopen(),则需要跟踪您的句柄。

于 2012-04-09T02:36:26.743 回答
0

我知道的唯一方法是解析/proc/self/maps(和/或也许smaps)的内容,然后使用符号地址从映射的边界.so(开始及其大小)计算函数所在的映射模块。

注意:/proc/self是当前进程(带有 ID <pid>)元信息的符号链接(在 Linux 上),即/proc/<pid>.

您可以使用这些信息的一些编程接口。

编辑:啊,dladdr()那个界面也是如此。

于 2012-04-09T02:48:28.357 回答