GCC/LD-使用__isoc99_sscanf @@@glibc_2.7创建一个新的libc.so,来自glibc.2.6
-
01-10-2019 - |
题
我有一个应用程序,当我尝试运行它时会出现错误:
/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”链接器中的错误。
解决方案
我发现 @felipec
S回答非常有帮助。此外,我们的应用程序必须使用OCAML进行一些动态链接,我们发现给定的脚本对这种情况不起作用,因为它使应用程序仅导出__isoc99_sscanf符号为全局。
GLIBC_2.7 {
global: *;
};
上面的脚本解决了此问题,并允许OCAML的动态链接器正常工作。使用 -D_GNU_SOURCE
仅选项就不足以避免此问题,因为对glibc_2.7的依赖性来自我们静态链接的预构建的二进制。
其他提示
您的第二版与此脚本一起使用:
GLIBC_2.7 {
global: __isoc99_sscanf;
local: *;
};
使用 -Wl,--version-script=script.txt
, 但是,我不知道如何访问原始 sscanf@GLIBC_2.4
.
无论如何,也许您想使用 -D_GNU_SOURCE
反而;避免 __isoc99_sscanf
共。
不隶属于 StackOverflow