编译原理(5):链接

在编译阶段,编译器并不能直接知道函数的绝对内存地址(因为最终地址由链接器在链接时分配),但它可以确定函数的相对地址符号引用,并通过以下步骤实现“硬编码”函数调用:


1. 编译阶段:生成符号引用

当编译器处理 calc.add(2, 3) 时:

  1. 解析函数定义

    • 编译器在编译 Calculator::add 时,会为其生成一个符号名(如 _ZN9Calculator3addEii,这是经过名称修饰(Name Mangling)后的唯一标识)。

    • 符号名包含了类名、函数名和参数类型信息,确保全局唯一性。

  2. 生成调用指令

    • 编译器将 calc.add(2, 3) 转换为汇编指令 call _ZN9Calculator3addEii

    • 这里的 _ZN9Calculator3addEii 是一个符号引用,表示“需要调用该符号对应的函数”。

    ; x86-64 汇编示例
    lea  rdi, [rbp-16]   ; 传递 this 指针(calc 的地址)
    mov  esi, 2          ; 参数 a = 2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值