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

elva

COFF格式續(xù)篇—Lib文件的結(jié)構(gòu)

COFF格式續(xù)篇—Lib文件的結(jié)構(gòu)

    上一篇文章介紹了COFF目標(biāo)文件的結(jié)構(gòu)。如果你試著做一個應(yīng)用程序的連接器(Linker),就會發(fā)現(xiàn),僅僅有目標(biāo)文件是不夠的。我們在連接程序時,不僅僅要用到目標(biāo)文件,庫文件也是必不可少的。
    庫文件是怎么樣的結(jié)構(gòu)呢?
    其實,庫文件的結(jié)構(gòu)也很簡單。它就是“一堆”目標(biāo)文件的集合。把目標(biāo)文件做成庫以后,我們在使用目標(biāo)文件中所實現(xiàn)的功能時,連接程序會自動在庫文件里查找相應(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只是一個標(biāo)識,它相當(dāng)于COFF目標(biāo)文件中的魔法數(shù)字。它是一個長度為8的字符串,值為“!<arch>\n”。
    First Sec,顧名思義,就是第一個節(jié)。它包含了庫中所有的符號名以及這些符號所在的目標(biāo)文件在庫中的位置(絕對偏移)。
    Second Sec就是第二節(jié)。它的內(nèi)容和First Sec是相同的。不同的是,Second Sec是一個有序表,通過它來查找?guī)熘械姆柋韧ㄟ^First Sec來查找要快很多。
Signature
First Sec
Second Sec
Longname Sec
Obj Sec1
Obj Sec2
……










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

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

Obj Sec

    這一節(jié)中的數(shù)據(jù)就是COFF文件的原始數(shù)據(jù),把它讀出來存成文件,就是一個COFF文件。它的格式請參考《COFF格式》一文。
    要指出的是它的命名方式有些特殊。如果Obj文件的名稱少于16個字符,它就會被保存在SectionHeader的Name成員中,以‘/’字符結(jié)尾。如果無法保存在Name成員中,則Name成員的第一個字符就為‘/’,之后再跟上這個名稱在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”  // 這里使用了第一個長文件名This_Is_Long_Name0001
 ……
Obj Sec3:
 Name[16]:“/22”  // 這里使用了第二個長文件名This_Is_Long_Name0002
 ……     OK!現(xiàn)在已經(jīng)介紹完了Lib文件的結(jié)構(gòu)。大家的連接器可以加新功能了。不過這里只給出了最基本的Lib文件結(jié)構(gòu),動態(tài)連接庫(DLL)的導(dǎo)出庫有點特別,我將在PE文件格式中進(jìn)行詳細(xì)介紹。

