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

运行ELF文件的应用程序

时间: 2024-11-09 00:52:28

运行ELF文件的应用程序的相关文章

ELF文件的加载过程(load_elf_binary函数详解)--Linux进程的管理与调度(十三)

日期 内核版本 架构 作者 GitHub CSDN 2016-06-04 Linux-4.6 X86 & arm gatieme LinuxDeviceDrivers Linux进程管理与调度-之-进程的描述 加载和动态链接 从编译/链接和运行的角度看,应用程序和库程序的连接有两种方式. 一种是固定的.静态的连接,就是把需要用到的库函数的目标代码(二进制)代码从程序库中抽取出来,链接进应用软件的目标映像中: 另一种是动态链接,是指库函数的代码并不进入应用软件的目标映像,应用软件在编译/链接阶段并

程序编译运行和exe运行之文件位置的区别

如图: 文件输入输出 1.程序编译运行 输入文件和输出文件与.c同位置 2.exe运行 输入文件和输出文件与.exe同位置

c# winform 获取当前程序运行根目录,winform 打开程序运行的文件夹

// 获取程序的基目录. System.AppDomain.CurrentDomain.BaseDirectory // 获取模块的完整路径. System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName // 获取和设置当前目录(该进程从中启动的目录)的完全限定目录. System.Environment.CurrentDirectory // 获取应用程序的当前工作目录. System.IO.Directory.GetC

如何创建JAR文件?如何运行.jar形式的Java程序?

一.如何创建JAR文件? .jar是用来压缩档案或者解压档案的文件格式,其特点是具有无损压缩的功能.想知道如何创建这种程序?请访问 http://www.cnblogs.com/yjmyzz/p/executable-jar.html .jar可以通过整理Java程序的类别文件来变为可执行文件,而编译器或Java虚拟机可以识别这些格式..jar文件是通过javaw(Java应用程序管理器)执行的.你需要设置.jar文件中的应用程序接入点(即含有程序主功能的文件类别).你需要通过清单文件(Mani

【java】 linux下利用nohup后台运行jar文件包程序

Linux 运行jar包命令如下: 方式一: java -jar XXX.jar 特点:当前ssh窗口被锁定,可按CTRL + C打断程序运行,或直接关闭窗口,程序退出 那如何让窗口不锁定? 方式二 java -jar XXX.jar & &代表在后台运行. 特定:当前ssh窗口不被锁定,但是当窗口关闭时,程序中止运行. 继续改进,如何让窗口关闭时,程序仍然运行? 方式三 nohup java -jar XXX.jar & nohup 意思是不挂断运行命令,当账户退出或终端关闭时,

ELF文件

ELF文件格式是一个开发标准,各种UNIX系统的可执行文件都采用ELF格式,它有三种不同的类型: 可重定位的目标文件 可执行文件 共享库 现在分析一下上一篇文章中经过汇编之后生成的目标文件max.o和链接之后生成的可执行文件max的格式,从而理解汇编.链接和加载执行的过程. 一.目标文件 ELF文件格式提供了两种不同的视角,在汇编器和链接器看来,ELF文件是由Section Header Table描述的一系列Section的集合,而执行一个ELF文件时,在加载器看来它是由Program Hea

linux实践之ELF文件分析

linux实践之ELF文件分析 下面开始elf文件的分析. 我们首先编写一个简单的C代码. 编译链接生成可执行文件. 首先,查看scn15elf.o文件的详细信息. 以16进制形式查看scn15elf.o文件. 查看scn15elf.o中各个段和符号表的信息. 各个段的详细信息如下. 符号表的信息如下: 使用readelf命令查看各个段的详细信息: 段表信息如下: 符号表信息如下: 下面让我们开始分析文件头吧! 由于我的虚拟机是32位的,我下面就主要以32位的系统进行分析,就不比较32位机和64

实例分析ELF文件静态链接

1.ELF文件格式概貌 readelf -h 查看elf文件头部信息可以看到Type值有三种:REL,EXEC,DYN. REL文件是只被编译没有被链接过的文件,其格式属于左边一种,elf header+section1,2,3...+section header table,每个section对应一个section header table entry,section header table为各个section提供索引.没有被链接过的文件没有program header,不能被加载到内存中运

实例分析ELF文件动态链接

参考文献: <ELF V1.2> <程序员的自我修养---链接.装载与库>第6章 可执行文件的装载与进程 第7章 动态链接 <Linux GOT与PLT> 开发平台: [[email protected] dynamic_link]# uname -a Linux tanghuimin 2.6.32-358.el6.x86_64 #1 SMP Fri Feb 22 00:31:26 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux 实例讲解