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

普通函数调用和虚函数调用

1.普通函数调用

源文件.cpp经过编译变成目标文件,函数保存在目标文件的代码段,符号表保存在只读数据段,这时代码段和数据段中的函数调用的地址都是临时地址,链接时目标文件合并,函数地址固定下来,重定位修改临时地址为新地址,普通函数的调用就是最终编译成 call 函数地址 的指令,也就是说普通函数的调用在编译链接后就确定好了

2.虚函数的调用

源文件.cpp经过编译变成目标文件,子类虚函数表是拷贝父类虚表,存在只读数据段,虚函数在代码段,重写虚函数会覆盖原来子类虚函数表里的指针,链接合并目标文件,虚函数的调用编译器会编译成去虚函数表中找对应虚函数地址然后调用,虚函数的调用在运行时才确定好

1. 符号表(Symbol Table)

作用
符号表记录了目标文件中定义的符号(如函数、全局变量)以及引用的外部符号信息,用于链接阶段的符号解析和地址绑定。

主要内容

  • 符号名称:函数或变量的名称(如 printfmain)。

  • 符号类型:区分是函数(FUNC)、变量(OBJECT)还是未定义符号(UND)。

  • 作用域:全局(可被其他文件访问)或局部(仅当前文件可见)。

  • 地址/大小:符号在内存或目标文件中的相对地址及大小(未定义的符号地址为0)。

用途

  • 链接阶段
    链接器通过符号表解析跨文件的符号引用。例如,文件A调用文件B的函数,链接器需找到该函数的定义并绑定地址。

  • 调试信息
    符号表可包含调试符号(如函数名、变量名),帮助调试工具(如GDB)定位问题。

  • 动态链接
    动态库的符号表在运行时由动态链接器(如 ld-linux.so)加载,解析未定义符号。

示例(使用 readelf -s 查看):

Symbol table '.symtab' contains 10 entries:Num:    Value  Size Type    Bind   Vis      Ndx Name0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND 1: 00000000     0 FUNC    GLOBAL DEFAULT  UND printf2: 00001129    42 FUNC    GLOBAL DEFAULT   14 main

2. 重定位表(Relocation Table)

作用
重定位表记录了目标文件中需要修改的地址(如函数调用、变量引用),指导链接器或加载器在链接或运行时修正这些地址。

主要内容

  • 重定位位置:需要修改的指令或数据的偏移地址。

  • 重定位类型:指示如何计算新地址(如相对跳转、绝对地址)。

  • 依赖的符号:需要绑定的符号(如 printf 的地址)。

用途

  • 静态链接
    链接器合并多个目标文件时,根据重定位表修改指令中的地址,使其指向最终的内存位置。

  • 动态链接
    动态库加载时,动态链接器根据重定位表修正指令中的地址(如PLT/GOT条目)。

  • 地址无关代码(PIC)
    共享库通过重定位表实现代码段共享,数据段每进程独立。

示例(使用 objdump -r 查看):

RELOCATION RECORDS FOR [.text]:
OFFSET   TYPE              VALUE 
0000001c R_X86_64_PC32    printf
00000025 R_X86_64_32      global_var
http://www.xdnf.cn/news/277003.html

相关文章:

  • 性能优化实践:渲染性能优化
  • OpenCv实战笔记(2)基于opencv和qt对图像进行灰度化 → 降噪 → 边缘检测预处理及显示
  • Prompt多版本测试指南:如何科学评估不同提示词的效果
  • Coco AI 入驻 GitCode:打破数据孤岛,解锁智能协作新可能
  • Vue 3 中 ref 的使用例子
  • 从实列中学习linux shell12 通过Shell脚本来优化MySQL数据库性能,特别是慢SQL跟踪和索引优化
  • 从入门到登峰-嵌入式Tracker定位算法全景之旅 Part 4 |IMU 死算与校正:惯性导航在资源受限环境的落地
  • Javase 基础加强 —— 04 集合2.0
  • Linux:web服务
  • 第14章:阿凡达的复兴与潘多拉的新生
  • 三、A2DP协议详解
  • 高可用架构设计——服务接口高可用
  • 北极花 APP:开启生物多样性调查新模式,助力生态保护
  • Lesson 16 A polite request
  • bc 命令
  • 系统架构设计师:设计模式——行为设计模式
  • Go语言chan底层原理
  • el-input Vue 3 focus聚焦
  • 无人机视觉:连接像素与现实世界 —— 像素与GPS坐标双向转换指南
  • 【Unity】使用XLua进行热修复
  • Nginx 核心功能之正反代理
  • 高等数学第三章---微分中值定理与导数的应用(§3.6 函数图像的描绘§3.7 曲率)
  • 开源 FEM(有限元分析)工程
  • 工业元宇宙:从虚拟仿真到虚实共生
  • C++负载均衡远程调用学习之实时监测与自动发布功能
  • Day110 | 灵神 | 二叉树 | 根到叶路径上的不足节点
  • Qt6 学习指南:前言+安装基本依赖
  • C++名称空间
  • Python 浮点数(float)类型详解
  • 苍穹外卖12