gcc / ld - 使用glibc.2.6中的__isoc99_sscanf @@ GLIBC_2.7符号创建一个新的libc.so

时间:2010-09-07 16:55:35

标签: gcc linker ld scanf linker-scripts

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

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

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

__isoc99_sscanf@@GLIBC_2.7 

我想写一个小的单个函数“library”,用这个符号作为__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的版本节点”结束。

2 个答案:

答案 0 :(得分:4)

您的第二个版本适用于此脚本:

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

但是,使用-Wl,--version-script=script.txt,我不知道如何访问原始sscanf@GLIBC_2.4

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

答案 1 :(得分:2)

我发现@felipec的答案非常有用。此外,我们的应用程序必须使用ocaml进行一些动态链接,并且我们发现给定的脚本不适用于此场景,因为它使应用程序仅将__isoc99_sscanf符号导出为全局。

GLIBC_2.7 {
 global: *;
};

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