我可以从linux上的函数地址获取模块句柄吗?

时间:2012-04-09 02:21:34

标签: linux ld

与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没有帮助。

3 个答案:

答案 0 :(得分:2)

使用dladdr。文档here

答案 1 :(得分:0)

本身,不;如果符号是在编译而不是通过dlopen() / dlsym()访问的,那么就没有要返回的句柄。 (句柄抽象仅用于使dlsym()能够精确控制其加载符号的位置;除了通过链接描述文件之外,对原始链接没有这样的控制。)在正常的事件过程中,对象只是{ {1}} ed和open() ed,其他详细信息隐藏在mmap()中,只能通过ld.soRTLD_DEFAULT参数间接访问RTLD_NEXT。如果您使用dlsym(),则需要跟踪您的句柄。

答案 2 :(得分:0)

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

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

可能有一些编程接口可以使用这些信息。

编辑:啊,所以/proc/<pid>就是那个界面。