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

如何确定虚函数在虚函数表中的位置3 (Linux x64版本)

之前2篇Blog说明了如何在Windows下确定虚函数在虚函数表中的位置

这里说明Linux gcc是如何得到虚函数在表中的位置。
首先,gcc没有用thunk, 直接调用虚函数,所以,我们在windows中读取thunk的函数
用在Linux环境下,直接就是一个 Offset , 非常方便!

template <typename T>
union TFP;
// 特化模板,支持成员函数指针
template <typename ClassType, typename ReturnType, typename... Args>
union TFP<ReturnType(ClassType::*)(Args...)> {
    using MemberFuncPtr = ReturnType(ClassType::*)(Args...);  // 成员函数指针类型
    MemberFuncPtr memberFunc;  // 成员函数指针
    void* ptr;  // 在Linux环境下,这里其实是一个表示Offset的数字,而不是指针
};

template <typename ClassType, typename ReturnType, typename... Args>
uint64_t GetMemberFnOffset(ReturnType(ClassType::* func)(Args...))
{
    TFP<decltype(func)> fp;
    fp.memberFunc = func;   
    return (uint64_t)fp.ptr; 
}

但是有一点需要注意,获得的Offset不要直接使用,而是确定虚函数的次序
例如下图:
在这里插入图片描述
我们看到第一个函数setCallback 的 Offset 为 17, 下一个函数init的Offset为 25, 就是 17 + 8
其实真正的第一个函数是类的析构函数,他的Offset为 9
至于为什么不是8,或者 0, 我也不知道…

相关文章:

  • Python----数据结构(哈希表:哈希表组成,哈希冲突)
  • [漏洞篇]文件上传漏洞详解
  • Nacos学习(一)——基本介绍、安装与负载均衡策略
  • MySQL 面试总结
  • TCP三次握手 四次挥手:一场“确认眼神”与“礼貌告别”的对话
  • Linux中ps -ef命令详解
  • 开源低代码平台与 Vue.js
  • JVM篇:内存分区及作用及各部分可能发生的异常
  • 前端八股——计算机网络+浏览器原理
  • 编程小白冲Kaggle每日打卡(12)--kaggle学堂:<机器学习简介>模型如何工作
  • 《论模型驱动架构设计方法及其应用》审题技巧 - 系统架构设计师
  • 为AI聊天工具添加一个知识系统 之117 详细设计之58 思维导图及观察者效应 之2 概念全景图
  • 深入剖析抽象工厂模式:设计模式中的架构利器
  • 【每日一算法】二分查找
  • 学习经验分享【39】YOLOv12——2025 年 2 月 19 日发布的以注意力为核心的实时目标检测器
  • vue2 和 vue3 中 computer 计算属性的用法
  • 单臂路由
  • 【算法系列】荷兰国旗问题:三指针法原地排序
  • comfy 面部修复(ComfyUI-Impact-Pack)
  • mybatis 细节(${ ..}和#{..},resultType 和 resultMap的区别,别名的使用,Mapper 代理模式)
  • 成就彼此,照亮世界:“中欧建交50周年论坛”在沪成功举行
  • 中国一重集团有限公司副总经理陆文俊被查
  • 王受文已任全国工商联党组成员
  • 5月12日至13日北京禁飞“低慢小”航空器
  • 城管给商户培训英语、政银企合作纾困,上海街镇这样优化营商环境
  • 上海如何为街镇营商环境赋能?送政策、配资源、解难题、强活力