シャード オブジェクト内のシンボルを見つけるには、 で開きますdlopen
。
void* foobar = dlopen ("/usr/local/lib/foobar.so", RTLD_NOW);
void* mysymbol = dlsym (foobar, "mysymbol");
更新これは、「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
いくつかの重複がありますが、これは小さな問題です。