システムに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バージョンを確認するにはどうすればよいですか。
テストプログラムを作成します(たとえば、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バージョンが表示されます。
つかいます -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>.
さらに簡単に
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.
...
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
という名前の内部マクロが多数あり、読み通す必要がないためです。
システムに複数の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バージョンを確認するには、さらに2つの方法があります。
インストールされたglibc rpmパッケージのバージョンを確認します。これは、このコマンドを実行して
rpm -q glibc
使用されているlibc.soファイルのバージョンを確認します。この方法はもう少し難しいです。このリンクで確認できます: Linux:glibcバージョンを確認してください