1、ELF(Executable Linkable Format):linux下的可执行文件格式,按照ELF格式编写的文件包括:.so、.a等。这里就不对该格式做过多介绍了。
2、PE(Portable Executable):windows下的可执行文件格式,按照PE格式编写的文件包括:.dll、.lib、.exe等。如图所示:
PE文件主要结构:DOS头+PE头+SessionTable+Session1+...+SessionN+....
DOS头:为兼容DOS系统
PE头:含文件属性、文件大小、Session数量等信息
SessionTalbe:含全部Session地址、偏移等
Session:每个文件至少包含两个Session,代码.text和数据.data。
代码装载后在内存中的结构如下:
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有点像):
从上图看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的,区别仅在优缺点上而已。