PE/ELF/Mach-O之比较

1、ELF(Executable Linkable Format):linux下的可执行文件格式,按照ELF格式编写的文件包括:.so、.a等。这里就不对该格式做过多介绍了。

2、PE(Portable Executable):windows下的可执行文件格式,按照PE格式编写的文件包括:.dll、.lib、.exe等。如图所示:


PE/ELF/Mach-O之比较_第1张图片
PE结构.jpeg

PE文件主要结构:DOS头+PE头+SessionTable+Session1+...+SessionN+....

DOS头:为兼容DOS系统
PE头:含文件属性、文件大小、Session数量等信息
SessionTalbe:含全部Session地址、偏移等
Session:每个文件至少包含两个Session,代码.text和数据.data。

代码装载后在内存中的结构如下:


PE/ELF/Mach-O之比较_第2张图片
内存结构.png

Text段:存储了由代码编译成的指令集
Data段:含堆、栈、全局和静态变量
Bss段:未初始化全局和静态变量

3、Mach-O:IOS/MacOS下可执行文件格式,平时常见的.app或者ipa只是zip压缩包并非可执行文件,可执行文件在压缩包中。在mac下使用file命令打印任意可执行文件便可以看到如下内容:

> file /Applications/filename.app/Contents/MacOS/filename
Mach-O 64-bit executable x86_64

Mach-O结构主要包含Header、segment、section,如图所示(是不是和PE有点像):

PE/ELF/Mach-O之比较_第3张图片
machoview.png

从上图看Mach-o主要包含如下部分:

  • 文件头 mach64 Header:文件类型、大小等信息
  • 加载命令 Load Commands:指示加载器如何加载二进制文件
  • 文本段 __TEXT:类似PE的.text段
  • 数据段 __DATA:类似PE的.data段
  • 动态库加载信息 Dynamic Loader Info
  • 入口函数 Function Starts
  • 符号表 Symbol Table
  • 动态库符号表 Dynamic Symbol Table
  • 字符串表 String Table

4、ADD:
一个C语言代码的编译过程:预编译---编译---汇编---链接。
而一个OC语言代码的编译过程是一样的...
C通常用gcc编译,OC通常用clang编译,而二者也其实是可以通用的,用clang来编译C代码、gcc来编译OC代码也是OK的,区别仅在优缺点上而已。

你可能感兴趣的:(PE/ELF/Mach-O之比较)