试图搜索,但没有找到任何东西。每当我尝试编译共享对象和链接到它的测试二进制文件时,我都会收到此错误:
[root@hypervisor test-files]# ./test
./test: symbol lookup error: ./test-files.so: undefined symbol: stat
[root@hypervisor test-files]#
在玩完之后我发现如果我在编译期间将-O
提供给gcc,stat()会按预期开始工作。我无法在网上找到任何关于为什么-O所有东西修复未定义符号的问题(或者只是掩盖错误而不是修复它?)的任何指示。/ p>
答案 0 :(得分:1)
极有可能,优化触发了无法访问代码的删除,完全不需要符号。
构建test-files.so
共享对象时,您可能没有使用C编译器,而是直接调用ld
。因此,test-files.so
所具有的任何库依赖项都不会出现。动态加载文件会使其尝试使用test
二进制文件中已有的符号解析符号,但无法找到它。
使用优化进行编译,删除了名为stat
的无法访问的代码,因此在调用dlopen()
时无需解析该符号。