链接与Symbol (1)
多环境配置 & Mach-o与链接器 & Symbol
多环境配置
Project: 包含了项目所有的代码,资源文件,所有信息.
Target: 对指定代码和资源文件的具体构建方式.
Scheme: 对指定Target的环境配置.
多Target
1. 选中一个target右键 -> duplicate -> 生成一个新的(记得修改新生成的info.plist文件) -> 最后记得修改路径才能生效 2. 自定义宏 -> OC -> build settings -> Preprocessing -> DEV=1 1. swift -> other swift Flags -> -DEV 3. 缺点多个info, 配置比较乱 4. 步骤截图 1. ![1.png](https://upload-images.jianshu.io/upload_images/1367029-7cf30384232caa36.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
Scheme
1. project -> info -> configurationns -> 添加一个新的编译环境,例:Beta 2. scheme -> Manage scheme -> 添加新的,例:Beta 3. 选新的scheme -> 选取对应的configurationns 4. build settings -> +新的定义,例HOST_URL,配置不同的链接 -> 添加到info.plist(通过info.plist暴露出去) -> HOST_URL : $(HOST_URL) ->读取plist文件参数 5. 步骤截图 ![2.png](https://upload-images.jianshu.io/upload_images/1367029-419a28fe36720f24.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
xconfig文件
- 本质是key-value
- project -> info -> configurationns -> 查看
- 新建目录 -> 新建config -> 目录-APP名字.环境,例:Configs-LoginApp.dubug
- key-value说明
推荐Scheme + xconfig
xconfig文件冲突解决
- 与cocopods的冲突
1.#include "路径",例: #include "Pods/Target Support File/Pods-LoginApp/Pods-LoginApp.debug.xconfig"
2.OTHER_LDFLAGS = $(inherited) -framework "AFNetworking"
1.$(inherited) -> 继承include导入的其他的xconfig设置的
Mach-O与链接器
Mach-O(Mach Object)是macOS, iOS, iPadOS存储程序和库的文件格式. 对应系统通过应用二进制接口(ABI)来运行该格式文件.
可执行文件调用过程
- 调用'ford'函数, 创建一个'process'
- 调用'execve'或其衍生函数, 在该进程上加载, 执行我们的'Mach-O'
1.将文件加载到内存
2.开始分析'Mach-O'中'mach_header',以确认它是有效的'Mach-O'文件
//objdump objdump --macho --private-headers 可执行文件路径(烂苹果也可分析) objdump --macho --private-headers 可执行文件路径 | ag 'LG_MAIN' 3
工具提供 -> mach-o就是一个二进制
//machoinfo先编译 -> machoinfo的可执行文件 ./machoinfo 可执行文件路径(终端拖拽)
或者scheme -> Arguments -> 添加一个可执行文件路径(终端拖拽)
符号的种类与作用
Symbol Table
- Symbol Table : 保存符号
- String Table : 保存符号的名称
- Indirect Symbol Table : 间接符号表. 保存使用的外部符号, 更准确一点就是使用的外部动态库的符号. 是Symbol Table的子集
xcode编译时命令显示到终端
//查看当前终端标识 tty ///dev/ttys001 上面的终端标识 echo "LG_Cat" > /dev/ttys001
// CMD = 运行到命令 // CMD_FLAG = 运行到命令参数 // TTY = 终端 // $SRCROOT 代码的路径 // nm // -p: 不排序 // -a: 显示所有符号,除了调试符号 // -m:显示(N_SECT)符号,格式(seg-ment_name, section_name) (external non- // external) (undefined), (common), (absolute) (indirect) // objdump // --macho --syms // --exports-trie :导出符号
strip命令
build setting -> strip -> strip style : debugging Symbols -> deployment postprocessing : yes
在脚本之后执行
//符号可见性
- -O1-Oz 生成目标文件
//符号 - dead code strip 死代码剥离 链接时
- strip 剥离符号 mach-o
//查看链接器 man ld //注意斜线 /-S
TTY=/dev/ttys003 MACHO_PATH=${BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/* CMD=objdump CMD_FLAG= --macho --exports-trie $MACHO_PATH OTHER_LDFLAGS = -Xlinker -S
3.png