dlsym - 得到被覆盖的符号

cie*_*zdz 4 c unix symbols dlopen dlsym

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

在Windows中,我能够迭代所有加载的模块,寻找我感兴趣的符号.不知道如何在Unix/Linux环境中这样做.我知道我可以使用dlsym(dlopen(0, flag))dlsym(RTLD_DEFAULT / RTLD_NEXT)前两个符号并知道要搜索的模块的顺序 - 我怎样才能更深入地获得给定符号的所有定义?

n. *_* m. 6

要在分片对象中查找符号,请使用以将其打开dlopen.

 void* foobar = dlopen ("/usr/local/lib/foobar.so", RTLD_NOW);
 void* mysymbol = dlsym (foobar, "mysymbol");
Run Code Online (Sandbox Code Playgroud)

更新这是一个迭代所有名为"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;
}
Run Code Online (Sandbox Code Playgroud)

这是输出:

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
Run Code Online (Sandbox Code Playgroud)

有一些重复,但这是一个小问题.