青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 71,  comments - 41,  trackbacks - 0
上一篇文章介紹了COFF目標(biāo)文件的結(jié)構(gòu)。如果你試著做一個(gè)應(yīng)用程序的連接器(Linker),就會發(fā)現(xiàn),僅僅有目標(biāo)文件是不夠的。我們在連接程序時(shí),不僅僅要用到目標(biāo)文件,庫文件也是必不可少的。
    庫文件是怎么樣的結(jié)構(gòu)呢?
    其實(shí),庫文件的結(jié)構(gòu)也很簡單。它就是“一堆”目標(biāo)文件的集合。把目標(biāo)文件做成庫以后,我們在使用目標(biāo)文件中所實(shí)現(xiàn)的功能時(shí),連接程序會自動在庫文件里查找相應(yīng)的目標(biāo)文件,并使用它。這大大減少了我們對目標(biāo)文件的管理工作,減輕了代碼重用的負(fù)擔(dān)。
    Lib文件中的節(jié)
    COFF格式中所用到的“節(jié)”的概念再次出現(xiàn)在Lib格式中。不過,Lib文件的節(jié)要簡單得多。先讓我們來看看它的整體結(jié)構(gòu):
    如右圖所示:
    Lib格式只有四種類型的節(jié)(Section),即First Sec,Second Sec,Longname Sec和Obj Sec;其中Second Sec與Longname Sec是可選節(jié),很多Lib文件中都沒有。而開頭的Singature只是一個(gè)標(biāo)識,它相當(dāng)于COFF目標(biāo)文件中的魔法數(shù)字。它是一個(gè)長度為8的字符串,值為“!<arch>\n”。
    First Sec,顧名思義,就是第一個(gè)節(jié)。它包含了庫中所有的符號名以及這些符號所在的目標(biāo)文件在庫中的位置(絕對偏移)。
    Second Sec就是第二節(jié)。它的內(nèi)容和First Sec是相同的。不同的是,Second Sec是一個(gè)有序表,通過它來查找?guī)熘械姆柋韧ㄟ^First Sec來查找要快很多。
