sourcecode

특정 gcc 컴파일러의 glibc 버전을 확인합니다.

copyscript 2022. 7. 17. 16:43
반응형

특정 gcc 컴파일러의 glibc 버전을 확인합니다.

시스템에 2개의 gcc 컴파일러가 설치되어 있습니다.하나는gcc 4.1.2(디폴트)와 다른 하나는gcc 4.4.4에서 사용되는 libc 버전을 확인하려면 어떻게 해야 합니까?gcc 4.4.4,왜냐면/lib/libc.so.6에 의해 사용되는 glibc를 나타냅니다.gcc 4.1.2디폴트 컴파일러이기 때문입니다.

테스트 프로그램 작성(예를 들어 이름 지정)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);
}

gcc-4.4 컴파일러를 사용하여 컴파일합니다.

gcc-4.4 glibc-version.c -o glibc-version

실행 시./glibc-version사용된 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.

...

사용하다-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는 Linux에서 실행할 수 있다는 점에서 특별합니다.

$ /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>.

gnu_get_libc_version에 GNU C 라이브러리의 런타임버전을 나타냅니다.

컴파일 타임버전(즉, 에서 헤더를 제공한 버전)에 관심이 있는 경우/usr/include), 매크로를 참조해 주세요.__GLIBC__그리고.__GLIBC_MINOR__이것들은 양의 정수로 확장되어 GNU C 라이브러리에서 제공되는 헤더 파일을 포함시키는 부작용으로 정의됩니다.이것은 표준 헤더를 포함시키고, 다음에 사용할 수 있는 것을 의미합니다.#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
}

컴퓨터에서 이 프로그램을 컴파일하여 실행하면 (Mac인) 이 응답을 입력하면 인쇄됩니다.

Not the GNU C Library

하지만 컴파일하여 인근 Linux 박스에서 실행하면

GNU libc compile-time version: 2.24
GNU libc runtime version:      2.24

통상적인 상황에서는 "runtime" 버전이 "compile-time" 버전보다 클 수 있지만 결코 작지 않습니다.메이저 버전 번호는 다시 변경되지 않을 것 같습니다(마지막으로 변경된 것은 1997년의 libc6 이행입니다).

이러한 매크로를 덤프하기 위해 셸 '원라이너'를 사용하려면 다음을 사용하십시오.

echo '#include <errno.h>' | gcc -xc - -E -dM | 
    grep -E '^#define __GLIBC(|_MINOR)__ ' | sort

grep패턴은 관련된2개의 매크로에만 일치하도록 선택됩니다.이것은, 이름 붙여진 수십개의 내부 매크로가 있기 때문입니다.__GLIBC_somethingorother읽어보고 싶지 않을 것 같아요.

시스템에 glibc가 여러 개 설치되어 있는지 의심됩니다.그렇지만ldd -v <path/to/gcc-4.x>사용되는 glibc를 제공합니다.

가장 쉬운 방법은ldd수반되는glibc

이 명령어를 실행하기만 하면 됩니다.ldd --version:

dina@dina-X450LA:~$ ldd --version
ldd (Ubuntu GLIBC 2.23-0ubuntu9) 2.23
Copyright (C) 2016 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.
Written by Roland McGrath and Ulrich Drepper.

glibc 버전을 확인하려면 다음 두 가지 방법이 있습니다.

  1. 이 명령을 실행하여 설치된 glibc rpm 패키지의 버전을 확인합니다.

    rpm -q glibc

  2. 사용된 libc.so 파일의 버전을 확인합니다.이쪽이 조금 더 어렵다.다음 링크에서 확인할 수 있습니다.Linux:glibc 버전 확인

strings 명령을 사용하여 GLIBC 버전의 컴파일러를 확인할 수 있습니다.가장 높은 버전이 적용됩니다.

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

또한 libc의 상위 버전 기호도 확인합니다.

readelf -V /lib64/libc.so.6

언급URL : https://stackoverflow.com/questions/9705660/check-glibc-version-for-a-particular-gcc-compiler

반응형