当前位置: 首页 > 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
http://www.dtcms.com/a/153074.html

相关文章:

  • 今日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语言的提升用法(万字总结)
  • 推荐几个可以免费下载视频的软件(Neat Download Manager、蜗牛下载助手、bilidown)
  • 【安全扫描器原理】网络扫描算法
  • 【题解-Acwing】851. spfa求最短路
  • 动态自适应分区算法(DAPS)设计流程详解
  • 【Qt6 QML Book 基础】07:布局项 —— 锚定布局与动态交互(附完整可运行代码)
  • MySQL 报错解析:SQLSyntaxErrorException caused by extra comma before FROM
  • 网络原理 - 7(TCP - 4)
  • 技术视界 | 数据的金字塔:从仿真到现实,机器人学习的破局之道
  • EFISH-SBC-RK3588无人机地面基准站项目
  • 【Hive入门】Hive查询语言(DQL)完全指南:从基础查询到高级分析