2010-09-07 16 views
5

से __isoc99_sscanf साथ @@ एक नया libc.so GLIBC_2.7 प्रतीक मैं एक आवेदन पत्र है, जो एक त्रुटि करता है जब मैं इसे चलाने के लिए कोशिश बनाने केवल प्रतीक यह glibc 2.7 से की जरूरत हैजीसीसी/ld glibc.2.6

[email protected]@GLIBC_2.7 

मैं उर्फ ​​__sscanf के रूप में इस प्रतीक() के साथ एक छोटे एकल समारोह "पुस्तकालय" लिखना चाहते है

मैं कैसे जीसीसी/ld के साथ ऐसा कर सकते हैं?

मेरे संस्करण

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

दूसरा मेरी संस्करण क्योंकि "@@" प्रतीकों स्वीकार नहीं किया है

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

है लेकिन यह "के साथ संस्करण नोड @@ GLIBC_2.7 __isoc99_sscanf प्रतीक के लिए नहीं मिला समाप्त होता है "लिंकर से त्रुटि।

उत्तर

2

मुझे @felipec का उत्तर बहुत उपयोगी मिला। इसके अलावा हमारे आवेदन को ओकंपल का उपयोग करके कुछ गतिशील लिंकिंग करना पड़ा, और हमने पाया कि दी गई स्क्रिप्ट इस परिदृश्य के लिए काम नहीं करती है, क्योंकि यह एप्लिकेशन को वैश्विक रूप से __isoc99_sscanf प्रतीक निर्यात करता है।

GLIBC_2.7 { 
global: *; 
}; 

ऊपर स्क्रिप्ट इस समस्या का समाधान और ocaml की गतिशील लिंकर ठीक से काम करने की अनुमति देता है। -D_GNU_SOURCE विकल्प का उपयोग अकेले इस मुद्दे से बचने के लिए पर्याप्त नहीं था क्योंकि GLIBC_2.7 पर निर्भरता पूर्वनिर्धारित बाइनरी से आई थी, हम स्थिर रूप से लिंक कर रहे थे।

4

आपका दूसरा संस्करण इस स्क्रिप्ट के साथ काम करता है:

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

-Wl,--version-script=script.txt का उपयोग करते हुए, फिर भी, मैं मूल [email protected]_2.4 तक पहुंचने का तरीका पता नहीं है।

वैसे भी, शायद आप -D_GNU_SOURCE का उपयोग करना चाहते हैं; __isoc99_sscanf से पूरी तरह से बचने के लिए।

+0

एप्लिकेशन एक बाइनरी है, इसलिए इसमें पहले से ही __isoc99_scanf है – osgx