2012-03-14 12 views
21

के लिए ग्लिबैक संस्करण की जांच करें मेरे पास मेरे सिस्टम पर दो जीसीसी कंपाइलर्स स्थापित हैं, एक gcc 4.1.2 (डिफ़ॉल्ट) है और दूसरा gcc 4.4.4 है। मैं gcc 4.4.4 द्वारा उपयोग किए गए libc संस्करण को कैसे देख सकता हूं, क्योंकि /lib/libc.so.6gcc 4.1.2 द्वारा उपयोग किए गए glibc को दिखाता है, क्योंकि यह डिफ़ॉल्ट कंपाइलर है।किसी विशेष जीसीसी कंपाइलर

+0

यदि आप संकलन समय पर चेक करना चाहते हैं, तो नीचे ज़्वोल का उत्तर शायद सबसे अच्छा तरीका है। यदि आप रनटाइम पर संस्करण देखना चाहते हैं, तो R1tschY का उत्तर शायद सबसे अच्छा तरीका है। ध्यान दें कि आपको लाइब्रेक संस्करण या मानक सी ++ लाइब्रेरी संस्करण नहीं मिल सकता है जो आप रनटाइम पर अपेक्षा करते हैं क्योंकि लिनक्स की पथों को अपने आप सही तरीके से प्राप्त करने में असमर्थता है। यह भी देखें [libstdC++ में g ++ 4.8 को लिंक करना] (https://stackoverflow.com/q/17220872/608639) – jww

उत्तर

21

एक परीक्षण कार्यक्रम (उदाहरण के 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 संस्करण है दिखाया गया है।

+0

यह मेरे लिए काम करता है, लेकिन यह कहां है? मैं देख रहा हूं [glibc 2.7 डॉक्स पर] (http://www.gnu.org/software/libc/manual/html_mono/libc.html) लेकिन मुझे यह नहीं मिल रहा है। –

+0

फ़ंक्शन ग्नुलिब का हिस्सा है: https://www.gnu.org/software/gnulib/manual/gnulib.html – R1tschY

+0

http://man7.org/linux/man-pages/man3/gnu_get_libc_version.3.html – Adam

25

उपयोग -print-file-namegcc विकल्प:

$ 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>. 
+0

ओह, मैंने सोचा कि आपको पथ की आवश्यकता है, मेरा बुरा। –

8

मुझे शक है अगर आप एक से अधिक glibc अपने system.But ldd -v <path/to/gcc-4.x> में स्थापित किया है आप का इस्तेमाल किया glibc देना चाहिए।

9

और भी आसान

उपयोग 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. 

...

+0

उपरोक्त आदेशों के परिणाम समान नहीं हैं। मेरे कंप्यूटर पर: जीएनयू libc संस्करण: 2.17, एलडी-लिनक्स-x86-64.so.2 (GLIBC_2.3) => /lib64/ld-linux-x86-64.so.2 ?? – Adam

-1

आप कंपाइलर के जीएलबीबी संस्करण की जांच के लिए स्ट्रिंग कमांड का उपयोग कर सकते हैं। उच्चतम संस्करण लागू है।

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 
+1

ध्यान दें कि यह आपको वास्तव में संस्करण नहीं बताता है। आइए मान लें कि बाइनरी glibc 2.17 के खिलाफ जुड़ा हुआ था, लेकिन 'GLIBC_2.14' के बाद प्रतीक संस्करणों वाले किसी भी प्रतीक को संदर्भित नहीं किया गया। फिर यह आसानी से प्रतीक संस्करणों की एक ही सूची का उत्पादन कर सकता है। –

6

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 नाम दिया गया है जिसे आप पढ़ना नहीं चाहते हैं।

+0

और संबंधित प्रश्न पर टिप्पणियों से: 'echo' # शामिल '| जीसीसी-एक्स सी-डीएम-ई - | egrep -i '(gnu | lib)' '। – jww