Jawaban yang jelas, meskipun bukan yang paling komprehensif, adalah memeriksa manajer paket Anda, mis
rpm -qi glibc
dpkg -l libc6
(Sedihnya, glibc tidak memiliki .pc
file pkconfig , begitu pkgconfig --modversion glibc
juga non-runner.) Lihat juga getconf
saran luar biasa @ Gnouc .
Kasus paling sederhana, dengan gcc + glibc, dan yang paling sering saya gunakan pertama adalah dengan mengeksekusi libc.so
, seperti yang dijelaskan dalam beberapa jawaban lain di sini. Tidak perlu melewati argumen apa pun, itu mengeluarkan versinya secara default. Ini berfungsi sejauh glibc-2.1 (glibc-2.0 seg-faults, meskipun saat itu Anda dapat memeriksa glibcbug
skrip (sekarang sudah pensiun) untuk mengonfirmasi versi). Metode ini juga berfungsi dengan versi musl -libc ( > 0.9.15) terbaru (yang baru berjalan 1.0 hari ini, 20 Maret). Itu tidak bekerja dengan uClibc, itu segfaults.
Salah satu cara sederhana untuk mengetahui dengan pasti apa gcc
yang akan Anda lakukan adalah mengkompilasi:
#include <gnu/libc-version.h>
#include <stdio.h>
int main(int argc, char *argv[]) {
printf("%s %s\n",gnu_get_libc_version(),gnu_get_libc_release());
printf("glibc v%i %i.%i\n",__GNU_LIBRARY__,__GLIBC__,__GLIBC_MINOR__);
return 0;
}
(dengan glibc, <stdio.h>
termasuk <features.h>
yang mendefinisikan makro GLIBC yang relevan, Anda perlu <gnu/libc-version.h>
deklarasi fungsi.)
Ini menangkap kasus yang lebih rumit (multiple libc's, dan / atau multiple compiler), dengan asumsi Anda menggunakan kompiler yang tepat (dan flag) tentu saja. (Saya menduga itu tidak akan membedakan antara eglibc dan glibc yang tepat.)
Jika Anda yakin Anda menggunakan glibc (atau eglibc) maka ld
juga akan mengkonfirmasi versi (maaf, ini tidak benar).
Jika __GNU_LIBRARY__
tidak didefinisikan Anda akan mendapatkan kesalahan, maka sudah saatnya untuk rencana B.
gcc -dumpmachine
dapat membantu, misalnya untuk uclibc -uclibc
, suffix memiliki akhiran gcc -dumpspecs | grep dynamic-linker
. Ini juga dapat menyiratkan ABI.
gcc -print-file-name=libc.so
akan memberi tahu Anda file apa yang akan digunakan kompiler untuk " -lc
", ini hampir pasti merupakan skrip-tautan di dalam instalasi gcc Anda, yang dapat Anda baca sebagai teks biasa. Itu akan menunjukkan jalur yang tepat ke libc.so
. Ini juga akan berfungsi jika Anda memberikan tanda suka -m32
atau -m64
.
Jika Anda menggunakan uclibc (seperti yang digunakan oleh OpenWRT dan lainnya), ia mendefinisikan __UCLIBC_MAJOR__
, __UCLIBC_MINOR__
dan __UCLIBC_SUBLEVEL__
juga __UCLIBC__
dalam <features.h>
, sehingga mudah dideteksi menggunakan variasi kecil pada cuplikan kode C di atas. Demi kompatibilitas, uClibc juga dapat mendefinisikan makro GNU / GLIBC seperti yang digunakan di atas, saat ini berpura-pura menjadi glibc-2.2. Ini saat ini tidak melaksanakan gnu_get_libc_X()
fungsi, tetapi tidak melaksanakan getconf
yang juga dapat menyesatkan (saya menduga itu mengembalikan jawaban kosong untuk getconf GNU_LIBC_VERSION
, saya membangun env yang merajuk hari ini jadi saya tidak bisa mengkonfirmasi.)
Jika Anda menggunakan dietlibc , menjalankan diet -v
akan menampilkan versi.
(FWIW, selama beberapa tahun dengan perangkat lunak menggunakan autoconf, saya punya lebih banyak masalah dengan uncheck-for gcc
dan g++
persyaratan daripada dengan diperiksa-untuk fitur glibc.)