[英]Detecting unresolved symbols in an ELF executable
假设我有两个文件:
// shared.c (will be compiled to 'shared.so')
#include <stdio.h>
int f() { printf("hello\n"); }
和
// exe.c (will be compiled to 'exe')
#include <stdio.h>
int f();
int main() {
int i;
scanf("%d", &i);
if (i == 5) f();
}
我将两个文件编译如下:
gcc -shared shared.c -o libshared.so
gcc exe.c -o exe -lshared -L.
当我运行exe
并键入5时,它将调用f然后退出。 但是,如果我从shared.c
删除f
并重新编译它,则仅当我键入5时,我才会得到运行时符号查找错误。有没有一种方法可以检查exe
是否具有其所有符号都可以独立于用户输入运行?案件? 最好不运行它。
您可以使用ldd -r exe
命令列出共享库的依赖关系。 这是我的不带f
函数的示例的输出:
$ LD_LIBRARY_PATH=. ldd -r ./exe
linux-vdso.so.1 (0x00007ffcfa7c3000)
libshared.so => ./libshared.so (0x00007f303a02e000)
libc.so.6 => /lib64/libc.so.6 (0x0000003e26c00000)
/lib64/ld-linux-x86-64.so.2 (0x0000003e26400000)
undefined symbol: f (./exe)
(不要在意LD_LIBRARY_PATH=.
部分。它用于告诉您在当前目录中查找共享库)
@tohava编译可执行文件并将其与共享库链接时,ld(链接程序)检查可执行文件所依赖的共享库列表中是否所有引用的符号均可用,如果未解析任何符号,将引发错误。
因此,我不确定从共享库中删除f()并重建可执行文件时如何设法获得运行时错误。 (我自己进行了练习,但得到了链接器错误)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.