我有一个动态加载库的应用程序,它动态加载库...
在Windows中,我可以遍历所有加载的模块,查找我感兴趣的符号。我不知道在Unix/Linux环境下该怎么做。我知道我可能会对前两个符号使用dlsym(dlopen(0, flag))或dlsym(RTLD_DEFAULT / RTLD_NEXT),并且知道要搜索的模块的顺序--我如何才能更深入地了解给定符号的所有定义?
发布于 2011-12-01 01:26:08
要在分片对象中查找元件,请使用dlopen打开它。
void* foobar = dlopen ("/usr/local/lib/foobar.so", RTLD_NOW);
void* mysymbol = dlsym (foobar, "mysymbol");foo更新这里有一个程序,可以迭代所有名为"foo“的符号。这不是POSIX,而是GNU库。我几乎可以肯定POSIX不提供这样的功能。
#define _GNU_SOURCE
#include <link.h>
#include <dlfcn.h>
#include <stdio.h>
void doit (const char* s)
{
void* obj = dlopen (s, RTLD_LAZY);
void* fcn = dlsym (obj, "foo");
if (fcn)
printf ("Object %s has 'foo' at addr %p\n", *s ? s : "(exe)", fcn);
}
int cb (struct dl_phdr_info *info, size_t size, void *data)
{
doit (info->dlpi_name);
return 0;
}
int main ()
{
dl_iterate_phdr (cb, 0);
return 0;
}下面是输出:
Object (exe) has 'foo' at addr 0xb76f8418
Object (exe) has 'foo' at addr 0xb76f8418
Object /tmp/libfoo.so has 'foo' at addr 0xb76f8418
Object /tmp/libfoo1.so has 'foo' at addr 0xb76f5418
Object /tmp/libfoo2.so has 'foo' at addr 0xb76f2418有一些副本,但这是一个小问题。
发布于 2011-12-05 08:07:37
回答自己的问题,使寻找解决方案的人的生活变得更容易。没有统一的方法,想要在加载的模块上迭代的人应该搜索以下命令/数据类型(请专家对此发表评论):
Windows:
MODULEENTRY32、CreateToolhelp32Snapshot、Module32First、Module32Next
Linux:
正如N.M.的答案中所述,当找到合适的模块时,从回调中返回非零值(结束循环)。
AIX:
loadquery(L_GETINFO,buffer,size),结构ld_info。
HP-UX:
dlget、dlgetname (如果需要模块路径)。
Solaris:
ldinfo,Link_map。
此外,我建议dlopen模块,并从一个新的句柄获取符号,以使库的引用计数递增,从而防止它被卸载。至少在AIX上,它可能会有再次加载和初始化库的副作用,但在大多数情况下,这比尝试从卸载的库中调用函数要好。
https://stackoverflow.com/questions/8328249
复制相似问题