首页 > 代码库 > 运行ELF文件的应用程序

运行ELF文件的应用程序

8.2.3  运行ELF格式的应用程序

首先我们需要提供一些与ELF格式有关的宏定义。

代码8-7

  1. #define ELFCLASSNONE    0  
  2. #define ELFCLASS32      1  
  3. #define ELFCLASS64      2  
  4. #define CHECK_ELF_CLASS(p)              ((p)->e_ident[4])  
  5. #define CHECK_ELF_CLASS_ELFCLASS32(p)\  
  6. (CHECK_ELF_CLASS(p)==ELFCLASS32)  
  7.  
  8. /*definition of elf data*/  
  9. #define ELFDATANONE     0  
  10. #define ELFDATA2LSB         1  
  11. #define ELFDATA2MSB     2  
  12. #define CHECK_ELF_DATA(p)               ((p)->e_ident[5])  
  13. #define CHECK_ELF_DATA_LSB(p)\  
  14.     (CHECK_ELF_DATA(p)==ELFDATA2LSB)  
  15.  
  16. /*elf type*/  
  17. #define ET_NONE         0  
  18. #define ET_REL          1  
  19. #define ET_EXEC         2  
  20. #define ET_DYN          3  
  21. #define ET_CORE         4  
  22. #define ET_LOPROC       0xff00  
  23. #define ET_HIPROC       0xffff  
  24. #define CHECK_ELF_TYPE(p)           ((p)->e_type)  
  25. #define CHECK_ELF_TYPE_EXEC(p)\  
  26.     (CHECK_ELF_TYPE(p)==ET_EXEC)  
  27.  
  28. /*elf machine*/  
  29. #define EM_NONE     0  
  30. #define EM_M32          1  
  31. #define EM_SPARC        2  
  32. #define EM_386          3  
  33. #define EM_68k          4  
  34. #define EM_88k          5  
  35. #define EM_860          7  
  36. #define EM_MIPS         8  
  37. #define EM_ARM          40  
  38. #define CHECK_ELF_MACHINE(p)        ((p)->e_machine)  
  39. #define CHECK_ELF_MACHINE_ARM(p)\  
  40.     (CHECK_ELF_MACHINE(p)==EM_ARM)  
  41.  
  42. /*elf version*/  
  43. #define EV_NONE         0  
  44. #define EV_CURRENT      1  
  45. #define CHECK_ELF_VERSION(p)            ((p)->e_ident[6])  
  46. #define CHECK_ELF_VERSION_CURRENT(p)\  
  47.     (CHECK_ELF_VERSION(p)==EV_CURRENT)  
  48.  
  49. #define ELF_FILE_CHECK(hdr) ((((hdr) ->e_ident[0])==0x7f)&&\  
  50.                             (((hdr)->e_ ident[1])=='E')&&\  
  51.                             (((hdr)->e_ ident[2])=='L')&&\  
  52.                                 (((hdr) ->e_ident[3])=='F'))  
  53.  
  54. #define PT_NULL                 0  
  55. #define PT_LOAD                 1  
  56. #define PT_DYNAMIC          2  
  57. #define PT_INTERP               3  
  58. #define PT_NOTE                 4  
  59. #define PT_SHLIB                5  
  60. #define PT_PHDR                 6  
  61. #define PT_LOPROC               0x70000000  
  62. #define PT_HIPROC               0x7fffffff  
  63. #define CHECK_PT_TYPE(p)           ((p)->p_type)  
  64. #define CHECK_PT_TYPE_LOAD(p)   (CHECK_PT_TYPE(p)\  
  65. ==PT_LOAD) 

代码8-7中,有一部分内容我们曾经使用过,但大部分宏在本书的代码中都未曾用到。这些宏都是根据ELF文件格式标准定义的,具有一定的通用性。朋友们也可以将这些宏用到自己的代码之中。

现在,读者朋友们可以将代码8-7与代码8-5、代码8-4的内容共同保存到一个文件之中,命名为"elf.h"。

然后修改"boot.c"文件,先在文件的开始处将"elf.h"文件包含进来,再把plat_boot函数修改为代码8-6那样。

这样,操作系统部分的代码就算完成了,读者可以尝试编译一下程序,确保没有语法错误。

接下来,我们还需要重新制作一个RAM盘存储设备映像。进入tools目录,将编译生成的测试应用程序main复制到tools中的filesystem目录。使用工具制作一个新的romfs文件系统类型文件,并将这个文件复制到上级目录的"ram.img"文件中。

现在回到我们的操作系统根目录,启动虚拟机,运行操作系统。不出意外的话,您将看到与上一节相同的结果。

  1. arch: arm  
  2. cpu info: armv4, arm920t, 41009200, ff00fff0, 2  
  3. mach info: name s3c2410x, mach_init addr 0x426c70  
  4. uart_mod:0, desc_in:, desc_out:, converter:  
  5. SKYEYE: use arm920t mmu ops  
  6. Loaded RAM   ./leeos.bin  
  7. Loaded RAM   ./ram.img  
  8. start addr is set to 0x30000000 by exec file.  
  9. helloworld  
  10. this is a test application