首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >dlsym --获取重写的符号

dlsym --获取重写的符号
EN

Stack Overflow用户
提问于 2011-11-30 23:19:39
回答 2查看 2.6K关注 0票数 4

我有一个动态加载库的应用程序,它动态加载库...

在Windows中,我可以遍历所有加载的模块,查找我感兴趣的符号。我不知道在Unix/Linux环境下该怎么做。我知道我可能会对前两个符号使用dlsym(dlopen(0, flag))dlsym(RTLD_DEFAULT / RTLD_NEXT),并且知道要搜索的模块的顺序--我如何才能更深入地了解给定符号的所有定义?

EN

回答 2

Stack Overflow用户

发布于 2011-12-01 01:26:08

要在分片对象中查找元件,请使用dlopen打开它。

代码语言:javascript
复制
 void* foobar = dlopen ("/usr/local/lib/foobar.so", RTLD_NOW);
 void* mysymbol = dlsym (foobar, "mysymbol");

foo更新这里有一个程序,可以迭代所有名为"foo“的符号。这不是POSIX,而是GNU库。我几乎可以肯定POSIX不提供这样的功能。

代码语言:javascript
复制
#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;
}

下面是输出:

代码语言:javascript
复制
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

有一些副本,但这是一个小问题。

票数 6
EN

Stack Overflow用户

发布于 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上,它可能会有再次加载和初始化库的副作用,但在大多数情况下,这比尝试从卸载的库中调用函数要好。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8328249

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档