亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 1192 | 回復(fù): 0
打印 上一主題 下一主題

linux存檔文件(archive)分析 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2008-11-28 16:53 |只看該作者 |倒序?yàn)g覽
出于好奇,想了解一下linux的存檔文件(*.a)的格式。在網(wǎng)上大概找了一下,沒找到比較好的(沒細(xì)找),所以想自己摸索
一下,把它的文件格式弄清楚。結(jié)構(gòu)發(fā)現(xiàn)這個(gè)文件的格式竟然那么簡(jiǎn)單。在這里和大家分享一下,有錯(cuò)誤的地方希望大家指正。
1.存檔文件(archive)簡(jiǎn)介
存檔文件(*.a)文件相當(dāng)于windows的靜態(tài)鏈接庫,他把很多的目標(biāo)文件(*.o)文件打包為單一的庫文件。在鏈接程序
的時(shí)候,需要用到庫里面的函數(shù)時(shí),只需在鏈接時(shí)加上-lX    (X表示庫的名字),鏈接器會(huì)自動(dòng)得根據(jù)要調(diào)用函數(shù),找到相應(yīng)的
目標(biāo)文件,鏈接到可執(zhí)行程序中,不需要的目標(biāo)不會(huì)被鏈接到可執(zhí)行程序中。
2.archive文件的格式[參考/usr/include/ar.h中的說明]
archive文件的格式主要保護(hù)兩個(gè)部分,主要是:
一個(gè)頭部標(biāo)志ARMAG,
多個(gè)數(shù)據(jù)區(qū)。
['頭部標(biāo)志'和'數(shù)據(jù)區(qū)'是我自己為了方便說明起的名字,跟官方的說法應(yīng)該是有出入的]。
2.1 頭部標(biāo)志
頭部標(biāo)志的作用僅用于說明這是一個(gè)archive文件
在ar.h中定義了兩個(gè)宏:
#define ARMAG   "!\n" /* String that begins an archive file.  */
#define SARMAG  8       /* Size of that string.  */
ARMAG指明了頭部標(biāo)志的內(nèi)容,SARMAG說明了頭部標(biāo)志的長(zhǎng)度。
2.2 數(shù)據(jù)區(qū)
一個(gè)archive文件有多個(gè)數(shù)據(jù)區(qū),每個(gè)數(shù)據(jù)區(qū)包含一個(gè)頭部(ar_hdr)和一段數(shù)據(jù)段,他們是緊跟在一起的。
在ar.h中ar_hdr的聲明是這樣的
struct ar_hdr
{
     char ar_name[16];       /* Member file name, sometimes / terminated. */
      char ar_date[12];       /* File date, decimal seconds since Epoch.  */
       char ar_uid[6], ar_gid[6];  /* User and group IDs, in ASCII decimal.  */
       char ar_mode[8];        /* File mode, in ASCII octal.  */
       char ar_size[10];       /* File size, in ASCII decimal.  */
       char ar_fmag[2];        /* Always contains ARFMAG.  */
};
在archive中每個(gè)目標(biāo)文件(*.o)都會(huì)被分配一個(gè)數(shù)據(jù)區(qū),數(shù)據(jù)區(qū)的數(shù)據(jù)段是該目標(biāo)文件(*.o)原封不動(dòng)的拷貝,ar_hdr
則存放了對(duì)該目標(biāo)文件的說明。
ar_name文件說明了目標(biāo)文件的名字(以/作為終止符),
ar_date說明了該文件的日期,
ar_uid、ar_gid指明了該目標(biāo)文件的用戶ID和組ID,
ar_mode指明了文件的訪問屬性(權(quán)限),
ar_size指明了目標(biāo)文件的大小,同時(shí)是該數(shù)據(jù)區(qū)數(shù)據(jù)段的大小
ar_fmag總是包含ARFMAG,該宏被定義為#define ARFMAG  "`\n" , 用戶指明ar_hdr的尾部。

除了為每個(gè)目標(biāo)文件分配一個(gè)數(shù)據(jù)區(qū)之外,archive文件還添加一個(gè)特殊的數(shù)據(jù)區(qū),它位于第一個(gè)數(shù)據(jù)區(qū),它的數(shù)據(jù)段
包含了該archive文件的符號(hào)數(shù)(函數(shù)/全局變量)、符號(hào)名稱、符號(hào)所在目標(biāo)文件的偏移量。
3.archive文件的分析
首先,建立兩個(gè)測(cè)試文件,并把它們加到archive文件中:
[root:/root/test/ar]cat test_ar.c
int test(void)   
這樣,我們把test_ar.o test_ar_1.o放到了libtest_ar.a中。我們用hexdump對(duì)libtest_ar.a進(jìn)程剖析
(不熟悉hexdump用法的參見man hexdump)
[root:/root/test/ar]hexdump -C -s 0x0 -n 8 libtest_ar.a   
00000000  21 3c 61 72 63 68 3e 0a                           |!.|  
上面是頭部標(biāo)志部分,位于文件最前面。
[root:/root/test/ar]hexdump -C -s 0x8 -n 60 libtest_ar.a
00000008  2f 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |/               |
00000018  31 32 31 36 32 38 30 37  39 36 20 20 30 20 20 20  |1216280796  0   |
00000028  20 20 30 20 20 20 20 20  30 20 20 20 20 20 20 20  |  0     0       |
00000038  33 32 20 20 20 20 20 20  20 20 60 0a              |32        `.|
00000044
上面是第一個(gè)數(shù)據(jù)區(qū)的頭部ar_hdr,名字為空, '/'是終止符,1216280796是文件的時(shí)間,是被字符串化
的time_t類型的數(shù)據(jù),三個(gè)0中前兩個(gè)分別為uid和gid,后面一個(gè)標(biāo)志目標(biāo)文件屬性,在這忽略,32是該數(shù)據(jù)
區(qū)后面數(shù)據(jù)段的長(zhǎng)度, `.是終止符。

