1. 程式人生 > >linux下的lib檔案知識

linux下的lib檔案知識


庫的編號格式如下:

library_name.major.num.minor_.min.pathch_num
例如,筆者Red Hat Linux 9.0的GUN資料庫是libgdbm.so.0.0.2,詳細表述如下:

◆library_name是libc.so(標準C庫);

◆major_num是2(主版本號);

◆minor_.min是0(次版本號);

◆pathch_num是0(補丁級別號又稱發行號)。

libgdbm.so.0.0.2所在目錄是/usr/lib,其大小是24576位元組,這是一個ELF(Executable and Linking Format)格式的二進位制格式檔案,執行時由系統將其裝入記憶體開始執行。

ELF有三種主要型別:

◆適於連線的可重定位檔案(Relocatable File),可與其它目標檔案一起建立可執行檔案和共享目標檔案。

◆適於執行的可執行檔案(Executable File),用於提供程式的程序映像,載入的記憶體執行。

◆共享目標檔案(Shared Object File),聯結器可將它與其它可重定位檔案和共享目標檔案連線成其它的目標檔案;動態聯結器又可將它與可執行檔案和其它共享目標檔案結合起來建立一個程序映像。

常用的程式設計庫

庫操作命令

Linux庫操作可以使用命令完成,目前常用的命令是ldd和ldconfig。

1.ldd
是Library Dependency Display縮寫,它的作用是顯示一個可執行程式必須使用的共享庫

(1)命令格式

ldd [選項] 檔名

(2)主要引數

-d 執行重定位並報告丟失的函式。

-r 執行對函式和資料物件的重定位,並報告丟失的函式和資料物件。
(3)應用例項

Perl語言是開發者喜歡使用的一種“膠水語言”(能夠將許多元素連線在一起,因此它具有極強的適應性),如果需要查詢有哪些共享庫,則可以首先使用find命令查詢這個程式的絕對路徑,然後使用ldd命令:


#find -name perl
ldd /usr/bin/perl


其結果見圖2所示。圖2中,箭頭左邊的一列顯示的是Prel語言所需的.so檔名, 箭頭右邊的一列顯示是庫的真實庫名稱。應用程式連結到庫的so名字是到實際庫的符號連結。以第二行為例,最後的0x40014000是庫libperl.so的載入地址。由此可以看到,執行Perl語言需要9個共享庫。

2.ldconfig

ldconfig命令的作用是決定位於目錄/usr/lib和/lib下的共享庫所需的執行連結。這些連結儲存在的Libs儲存在/et/ld.so.conf檔案中。搜尋出可共享的動態連結庫(格式如前介紹,lib*.so*),進而創建出動態裝入程式(ld.so)所需的連結和快取檔案。快取檔案預設為/etc/ld.so.cache,此檔案儲存已排好序的動態連結庫名字列表。

(1)命令格式

ldconfig [選項] [libs]

(2)主要選項

-v或--verbose ldconfig將顯示正在掃描的目錄、搜尋到的動態連結庫,以及它所建立的連線的名字。

-f CONF 指定動態連結庫的配置檔案為CONF,系統預設為/etc/ld.so.conf。

-C CACHE 指定生成的快取檔案為CACHE,系統預設的是/etc/ld.so.cache,檔案存放已排好序的可共享的動態連結庫的列表。

-p或--print-cache 讓ldconfig打印出當前快取檔案所儲存的所有共享庫的名字。

-r ROOT 改變應用程式的根目錄為ROOT。

-n ldconfig僅掃描命令列指定的目錄,不掃描預設目錄(/lib、/usr/lib),也不掃描配置檔案/etc/ld.so.conf所列的目錄。

執行沒有選項的ldconfig命令時,用於更新高速緩衝檔案。這個命令主要用於高速緩衝DNS伺服器(Caching DNS Server)。高速緩衝DNS伺服器的原理是提供查詢的歷史記錄,並且利用這些記錄來提高查詢的效率。

當某個查詢是第一次被髮送到高速緩衝DNS伺服器時,高速緩衝DNS伺服器就將此查詢的整個過程記錄下來,在一定的時期內用它來回答所有相同的查詢,從而減少整個DNS系統的負擔並且提高查詢速度。

(3)應用例項

如果使用者想知道系統中有哪些動態連結庫,或者想知道系統中有沒有某個動態連結庫時,可用-p選項讓ldconfig輸出快取檔案中的動態連結庫列表,從而查詢得到。


ldconfig -p
998 libs found in cache `/etc/ld.so.cache'
libzvt.so.2 (libc6) => /usr/lib/libzvt.so.2
libzvt.so (libc6) => /usr/lib/libzvt.so
……

ldconfig命令輸出結果表明,在快取檔案/etc/ld.so.cache中找到998個共享庫,下一行開始便是一系列共享庫的名字及其全名(絕對路徑)。因為實際輸出結果很多,為節省篇幅以“……”表示省略的部分。
庫的升級

Linux系統軟體更新很快,新的核心幾乎每幾個星期就公佈一次,其它軟體的更新也是非常頻繁。多數情況下,盲目跟隨潮流的升級並不必要,如果確實需要新版本的特性時再升級。換句話說,不要為了升級而升級。Linux系統中多數軟體都是用共享庫來編譯的,其中包含了在不同程式之間共享的公用子例程。

在執行某個程式時,如果看到如下資訊:“Incompatible library version.”則表明需要將該庫升級到程式所需要的版本。庫是向下相容的,也就是說,用老版本庫編譯的程式可以在新安裝的版本庫上執行,反之則不行。

Linux庫函式的升級是一項重要的工作,往往與其它軟體包的升級有一定關聯作用,所以操作前一定要備份檔案。下面看一下如何把Glibc 2.2.4.13升級至2.3.2版本,其過程如下:

1.下載.gz壓縮檔案並解壓

在GUN C網站下載的四個.gz壓縮檔案,解壓至一臨時目錄中:


cd /usr/caolinux
tar xzvf
glibc-2.3.2.tar.gz
cd glibc-2.3.2
tar xzvf ../glibc-linuxthreads-2.3.2.tar.gz
tar xzvf ../glibc-crypt-2.3.2.tar.gz
tar xzvf ../glibc-localedata-2.3.2.tar.gz

2.建立庫函式的安裝目錄

mkdir /usr/higlibc
cd /usr/higlibc

3.建立編譯目錄

mkdir cao
cd cao
./configure --enable-add-ons=linuxthreads,crypt,localedata -prefix
=/usr/higlibc

4.編譯與安裝

make
make check
make install

編譯與安裝過程根據計算機硬體配置不同,從10分鐘到幾十分鐘不等。 ,