posted on 2008-03-24 10:18 葉子 閱讀(1499) 評論(0)  編輯 收藏 引用 所屬分類: C\C++

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美亚洲一区二区在线| 亚洲精品一区二区三区不| 一片黄亚洲嫩模| 亚洲国产精品成人综合| 亚洲日本欧美天堂| 亚洲美女区一区| 欧美激情一区在线观看| 美女在线一区二区| 久久亚洲精品中文字幕冲田杏梨| 亚洲女人小视频在线观看| 一本色道**综合亚洲精品蜜桃冫 | 欧美激情亚洲| 欧美激情综合在线| 欧美日韩在线观看视频| 欧美日韩第一区日日骚| 葵司免费一区二区三区四区五区| 欧美 日韩 国产精品免费观看| 亚洲欧美国产77777| 亚洲精品网站在线播放gif| 亚洲三级性片| 亚洲精品日韩欧美| 亚洲一区二区三区四区视频| 亚洲午夜视频在线观看| 久久超碰97中文字幕| 欧美国产综合| 黄色成人在线网址| 亚洲一区二区精品| 久久性天堂网| 在线一区视频| 久久久精品一区二区三区| 欧美成人dvd在线视频| 国产精品欧美风情| 亚洲国产精品福利| 免费成人高清视频| 国产一区二区在线观看免费| 在线观看91久久久久久| 亚洲香蕉伊综合在人在线视看| 久久精品30| 亚洲欧美中文在线视频| 欧美高潮视频| 红桃av永久久久| 欧美中文字幕| 亚洲欧美一区二区激情| 国产精品盗摄一区二区三区| 亚洲国产一区二区三区高清| 久久三级福利| 卡一卡二国产精品| 亚洲丶国产丶欧美一区二区三区 | 欧美在线|欧美| 国产精品视频yy9299一区| 亚洲欧美日韩中文播放| 亚洲主播在线播放| 国内揄拍国内精品久久| 亚洲高清免费| 欧美日韩国内自拍| 亚洲一区在线看| 久久久久国产精品麻豆ai换脸| 在线电影欧美日韩一区二区私密| 欧美黄色视屏| 国产精品久久久久久av福利软件| 亚洲欧美精品伊人久久| 欧美亚洲系列| 亚洲日本欧美在线| 欧美一区二区日韩| 亚洲美女区一区| 午夜免费日韩视频| 两个人的视频www国产精品| 欧美日韩一二三四五区| 久久精品亚洲乱码伦伦中文 | 欧美一区二区三区四区在线 | 免费欧美在线| 亚洲男人的天堂在线观看| 久久久噜噜噜久噜久久| 91久久久久久久久| 樱桃成人精品视频在线播放| 亚洲午夜精品福利| 免费日韩av电影| 久久影院午夜片一区| 国产精品国产精品| 欧美凹凸一区二区三区视频| 国产综合欧美| 久久精品最新地址| 久久久久久久97| 国产乱码精品一区二区三区五月婷| 亚洲丶国产丶欧美一区二区三区| 国内精品免费在线观看| 久久久久久久高潮| 欧美激情精品久久久久久黑人| 国内精品久久久久影院 日本资源| 亚洲专区一区| 久久综合九九| 亚洲精品国产欧美| 欧美日韩精品一区二区天天拍小说 | 欧美在线一级va免费观看| 久久久www免费人成黑人精品| 国产欧美精品日韩| 亚洲专区在线视频| 亚洲成在人线av| 欧美日韩一卡| 欧美在线视频一区二区| 亚洲高清二区| 欧美中在线观看| 一区二区电影免费在线观看| 国产精品伊人日日| 欧美sm极限捆绑bd| 亚洲欧美韩国| 99re6这里只有精品视频在线观看| 欧美一区二区三区在线| 国产亚洲精品久久久| 免费观看成人| 欧美一区二区免费观在线| 亚洲开发第一视频在线播放| 久久尤物视频| 欧美中文字幕精品| 午夜天堂精品久久久久| 日韩午夜剧场| 亚洲国产精品一区二区www在线| 国产精品揄拍500视频| 欧美久久久久中文字幕| 玖玖综合伊人| 女生裸体视频一区二区三区| 午夜一级在线看亚洲| 亚洲一本大道在线| 亚洲老板91色精品久久| 9i看片成人免费高清| 亚洲精品精选| 亚洲精品在线三区| 亚洲综合色视频| 久久国产精品久久久久久电车 | 久久精品一本久久99精品| 亚洲曰本av电影| 久久久久久久综合日本| 久久青草欧美一区二区三区| 欧美国产日韩精品| 91久久精品国产91久久| 亚洲欧洲日产国码二区| 99伊人成综合| 久久亚洲二区| 亚洲视频在线观看| 另类尿喷潮videofree| 一区二区免费看| 精品盗摄一区二区三区| 亚洲美女一区| 久久精品国产一区二区三区免费看 | 久久久久国产精品一区二区| 久久午夜色播影院免费高清| 欧美大片国产精品| 精品成人在线| 久色成人在线| 午夜久久久久久| 欧美日韩一二三四五区| 亚洲激情专区| 久久人人97超碰国产公开结果| 亚洲精品在线观| 欧美搞黄网站| av72成人在线| av不卡在线观看| 欧美成人精品一区二区| 亚洲国产成人tv| 欧美高清视频一区二区| 久久视频在线免费观看| 国内精品免费午夜毛片| 久久免费视频在线观看| 欧美在线地址| 亚洲国产91色在线| 亚洲精品黄色| 国产精品老女人精品视频| 午夜一级在线看亚洲| 午夜在线播放视频欧美| 韩国av一区二区三区四区| 美女精品在线| 欧美精品午夜视频| 亚洲欧美日韩中文播放| 欧美一区二区三区四区视频| 久久人91精品久久久久久不卡| 免费看成人av| 亚洲网站视频福利| 亚洲欧美视频在线观看| 一区视频在线| 亚洲一区二区三区乱码aⅴ蜜桃女 亚洲一区二区三区乱码aⅴ | 国产麻豆日韩| 亚洲国产女人aaa毛片在线| 国产精品久久久久7777婷婷| 欧美大尺度在线观看| 国产麻豆成人精品| 亚洲精品视频一区| 亚洲国产欧美一区二区三区久久| 亚洲一区二区三区成人在线视频精品| 国产一区二区三区在线观看免费视频| 欧美激情国产精品| 尤物视频一区二区| 久久精品国产91精品亚洲| 亚洲综合色视频| 欧美亚州一区二区三区| 亚洲国产免费看| 亚洲精品在线视频观看| 免费久久99精品国产| 亚洲电影免费观看高清完整版| 激情久久婷婷| 免费看精品久久片|