假设我有两个文件:
// 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
和types5,它会调用f,然后退出。 但是,如果我从shared.c
删除f
并重新编译它,只有当我input5时,才会得到一个运行时符号查找错误。有没有一种方法可以检查exe
是否有独立于用户input的所有符号案件? 最好不要运行它。
您可以使用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()并重建可执行文件时,如何设法得到运行时错误。 (我自己做了练习,并得到链接器错误)。