圖1
3. 資料表示
ELF資料編碼順序與機器相關,資料類型有六種,見表1。
4.
ELF檔案頭
象bmp、exe等檔案一樣,ELF的檔案頭包含整個檔案的控制結構。它的定義如下:
#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個位元組标明是個ELF檔案
(7F+'E'+'L'+'F'+class
+data+version+pad)。E_type表示檔案類型,2表示可執行檔案。E_machine說明機器類别,3表示386機器,8表示
MIPS機器。E_entry給出程序開始的虛位址,即系統将控制轉移的位置。E_phoff指出program
header
table的檔案偏移,e_phentsize表示一個program
header表中的入口的長度(位元組數表示),e_phnum給出program
header表中的入口數目。類似的,e_shoff,e_shentsize,e_shnum
分别表示section
header表的檔案偏移,表中每個入口的的位元組數和入口數目。E_flags給出與處理器相關的标志,e_ehsize給出ELF檔案頭的長度(位元組數
表示)。E_shstrndx表示section名表的位置,指出在section
header表中的索引。
下面有個elf檔案頭的例子,可以對照了解,見圖2。
圖2
5.
section header
目标檔案的section header
table可以定位所有的section,它是一個Elf32_Shdr結構的數組,Section頭表的索引是這個數組的下标。有些索引号是保留的,目标檔案不能使用這些特殊的索引。
Section包含目标檔案除了ELF檔案頭、程式頭表、section頭表的所有資訊,而且目标檔案section滿足幾個條件:
(1)目标檔案中的每個section都隻有一個section頭項描述,可以存在不訓示任何section的section頭項。
(2)每個section在檔案中占據一塊連續的空間。
(3)Section之間不可重疊。
(4)目标檔案可以有非活動空間,各種headers和sections沒有覆寫目标檔案的每一個位元組,這些非活動空間是沒有定義的。
Section
header結構定義如下:
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結尾的字元串。Sh_type是類别,sh_flags訓示該section在程序執行時的特性。Sh_addr
指出若此section在程序的記憶體映像中出現,則給出開始的虛位址。Sh_offset給出此section在檔案中的偏移。其它字段的意義不太常用,
在此不細述。
檔案的section含有程式和控制資訊,系統使用一些特定的section,并
有其固定的類型和屬性(由sh_type和sh_info指出)。下面介紹幾個常用到的section:“.bss”段含有占據程式記憶體映像的未初始化數
據,當程式開始運作時系統對這段資料初始為零,但這個section并不占檔案空間。“.data.”和“data1”段包含占據記憶體映像的初始化資料。
“.rodata”和“.rodata1”段含程式映像中的隻讀資料。“.shstrtab”段含有每個section的名字,由section入口結構
中的sh_name索引。“.strtab”段含有表示符号表(symbol
table)名字的字元串。“.symtab”段含有檔案的符号表,在後文專門介紹。“.text”段包含程式的可執行指令。
6.
symbol table
目标檔案的符号表包含定位或重定位程式符号定義和引用時所需要的資訊。符号表入口結構定義如下:
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指出符号相關的記憶體大小,比如一個資料結構包含的位元組數等。
St_info規定了符号的類型和綁定屬性,指出這個符号是一個資料名、函數名、section名還是源檔案名;并且指出該符号的綁定屬性是local、
global還是weak。
posted on 2009-05-26 14:43 大龍 閱讀(321) 評論(0) 編輯 收藏 引用