के लिए ग्लिबैक संस्करण की जांच करें मेरे पास मेरे सिस्टम पर दो जीसीसी कंपाइलर्स स्थापित हैं, एक gcc 4.1.2
(डिफ़ॉल्ट) है और दूसरा gcc 4.4.4
है। मैं gcc 4.4.4
द्वारा उपयोग किए गए libc संस्करण को कैसे देख सकता हूं, क्योंकि /lib/libc.so.6
gcc 4.1.2
द्वारा उपयोग किए गए glibc को दिखाता है, क्योंकि यह डिफ़ॉल्ट कंपाइलर है।किसी विशेष जीसीसी कंपाइलर
उत्तर
एक परीक्षण कार्यक्रम (उदाहरण के glibc-version.c
के लिए इसे नाम) लिखें:
#include <stdio.h>
#include <stdlib.h>
#include <gnu/libc-version.h>
int main(int argc, char *argv[]) {
printf("GNU libc version: %s\n", gnu_get_libc_version());
exit(EXIT_SUCCESS);
}
और जीसीसी-4.4 संकलक के साथ यह संकलन:
gcc-4.4 glibc-version.c -o glibc-version
जब आप ./glibc-version
निष्पादित इस्तेमाल किया glibc संस्करण है दिखाया गया है।
यह मेरे लिए काम करता है, लेकिन यह कहां है? मैं देख रहा हूं [glibc 2.7 डॉक्स पर] (http://www.gnu.org/software/libc/manual/html_mono/libc.html) लेकिन मुझे यह नहीं मिल रहा है। –
फ़ंक्शन ग्नुलिब का हिस्सा है: https://www.gnu.org/software/gnulib/manual/gnulib.html – R1tschY
http://man7.org/linux/man-pages/man3/gnu_get_libc_version.3.html – Adam
उपयोग -print-file-name
gcc
विकल्प:
$ gcc -print-file-name=libc.so
/usr/lib/gcc/x86_64-redhat-linux/4.5.1/../../../../lib64/libc.so
पथ देता है। अब:
$ file /usr/lib/gcc/x86_64-redhat-linux/4.5.1/../../../../lib64/libc.so
/usr/lib/gcc/x86_64-redhat-linux/4.5.1/../../../../lib64/libc.so: ASCII C program text
$ cat /usr/lib/gcc/x86_64-redhat-linux/4.5.1/../../../../lib64/libc.so
/* GNU ld script
Use the shared library, but some functions are only in
the static library, so try that secondarily. */
OUTPUT_FORMAT(elf64-x86-64)
GROUP (/lib64/libc.so.6 /usr/lib64/libc_nonshared.a AS_NEEDED (/lib64/ld-linux-x86-64.so.2))
एक लिंकर स्क्रिप्ट की तरह दिखता है। libc
लिनक्स पर विशेष है कि यह क्रियान्वित किया जा सकता:
$ /lib64/libc.so.6
GNU C Library stable release version 2.13, by Roland McGrath et al.
Copyright (C) 2011 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
Compiled by GNU CC version 4.5.1 20100924 (Red Hat 4.5.1-4).
Compiled on a Linux 2.6.35 system on 2011-08-05.
Available extensions:
Support for some architectures added on, not maintained in glibc core.
The C stubs add-on version 2.1.2.
crypt add-on version 2.1 by Michael Glad and others
GNU Libidn by Simon Josefsson
Native POSIX Threads Library by Ulrich Drepper et al
BIND-8.2.3-T5B
RT using linux kernel aio
libc ABIs: UNIQUE IFUNC
For bug reporting instructions, please see:
<http://www.gnu.org/software/libc/bugs.html>.
ओह, मैंने सोचा कि आपको पथ की आवश्यकता है, मेरा बुरा। –
मुझे शक है अगर आप एक से अधिक glibc अपने system.But ldd -v <path/to/gcc-4.x>
में स्थापित किया है आप का इस्तेमाल किया glibc देना चाहिए।
और भी आसान
उपयोग ldd --version
यह glibc संस्करण यानी इस्तेमाल किया जा रहा
$ ldd --version
ldd (GNU libc) 2.17
Copyright (C) 2012 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
...
जो चल रहा है के रूप में एक ही परिणाम है लौट जाना मेरी libc लाइब्रेरी
$ /lib/libc.so.6
GNU C Library (GNU libc) stable release version 2.17, by Roland McGrath et al.
Copyright (C) 2012 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
...
उपरोक्त आदेशों के परिणाम समान नहीं हैं। मेरे कंप्यूटर पर: जीएनयू libc संस्करण: 2.17, एलडी-लिनक्स-x86-64.so.2 (GLIBC_2.3) => /lib64/ld-linux-x86-64.so.2 ?? – Adam
आप कंपाइलर के जीएलबीबी संस्करण की जांच के लिए स्ट्रिंग कमांड का उपयोग कर सकते हैं। उच्चतम संस्करण लागू है।
ubuntu1604:extra$ strings ./arm-unknown-linux-gnueabi/bin/arm-unknown-linux-gnueabi-gcc | grep GLIBC
GLIBC_2.3
GLIBC_2.8
GLIBC_2.14
GLIBC_2.4
GLIBC_2.11
GLIBC_2.2.5
GLIBC_2.3.4
ध्यान दें कि यह आपको वास्तव में संस्करण नहीं बताता है। आइए मान लें कि बाइनरी glibc 2.17 के खिलाफ जुड़ा हुआ था, लेकिन 'GLIBC_2.14' के बाद प्रतीक संस्करणों वाले किसी भी प्रतीक को संदर्भित नहीं किया गया। फिर यह आसानी से प्रतीक संस्करणों की एक ही सूची का उत्पादन कर सकता है। –
gnu_get_libc_version
GNU सी पुस्तकालय के क्रम संस्करण को पहचानती है।
क्या आप के बारे में परवाह है, तो संकलन समय संस्करण (जो है, उस संस्करण /usr/include
में हेडर प्रदान की), तो आप मैक्रो __GLIBC__
और __GLIBC_MINOR__
पर गौर करना चाहिए है। ये सकारात्मक पूर्णांक में विस्तारित होते हैं, और जीएनयू सी लाइब्रेरी द्वारा प्रदान की गई शीर्षलेख फ़ाइल सहित साइड इफेक्ट के रूप में परिभाषित किया जाएगा; इसका अर्थ यह है कि आप एक मानक शीर्षलेख शामिल कर सकते हैं, और उसके बाद #ifdef __GLIBC__
का उपयोग यह तय करने के लिए करें कि क्या आप gnu/libc-version.h
जैसे गैर-मानक शीर्षलेख शामिल कर सकते हैं या नहीं।
स्वीकार किए जाते हैं जवाब से परीक्षण कार्यक्रम का विस्तार:
#include <stdio.h>
#ifdef __GLIBC__
#include <gnu/libc-version.h>
#endif
int
main(void)
{
#ifdef __GLIBC__
printf("GNU libc compile-time version: %u.%u\n", __GLIBC__, __GLIBC_MINOR__);
printf("GNU libc runtime version: %s\n", gnu_get_libc_version());
return 0;
#else
puts("Not the GNU C Library");
return 1;
#endif
}
जब मैं संकलन और कंप्यूटर मैं पर इस जवाब (जो एक मैक) टाइप कर रहा हूँ पर इस कार्यक्रम को चलाने के यह प्रिंट
Not the GNU C Library
लेकिन जब संकलित और पास के एक लिनक्स बॉक्स पर चलने यह प्रिंट
GNU libc compile-time version: 2.24
GNU libc runtime version: 2.24
नोर्मा के तहत एल परिस्थितियों में, "रनटाइम" संस्करण "संकलन-समय" संस्करण से बड़ा हो सकता है, लेकिन कभी भी छोटा नहीं। प्रमुख संस्करण संख्या फिर से बदलने की संभावना नहीं है (आखिरी बार यह बदल गया था "1997 में" libc6 संक्रमण ")।
आपको इन मैक्रो डंप करने के लिए एक खोल 'एक लाइनर' पसंद करते हैं, का उपयोग करें:
echo '#include <errno.h>' | gcc -xc - -E -dM |
grep -E '^#define __GLIBC(|_MINOR)__ ' | sort
grep
पैटर्न आंतरिक के दर्जनों देखते हैं क्योंकि केवल दो मैक्रोज़ प्रासंगिक हैं मैच के लिए चुना जाता है मैक्रोज़ को __GLIBC_somethingorother
नाम दिया गया है जिसे आप पढ़ना नहीं चाहते हैं।
और संबंधित प्रश्न पर टिप्पणियों से: 'echo' # शामिल
यदि आप संकलन समय पर चेक करना चाहते हैं, तो नीचे ज़्वोल का उत्तर शायद सबसे अच्छा तरीका है। यदि आप रनटाइम पर संस्करण देखना चाहते हैं, तो R1tschY का उत्तर शायद सबसे अच्छा तरीका है। ध्यान दें कि आपको लाइब्रेक संस्करण या मानक सी ++ लाइब्रेरी संस्करण नहीं मिल सकता है जो आप रनटाइम पर अपेक्षा करते हैं क्योंकि लिनक्स की पथों को अपने आप सही तरीके से प्राप्त करने में असमर्थता है। यह भी देखें [libstdC++ में g ++ 4.8 को लिंक करना] (https://stackoverflow.com/q/17220872/608639) – jww