【问题标题】:Why does -O to gcc cause "stat" to resolve?为什么 -O to gcc 会导致“stat”解析?
【发布时间】:2013-05-11 19:18:53
【问题描述】:

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

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

在玩弄它之后,我发现如果我在编译期间将-O 提供给 gcc,则 stat() 开始按预期工作。我无法在网上找到任何迹象,说明为什么 -O of all things 修复未定义符号的问题(或者它只是掩盖错误而不是修复它?)。

【问题讨论】:

  • 您不需要链接任何特殊的库来获取stat。这是一个交叉编译环境,还是其他特殊的构建环境?
  • -On , n=0 无优化,n=1 ...n=3 所有优化, -O0 删除所有可能为代码提供替代执行形式的优化
  • 不只是一台普通的 RHEL6 机器。
  • 您说的是编译您的test-files.so 文件,而不是测试二进制文件,对吧?
  • 它们都是由同一个目录中的同一个 Makefile 构建的

标签: c linux shared-libraries glibc


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-19
    • 2020-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多