[root:/root/test/ar]hexdump -C -s 0x44 -n 32 libtest_ar.a
00000044  00 00 00 03 00 00 00 64  00 00 00 64 00 00 03 62  |.......d...d...b|
00000054  74 65 73 74 00 65 72 72  6f 72 00 74 65 73 74 00  |test.error.test.|
上面是特殊數(shù)據(jù)區(qū)的數(shù)據(jù)段,第一行中00 00 00 03表示的是該archive文件向外
導(dǎo)出的符號(hào)數(shù),這里為3(注意,這里的數(shù)據(jù)都是按大尾的編碼方式的)。00 00 00 64 、
00 00 00 64、 00 00 03 62分別是三個(gè)符號(hào)所在目標(biāo)文件的ar_hdr在該archive文件中的
偏移量,分別是0x64、0x64、0x362,緊接著是符號(hào)名稱的字符串表。
[root:/root/test/ar]hexdump -C -s 0x64 -n 60 libtest_ar.a
00000064  74 65 73 74 5f 61 72 2e  6f 2f 20 20 20 20 20 20  |test_ar.o/      |
00000074  31 32 31 36 32 38 30 37  31 38 20 20 30 20 20 20  |1216280718  0   |
00000084  20 20 30 20 20 20 20 20  31 30 30 36 36 34 20 20  |  0     100664  |
00000094  37 30 36 20 20 20 20 20  20 20 60 0a              |706       `.|
000000a0
[root:/root/test/ar]hexdump -C -s 0x362 -n 60 libtest_ar.a
00000362  74 65 73 74 5f 61 72 5f  31 2e 6f 2f 20 20 20 20  |test_ar_1.o/    |
00000372  31 32 31 36 32 38 30 37  35 30 20 20 30 20 20 20  |1216280750  0   |
00000382  20 20 30 20 20 20 20 20  31 30 30 36 36 34 20 20  |  0     100664  |
00000392  36 38 36 20 20 20 20 20  20 20 60 0a              |686       `.|
0000039e
上面驗(yàn)證了0x64、0x362是目標(biāo)文件的ar_hdr在該archive文件中的偏移量,可以看出,第一個(gè)test和error定義在
test_ar.o中,第二個(gè)test定義在test_ar_1.o中,這和我們之前寫的文件是相符的。
上面第一命令,同樣test_ar.o/是目標(biāo)文件的名字,1216280718是時(shí)間,兩個(gè)0分別是uid和gid,100644表示文件
權(quán)限(rw_rw_r__), 706是該目標(biāo)文件的大小,也是下面數(shù)據(jù)段的大小。
[root:/root/test/ar]ls -l *.o
-rw-rw-r-- 1 root root 686 07-17 15:45 test_ar_1.o
-rw-rw-r-- 1 root root 706 07-17 15:45 test_ar.o
和archive文件中的數(shù)據(jù)相符的。
接下來我們對(duì)比一下存檔中的內(nèi)容和目標(biāo)文件的內(nèi)容。
[root:/root/test/ar]hexdump -C -s 0xa0 -n 706 libtest_ar.a      
對(duì)比上面兩個(gè)輸出,內(nèi)容是完全一致的,正是我之前期盼的那樣。
4.鏈接
在上面的例子中,我故意在test_ar.c、test_ar_1.c中定義了同名的函數(shù)。但一個(gè)返回0,
一個(gè)返回1,主要是為了檢查符號(hào)的解析。
我又寫了一個(gè)測(cè)試文件。
[root:/root/test/ar]cat main.c
#include
int main()
{
        int i = test();
        printf("%d\n", i);
        return 0;
}
[root:/root/test/ar]gcc -o main main.c -L. -ltest_ar
[root:/root/test/ar]./main
0
輸出結(jié)果為0,也就是它調(diào)用的時(shí)test_ar.o中的test()函數(shù)而不是調(diào)用test_ar_1.o中的函數(shù)。
我們看上面符號(hào)表中的數(shù)據(jù)
00000044  00 00 00 03 00 00 00 64  00 00 00 64 00 00 03 62  |.......d...d...b|
00000054  74 65 73 74 00 65 72 72  6f 72 00 74 65 73 74 00  |test.error.test.|
test_ar.o中test在前面,鏈接的過程我猜想是這樣的[如有錯(cuò)誤請(qǐng)糾正]:
1.函數(shù)遇到一個(gè)未解析的符號(hào),它在-l指定的連接歸檔庫中查找。
2.當(dāng)查找到第一個(gè)符合的符號(hào)時(shí),他即停止搜索。
3.根據(jù)符號(hào)獲得目標(biāo)文件在archive中的偏移量,把相關(guān)的目標(biāo)文件(*.o)從庫中復(fù)制一份出來,
鏈接到可執(zhí)行程序中。


本文來自ChinaUnix博客,如果查看原文請(qǐng)點(diǎn):http://blog.chinaunix.net/u2/73874/showart_1671167.html
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP