में रनटाइम पर लाइब्रेरी फीचर्स का पता लगाएं मैं सी में एक प्रोग्राम बनाने की कोशिश कर रहा हूं जिसमें कई साझा सुविधाएं हैं जो विभिन्न साझा पुस्तकालयों पर निर्भर करती हैं।सी
हमारे विषम कंप्यूटिंग क्लस्टर में उन सभी पुस्तकालयों को सभी सिस्टम पर उपलब्ध नहीं है (या अद्यतित)।
उदाहरण नए 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
तो, वहाँ ब्लॉक कि उन्हें इस्तेमाल से पहले पुस्तकालयों केवल उपयोग पर लोड करने के लिए इस तरह की जाँच करता है बल और करने के लिए एक तरीका है?
यह आपके क्लस्टर को थोड़ा अधिक सजातीय बनाने की कोशिश करने के लिए लंबे समय तक सुरक्षित हो सकता है। वैकल्पिक रूप से सबसे अच्छा समाधान उन सभी निष्पादकों को स्थिर-लिंक करना है जो इन असंगत रूप से बनाए रखा सिस्टम पर चलाना चाहिए, और उम्मीद है कि कम से कम वे दृढ़ता से संगत कर्नेल चलाते हैं। यदि आपका क्लस्टर बीएसडी चला रहा था, तो एएसपी। नेटबीएसडी तब आसान होगा, बशर्ते आपने ऐप को क्लस्टर में चल रहे सिस्टम के सबसे पुराने संस्करण पर लिंक किया हो। –
@ ग्रेगा। वूड्स मैं यही करता हूं कि मैं अपने sysadmins को कहता रहता हूं। लेकिन समस्या यह है: मैं एक सॉफ्टवेयर डेवलपर हूं। मुझे कोड लिखने और इसे चलाने की जरूरत है। मेरे पास क्लस्टर में व्यवस्थापक पहुंच भी नहीं है, इसलिए यह कोई विकल्प नहीं है। कर्नेल सभी लिनक्स हैं, लेकिन यह सुपरकंप्यूटर पर कम-शक्ति मशीनों और रेडहाट पर विभिन्न स्वादों में सेंटोस का मिश्रण है। –
फिर स्थैतिक लिंकिंग आपका सबसे अच्छा, और शायद केवल विकल्प है। यद्यपि कम से कम आम-denominator कर्नेल संस्करण खोजने के लिए आपको अपनी खुद की बिल्ड मशीन बनाना पड़ सकता है। ज्यादातर चीजों के लिए यह करना मुश्किल नहीं है। –