3

试图进行搜索,但没有找到任何东西。每当我尝试编译共享对象和链接到它的测试二进制文件时,我都会收到此错误:

[root@hypervisor test-files]# ./test
./test: symbol lookup error: ./test-files.so: undefined symbol: stat
[root@hypervisor test-files]#

在玩弄它之后,我发现如果我-O在编译期间向 gcc 提供数据,stat() 就会按预期开始工作。我无法在网上找到任何关于为什么 -O解决未定义符号问题的任何迹象(或者它只是掩盖错误而不是修复它?)。

4

1 回答 1

1

很可能,优化触发了无法访问的代码的删除,完全消除了对符号的需求。

当您构建test-files.so共享对象时,您可能没有使用 C 编译器,而是ld直接调用。因此,任何test-files.so以前的库依赖项都不存在。动态加载文件将使其尝试使用test二进制文件中已有的符号解析符号,并且无法找到它。

使用优化进行编译删除了调用的不可达代码,stat因此不需要在调用时解析符号dlopen()

于 2013-05-16T18:54:15.667 回答