Mach-o(Mach Ojbect缩写)文件有11种格式(并不是所有的可执行文件都有Mach-o),是Mac/iOS上用于存储程序,库的标准格式
Mach-o常见格式:
- 可执行文件
- object (a. 其中包括.o 文件 b. .a静态库文件 其实就是N个.o文件集合)
- DYLIB:动态库 (a. dylib b.framwork)
- 动态连接器
- DSYM
例子1:
1 2 3 4 5 6 7 |
#include <stdio.h> int main(int argc, const char * argv[]) { // insert code here... printf("Hello, World!\n"); return 0; } |
把上面的代码文件.c编程.o执行命令
- clang -c main.c (会生成一个main.o) (也可以直接生成多个 clang -c main.c test.c)
- file main.o (main.o: Mach-O 64-bit object x86_64)(属于Mach-o 是一个object 不是可执行文件)
- clang main.o (或者生成cusmain clang -o cusmain main.0)(生成a.out 在file a.out (a.out: Mach-O 64-bit executable x86_64) (可执行文件))
- ./a.out 直接执行 (Hello, World!)
上面那几步也可以直接生成可执行文件 :
1 |
clang -o main2 main.c |
例子2:多文件文件合并成一个可执行文件
1 2 3 4 5 |
void run() { printf("run"); return; } |
这个文件类交Test.c (不需要引入#include..),另一个文件还是上面的main.c (和.c顺序没关系)
执行下面命令合并(会有警告 没关系)
1 |
clang -o sks main.c Test.c |
它会生成一个sks可执行文件,./sks 直接执行就行
*find找文件 find /cust/dsk -name “*.a”
动态库共享缓存:
为了提高性能,系统的动态库文件都存在动态库共享缓存里面(其中动态库只有一份)
比如上面的dyld_shared….x86_64h 多个app动态库都放在这,起到公用库的作用(类似单利) (通过动态连接器加载动态库)
动态加载器(动态连接器)(dyld) (用来加载动态库) (是dynamic linker可执行文件)
- dynamic linker
- dynamic loadel
二进制文件
其中xcode中默认是Executable可执行文件
- Executable (默认)
- Dynamic Library
- Bundle
- Static Library
- Relocatable Object File
xcode,debug下生成app可执行文件是arm64, 在release中是多个架构,这个debug中YES是当前真机的架构
Architectures和有效架构是取交集,所有上面只生成arm64 armv7,在Architectures加一种就可以生成armv7s架构
在分析汇编代码的时候,大多时候值分析一个架构就可以(经常用于静态库):
拆分二进制文件:
1 2 |
$ lipo ctest -thin armv7 -output macho_armv7 $ lipo ctest -thin armv64 -output macho_armv64 |
合并:
1 |
$ lipo -create macho_armv7 macho_arm64 -output machO_v7_64 |
MachO
MachO主要分为3大块:
- MachO Header (包含整个架构的信息,load Commands数量等)
- Load Commands (区域位置)
- Data (代码 全局变量等)
MachO工具
- MachoView(查看MachO可视化工具) 链接:https://pan.baidu.com/s/1x0LTj2PYrH9OTXa02ygGKw 密码:olws
- otool命令查看 (otool -f wechat)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Fat headers fat_magic 0xcafebabe nfat_arch 2 architecture 0 cputype 12 cpusubtype 9 capabilities 0x0 offset 16384 size 65278912 align 2^14 (16384) architecture 1 cputype 16777228 cpusubtype 0 capabilities 0x0 offset 65306624 size 75323184 align 2^14 (16384) |
附加: shell转成二进制可执行文件
http://www.datsi.fi.upm.es/~frosal/ 下载解压进入 然后执行make test
1 |
shc -r -f test.sh |
- test.sh.x是加密后的可执行的二进制文件;用./test.sh.x即可运行,
- test.sh.x.c是生成 test.sh.x的原文件(c语言)
-e:指定过期时间为2018年05月24日
-m:过期后打印出的信息;
-v: verbose
-r: 可在相同操作系统的不同主机上执行
-f: 指定源shell
另外的一种方式 gzexe test.sh