文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>#3: 第一個範例:loader v0.1(讀 ELF 檔頭)

#3: 第一個範例:loader v0.1(讀 ELF 檔頭)

时间:2009-04-10  来源:AppleDragon

ELF 的第一個範例:loader v0.1

ELF header 儲存執行檔的重要資訊,我們必須先知道如何讀取 ELF 檔案的檔頭資訊(header),才能處理個別節區(section)。在 GNU/Linux 系統下,程式可以直接引用 elf.h 標頭檔。完整的程式範例 loader-0.1.c 列表如下。

/*
* Copyright (C) 2003 www.jollen.org
*
* ELF programming. ver 0.1
*
*/
#include <stdio.h>
#include <unistd.h>
#include <elf.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>

void parse_machine(Elf32_Half machine)
{
printf("Machine: ");
switch (machine) {
case EM_NONE: printf("No machine\n"); break;
case EM_M32: printf("AT&T WE 32100\n"); break;
case EM_SPARC: printf("SPARC\n"); break;
case EM_386: printf("Intel 80386\n"); break;
case EM_68K: printf("Motorola 68000\n"); break;
case EM_88K: printf("Motorola 88000\n"); break;
case EM_860: printf("Intel 80860\n"); break;
case EM_MIPS: printf("MIPS RS3000 Big-Endian\n"); break;

default: printf("Unknow\n");
}
}

int main(int argc, char *argv[])
{
int fd;
Elf32_Ehdr f_header;

if (argc != 2) {
printf("Usage: loader [filename]\n");
return -1;
}

fd = open(argv[1], S_IRUSR);
if (fd < 0) {
printf("\nfile open error\n");
return -1;
}

/* Read ELF Header */
read(fd, &f_header, sizeof(Elf32_Ehdr));

/* Parse header information */
parse_machine(f_header.e_machine);
}

範例說明

程式 loader-0.1.c 首先宣告變數 f_header 用存放所讀取的檔頭資料:

Elf32_Ehdr f_header;

Elf32_Ehdr 的宣告在 elf.h 裡,這個 data type 是 SysV ABI 裡的 ELF object files 檔頭的標準資料結構。讀者的方式如同傳統的 C 語言一般,只要利用低階 I/O 函數將檔頭的部份讀出即可:

read(fd, &f_header, sizeof(Elf32_Ehdr));

目前我們只讀取 ELF header 的部份。ELF header 裡存放許多重要的 object file 資訊,其中一項為 e_machine 成員,因此程式接著來判斷此欄位的內容,並且列印出 object file 所支援的硬體平臺名稱。

在 parse_machine() 裡頭,我們判斷 e_machine 欄位的值,並且列印出相對應的硬體平臺名稱,例如:若 e_mahcine 的值為 EM_386,則印出 "Intel 80386" 字串。EM_386 與其它相關的常數都定義在 SysV ABI 標準裡,可在 elf.h 裡看到。這部份就留給大家當功課了。

執行結果

先將上面的程式碼 copy 下來存成 loader-0.1.c 後編譯成執行檔:

$ gcc -o loader-0.1 loader-0.1.c

接著再用 loader-0.1 來分析 ELF object file:

# ./loader-0.1 /bin/vi
Machine: Intel 80386
相关阅读 更多 +
排行榜 更多 +
省店

省店

购物比价 下载
rhythmhive最新版

rhythmhive最新版

休闲益智 下载
节奏蜂巢最新版(rhythm hive)

节奏蜂巢最新版(rhythm hive)

休闲益智 下载