ELF檔案格式

2021-06-02 12:41:14 字數 3952 閱讀 4793

在介紹elf格式之前,先簡單說明一下可執行檔案的生成流程:1)編寫c原始檔,或彙編原始檔;2)準備共享庫格式的目標檔案(shared object file),如數學庫、標準庫;2)用編譯器(compiler)將c編譯成可重定位格式的目標檔案(relocatable object file),用彙編器(assembler)將彙編原始檔編譯成可重定位格式的目標檔案;3)用聯結器(linker)將第二步的共享個庫檔案和第三步生成的目標檔案鏈結生成可執行檔案(executable file)。

(也就是說,記憶體中程式存在的狀態就是elf格式,當自己編寫某個程式,定義指標*p,則p+4的位址為p的位址加4,其實已經在編譯時確定了p+4的大小,所以列印出來的位址是+4的,不出錯,我yazhouren09的理解)

elf(excutable and linking format)是一種可執行可鏈結格式的二進位制檔案,它可以用來表示relocatable file、executable file或者shared object file,這三者都是目標檔案(object file)。所謂「可執行」指可以被調入記憶體供cpu直接執行;「可鏈結」指多個elf格式的目標檔案可以被鏈結在一起形成乙個可執行檔案。下圖左邊是可鏈結格式的elf檔案格式,右邊是可執行格式的elf檔案格式。

無論是linking view還是execution view的elf檔案,他們都包含乙個elf header,它包含檔案的基本資訊。elf自定義了一些型別,並強制規定了他們所佔的位元組個數,以實現跨平台,如elf32_half佔2位元組、elf32_word佔4位元組、elf32_off佔4位元組等。12

18e_ident[ei_nident]是乙個有16個位元組的陣列,e_ident[0]=0x7f,e_ident[1]=」e」,e_ident[2]=」l」, e_ident[3]=」f」, e_ident[4]指示elfclass(0:elfclassnone;1:elfclass32;2:elfclass64),e_ident[5]指示程式中的資料格式(0:無效;1:小端;2:大端),e_ident[6]指示版本固定為0x1,e_ident[7]到e_ident[14]固定為0,e_ident[15]固定為16用於指示e_ident陣列有16個元素。e_type指示該elf檔案的型別,佔2位元組,可以為et_none(0, no file type)/ et_rel(1, relocatable file)/ et_exec(2, executable file)/ et_dyn(3, shared object file)/ et_core(4, core file)/ et_loproc(0xff00, processor-specific)/ et_hiproc(0xffff, processor-specific),常見的是et_exec、et_dyn、et_rel。e_machine定義cpu的指令集架構,elf標準中定義的有em_none(0)/ em_m32(1)/ em_sparc(2)/ em_386(3)/ em_68k(4)/ em_88k(5)/ em_860(6)/em_mips(7),其它的值保留,有使用者使用,比如em_or32=0x8472。e_version定義該elf檔案的版本號。e_entry定義程式的啟動位址,也即cpu啟動後讀取的第一條指令所在的位址。e_phoff定義代表program header table的資料結構在檔案中的以位元組為單位的偏移量,為0表示沒有program header table。e_shoff定義代表section header table資料結構在檔案中的以位元組為單位的偏移量,為0表示沒有section header table。e_flags定義了和cpu相關的一些引數,不同的cpu對e_flags的定義是不一樣的。e_ehsize定義elf header這個資料結構的以位元組為單位的實際大小,之所以出現這個引數,是因為各個平台上elf自定義型別所表示的位元組數不同。乙個program header table包含多個entry即多個program header,每個entry的占用的檔案位元組數相同,e_phentsize定義了每個entry的大小,e_phnum定義當前program header table中entry的個數。乙個section header table包含多個entry即多個section header,每個entry的占用的檔案位元組數相同,e_shentsize定義了每個entry的大小,e_shnum定義當前section header table中entry的個數。在section header table中有乙個特殊的entry,它定義了section header table中各個entry的名字,e_shstrndx用於指示這個特殊的entry在section header table中的索引,即它在第幾個entry,這個特殊的entry稱為section name string table。

