编译成目标文件.o的过程
- 对代码进行
汇编
- 把
符号
进行 归类
-> 重定位符号表
- .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") }
|
1 2
| 可以给编译器传递属性: __attribute__((deprecated)) :告诉编译器已废弃
|
- two_levelnamespace & flat_namespace
二级命名空间
与 一级命名空间
。连接器默认采用 二级命名空间
,也就是除了会记录符号名称,还会记录属于哪个 Mach-O
的,比如会记录下来 _NSLog 来自Foundation。
1 2
| % man nm 查看具体的文档 % nm --help
|
符号表说明
下面我们来通过终端来查看一个可执行文件的符号表
-pa :不排序,显示所有符号
上面的 t、s等就是符号的种类
man nm 如何使用呢