Signature
First Sec
Second Sec
Longname Sec
Obj Sec1
Obj Sec2
……










    Longname Sec是長名稱節(jié)。這一節(jié)是一個(gè)字符串表。它包含了所有長目標(biāo)文件名。如果后面的Obj Sec中沒有給出相應(yīng)的目標(biāo)文件名,我們就要到這一節(jié)中來查找。
    Obj Sec就是目標(biāo)文件節(jié)。這些節(jié)中存儲著不同的目標(biāo)文件的原始數(shù)據(jù)。
 
    在庫文件中,每一節(jié)都有兩個(gè)部分。一個(gè)部分是頭,另一個(gè)部分才是該節(jié)的數(shù)據(jù);數(shù)據(jù)緊跟在頭的后面。頭描述了該節(jié)數(shù)據(jù)的類型、長度等信息。這些頭的格式都是相同的。其結(jié)構(gòu)用C語言描述如下:
    typedef struct {
        char Name[16];      // 名稱
        char Time[12];      // 時(shí)間
        char UserID[6];     // 用戶ID
        char GroupID[6];    // 組ID
        char Mode[8];       // 模式
        char Size[10];      // 長度
        char EndOfHeader[2];// 結(jié)束符
    } SectionHeader;
    可以看到,頭中的數(shù)據(jù)全都是字符串。用字符串的好處是可以提高格式的兼容性,因?yàn)樵诓煌臋C(jī)器上,數(shù)據(jù)的排列方式是不同的。有的機(jī)器是以Little-Endian方式工作,還有的是以Big-Endian方式工作,它們互不兼容(這兩種方式的區(qū)別!?請看我的《COFF格式》一文,其中的文件頭一節(jié)有說明)。用字符串就不會有這種問題(后面我們將會遇到)。但它也有不方便的地方,就是必須把字符串轉(zhuǎn)換成數(shù)值,多了一個(gè)步驟。
    在這個(gè)結(jié)構(gòu)中,最常用的Name、Size以及EndOfHeader三個(gè)成員。Name就是節(jié)的名稱啦!Size也很好理解,就是該節(jié)數(shù)據(jù)的長度。現(xiàn)在要注意的就是這個(gè)EndOfHeader成員了!這個(gè)成員標(biāo)志著頭的結(jié)束,其內(nèi)容為“`\n”(注意,這里沒有打錯(cuò),是兩個(gè)字符“`”和“\n”)。怎么樣?有點(diǎn)奇怪吧?為什么要有這個(gè)結(jié)束符?每一節(jié)的頭長度一定,每節(jié)中的數(shù)據(jù)長度也知道。按順序向下讀不行嗎?答案是:不行!因?yàn)槊恳还?jié)之間存在間隙!通常是一個(gè)字節(jié)或零個(gè)字節(jié)。如果是零個(gè)字節(jié)倒好,按順序向下讀是OK的。可是如果不為零的話,這樣讀就要錯(cuò)位了。要知道錯(cuò)位沒有,只好用一個(gè)結(jié)束符來定位了。如果在讀頭的時(shí)候發(fā)現(xiàn)結(jié)束符不對,那就要一個(gè)字節(jié)一個(gè)字節(jié)地向下查找,直到找到結(jié)束符,才能算是對齊了。切記!切記!
    當(dāng)然,通過First Sec或Second Sec中給出的偏移來讀數(shù)據(jù)就不存在這個(gè)問題。不會發(fā)生錯(cuò)位,放心讀吧!
    現(xiàn)在讓我們來看看每一節(jié)中的數(shù)據(jù)是什么樣子。
 
    First Sec
    第一節(jié),通常就是Lib中的每一個(gè)小節(jié)。它的名稱是“/”。其數(shù)據(jù)部分的結(jié)構(gòu)如下:
    typedef struct {
        unsigned long SymbolNum;         // 庫中符號的數(shù)量
        unsigned long SymbolOffset[n];   // 符號所在目標(biāo)節(jié)的偏移
        char StrTable[m];                // 符號名稱字符串表
    }FirstSec;
    第一個(gè)成員SymbolNum是符號的數(shù)量。注意!它是以Big-Endian方式儲存的(x86平臺上的數(shù)據(jù)是以Little-Endian方式儲存的。這里應(yīng)該注意轉(zhuǎn)換。后面給出的convert函數(shù)可以在Little-Endian格式與Big-Endian格式之間進(jìn)行相互轉(zhuǎn)換)。
    第二個(gè)成員SymbolOffset是一個(gè)數(shù)組,它的長度n就是符號的數(shù)量,也就是SymbolNum。這個(gè)數(shù)組儲存了每一個(gè)符號所在的目標(biāo)節(jié)的偏移。我們可以方便地通過它來查找符號所在的目標(biāo)文件。注意!它也是以Big-Endian格式儲存的。
    第三個(gè)成員StrTable是一個(gè)字符串表,它的長度m就是SectionHeader.Size的值減去(SymbolNum+1)*4。其結(jié)構(gòu)很簡單,就是一堆以‘\0’結(jié)尾的字符串(和COFF文件中的字符串表結(jié)構(gòu)相同)。在有的系統(tǒng)中,它還可能是以“/\n”這兩個(gè)字符結(jié)尾的字符串的集合。
    很簡單的一個(gè)結(jié)構(gòu),不過有兩個(gè)成員的長度是不定的。怎么才能方便地從Lib中讀出這些數(shù)據(jù),留給大家自己想吧!下面我只給出一個(gè)進(jìn)行Little-Endian與Big-Endian互轉(zhuǎn)的函數(shù)。
    inline void convert(void * p          // 要轉(zhuǎn)換的數(shù)據(jù)的指針
                        ,size_t size = 4  // 數(shù)據(jù)的長度,long為4,short為2
                        ) {
        char * buf=(char*)p;
        char temp;
        for ( size_t i=0;i<size/2;i++ ) {
            temp=buf[i];
            buf[i]=buf[size-i-1];
            buf[size-i-1]=temp;
        }
    }
 
Second Sec
    現(xiàn)在看看第二節(jié)。
    這一節(jié)與第一節(jié)很相似!它通常也就是Lib文件的第二個(gè)節(jié)。它的名字也是“/”(注意:文件中第一個(gè)叫“/”的節(jié)是第一節(jié),第二個(gè)就是第二節(jié))。不過它的結(jié)構(gòu)與第一節(jié)有些不同,如下:
    typedef struct {
        unsigned long ObjNum;        // Obj Sec的數(shù)量
        unsigned long ObjOffset[x];  // 每一個(gè)Obj Sec的偏移
        unsigned long SymbolNum;     // 庫中符號的數(shù)量
        unsigned short SymbolIdx[n]; // 符號在ObjOffset表中的索引
        char StrTable[m];            // 符號名稱字符串表
    }SecondSec;
    第一個(gè)成員ObjNum是庫中Obj Sec的數(shù)量。
    第二個(gè)成員ObjOffset是一個(gè)偏移表,它記錄了庫中所有Obj Sec的偏移。這個(gè)表的記錄數(shù)x就是ObjNum。
    第三個(gè)成員SymbolNum與First Sec中的SymbolNum意義相同。
    第四個(gè)成員SymbolIdx變成了一個(gè)索引,它記錄了相應(yīng)名稱字符串在ObjOffset這個(gè)表中的位置,我們要通過兩次索引才能找到我們所要符號的Obj Sec位置。它的項(xiàng)目數(shù)n為SymbolNum。但請注意,這個(gè)索引是unsigned short型,不再是unsigned long型。
    第五個(gè)成員StrTable結(jié)構(gòu)與First Sec中的一樣。不過,它的長度m為SectionHeader.Size的值減去((ObjNum+1)*4+(SymbolNum+2)*2)。
    值得注意的是,這里的所有數(shù)據(jù)都是Little-Endian格式的。千萬不要弄錯(cuò)了!

