首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >gcc/ld -从glibc.2.6创建一个带有__isoc99_sscanf@@GLIBC_2.7符号的新libc.so

gcc/ld -从glibc.2.6创建一个带有__isoc99_sscanf@@GLIBC_2.7符号的新libc.so
EN

Stack Overflow用户
提问于 2010-09-08 00:55:35
回答 2查看 6.8K关注 0票数 6

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

代码语言:javascript
运行
复制
/lib/libc.so.6: version `GLIBC_2.7' not found

但glibc2.7唯一需要的符号是

代码语言:javascript
运行
复制
__isoc99_sscanf@@GLIBC_2.7 

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

我该如何使用gcc/ld进行此操作?

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

代码语言:javascript
运行
复制
 int __isoc99_sscanf@@GLIBC_2.7(const char *, const char *, ...) __attribute__((alias("__sscanf")));

第二,我的变体是

代码语言:javascript
运行
复制
#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");

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-28 15:34:04

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

代码语言:javascript
运行
复制
GLIBC_2.7 {
 global: *;
};

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

票数 2
EN

Stack Overflow用户

发布于 2010-09-27 12:10:35

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

代码语言:javascript
运行
复制
GLIBC_2.7 {
 global: __isoc99_sscanf;
 local: *;
};

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

无论如何,为了完全避免__isoc99_sscanf,您可能会希望使用-D_GNU_SOURCE

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3660826

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档