gcc/ld - 使用 glibc.2.6 中的 __isoc99_sscanf@@GLIBC_2.7 符号创建一个新的 libc.so
我有一个应用程序,当我尝试运行它时出现错误:
/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 的版本节点”错误结束。
I have an application, which does a error when I try to run it:
/lib/libc.so.6: version `GLIBC_2.7' not found
But the only symbol it needs from glibc 2.7 is
__isoc99_sscanf@@GLIBC_2.7
I want to write a small single function "library" with this symbol as alias to __sscanf()
How can I do this with gcc/ld?
My variant is not accepted because "@@" symbols
int __isoc99_sscanf@@GLIBC_2.7(const char *, const char *, ...) __attribute__((alias("__sscanf")));
second my variant is
#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");
but it ends with "version node not found for symbol __isoc99_sscanf@@GLIBC_2.7" error from linker.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您的第二个版本使用此脚本:
使用
-Wl,--version-script=script.txt
,但是,我不知道如何访问原始sscanf@GLIBC_2.4< /代码>。
不管怎样,也许你想使用 -D_GNU_SOURCE 来代替;完全避免
__isoc99_sscanf
。Your second version works with this script:
Using
-Wl,--version-script=script.txt
, however, I don't know how to access the originalsscanf@GLIBC_2.4
.Anyway, perhaps you would want to use
-D_GNU_SOURCE
instead; to avoid__isoc99_sscanf
altogether.我发现@felipec的回答非常有帮助。此外,我们的应用程序必须使用 ocaml 进行一些动态链接,我们发现给定的脚本不适用于此场景,因为它使应用程序仅将 __isoc99_sscanf 符号导出为全局符号。
上面的脚本解决了这个问题并允许 ocaml 的动态链接器正常工作。单独使用 -D_GNU_SOURCE 选项不足以避免此问题,因为对 GLIBC_2.7 的依赖来自我们静态链接的预构建二进制文件。
I found
@felipec
s answer very helpful. In addition our application had to do some dynamic linking using ocaml, and we found that the given script doesn't work for this scenario, since it makes the application only export the __isoc99_sscanf symbol as a global.the above script resolves this issue and allows ocaml's dynamic linker to work properly. using the
-D_GNU_SOURCE
option alone wasn't enough to avoid this issue since the dependency on GLIBC_2.7 came from a prebuilt binary we were statically linking with.