链接与Symbol (1)

简介: 链接与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


微信图片_20220509173629.png

3.png




目录
相关文章
缺少链接库报错:ld: symbol(s) not found for architecture x86_64
缺少链接库报错:ld: symbol(s) not found for architecture x86_64
240 0
|
6月前
|
JavaScript 前端开发
ES6:什么是Symbol?
ES6:什么是Symbol?
78 1
|
6月前
ES6之Symbol
ES6之Symbol
|
6月前
|
JavaScript 前端开发
|
6月前
|
JavaScript 前端开发 开发者
|
16天前
|
设计模式 JavaScript 前端开发
es6加上symbol的基础数据类型
【10月更文挑战第30天】ES6 中的 `Symbol` 作为一种新的基础数据类型,为 JavaScript 提供了一种创建唯一标识符和处理对象属性名冲突的有效方式,丰富了 JavaScript 的数据类型体系和编程模式,在实际开发中具有重要的应用价值。
|
16天前
|
设计模式 JavaScript 前端开发
es6加上symbol的基础数据类型
【10月更文挑战第22天】ES6中的 `Symbol` 作为一种新的基础数据类型,为JavaScript提供了一种创建唯一标识符和处理对象属性名冲突的有效方式,丰富了JavaScript的数据类型体系和编程模式,在实际开发中具有重要的应用价值。
|
4月前
|
存储 JavaScript 前端开发
JavaScript编码之路【ES6新特性之 Symbol 、Set 、Map、迭代器、生成器】(二)
JavaScript编码之路【ES6新特性之 Symbol 、Set 、Map、迭代器、生成器】(二)
54 1
|
4月前
|
存储 JavaScript 前端开发
JavaScript编码之路【ES6新特性之 Symbol 、Set 、Map、迭代器、生成器】(一)
JavaScript编码之路【ES6新特性之 Symbol 、Set 、Map、迭代器、生成器】(一)
40 0
|
6月前
|
存储 JavaScript
ES6+新特性-Symbol与Set/Map数据结构
ES6 引入了三种新的数据结构:Symbol、Set和Map。Symbol是唯一且不可变的值,常用于定义对象的独特属性;Set存储不重复值,适合数组去重;Map则是键值对集合,键可为任意类型,提供了更灵活的存储方式。这些新数据结构提供了更高效的操作手段,分别解决了属性命名冲突、数据去重和复杂键值对存储的问题。示例展示了如何使用Symbol、Set和Map进行基本操作。
下一篇
无影云桌面