链接与Symbol (1)

链接与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文件

  1. 本质是key-value
  2. project -> info -> configurationns -> 查看
  3. 新建目录 -> 新建config -> 目录-APP名字.环境,例:Configs-LoginApp.dubug
  4. key-value说明

推荐Scheme + xconfig

xconfig文件冲突解决

  1. 与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)来运行该格式文件.

可执行文件调用过程

  1. 调用'ford'函数, 创建一个'process'
  2. 调用'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就是一个二进制
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 :导出符号

xcode_run_cmd脚本

strip命令

build setting -> strip -> strip style : debugging Symbols -> deployment postprocessing : yes
在脚本之后执行

//符号可见性

  1. -O1-Oz 生成目标文件
    //符号
  2. dead code strip 死代码剥离 链接时
  3. 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

你可能感兴趣的:(链接与Symbol (1))