当前位置: 首页 > 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, 我也不知道…

http://www.dtcms.com/a/32594.html

相关文章:

  • 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 代理模式)
  • vue-treeselect显示unknown的问题及解决
  • React 高阶组件的优缺点
  • CMake入门
  • HDFS Java 客户端 API
  • QML MouseArea 鼠标事件详解
  • SQLMesh 系列教程8- 详解 seed 模型
  • 每日一题——验证IP地址
  • Docker教程(喂饭级!)
  • 数字化电子(不动产经营租赁服务)发票版式文件说明
  • 孜然单授权系统V2.0PHP授权系统