【问题标题】:gcc/ld - create a new libc.so with __isoc99_sscanf@@GLIBC_2.7 symbol from glibc.2.6gcc/ld - 使用来自 glibc.2.6 的 __isoc99_sscanf@@GLIBC_2.7 符号创建一个新的 libc.so
【发布时间】:2011-04-09 07:37:00
【问题描述】:

我有一个应用程序,当我尝试运行它时出错:

/lib/libc.so.6: version `GLIBC_2.7' not found

但它需要的 glibc 2.7 中唯一的符号是

__isoc99_sscanf@@GLIBC_2.7 

我想用这个符号作为 __sscanf() 的别名写一个小的单一函数“库”

如何使用 gcc/ld 做到这一点?

我的变体不被接受,因为“@@”符号

 int __isoc99_sscanf@@GLIBC_2.7(const char *, const char *, ...) __attribute__((alias("__sscanf")));

第二个我的变种是

#include <stdarg.h>
int __isoc99_sscanf1(const char *a, const char *b, va_list args)
{
   int i;
   va_list ap;
   va_copy(ap,args);
   i=sscanf(a,b,ap);
   va_end(ap);
   return i;
}

   // __asm__(".symver __isoc99_sscanf,__isoc99_sscanf@@GLIBC_2.7");
    __asm__(".symver __isoc99_sscanf1,__isoc99_sscanf@@GLIBC_2.7");

但它以来自链接器的“未找到符号 __isoc99_sscanf@@GLIBC_2.7 的版本节点”错误结尾。

【问题讨论】:

    标签: gcc linker ld scanf linker-scripts


    【解决方案1】:

    您的第二个版本使用此脚本:

    GLIBC_2.7 {
     global: __isoc99_sscanf;
     local: *;
    };
    

    使用-Wl,--version-script=script.txt,但是不知道怎么访问原来的sscanf@GLIBC_2.4

    无论如何,也许您想改用-D_GNU_SOURCE;完全避免__isoc99_sscanf

    【讨论】:

    • 应用程序是二进制的,所以它已经有__isoc99_scanf
    【解决方案2】:

    我发现@felipecs 的回答很有帮助。此外,我们的应用程序必须使用 ocaml 进行一些动态链接,我们发现给定的脚本不适用于这种情况,因为它使应用程序仅将 __isoc99_sscanf 符号导出为全局符号。

    GLIBC_2.7 {
     global: *;
    };
    

    上面的脚本解决了这个问题,并允许 ocaml 的动态链接器正常工作。仅使用 -D_GNU_SOURCE 选项不足以避免此问题,因为对 GLIBC_2.7 的依赖来自我们静态链接的预构建二进制文件。

    【讨论】:

      猜你喜欢
      • 2019-02-12
      • 2016-05-11
      • 1970-01-01
      • 1970-01-01
      • 2020-09-24
      • 2013-01-29
      • 2018-05-06
      • 2015-01-24
      • 1970-01-01
      相关资源
      最近更新 更多