要在分片对象中查找符号,请使用以将其打开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)
有一些重复,但这是一个小问题.