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.

¿Fue útil?

Solución

He encontrado @felipecs 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top