Linux系統glibc和 GLIBCXX庫版本信息查看

有時我們經常需要查看當前系統的glibc版本,可以這樣查看:

/lib/libc.so.6

有時:/lib/x86-64-linux/libc.so.6
把這個文件當命令執行一下

 

爲什麼這個庫可以直接run呢? 原來在libc的代碼中有一點小手腳:

Makerules:586:LDFLAGS-c.so += -e __libc_main 

csu/version.c:71:__libc_main (void) 

void 
__libc_main (void) 

  __libc_print_version (); 
  _exit (0); 

 

或者:

因爲ldd命令也是glibc提供的,所以也能查看

ldd  --version

glibc是什麼,以及與gcc的關係?
glibc是gnu發佈的libc庫,也即c運行庫。glibc是linux 系統中最底層的api(應用程序開發接口),幾乎其它任何的運行庫都會倚賴於glibc。glibc除了封裝linux操作系統所提供的系統服務外,它本 身也提供了許多其它一些必要功能服務的實現,主要的如下:
(1)string,字符串處理
(2)signal,信號處理
(3)dlfcn,管理共享庫的動態加載
(4)direct,文件目錄操作
(5)elf,共享庫的動態加載器,也即interpreter
(6)iconv,不同字符集的編碼轉換
(7)inet,socket接口的實現
(8)intl,國際化,也即gettext的實現
(9)io
(10)linuxthreads
(11)locale,本地化
(12)login,虛擬終端設備的管理,及系統的安全訪問
(13)malloc,動態內存的分配與管理
(14)nis
(15)stdlib,其它基本功能
gcc 是編譯器,基本上 Linux 下所有的程序(包括內核)都是 gcc 編譯的,libc 當然也是。
gcc 和 libc 是互相依賴的兩個軟件,它們合作的方式類似 Linux 系統的 "自舉"。先在一個可以運行的帶有老 libc 和 gcc 的系統上,用老 gcc 編譯出一個新版本的 gcc + 老 libc,再用這個新 gcc 編譯出一個新 gcc + 新 libc,再用這套東東編譯整個新系統。

 

glibc版本查看

4.9. How can I find out which version of glibc I am using in the moment? {UD} If you want to find out about the version from the command line simply run the libc binary. This is probably not possible on all platforms but where it is simply locate the libc DSO and start it as an application. On Linux like /lib/libc.so.6 This will produce all the information you need. What always will work is to use the API glibc provides. Compile and run the following little program to get the version information: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #include <stdio.h> #include <gnu/libc-version.h> int main (void) { puts (gnu_get_libc_version ()); return 0; } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This interface can also obviously be used to perform tests at runtime if this should be necessary.

 

Just execute:

ldd --version

which comes with glibc package

 

 https://www.cnblogs.com/jiftle/p/11730257.html

 

GLIBCXX_3.4.9' not found - 解決辦法

 

在Linux中安裝交叉編譯器arm-linux-gcc 4.4.3,然後編譯mini2440內核出錯: 
/usr/lib/libstdc++.so.6: version GLIBCXX_3.4.9' not found: 
在RHEL5中安裝交叉編譯器arm-linux-gcc 4.4.3,然後編譯mini2440內核出錯: 
/usr/lib/libstdc++.so.6: version
GLIBCXX_3.4.9’ not found 
 
分析:

執行strings /usr/lib/libstdc++.so.6 | grep GLIBC 
返回結果沒有GLIBCXX_3.4.9

GLIBCXX_3.4 
GLIBCXX_3.4.1 
GLIBCXX_3.4.2 
GLIBCXX_3.4.3 
GLIBCXX_3.4.4 
GLIBCXX_3.4.5 
GLIBCXX_3.4.6 
GLIBCXX_3.4.7 
GLIBCXX_3.4.8 
GLIBC_2.0 
GLIBC_2.3 
GLIBC_2.4 
GLIBC_2.3.4 
GLIBC_2.1 
GLIBC_2.1.3 
GLIBC_2.2 
GLIBCXX_FORCE_NEW 
GLIBCXX_DEBUG_MESSAGE_LENGTH

執行ls -l /usr/lib/libstdc++.so.6 
發現/usr/lib/libstdc++.so.6 -> /usr/lib/libstdc++.so.6.0.8,其實這裏需要使用 
libstdc++.so.6.0.10

分析得知:RHEL5自帶的libstdc++.so.6指向的是libstdc++.so.6.0.8,版本太低。 
從網上下載安裝包:libstdc++-4.3.2-7.i386.rpm,更新版本。

解決辦法:

1、下載RPM包: 
http://kojipkgs.fedoraproject.org/packages/gcc/4.3.2/7/i386/libstdc++-4.3.2-7.i386.rpm

拷貝到虛擬機下/opt

2、提取包並將生成的libstdc++庫文件考到到/usr/lib

rpm2cpio libstdc++-4.3.2-7.i386.rpm | cpio -idv

則在當前目錄下生成./usr/lib目錄,包含:libstdc++.so.6.0.10、軟連接和 libstdc++.so.6 
將生成的libstdc++.so.6.0.10 、軟連接和 libstdc++.so.6拷貝到/usr/lib下:

cp libstdc++* /usr/lib -a

查看: 
ls -l libstdc++.so.6 
顯示: 
/usr/lib/libstdc++.so.6 -> /usr/lib/libstdc++.so.6.0.10

3、 
執行strings /usr/lib/libstdc++.so.6 | grep GLIBC 
返回結果包含:GLIBCXX_3.4.9

GLIBCXX_3.4 
GLIBCXX_3.4.1 
GLIBCXX_3.4.2 
GLIBCXX_3.4.3 
GLIBCXX_3.4.4 
GLIBCXX_3.4.5 
GLIBCXX_3.4.6 
GLIBCXX_3.4.7 
GLIBCXX_3.4.8 
GLIBCXX_3.4.9 
GLIBCXX_3.4.10 
GLIBC_2.0 
GLIBC_2.3 
GLIBC_2.4 
GLIBC_2.3.4 
GLIBC_2.1 
GLIBC_2.1.3 
GLIBC_2.2 
GLIBCXX_FORCE_NEW 
GLIBCXX_DEBUG_MESSAGE_LENGTH

4 這時,編譯Mini2440內核正確運行。

https://www.cnblogs.com/life-Meer/p/11407220.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章