Mach-O文件(12)

简介: MachO文件(12)

MachO文件(12)


MachO文件


Mach-O其实是Mach Object文件格式的缩写,是mac以及iOS上可执行文件的格式, 类似于windows上的PE格式 (Portable Executable ), linux上的elf格式 (Executable and Linking Format)


Mach-O为Mach object文件格式的缩写,它是一种用于可执行文件、目标代码、动态库的文件格式。作为a.out格式的替代,Mach-O提供了更强的扩展性。


MachO格式的常见文件


  • 目标文件.o
  • 库文件
  • .a
  • .dylib
  • Framework
  • 可执行文件
  • dyld
  • .dsym


//将test.c通过clang进行编译生成test.o
clang -c test.c
//通过 $file 文件路径 查看文件类型
file test.o
//编译.o生成一个.out的可执行文件
clang test.o -> a.out
//file查看.out -> executable意思是可执行 ./a.out 可直接调用
//也可通过下面代码直接生成可执行文件
clang -o test2 test.c
clang -o test3 test.o
//a.out test2 test3 是一样的, 通过hash值比较 -> md5 a.out


.o文件


编译流程

1. 准确两个文件 test1.c test.c
2. clang -o demo test1.c test.c -> demo可执行文件, ./demo可直接调用
   1. 流程为下:
   2. clang -c test1.c test.c -> .o
   3. clang -o demo1 test.o test1.o -> demo1可执行文件
   4. 此时进行hash比较, md5 demo 跟 md5 demo1 hash值却不一样, 因为链接顺序不一样
       1. objdump --macho -d demo //查看链接顺序


.a文件 .dylib文件

1.

find /usr -name "*.a"

         1.file 路径


2.

find /usr -name "*.dylib"

        1.file 路径


dyld


1. cd /usr/lib/
2. ls dyld
3. file dyld -> dynamic linker 动态链接器 Mach-O文件
   1. 有两个架构i386, x86_64

dSYM

工程编译 -> .dSYM -> 显示包文件
file 里面的包内容 -> .dDYM类型, 符号文件
   1.排查崩溃信息 -> 拿到堆栈信息 -> 去符号

可执行文件的架构配置


1. 工程 -> Build Seetings -> 搜mach -> 可以更改生成类型
2. 工程编译生成的可执行文件, 默认是arm64
   1. 11以上的编译 -> arm64
   2. 选择低版本10.3 -> armv7/arm64
3. 架构设置 -> Build Seetings -> architectures
   1. 可以修改,比如添加armv7s来支持iPhone5/5c
   2. Build Active Architectures only //编译当前架构
      1. debug -> 当前运行手机的架构
      2. release -> 根据你需要支持的设备来定的, 即选择的编译版本

通用二进制文件 (Universal binary)


苹果公司提出的一种程序代码。能同时适用多种架构的二进制文件


  • 同一个程序包中同时为多种架构提供最理想的性能。
  • 因为需要储存多种代码,通用二进制应用程序通常比单一平台二进制的程序要大。
  • 但是 由于两种架构有共通的非执行资源(代码以外的),所以并不会达到单一版本的两倍之多。
  • 而且由于执行中只调用一部分代码,运行起来也不需要额外的内存。


//查看架构 Demo是上面生成的三个架构的
lipo -info Demo
//使用lifo –thin 拆分某种架构, 拆出来是某种架构
lipo Demo -thin armv7 -output machO_armv7
//使用lipo -create  合并多种架构
lipo -create machO_armv7 machO_arm64 -output machO_7_64
// 删掉i386,x86_86
lipo -remove i386 NIMSDK -o NIMSDK


MachO文件结构


[图片上传失败...(image-5b2ccc-1619252451688)]


//直接查看otool指令
otool 
//查看headers信息
otool -f Demo


MachOView来分析, 非常推荐

MachOView.app


Header的数据结构


快捷搜索 -> loader.h -> mach_header
[图片上传失败...(image-f18376-1619252451688)]

Load Command段


1. Load Command段 -> PAGEZERO -> VM
   1. VM Addr : 虚拟内存地址
   2. VM Size: 运行时刻, 在内存中的大小 -> 4G空间, 虚拟内存大小
      1. 64位 -> 0xffffffff12345678
      2. 32位 -> 0x12345678
      3. 这样64位就可以兼容32位
   3. File offset: 数据在文件中偏移量
   4. File size: 数据在文件中的大小
2. LC_DYLD_INFO_ONLY
   1. Rebase Info Size 重定向, 运行时, 代码段要统一加上一个偏移量, 称为重定向
3. LC_SYMTAB 符号表信息
4. LC_MAIN 主程序入口
   1. 如果别人有做防护, 运行就崩, 那么main不失为一个好的切入点
5. 还有一些需要加载的动态库
[图片上传失败...(image-95a9fd-1619252451688)]

代码段__text


  1. 主程序代码
  2. 符号绑定

数据段__Data


  1. 符号表




目录
相关文章
|
4月前
|
编译器
内核编译bpf
内核编译bpf
26 0
|
4月前
|
Linux
cmdline(二):uboot cmdline怎么传?&&cmdline kernel怎么用?
cmdline(二):uboot cmdline怎么传?&&cmdline kernel怎么用?
54 0
|
7月前
|
存储 缓存 API
FATFS函数浅谈 看完学会FATSFS,建议收藏
FATFS函数浅谈 看完学会FATSFS,建议收藏
|
12月前
|
存储 编译器 C语言
3-STM32启动文件详解
3-STM32启动文件详解
|
运维 Cloud Native 前端开发
MACH 架构的质量工程指南
MACH 架构的质量工程指南
188 0
MACH 架构的质量工程指南
|
Linux 编译器
Uboot + Kernel
Uboot + Kernel
154 0
|
IDE 编译器 API
nios的头文件不同意义总结
nios的头文件不同意义总结
|
存储 Java Unix
Linux下的lds链接脚本基础
Linux下的lds链接脚本基础
|
存储 Linux C语言
Linux下的lds链接脚本详解【转】
转自:http://www.cnblogs.com/li-hao/p/4107964.html 转载自:http://linux.chinaunix.net/techdoc/beginner/2009/08/12/1129972.
1498 0
|
内存技术
makefile使用.lds链接脚本以及 $@ ,$^, $,< 解析【转】
转自:http://www.cnblogs.com/lifexy/p/7089873.html 先来分析一个简单的.lds链接脚本   例1,假如现在有head.c init.c nand.
1760 0