gcc / LD - crear una nueva libc.so con __isoc99_sscanf @@ símbolo GLIBC_2.7 de glibc.2.6
-
01-10-2019 - |
Pregunta
Tengo una aplicación, lo que hace un error al intentar ejecutarlo:
/lib/libc.so.6: version `GLIBC_2.7' not found
Sin embargo, el único símbolo que necesita de glibc 2.7 es
__isoc99_sscanf@@GLIBC_2.7
Quiero escribir una pequeña función única "biblioteca" con este símbolo como alias para __sscanf ()
¿Cómo puedo hacer esto con gcc / ld?
Mi variante no es aceptada porque "@@" símbolos
int __isoc99_sscanf@@GLIBC_2.7(const char *, const char *, ...) __attribute__((alias("__sscanf")));
segunda variante es mi
#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");
pero termina con "nodo versión no encontrado para símbolo __isoc99_sscanf @@ GLIBC_2.7" error de enlazador.
Solución
He encontrado @felipec
s respuesta muy útiles. Además nuestra aplicación tenía que hacer alguna vinculación dinámica utilizando ocaml, y encontramos que el guión dado no funciona para este escenario, ya que hace que la aplicación sólo exportar el símbolo __isoc99_sscanf como global.
GLIBC_2.7 {
global: *;
};
el script anterior resuelve este problema y permite enlazador dinámico de ocaml para que funcione correctamente. usando la opción -D_GNU_SOURCE
por sí sola no era suficiente para evitar este problema ya que la dependencia de GLIBC_2.7 vino de un pre-compilados binaria nos estáticamente la vinculación con.
Otros consejos
Su segunda versión funciona con este script:
GLIBC_2.7 {
global: __isoc99_sscanf;
local: *;
};
El uso de -Wl,--version-script=script.txt
, sin embargo, no sé cómo acceder a la sscanf@GLIBC_2.4
originales.
De todos modos, tal vez usted quiere utilizar -D_GNU_SOURCE
lugar; a __isoc99_sscanf
evitar por completo.