链接与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. 
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. 步骤截图

xconfig文件
- 本质是key-value
- project -> info -> configurationns -> 查看
- 新建目录 -> 新建config -> 目录-APP名字.环境,例:Configs-LoginApp.dubug
- key-value说明
推荐Scheme + xconfig
xconfig文件冲突解决
- 与cocopods的冲突
- #include "路径",例: #include "Pods/Target Support File/Pods-LoginApp/Pods-LoginApp.debug.xconfig"
- OTHER_LDFLAGS = $(inherited) -framework "AFNetworking"
- $(inherited) -> 继承include导入的其他的xconfig设置的
Mach-O与链接器
Mach-O(Mach Object)是macOS, iOS, iPadOS存储程序和库的文件格式. 对应系统通过应用二进制接口(ABI)来运行该格式文件.
可执行文件调用过程
- 调用'ford'函数, 创建一个'process'
- 调用'execve'或其衍生函数, 在该进程上加载, 执行我们的'Mach-O'
- 将文件加载到内存
- 开始分析'Mach-O'中'mach_header',以确认它是有效的'Mach-O'文件
//objdump
objdump --macho --private-headers 可执行文件路径(烂苹果也可分析)
objdump --macho --private-headers 可执行文件路径 | ag 'LG_MAIN' 3
工具提供 -> mach-o就是一个二进制
main
//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

网友评论