当前位置: 首页 > 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语言的提升用法(万字总结)
  • 双拥主题歌曲MV:爱我人民,爱我军
  • 华夏银行青岛分行另类处置不良债权,德州近百亩土地被神奇操作抵押贷款
  • 神二十发射取得圆满成功
  • 外交部回应菲律宾涉仁爱礁言论:菲方7轮运补均提前通报中方
  • 波音CEO称中方因中美“贸易战”停止接收波音飞机,外交部回应
  • 冲击一英里4分钟大关,基普耶贡挑战女子中长跑极限