编译原理(5):链接
在编译阶段,编译器并不能直接知道函数的绝对内存地址(因为最终地址由链接器在链接时分配),但它可以确定函数的相对地址或符号引用,并通过以下步骤实现“硬编码”函数调用:
1. 编译阶段:生成符号引用
当编译器处理 calc.add(2, 3)
时:
-
解析函数定义:
-
编译器在编译
Calculator::add
时,会为其生成一个符号名(如_ZN9Calculator3addEii
,这是经过名称修饰(Name Mangling)后的唯一标识)。 -
符号名包含了类名、函数名和参数类型信息,确保全局唯一性。
-
-
生成调用指令:
-
编译器将
calc.add(2, 3)
转换为汇编指令call _ZN9Calculator3addEii
。 -
这里的
_ZN9Calculator3addEii
是一个符号引用,表示“需要调用该符号对应的函数”。
; x86-64 汇编示例 lea rdi, [rbp-16] ; 传递 this 指针(calc 的地址) mov esi, 2 ; 参数 a = 2
-