• <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>
            posts - 297,  comments - 15,  trackbacks - 0

            1. 概述

            Executable and linking format(ELF)文件是x86 Linux系統(tǒng)下的一種常用目標(biāo)文件(object file)格式,有三種主要類型:

            (1)適于連接的可重定位文件(relocatable file),可與其它目標(biāo)文件一起創(chuàng)建可執(zhí)行文件和共享目標(biāo)文件。

            (2)適于執(zhí)行的可執(zhí)行文件(executable file),用于提供程序的進程映像,加載的內(nèi)存執(zhí)行。

            (3)共享目標(biāo)文件(shared object file),連接器可將它與其它可重定位文件和共享目標(biāo)文件連接成其它的目標(biāo)文件,動態(tài)連接器又可將它與可執(zhí)行文件和其它共享目標(biāo)文件結(jié)合起來創(chuàng)建一個進程映像。

            ELF文件格式比較復(fù)雜,本文只是簡要介紹它的結(jié)構(gòu),希望能給想了解ELF文件結(jié)構(gòu)的讀者以幫助。具體詳盡的資料請參閱專門的ELF文檔。

            2. 文件格式

            為了方便和高效,ELF文件內(nèi)容有兩個平行的視角:一個是程序連接角度,另一個是程序運行角度,如圖1所示。

            ELF header在文件開始處描述了整個文件的組織,Section提供了目標(biāo)文件的各項信息(如指令、數(shù)據(jù)、符號表、重定位信息等),Program header table指出怎樣創(chuàng)建進程映像,含有每個program header的入口,Section header table包含每一個section的入口,給出名字、大小等信息。

            圖1

            3. 數(shù)據(jù)表示

            ELF數(shù)據(jù)編碼順序與機器相關(guān),數(shù)據(jù)類型有六種,見表1。

            4. ELF文件頭

            象bmp、exe等文件一樣,ELF的文件頭包含整個文件的控制結(jié)構(gòu)。它的定義如下:

            #define EI_NIDENT 16
            typedef struct{
            unsigned char e_ident[EI_NIDENT];
            Elf32_Half e_type;
            Elf32_Half e_machine;
            Elf32_Word e_version;
            Elf32_Addr e_entry;
            Elf32_Off e_phoff;
            Elf32_Off e_shoff;
            Elf32_Word e_flags;
            Elf32_Half e_ehsize;
            Elf32_Half e_phentsize;
            Elf32_Half e_phnum;
            Elf32_Half e_shentsize;
            Elf32_Half e_shnum;
            Elf32_Half e_shstrndx;
            }Elf32_Ehdr;

            其中E_ident的16個字節(jié)標(biāo)明是個ELF文件(7F+'E'+'L'+'F'+class +data+version+pad)。E_type表示文件類型,2表示可執(zhí)行文件。E_machine說明機器類別,3表示386機器,8表示MIPS機器。E_entry給出進程開始的虛地址,即系統(tǒng)將控制轉(zhuǎn)移的位置。E_phoff指出program header table的文件偏移,e_phentsize表示一個program header表中的入口的長度(字節(jié)數(shù)表示),e_phnum給出program header表中的入口數(shù)目。類似的,e_shoff,e_shentsize,e_shnum 分別表示section header表的文件偏移,表中每個入口的的字節(jié)數(shù)和入口數(shù)目。E_flags給出與處理器相關(guān)的標(biāo)志,e_ehsize給出ELF文件頭的長度(字節(jié)數(shù)表示)。E_shstrndx表示section名表的位置,指出在section header表中的索引。

            下面有個elf文件頭的例子,可以對照理解,見圖2。

            圖2

            5. section header

            目標(biāo)文件的section header table可以定位所有的section,它是一個Elf32_Shdr結(jié)構(gòu)的數(shù)組,Section頭表的索引是這個數(shù)組的下標(biāo)。有些索引號是保留的,目標(biāo)文件不能使用這些特殊的索引。

            Section包含目標(biāo)文件除了ELF文件頭、程序頭表、section頭表的所有信息,而且目標(biāo)文件section滿足幾個條件:

            (1)目標(biāo)文件中的每個section都只有一個section頭項描述,可以存在不指示任何section的section頭項。

            (2)每個section在文件中占據(jù)一塊連續(xù)的空間。

            (3)Section之間不可重疊。

            (4)目標(biāo)文件可以有非活動空間,各種headers和sections沒有覆蓋目標(biāo)文件的每一個字節(jié),這些非活動空間是沒有定義的。

            Section header結(jié)構(gòu)定義如下:

            typedef struct{
            Elf32_Word sh_name;
            Elf32_Word sh_type;
            Elf32_Word sh_flags;
            Elf32_Addr sh_addr;
            Elf32_Off sh_offset;
            Elf32_Word sh_size;
            Elf32_Word sh_link;
            Elf32_Word sh_info;
            Elf32_Word sh_addralign;
            Elf32_Word sh_entsize;
            }Elf32_Shdr;

            其中sh_name指出section的名字,它的值是后面將會講到的section header string table中的索引,指出一個以null結(jié)尾的字符串。Sh_type是類別,sh_flags指示該section在進程執(zhí)行時的特性。Sh_addr指出若此section在進程的內(nèi)存映像中出現(xiàn),則給出開始的虛地址。Sh_offset給出此section在文件中的偏移。其它字段的意義不太常用,在此不細(xì)述。

            文件的section含有程序和控制信息,系統(tǒng)使用一些特定的section,并有其固定的類型和屬性(由sh_type和sh_info指出)。下面介紹幾個常用到的section:“.bss”段含有占據(jù)程序內(nèi)存映像的未初始化數(shù)據(jù),當(dāng)程序開始運行時系統(tǒng)對這段數(shù)據(jù)初始為零,但這個section并不占文件空間。“.data.”和“data1”段包含占據(jù)內(nèi)存映像的初始化數(shù)據(jù)。“.rodata”和“.rodata1”段含程序映像中的只讀數(shù)據(jù)。“.shstrtab”段含有每個section的名字,由section入口結(jié)構(gòu)中的sh_name索引。“.strtab”段含有表示符號表(symbol table)名字的字符串。“.symtab”段含有文件的符號表,在后文專門介紹。“.text”段包含程序的可執(zhí)行指令。

            6. symbol table

            目標(biāo)文件的符號表包含定位或重定位程序符號定義和引用時所需要的信息。符號表入口結(jié)構(gòu)定義如下:

            typedef struct{
            Elf32_Word st_name;
            Elf32_Addr st_value;
            Elf32_Word st_size;
            Unsigned char st_info;
            Unsigned char st_other;
            Elf32_Half st_shndx;
            }Elf32_Sym;

            其中st_name包含指向符號表字符串表(strtab)中的索引,從而可以獲得符號名。St_value指出符號的值,可能是一個絕對值、地址等。St_size指出符號相關(guān)的內(nèi)存大小,比如一個數(shù)據(jù)結(jié)構(gòu)包含的字節(jié)數(shù)等。St_info規(guī)定了符號的類型和綁定屬性,指出這個符號是一個數(shù)據(jù)名、函數(shù)名、section名還是源文件名;并且指出該符號的綁定屬性是local、global還是weak。

            轉(zhuǎn)自:

            http://tech.ccidnet.com/art/305/20020126/9179_1.html

            posted on 2009-11-21 18:52 chatler 閱讀(372) 評論(0)  編輯 收藏 引用 所屬分類: FileFormat
            <2009年12月>
            293012345
            6789101112
            13141516171819
            20212223242526
            272829303112
            3456789

            常用鏈接

            留言簿(10)

            隨筆分類(307)

            隨筆檔案(297)

            algorithm

            Books_Free_Online

            C++

            database

            Linux

            Linux shell

            linux socket

            misce

            • cloudward
            • 感覺這個博客還是不錯,雖然做的東西和我不大相關(guān),覺得看看還是有好處的

            network

            OSS

            • Google Android
            • Android is a software stack for mobile devices that includes an operating system, middleware and key applications. This early look at the Android SDK provides the tools and APIs necessary to begin developing applications on the Android platform using the Java programming language.
            • os161 file list

            overall

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            久久久久无码精品| 久久综合欧美成人| 久久人人妻人人爽人人爽| 91视频国产91久久久| 久久午夜福利电影| 99精品国产综合久久久久五月天| 久久精品视频免费| 精品久久久久久中文字幕大豆网 | 国内精品伊人久久久久影院对白 | 久久九九精品99国产精品| 国产福利电影一区二区三区久久老子无码午夜伦不 | 51久久夜色精品国产| 国产精品久久久天天影视| 国产精品伊人久久伊人电影 | 97久久精品人人做人人爽| 亚洲精品乱码久久久久久蜜桃图片 | 丁香五月综合久久激情| 99久久国产宗和精品1上映| 品成人欧美大片久久国产欧美...| 天天影视色香欲综合久久| 久久福利青草精品资源站| 99久久精品国产一区二区 | 久久天天躁狠狠躁夜夜不卡 | 久久久久亚洲av综合波多野结衣| 欧美一区二区精品久久| 久久天天躁狠狠躁夜夜96流白浆| 色青青草原桃花久久综合| 国产成人香蕉久久久久| 欧美精品一本久久男人的天堂| 亚洲va久久久噜噜噜久久狠狠 | 思思久久好好热精品国产| 久久久久久青草大香综合精品| 久久这里只有精品久久| 久久精品中文字幕久久| 久久天天躁狠狠躁夜夜网站| 久久综合久久美利坚合众国| 久久国产欧美日韩精品免费| 少妇被又大又粗又爽毛片久久黑人 | 婷婷伊人久久大香线蕉AV | 日日狠狠久久偷偷色综合96蜜桃 | 午夜精品久久久久久中宇|