ELF(Executable and Linking Format)格式教?文档,#3: 第一??例
来源:
ChinaUnix博客 作者: 发布时间:2008-04-25 02:54:02


ELF(Executable and Linking Format)格式教?文档, #3: 第一??例:loader v0.1(? ELF ??)
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 #include #include #include #include #include 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 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/viMachine: Intel 80386
|
还没有关于此文章的相关评论!