2010-09-07 21 views
5

yeni @@ __isoc99_sscanf ile libc.so GLIBC_2.7 simgesi oluşturmak o glibc'nin 2.7'den ihtiyacı olan tek simge ben takma __sscanf olarak bu sembol() ile küçük tek işlevi "kütüphane" yazmak istiyorumgcc/ld bunu çalıştırmayı denediğinizde bir hata yapar ben bir uygulama var glibc.2.6

[email protected]@GLIBC_2.7 

olduğunu

nasıl gcc/ld ile yapabilirsiniz?

Benim varyant

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

ikinci benim varyant sembolleri "@@" çünkü kabul edilmez

#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"); 

ama @@ GLIBC_2.7 __isoc99_sscanf sembolü için not found sürüm düğümü" ile biter msgstr "bağlayıcıdan hata.

cevap

2

@felipec s yanıtını çok yararlı buldum. Buna ek olarak, uygulamamız ocaml kullanarak dinamik bir bağlantı yapmak zorundaydı ve verilen senaryoların bu senaryo için çalışmadığını, çünkü uygulamanın sadece __isoc99_sscanf sembolünü global olarak ihraç etmesini sağladığını gördük. Yukarıdaki betik bu sorunu çözmekte ve ocaml'in dinamik linker'ının düzgün çalışmasına izin vermektedir. Tek başına -D_GNU_SOURCE seçeneğini kullanmak, GLIBC_2.7 bağımlılığı statik olarak bağlandığımız önceden oluşturulmuş bir ikili yazılımdan geldiğinden bu sorunu önlemek için yeterli değildi.

4

Sizin ikinci sürümü bu komut ile çalışır: -Wl,--version-script=script.txt kullanma

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

, ancak, orijinal [email protected]_2.4 erişmek nasıl bilmiyorum.

Yine de, bunun yerine -D_GNU_SOURCE kullanmak istersiniz; __isoc99_sscanf'dan kaçınmak için.

+0

Uygulama bir ikili, bu yüzden zaten __isoc99_scanf var – osgx

İlgili konular