คำตอบที่ชัดเจนแม้ว่าจะไม่ครอบคลุมมากที่สุดคือการตรวจสอบผู้จัดการแพ็คเกจของคุณเช่น
rpm -qi glibc
dpkg -l libc6
(น่าเศร้าที่ glibc ไม่มี.pc
ไฟล์pkconfig ดังนั้นจึงpkgconfig --modversion glibc
ไม่ใช่นักวิ่ง) ดูgetconf
คำแนะนำที่ยอดเยี่ยมของ @ Gnouc
กรณีที่ง่ายที่สุดด้วย gcc + glibc และสิ่งที่ฉันใช้เป็นอันดับแรกคือเรียกใช้libc.so
งานตามที่ระบุไว้ในคำตอบอื่น ๆ ที่นี่ ไม่จำเป็นต้องผ่านการขัดแย้งใด ๆ มันเอาท์พุทรุ่นของมันโดยค่าเริ่มต้น วิธีนี้ใช้งานได้ไกลถึง glibc-2.1 (glibc-2.0 seg-faults แต่ถึงอย่างนั้นคุณก็สามารถตรวจสอบglibcbug
สคริปต์(ตอนนี้เลิกใช้) เพื่อยืนยันเวอร์ชัน) วิธีนี้ยังใช้ได้กับmusl-libcรุ่นล่าสุด (> 0.9.15) (ซึ่งเพิ่งไป 1.0 วันนี้, 20 มีนาคม) มันไม่ทำงานกับ uClibc มันเป็น segfaults
วิธีง่ายๆในการบอกสิ่งที่คุณgcc
กำลังจะทำคือรวบรวม:
#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;
}
(ด้วย glibc <stdio.h>
รวมถึงการ<features.h>
กำหนดมาโคร GLIBC ที่เกี่ยวข้องคุณจำเป็นต้อง<gnu/libc-version.h>
มีการประกาศฟังก์ชัน)
สิ่งนี้จะจับกรณีที่ซับซ้อนมากขึ้น (หลาย libc's และ / หรือคอมไพเลอร์หลายรายการ) สมมติว่าคุณใช้คอมไพเลอร์ที่ถูกต้อง (และตั้งค่าสถานะ) แน่นอน (ฉันสงสัยว่ามันจะไม่แยกความแตกต่างระหว่าง eglibc และ glibc ที่เหมาะสม)
หากคุณมั่นใจว่าคุณกำลังใช้ glibc (หรือ eglibc) แล้วld
จะยืนยันเวอร์ชัน (ขออภัยนี่ไม่ถูกต้อง)
หาก__GNU_LIBRARY__
ไม่ได้กำหนดไว้คุณจะได้รับข้อผิดพลาดจากนั้นก็ถึงเวลาสำหรับแผน B
gcc -dumpmachine
อาจช่วยเช่นการ uClibc ก็มีคำต่อท้ายตามที่อาจ-uclibc
gcc -dumpspecs | grep dynamic-linker
นี่อาจหมายถึง ABI
gcc -print-file-name=libc.so
จะบอกให้คุณทราบว่าไฟล์ที่คอมไพเลอร์ใช้สำหรับ " -lc
" นี่เป็นตัวเชื่อมโยงสคริปต์ในการติดตั้ง gcc ซึ่งคุณสามารถอ่านเป็นข้อความธรรมดาได้ libc.so
ที่จะแสดงเส้นทางที่แน่นอนที่จะ นอกจากนี้ยังจะทำงานหากคุณผ่านธงเหมือนหรือ-m32
-m64
ในกรณีที่คุณกำลังใช้uClibc (ที่ใช้โดย OpenWRT และอื่น ๆ ) จะกำหนด__UCLIBC_MAJOR__
, __UCLIBC_MINOR__
และ__UCLIBC_SUBLEVEL__
เช่นเดียวกับ__UCLIBC__
ใน<features.h>
จึงตรวจพบได้ง่ายโดยใช้รูปแบบเล็ก ๆ น้อย ๆ เกี่ยวกับการดังกล่าวข้างต้น C โค้ด เพื่อประโยชน์ในการใช้งานร่วมกันได้ uClibc อาจกำหนดมาโคร GNU / GLIBC ตามที่ใช้ด้านบนซึ่งในปัจจุบันมันอ้างว่าเป็น glibc-2.2 มันไม่ได้ขณะใช้gnu_get_libc_X()
ฟังก์ชั่น แต่ก็ไม่ดำเนินการgetconf
ซึ่งอาจทำให้เข้าใจผิด (ผมสงสัยว่ามันจะกลับคำตอบที่ว่างเปล่าสำหรับgetconf GNU_LIBC_VERSION
, สร้าง env ของฉันคือบูดบึ้งวันนี้ดังนั้นผมจึงไม่สามารถยืนยัน.)
ในกรณีที่คุณไม่ได้ใช้Dietlibc การวิ่งdiet -v
จะแสดงเวอร์ชั่น
(FWIW เป็นเวลาหลายปีกับซอฟต์แวร์ที่ใช้ autoconf ฉันมีปัญหาเกี่ยวกับการตรวจสอบgcc
และg++
ข้อกำหนดมากกว่าการตรวจสอบสำหรับคุณสมบัติ glibc)