我想dlerror獲得()失敗的負載時告訴我的所有10個人失蹤符號。
您不能:裝載機儘快報告錯誤爲它發現該庫不能(即一旦它發現的第一個缺少符號)加載。裝載機沒有任何意義,所以它不會。
但是,您可以使用LD_PRELOAD
和LD_TRACE_LOADED_OBJECTS
來模擬ldd -r
所做的操作,以獲得完整答案。例如:
$ cat main.c
#include <dlfcn.h>
#include <stdio.h>
int main()
{
void *p = dlopen("./foo.so", RTLD_NOW);
if (p == NULL) {
printf("%s\n", dlerror());
return 1;
}
return 0;
}
$ cat foo.c
int bar(), baz(); // not defined anywhere
int foo() {
return bar() + baz();
}
$ gcc main.c -ldl; gcc -fPIC -shared -o foo.so foo.c
$ ./a.out
./foo.so: undefined symbol: baz # only the first symbol is reported
$ ldd -r ./a.out
linux-vdso.so.1 => (0x00007fff52ddc000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f158e48d000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f158e0ce000)
/lib64/ld-linux-x86-64.so.2 (0x00007f158e6b2000)
那是不行的,因爲你的程序永遠不會執行,因而不會裝載foo.so
。但LD_PRELOAD
營救:
$ LD_BIND_NOW=1 LD_WARN=1 LD_TRACE_LOADED_OBJECTS=1 LD_PRELOAD=./foo.so ./a.out
linux-vdso.so.1 => (0x00007fff3c1b6000)
./foo.so (0x00007ffd33212000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007ffd3300e000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ffd32c4f000)
/lib64/ld-linux-x86-64.so.2 (0x00007ffd33414000)
undefined symbol: baz (./foo.so)
undefined symbol: bar (./foo.so)
Voilà:所有未解決的符號現在報告。