सी

2012-12-18 53 views
5

में रनटाइम पर लाइब्रेरी फीचर्स का पता लगाएं मैं सी में एक प्रोग्राम बनाने की कोशिश कर रहा हूं जिसमें कई साझा सुविधाएं हैं जो विभिन्न साझा पुस्तकालयों पर निर्भर करती हैं।सी

हमारे विषम कंप्यूटिंग क्लस्टर में उन सभी पुस्तकालयों को सभी सिस्टम पर उपलब्ध नहीं है (या अद्यतित)।

उदाहरण नए glibc ([email protected]@GLIBC_2.6, [email protected]@GLIBC_2.6) या पूरे साझा पुस्तकालयों जो या उपलब्ध नहीं हो सकता हो सकता है (libnuma, libR, libpbs) से प्रतीक हैं।

मुझे पता है कि मैं libdl उपयोग कर सकते हैं dlopen और dlsym के साथ प्रतीकों लोड करने के लिए है, लेकिन (इस समय 30 के आसपास) प्रतीकों में से एक कभी बढ़ती संख्या के लिए ऐसा करने में सबसे अच्छा कठिन है।

जहां तक ​​मैं समझता हूं कि लिनक्स में साझा पुस्तकालय डिफ़ॉल्ट रूप से आलसी लोड होते हैं, इसलिए वास्तव में इसका उपयोग होने तक एक प्रतीक की आवश्यकता नहीं होनी चाहिए।

लेकिन अगर मैं पहले से है कि जांच करने के लिए कोशिश तो यह निष्पादन शुरू में विफल रहता है:

#define _GNU_SOURCE 
#include <stdlib.h> 
#include <stdio.h> 
#include <stdint.h> 
#include <dlfcn.h> 
#include <sched.h> 

int main() { 

    void *lib_handle; 
    int (*fn)(void); 
    int x; 
    char *error; 

    lib_handle = dlopen("libc.so.6", RTLD_LAZY); 
    if (!lib_handle) 
    { 
     fprintf(stderr, "%s\n", dlerror()); 
     exit(1); 
    } 

    fn = dlsym(lib_handle, "sched_getcpu"); 
    if ((error = dlerror()) != NULL) 
    { 
     fprintf(stderr, "%s\n", error); 
     exit(1); 
    } 

    printf("%d\n", sched_getcpu()); 

    return 0; 
} 

संकलन प्रणाली पर जो सभी पुस्तकालयों है: एक और प्रणाली है जो एक कम है पर

$ icc test.c 
$ ./a.out 
10 

जीएलबीबीसी का हालिया संस्करण:

$ ./a.out 
./a.out: /lib64/libc.so.6: version `GLIBC_2.6' not found (required by ./a.out) 

यदि मैं उस पंक्ति को टिप्पणी करता हूं जो वास्तव मेंपर कॉल करता हैतो मैं बजाय कम सिस्टम पर मिलती है:

$ ./a.out 
/lib64/libc.so.6: undefined symbol: sched_getcpu 

तो, वहाँ ब्लॉक कि उन्हें इस्तेमाल से पहले पुस्तकालयों केवल उपयोग पर लोड करने के लिए इस तरह की जाँच करता है बल और करने के लिए एक तरीका है?

+0

यह आपके क्लस्टर को थोड़ा अधिक सजातीय बनाने की कोशिश करने के लिए लंबे समय तक सुरक्षित हो सकता है। वैकल्पिक रूप से सबसे अच्छा समाधान उन सभी निष्पादकों को स्थिर-लिंक करना है जो इन असंगत रूप से बनाए रखा सिस्टम पर चलाना चाहिए, और उम्मीद है कि कम से कम वे दृढ़ता से संगत कर्नेल चलाते हैं। यदि आपका क्लस्टर बीएसडी चला रहा था, तो एएसपी। नेटबीएसडी तब आसान होगा, बशर्ते आपने ऐप को क्लस्टर में चल रहे सिस्टम के सबसे पुराने संस्करण पर लिंक किया हो। –

+0

@ ग्रेगा। वूड्स मैं यही करता हूं कि मैं अपने sysadmins को कहता रहता हूं। लेकिन समस्या यह है: मैं एक सॉफ्टवेयर डेवलपर हूं। मुझे कोड लिखने और इसे चलाने की जरूरत है। मेरे पास क्लस्टर में व्यवस्थापक पहुंच भी नहीं है, इसलिए यह कोई विकल्प नहीं है। कर्नेल सभी लिनक्स हैं, लेकिन यह सुपरकंप्यूटर पर कम-शक्ति मशीनों और रेडहाट पर विभिन्न स्वादों में सेंटोस का मिश्रण है। –

+0

फिर स्थैतिक लिंकिंग आपका सबसे अच्छा, और शायद केवल विकल्प है। यद्यपि कम से कम आम-denominator कर्नेल संस्करण खोजने के लिए आपको अपनी खुद की बिल्ड मशीन बनाना पड़ सकता है। ज्यादातर चीजों के लिए यह करना मुश्किल नहीं है। –

उत्तर

1

glibc के साथ नहीं। यह एक असफल-सुरक्षित है और यह जगह पर है ताकि आप पैर में खुद को गोली मार न सकें। यदि GLIBC_2.6 प्रतीक परिभाषित नहीं किया गया था और देखा गया था, भले ही कोई अन्य गायब प्रतीकों न हों, तो आप ग्लिबैक (डेटा भ्रष्टाचार और दुर्घटनाओं) से कचरा परिणाम प्राप्त कर सकते हैं क्योंकि यह आगे संगत नहीं है।

यदि आपको ग्लिब स्तर पर संगतता की आवश्यकता है, तो आपको सबसे कम आम संस्करण के विरुद्ध निर्माण करने की आवश्यकता है।

+0

ठीक है, तो मुझे मैन्युअल रूप से glibc प्रतीकों को लोड करना होगा या सीधे 'syscall' का उपयोग करना होगा। फिलहाल मैं केवल दो सूचीबद्ध प्रतीकों के साथ असंगत हूं। अन्य पुस्तकालयों के बारे में क्या? –

+0

@ सर्जिल। अन्य पुस्तकालय सामान्य रूप से काम करते हैं। यदि आपके द्वारा प्रदान किए गए प्रतीकों की परिभाषा संगत हैं, तो वे काम करेंगे। –