当前位置: 首页 > news >正文

编译原理(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

相关文章:

  • 今日CSS学习浮动->定位
  • 数据分析案例:医疗健康数据分析
  • 机器学习(8)——主成分分析
  • Restful接口学习
  • [密码学实战]在Linux中实现SDF密码设备接口
  • 密码学的hash函数,哈希碰撞, collision resistance, BTC用到的SHA-256简介
  • arm64适配系列文章-第十章-arm64环境上jenkins的部署
  • docker部署Jenkins工具
  • PTA -L1-001 Hello World
  • 联邦知识窃取模型(FedBM):从预训练语言模型中窃取知识以实现异构联邦学习|文献速递-深度学习医疗AI最新文献
  • TCP基础题:音乐播放列表管理系统
  • React 的 useEffect 清理函数详解
  • Docker-高级使用
  • 【python】Python 中,单下划线(_)和双下划线(__)开头以及结尾的命名方式具有特殊的含义和用途
  • 安恒web安全春招实战
  • 如何使用 Apache 配置用户主页 ?
  • 【前端】【面试】在前端开发中,如何优化 CSS 以提升页面渲染性能?
  • 轻松完成视频创作,在线视频编辑器,无需下载软件,功能多样实用!
  • 游戏引擎学习第243天:异步纹理下载
  • C++区别于C语言的提升用法(万字总结)
  • 这样喝酸奶相当于在喝糖水,会导致娃龋齿、肥胖
  • 申活观察|演出场次破纪录、入境游导游档期忙,上海文旅商“热力”拉满
  • 这 3 种食物,不要放进微波炉!第 1 个就大意了
  • 莫斯科一机场实施临时限制措施
  • 晋城一男子实名举报村支书打伤其67岁父亲,镇政府:案件正在侦办中
  • 五年来首次!香港金管局斥资465.39亿港元购买美元