gcc/ld - create a new libc.so with __isoc99_sscanf@@GLIBC_2.7 symbol from glibc.2.6

不问归期 提交于 2019-11-27 15:18:44

问题


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.


回答1:


I found @felipecs 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.

GLIBC_2.7 {
 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.




回答2:


Your second version works with this script:

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

Using -Wl,--version-script=script.txt, however, I don't know how to access the original sscanf@GLIBC_2.4.

Anyway, perhaps you would want to use -D_GNU_SOURCE instead; to avoid __isoc99_sscanf altogether.



来源:https://stackoverflow.com/questions/3660826/gcc-ld-create-a-new-libc-so-with-isoc99-sscanfglibc-2-7-symbol-from-glibc

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!