2010-09-07 6 views
5

ich eine Anwendung, die einen Fehler macht, wenn ich versuche, es zu laufen:gcc/ld - ein neues libc.so mit __isoc99_sscanf erstellen @@ GLIBC_2.7 Symbol von glibc.2.6

/lib/libc.so.6: version `GLIBC_2.7' not found 

Aber die nur Symbol aus glibc benötigt 2.7 ist

[email protected]@GLIBC_2.7 

ich mit diesem Symbol eine kleine einzelne Funktion „Bibliothek“ schreiben will, als Alias ​​__sscanf()

wie kann ich das mit gcc/ld?

Meine Variante nicht akzeptiert wird, weil "@@" Symbole

int [email protected]@GLIBC_2.7(const char *, const char *, ...) __attribute__((alias("__sscanf"))); 

an zweiter Stelle meine Variante ist

#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,[email protected]@GLIBC_2.7"); 
    __asm__(".symver __isoc99_sscanf1,[email protected]@GLIBC_2.7"); 

aber es endet mit „-Version Knoten nicht für Symbol gefunden __isoc99_sscanf @@ GLIBC_2.7 "Fehler vom Linker.

Antwort

2

Ich fand @felipec s Antwort sehr hilfreich. Darüber hinaus musste unsere Anwendung eine dynamische Verknüpfung mit ocaml durchführen, und wir fanden, dass das angegebene Skript für dieses Szenario nicht funktioniert, da die Anwendung nur das __isoc99_sscanf-Symbol als global exportiert.

Das obige Skript behebt dieses Problem und ermöglicht es dem dynamischen Linker von ocaml, ordnungsgemäß zu funktionieren. Die Verwendung der Option -D_GNU_SOURCE alleine reichte nicht aus, um dieses Problem zu vermeiden, da die Abhängigkeit von GLIBC_2.7 von einer vorkompilierten Binärdatei kam, mit der wir statisch verbunden waren.

4

Ihre zweite Version funktioniert mit diesem Skript:

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

-Wl,--version-script=script.txt Verwendung jedoch weiß ich nicht, wie das Original [email protected]_2.4 zuzugreifen.

Wie auch immer, vielleicht möchten Sie stattdessen -D_GNU_SOURCE verwenden; zu vermeiden __isoc99_sscanf insgesamt.

+0

Die Anwendung ist eine Binärdatei, also hat es bereits __isoc99_scanf – osgx

Verwandte Themen