OC高级强化03:符号与链接

张建 lol

编译成目标文件.o的过程

  1. 对代码进行 汇编
  2. 符号 进行 归类 -> 重定位符号表
  • 重定位符号表 -> .m/.o 用到的 API
  1. .o -> 链接 -> 符号表和重定位符号表 合并到 一张表中 -> 生成可执行文件 exec
  • 链接 -> 处理目标文件符号的过程

全局 和 本地 符号

  • 全局符号:可见性 - 对整个项目可见
1
2
3
4
5
6
// 全局变量
int global_uninit_value
// 全局符号
void global_object() {
NSLog(@"global_object")
}
  • 本地符号:可见性 - 只对当前文件可见
1
2
3
4
5
6
// 静态变量 -> 本地变量
static int static_init_value = 9;
// 本地符号
static void global_object() {
NSLog(@"static_global_object")
}
  • attribute(())
1
2
可以给编译器传递属性:
__attribute__((deprecated)) :告诉编译器已废弃
  • two_levelnamespace & flat_namespace

二级命名空间一级命名空间。连接器默认采用 二级命名空间,也就是除了会记录符号名称,还会记录属于哪个 Mach-O 的,比如会记录下来 _NSLog 来自Foundation。

  • 终端查看符号表的方式
1
2
% man nm 查看具体的文档
% nm --help

符号表说明

下面我们来通过终端来查看一个可执行文件的符号表

-pa :不排序,显示所有符号

上面的 t、s等就是符号的种类

man nm 如何使用呢

  • 终端输入 man nm

  • 终端输入 /-p

  • 终端输入 /-a

  • Post title:OC高级强化03:符号与链接
  • Post author:张建
  • Create time:2022-01-07 14:38:12
  • Post link:https://redefine.ohevan.com/2022/01/07/OC底层原理/OC高级强化03:符号与链接 2/
  • Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.