Longname Sec
    這個(gè)小節(jié)就是一個(gè)字符串表,它的名稱為“//”,其結(jié)構(gòu)同F(xiàn)irstSec.StrTable。這里就不多說了。

Obj Sec

    這一節(jié)中的數(shù)據(jù)就是COFF文件的原始數(shù)據(jù),把它讀出來存成文件,就是一個(gè)COFF文件。它的格式請參考《COFF格式》一文。
    要指出的是它的命名方式有些特殊。如果Obj文件的名稱少于16個(gè)字符,它就會被保存在SectionHeader的Name成員中,以‘/’字符結(jié)尾。如果無法保存在Name成員中,則Name成員的第一個(gè)字符就為‘/’,之后再跟上這個(gè)名稱在Longname Sec中的偏移。

例如

!<arch>\n
……
LongName Sec:
This_Is_Long_Name0001\0
This_Is_Long_Name0002\0
……
Obj Sec1:
 Name[16]:“shortname/”
 ……
Obj Sec2:
 Name[16]:“/0”  // 這里使用了第一個(gè)長文件名This_Is_Long_Name0001
 ……
Obj Sec3:
 Name[16]:“/22”  // 這里使用了第二個(gè)長文件名This_Is_Long_Name0002
 ……
 
    OK!現(xiàn)在已經(jīng)介紹完了Lib文件的結(jié)構(gòu)。大家的連接器可以加新功能了。不過這里只給出了最基本的Lib文件結(jié)構(gòu),動態(tài)連接庫(DLL)的導(dǎo)出庫有點(diǎn)特別,我將在PE文件格式中進(jìn)行詳細(xì)介紹。
posted on 2007-07-19 16:54 Charles 閱讀(2289) 評論(1)  編輯 收藏 引用 所屬分類: 拿來主義

FeedBack:
# re: COFF格式續(xù)篇—Lib文件的結(jié)構(gòu)zz[未登錄]
2007-07-20 01:07 | Corner Zhang
好文!
期待關(guān)于dll的  回復(fù)  更多評論
  
<2007年7月>
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234

決定開始寫工作日記,記錄一下自己的軌跡...

常用鏈接

留言簿(4)

隨筆分類(70)

隨筆檔案(71)

charles推薦訪問

搜索

  •  

