Username: Password:

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

喜欢本文,那就收藏到:

    Del.icio.us Google书签 Digg Live Bookmark Technorati Furl Yahoo书签 Facebook 百度搜藏 新浪ViVi 365Key网摘 天极网摘 和讯网摘 博拉网 POCO网摘 添加到饭否 QQ书签 Digbuzz我挖网
相关评论  我也要评论
还没有关于此文章的相关评论!
  • 昵称: (为空则显示guest)
  • 评论分数: ★ ★ ★★★ ★★★★ ★★★★★
  • 评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
  • 导航
    赞助商
    文章类别
    订阅