web-dev-qa-db-ja.com

特定のgccコンパイラのglibcバージョンを確認する

システムに2つのgccコンパイラがインストールされています。1つはgcc 4.1.2(デフォルト)で、もう1つはgcc 4.4.4です。 gcc 4.4.4はデフォルトのコンパイラであるため、/lib/libc.so.6が使用するglibcを表示するため、gcc 4.1.2が使用するlibcバージョンを確認するにはどうすればよいですか。

46
MetallicPriest

テストプログラムを作成します(たとえば、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バージョンが表示されます。

40
R1tschY

つかいます -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は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>.
31

さらに簡単に

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.

...

29
John

gnu_get_libc_versionは、GNU Cライブラリの実行時バージョンを識別します。

気にするのがコンパイル時バージョン(つまり、/usr/includeでヘッダーを提供したバージョン)である場合は、マクロ__GLIBC____GLIBC_MINOR__。これらは正の整数に展開され、GNU Cライブラリによって提供されるanyヘッダーファイルを含める副作用として定義されます。つまり、標準を含めることができます次に、#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

通常の状況では、「実行時」バージョンは「コンパイル時」バージョンよりも大きくなる可能性がありますが、決して小さくなることはありません。メジャーバージョン番号が再び変更されることはほとんどありません(最後に変更されたのは1997年の「libc6移行」でした)。

これらのマクロをダンプするためにシェルの「ワンライナー」を使用する場合は、次を使用します。

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

grepパターンは、関連する2つのマクロのみに一致するように選択されます。これは、__GLIBC_somethingorotherという名前の内部マクロが多数あり、読み通す必要がないためです。

15
zwol

システムに複数のglibcがインストールされているかどうかは疑わしい。しかしldd -v <path/to/gcc-4.x>は、使用されるglibcを提供するはずです。

9
itisravi

最も簡単な方法は、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バージョンを確認するには、さらに2つの方法があります。

  1. インストールされたglibc rpmパッケージのバージョンを確認します。これは、このコマンドを実行して

    rpm -q glibc

  2. 使用されているlibc.soファイルのバージョンを確認します。この方法はもう少し難しいです。このリンクで確認できます: Linux:glibcバージョンを確認してください

6
DINA TAKLIT