積分與排名

  • 積分 - 51855
  • 排名 - 447

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久久久久久高潮| 亚洲激情视频在线播放| 欧美一区二视频| 亚洲一区二区成人| 中文一区二区| 亚洲欧美日韩精品一区二区| 亚洲一级黄色| 午夜免费在线观看精品视频| 欧美一区二区三区视频免费播放| 久久av一区二区三区| 久久午夜精品一区二区| 夜夜嗨av一区二区三区网页 | 日韩视频一区二区三区在线播放免费观看 | 亚洲一级黄色片| 亚洲欧美日韩另类| 久久男人资源视频| 亚洲国产精品va在线看黑人动漫 | 国产伦精品一区二区三区视频黑人| 午夜亚洲福利| 美女主播一区| 国产精品日韩| 亚洲精品免费网站| 久久精品国产99| 欧美激情国产日韩| 亚洲免费影视| 欧美激情精品久久久久久黑人| 香蕉久久一区二区不卡无毒影院| 欧美黄色免费| 国产一区久久| 在线视频你懂得一区| 噜噜爱69成人精品| 亚洲综合色在线| 欧美日韩国产精品成人| 狠狠狠色丁香婷婷综合久久五月| **欧美日韩vr在线| 欧美激情性爽国产精品17p| 欧美性猛交xxxx乱大交退制版| 精品av久久久久电影| 欧美精品一区二区精品网| 国产视频欧美视频| 亚洲午夜精品久久久久久app| 免费成人黄色| 欧美一二区视频| 欧美日韩精选| 亚洲乱码一区二区| 欧美激情va永久在线播放| 久久成人精品| 国产农村妇女毛片精品久久莱园子| 亚洲精品一区二区网址| 美女主播一区| 久久精品成人一区二区三区蜜臀 | 亚洲承认在线| 欧美综合二区| 噜噜噜噜噜久久久久久91| 尤物yw午夜国产精品视频| 久久av资源网| 午夜国产一区| 欧美体内she精视频| 久久精品国产亚洲一区二区三区 | 欧美精品在线网站| 亚洲精品视频在线观看免费| 欧美成人精品不卡视频在线观看| 久久久久久网址| 亚洲人午夜精品免费| 亚洲日本电影| 欧美日韩国产不卡| 亚洲一区国产精品| 亚洲午夜精品网| 国产精品欧美激情| 欧美在线影院| 久久精品免费观看| 最新中文字幕亚洲| 亚洲激情视频网站| 欧美精品一区二区高清在线观看| 亚洲国产一区在线观看| 欧美福利在线| 欧美精品aa| 亚洲中无吗在线| 久久久www成人免费毛片麻豆| 亚洲欧美在线视频观看| 国产精品久久久久秋霞鲁丝 | 国产模特精品视频久久久久| 性欧美超级视频| 一区二区三区四区五区精品| 亚洲精品网址在线观看| a91a精品视频在线观看| 久久中文字幕一区| 在线电影欧美日韩一区二区私密| 久久成人羞羞网站| 久久久久久高潮国产精品视| 精品电影在线观看| 亚洲大胆av| 国产精品vip| 亚洲欧美日韩高清| 欧美在线你懂的| 亚洲国产婷婷| 日韩一级黄色大片| 国内精品久久久久久久影视蜜臀 | 欧美成人精品影院| 国产精品99久久久久久人| 狼狼综合久久久久综合网| 午夜久久福利| 久久精品天堂| 亚洲午夜精品| 久久影视三级福利片| 亚洲一区黄色| 美日韩精品视频免费看| 久久超碰97人人做人人爱| 欧美激情按摩| 欧美成人午夜激情| 国产日韩欧美黄色| 亚洲乱亚洲高清| 亚洲国产mv| 久久www成人_看片免费不卡 | 欧美日韩日日骚| 久久婷婷国产综合国色天香| 欧美日韩欧美一区二区| 欧美成人福利视频| 国产婷婷精品| 亚洲图片欧洲图片av| 日韩视频免费观看高清完整版| 久久激情中文| 亚洲国产小视频在线观看| 亚洲自拍另类| 久久婷婷av| 亚洲一区二区免费视频| 狂野欧美一区| 久久这里有精品15一区二区三区| 欧美午夜激情在线| 最新亚洲激情| 亚洲精品日韩激情在线电影| 久久偷窥视频| 免费久久久一本精品久久区| 亚洲人成网在线播放| 日韩视频中文| 99视频国产精品免费观看| 欧美国产日产韩国视频| 国产精品jizz在线观看美国| 欧美尤物巨大精品爽| 国产精品入口日韩视频大尺度| 亚洲综合欧美日韩| 欧美午夜精彩| 亚洲一区二区三区在线视频| 亚久久调教视频| 国产亚洲亚洲| 久久久久久久综合狠狠综合| 欧美多人爱爱视频网站| 亚洲国产美女| 欧美日韩成人一区| 国产一区二区三区精品久久久| 嫩草成人www欧美| 亚洲激情网址| 欧美午夜www高清视频| 亚洲图片欧洲图片日韩av| 久久er精品视频| 1000精品久久久久久久久| 欧美精品久久99| 亚洲永久在线| 欧美va天堂| 亚洲一区二区三区成人在线视频精品 | 久久一区中文字幕| 亚洲人成在线观看| 国产精品99免费看| 久久福利影视| 9久re热视频在线精品| 久久久久久午夜| 欧美精品一区二区三区蜜桃| 亚洲伊人久久综合| 麻豆精品视频在线观看视频| 亚洲乱码视频| 国产婷婷成人久久av免费高清| 欧美成人综合| 欧美亚洲一区| 亚洲精品在线一区二区| 欧美中文字幕| 一本色道88久久加勒比精品 | 国产精品视频99| 免费欧美高清视频| 亚洲小视频在线观看| 亚洲高清资源综合久久精品| 亚洲欧美日韩在线一区| 亚洲第一区在线观看| 国产精品日韩电影| 欧美aaa级| 欧美在线1区| 亚洲午夜一区二区三区| 亚洲高清不卡av| 久久精品欧美| 亚洲欧美日韩综合| 99re在线精品| 狠狠色综合网| 国产日韩精品一区二区三区在线| 欧美伦理在线观看| 欧美成人免费在线视频| 亚洲欧美电影院| 亚洲精一区二区三区| 亚洲成人资源| 欧美激情第9页| 亚洲高清一二三区| 欧美二区乱c少妇|