为什么-O到gcc导致“stat”解决?

时间:2013-05-16 18:51:27

标签: c linux shared-libraries glibc

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

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

在玩完之后我发现如果我在编译期间将-O提供给gcc,stat()会按预期开始工作。我无法在网上找到任何关于为什么-O所有东西修复未定义符号的问题(或者只是掩盖错误而不是修复它?)的任何指示。

1 个答案:

答案 0 :(得分:1)

极有可能,优化触发了无法访问代码的删除,完全不需要符号。

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

使用优化进行编译,删除了名为stat的无法访问的代码,因此在调用dlopen()时无需解析该符号。