複製**

前面已經提到,section header table有多個entry,其實每個entry都是乙個elf32_shdr型別資料結構,用這個資料結構可以找到每個section在檔案中的位置,e_shentsize=sizeof(elf32_shdr),e_shnum=numof(elf32_shdr)。sh_name是乙個字串陣列的索引,它指示當前section header所描述的這個section的名字在section name string table中的位置。sh_type指示當前section header的型別,sht_null(0,該section header所指示的section無效,不占用檔案空間)/ sht_progbits(1,該section header所指示的section包含程式指令)/ sht_symtab(2,該section header所指示的section包含重定位符號表)/ sht_strtab(3,該section header所指示的section包含字元表)/ sht_rela(4,重定位相關,用於鏈結過程)/ sht_hash(5,重定位相關,用於鏈結過程)/ sht_dynamic(6,用於鏈結過程)/ sht_note(7,資訊說明)/ sht_nobits(8,,該section header所指示的section不占用檔案位元組,除此之外和sht_progbits含義相同) /sht_rel(9,重定位相關)/ sht_shlib(10,保留型別)/ sht_dynsym(11,重定位相關)/ sht_loproc(0x70000000)- sht_hiproc(0x7fffffff)(這一範圍的型別值跟cpu相關)/ sht_louser(0x80000000)- sht_hiuser(0xffffffff)(這一範圍的型別值保留給應用程式)。sh_flags指示當前section header所對應的section的屬性,write(0x1,當前section header所對應的section包含可寫的資料)/alloc(0x2,當前section header所對應的section在程式執行時占用實際的儲存空間)/execinstr(0x4,當前section header所對應的section包含可執行的指令)/maskproc(0xf0000000,保留)。sh_addr指示當前section header所對應的section在記憶體中起始位址。sh_offset指示當前section header所對應的section在檔案中以位元組為單位的偏移量。sh_size指示當前section header所對應的section在檔案中占用的位元組數。sh_link和sh_info供鏈結器使用。sh_addralign指示對sh_addr的對其要求。有一些特殊的section,它內部仍然包含多個entry,每個entry大小相同,如symbol table,sh_entsize用於指示這個特殊的section中每個entry的大小。

複製**

上表列出了一些常見的section。.bss中,包含未初始化的全域性資料變數,這些變數不占用elf檔案的空間(sht_nobits),但占用實際記憶體空間(shf_alloc),在程式執行啟動時由os負責初始化為0。.comment包含版本控制資訊。.data和.data1包含已經初始化的全域性資料變數,這些變數占用elf檔案空間,也占用實際記憶體空間。.fini包含主函式退出時執行的指令。.init包含主函式執行前所執行的指令。.rodata和.rodata1包含唯讀資料。.shstrtab包含section header string table。.text包含程式指令。

typedef struct

elf32_phdr;

複製**

ELF檔案格式

1.目標檔案 編譯器和彙編器生成可重定位目標檔案 包括共享目標檔案 鏈結器生成可執行目標檔案。2.可重定位目標檔案和可執行目標檔案的格式 可重定位目標檔案格式 可執行目標檔案格式 3.下面我們開始分析上面 而對於未被初始化的全域性變數和靜態區域性變數,編譯的時候並未被分配空間,而是僅僅在.bss段中...

ELF檔案格式

elf指executable and linking format,不僅包含可執行檔案,也包含庫檔案,包括靜態庫和動態庫。準備的說,也就是三種 這不廢話嗎 可執行檔案 靜態鏈結庫 動態鏈結庫 要觀察elf的具體資訊,可以用以下幾個工具 nm lists symbols from object fil...

elf檔案格式

1.elf檔案頭 elf header 標識該檔案為elf檔案 有關檔案型別和大小的資訊 檔案載入進入記憶體後的入口點資訊。2.程式頭表 program header table 向系統提供了可執行檔案的資料在程序虛擬位址空間中組織方式 檔案包含的段的數目 位置和用途。3.節 section 和 段...