Skip to content

证据锚索引

此页面上的所有地址适用于 libtpu.so 构建 ID 89edbbe81c5b328a958fe628a9f2207d,来自 libtpu-0.0.40-cp314 轮。二进制文件并未被剥离:这里的每个 0x… 都解析为 IDA 函数表中的分解 C++ 符号,并且 .text/.rodata/.lrodata/.data.rel.ro 映射 VMA == 文件偏移量。其他版本会有所不同。

摘要

这是 wiki 的 反向查找索引:一个平面的、按地址排序的二进制锚点表,在深层页面中重复出现,每个锚点都映射回解释它的页面。它存在于一个工作流程中——您在 IDA 中,您的光标落在 0x1c89fba0 上,并且您想要记录它的散文。扫描主表,找到该行,然后点击链接。它是 subsystem-map(进入子系统→地址带)和 front/codename-cheatsheet(进入代号→事实)的逆:两者都收集锚点转发;此页面是将它们连接在一起的平面地址→页面书脊。

该索引故意不详尽。该二进制文件有 884,832 个函数;这个页面只包含大约 60 个真正的横切锚点——入口点、工厂函数、成本表、目标访问器和数据部分,这些内容在三页或更多页上引用,读者实际上很可能会感到冷淡。单页局部变量(数千个 _GLOBAL__N_ 帮助程序、每个操作码处理程序、ICF 重复项)记录在其所属页面上,此处不再重复。选择偏差是针对重新实现者需要识别以在二进制文件中定位的地址。

每行在被接纳之前都经过双向验证:(a) 地址解析为 IDA 函数表 (…_function_addresses.json) 中的命名符号,或者对于数据锚点,解析为所属页面引脚的部分/符号; (b) 指定的所属页面存在并且实际引用了该地址。如果流通中的标签无法通过检查,则 > **CORRECTION —** 标注会记录它,而不是静默修复。置信度反映的是绑定(地址↔页面),而不是基础 RE 声明,所属页面自行对其进行评分。

为了重新实现,该页面服务的合约是:

  • 方向 — 给定原始 VA,恢复符号、其角色以及记录其背后算法的页面。
  • 出处 — 每个绑定都可以独立重新检查:符号位于函数表中,引用位于命名的 src/ 页面中。
  • 范围诚实 - 索引涵盖横切脊柱,而不是长尾;它告诉您它索引什么。
索引锚~58 个交叉地址(总共 884,832 个函数)
主表排序键升序 VA
符号来源…_function_addresses.json(函数) · ELF 节/符号记录(数据)
.text 跨度0xe63c0000x21217484 (~360 MB)
单频段.lbss 来自 0x227ba840
兄弟指数subsystem-map(频段→子系统)·codename-cheatsheet(代号→事实)·cross-reference-graph(页面→页面)

主锚索引

每个横切锚一行,按 VA 升序排序。 它是什么是一个单线角色; 所属页面链接记录算法或布局的页面; 置信度 对地址 ↔ 页面装订进行评分。子系统分组的详细信息如下所示。

VA符号它是什么所属页面
0x1c60480xprof::kDeviceTypeInfoDeviceTypeInfo[17] .lrodata分析/kdevicetypeinfo-生产者-读者
0x3366d90TPUMCCodeEmitter::…::InstBits每个操作码 TensorCore 编码位isa/instbits-master-db · isa/记录格式
0x84a0000.rodata 名称池合并的 NUL 终止字符串池(基本)附录/filewrapper-toc-catalog
0xb438aecresLUT(VF成本LUT)Viperfish资源循环查找表成本/vf 周期表 · 每个张量核心的成本/iars
0xbe8af30protodesc_cold(节)序列化 FileDescriptorProto blob 池附录/protodesc-cold-catalog
0xe635524.init_proc精灵DT_INIT;运行静态构造函数风暴生命周期/elf-entry-and-init-proc · 取证/静态初始化
0xe63c000__do_init构造函数驱动; .text的底座生命周期/elf-entry-and-init-proc
0xe6a83a0GetPjrtApi导出的 PJRT 条目 thunk生命周期/get-pjrt-api-thunk · pjrt/概述
0xe6a9d00pjrt::tpu_plugin::PJRT_Plugin_InitializePJRT_Api 的一次性插件初始化插槽生命周期/tftpu-initialize-bootstrap · 生命周期/模块初始化插件发现
0xe6aa440pjrt::tpu_plugin::GetTpuPjrtApi惰性 PJRT_Api 构建器 + 单例缓存生命周期/get-pjrt-api-thunk · pjrt/概述
0xe6f54a0TfTpu_InitializeC-shim 运行时引导程序生命周期/tftpu-initialize-bootstrap
0xeaafba0TpuExecutable_LoadProgramAndEnqueueToStream导出的 C-shim 运行时执行条目运行时/加载程序入队 · 垫片/tpu-可执行名册
0xf5a2900xprof::tpu::GetTraceCodecPer-DeviceType 跟踪编解码器工厂分析/跟踪 xevent 条目 · 分析/概述
0xf6993a0xprof::tpu::DeviceTypeFromDeviceIdentifiers设备标识符 → 设备类型调度程序取证/每代功能调度程序 · 目标/pci-device-ids
0xf795300jellyfish::AutoOr<bool>::FromProtoOrDieAutoProto → AutoOr 标志物化器配置/注册表介导的标志 · 配置/autoproto-autoor-resolution
0xf849ec0xla::TpuCompiler::RegisterAllPhasesHLO通行管道注册根运行时/内部通行名 · 编译器/概述
0xf874160pjrt::CreatePjrtApi填充 140 个 PJRT_Api 插槽 + 延长链pjrt/api-vtable-reconstruction · pjrt/概述
0x1096fac0jellyfish::(anon)::RunHloSchedulerLHS背后的调度程序驱动程序sched/lhs-ilp-变体 · 配置/注册表介导的标志
0x109c6fa0TensorCoreBarrierAssignment::DetermineBarrierConfigForKeyTensorCore 屏障配置求解器屏障/张量核屏障 · 屏障/推断屏障配置
0x12fc3080jellyfish::RunMemorySpaceAssignmentHBM/VMEM内存空间分配驱动程序编译器/msa-概述 · 编译器/编译阶段
0x130abfc0jellyfish::CostModel::GetCollectiveCycles集体操作周期估计器成本/tpu-hlo-成本分析 · 集体/spmd-link-count-cost
0x133c2dc0ConstructConfigForCollectiveUniDirNDGroupsUniDir-ND 集体配置生成器集体/张量分割平面
0x13426260jellyfish::DeepseaExecutable::LoadProgramAndEnqueueToStream运行时程序加载+流入队运行时/加载程序入队 · 运行时/概述
0x136321a0xla::LatencyHidingScheduler::RunImplLHS核心调度循环sched/lhs-布局后 · 前端/编译流程演练
0x137d3de0TwistedTorusND::GetPhase1ReplicaGroups第一阶段副本组几何路由/路由表生成
0x13a33320sparse_core::isa_emitter::GetVectorMaskSparseCore 矢量掩码 MCOperand 发出稀疏核心/扫描数据路径
0x1c6a75c0jellyfish::net_util::BarrierCoresTreeTree-barrier核心枚举屏障/树屏障垂直同步 · 屏障/复制屏障
0x1c89adc0jellyfish::ResourceVector::Acc资源向量累加原语成本/减少窗口池成本 · 成本/卷积成本状态
0x1c89ce20jellyfish::CycleTable::GetResource每指令资源查找成本/资源枚举 · 成本/tpu-hlo-成本分析
0x1c89f820jellyfish::LatencyTable::LatencyBetween边缘延迟访问器(调度器)sched/mrb 链分配器 · 成本/捆绑感知成本
0x1c89fba0jellyfish::LatencyTable::Create每个版本延迟表工厂成本/概述
0x1c8a0d60jellyfish::LatencyTableJellyfish::LatencyBetweenInternalJF 延迟边缘实现isa/slot-eup-超越 · 成本/捆绑感知成本
0x1c8ae5c0viperfish::MxuLatencyTable::GetResourceUsageMXU 每指令资源使用情况每个张量核心的成本/iars · 成本/vf 周期表
0x1d0b33e0tpu::System::Execute顶级异步程序执行运行时/加载程序入队 · 运行时/概述
0x1d522f40jellyfish::LloRegionBuilder::VsyncAddRemote远程 vsync sflag 发射器屏障/远程标志编码器 · 屏障/树屏障垂直同步
0x1d60f400jellyfish::Target::LaneCount每个目标 SIMD 通道数目标/tpu-拓扑结构 · 内存/tpu 缓冲区布局
0x1d60f420Target::GetGlobalBarrierSyncFlagNumber保留全局屏障 sflag id屏障/推断屏障配置 · 屏障/全局屏障窗口
0x1d60f4e0Target::GetMegacoreBarrierSyncFlagNumber保留的 megacore-barrier sflag id屏障/全局屏障窗口 · 屏障/屏障到 sflag 绑定
0x1d60fc20jellyfish::Target::Init每目标拓扑初始化程序目标/tpu-拓扑结构 · 屏障/推断屏障配置
0x1d615b40jellyfish::Target::CoresPerChip每芯片内核数(TpuCoreType)屏障/张量核屏障 · 扭曲/兆核-偶-奇
0x1d6ffae0jellyfish::MemorySpaceToStringMemorySpace 枚举 → 名称isa/内存空间枚举 · 附录/内存空间表
0x1d73e640jellyfish::OverrideTpuCompEnvByCmdLineFlags标志 → comp-env 覆盖附录/标志目录完整 · 配置/注册表介导的标志
0x1d73fcc0jellyfish::SetFieldFromFlagString字符串标志字段设置器配置/概述 · 配置/注册表介导的标志
0x1e66a860xla::DefaultDebugOptionsIgnoringFlags硬编码 DebugOptions 默认值配置/默认调试选项 · 配置/调试选项-proto
0x1e835fa0tpu::TpuCodec::Create每个版本编解码器工厂目标/tpuhal-class-hierarchy · 目标/tpu-版本-代码名称-矩阵
0x1e86c7c0EncoderJf::EncodeBundleInternalJellyfish 32字节捆绑编码器isa/isa-发射器-注册表 · barnacore/bcs-32byte-bundle
0x1fa0a900BitCopy(void*, int, const void*, int, int)通用位域复制原语前端/编译流程演练 · barnacore/bcs-32byte-bundle
0x204cecc0tpu::driver::InitializeDriver驱动程序启动(总线探针、核心枚举)配置/概述 · 生命周期/tftpu-initialize-bootstrap
0x20ad3020tpu::TpuTopology::LogicalDevicesPerChip每个芯片的逻辑设备(按 TpuCoreType)扭曲/兆核-偶-奇 · 目标/tpu-拓扑结构
0x20b1b040tpu::TpuChipParts::DefaultsForVersion每个版本芯片部件默认值目标/芯片零件-binarypb · 附录/每代比较矩阵
0x20b3a480tpu::TpuVersionToStringTpuVersion 枚举 → 代号字符串取证/每代功能调度程序 · isa/isa-发射器-注册表
0x20ccca20tensorflow::tpu::GetLibTpuInitArgumentslibtpu 初始化参数向量生命周期/模块初始化插件发现 · 附录/标志目录完整
0x215f26f0.init_array(底座)静态构造函数指针数组生命周期/elf-entry-and-init-proc
0x215f8190.init_array(完)构造函数数组结束(~2,900)生命周期/elf-entry-and-init-proc
0x21cfa9e0AutoProto::_table_ 邻里相邻 AutoProto 反射台配置/autoproto-autoor-resolution · 配置/autoproto-message-arms
0x22048b30.data.rel.ro(完)重新定位 RO:vtable、RTTI 图附录/二进制布局
0x223a1320opcode_info (461 × uint16)LLO 操作码属性/注册表文件表isa/llo-opcode-enum · 附录/llo 操作码表
0x224bf798filewrapper_toc (_ZL7toc_ptr)嵌入式 blob 目录附录/filewrapper-toc-catalog · 取证/自定义部分
0x227ba840GetTpuPjrtApi::pjrt_api(单例)缓存 PJRT_Api.lbss 中的第一个对象pjrt/api-vtable-reconstruction · 取证/自定义部分

GOTCHA — 打开表格的五个锚点(0x1c604800x3366d900x84a00000xb438aec0xbe8af30)排序低于 .text 的基础0xe63c000,尽管有些是 8 个十六进制数字并且看起来“高”。它们是数据:.lrodata中的0x1c60480/0x3366d90.rodata中的0x84a0000.rodata/protodesc_cold中的0xb438aec/0xbe8af30。大代码模型 l 标记部分 (.lrodata 0x01884a000x084931d0) 位于 movabs 达到的低频段,而不是 RIP 相对 lea 达到的低频段。不要假设一个看起来很小的 VA 是早期功能的内部;首先检查该部分。

注意 — 主表是权威的主干。下面的子系统部分重申了按角色分组的相同锚点以及额外的上下文;他们没有添加新的绑定。当两者意见不一致时,主桌获胜。

如何使用索引

预期的工作流程是单 VA 查找。给定 IDA 中的地址:

  1. 舍入到功能头。 符号条目 VA 上的表格键。如果你的光标在0xf874223,那么拥有的函数就是你的VA最大的表键——这里是CreatePjrtApi@0xf874160。该索引不列出内部地址;使用反汇编的函数边界找到头部,然后查找头部。
  2. 读取带,而不仅仅是行。 subsystem-map 将每个地址带固定到子系统;如果您的 VA 位于两个索引行之间,该区域仍会告诉您要浏览哪个子系统部分。 PJRT/生命周期为0xe6…0xf8…;成本模型/目标/水母核心为0x1c8…0x1d7…; ISA编码器和每代工厂为0x1e8…0x20b…;数据部分位于 0xc2… 下方和 0x214… 上方。
  3. 跟随第一个拥有链接。 拥有页面中的第一页是规范所有者 - 其主题此锚点的页面。第二个是上下文的高价值共引页面(调用者、同级页面或目录)。
  4. 对于数据 VA,需要一个范围。 数据锚点(.rodata.lrodataprotodesc_cold.init_array.data.rel.ro)被引用为“开始,结束)`spans on their owning pages; a single VA inside the span resolves to the section, not a symbol. [`二进制布局` 是精确边界的权威”。

适用范围及选型

锚点仅在横切时才获得一行:在三个或更多 src/ 页面上引用,或导出的入口点,或多个子系统引用的数据部分。该规则故意排除了读者在 IDA 中仍会遇到的三大类别——索引是这么说的,而不是假装完整:

  • 每页局部变量。 _GLOBAL__N_ 帮助程序、lambda 主体和一次性重写器,一页记录到位。它们可以从该页面找到;在这里复制它们会埋葬脊柱。
  • ICF 重复。 相同的代码折叠会生成许多字节相同的小函数和数据表副本(kDeviceTypeInfo 故事就是典型示例:0x1c60480 的一个主副本,13 个数据副本)。该索引仅列出规范副本。
  • 每操作码/每臂离开。 461 LLO 操作码、AutoProto 消息臂、InstBits 行 — 这些是,由表锚索引一次(opcode_info @ 0x223a1320InstBits @ 0x3366d90),而不是行按行。 因此,

错过索引的 VA 并非未记录;它要么是索引函数的内部,要么是其所属页面上的每页局部变量,要么是索引表的成员。在结束间隙之前,绕到头部并重新查找。


PJRT 和生命周期锚

这些是读者首先访问的地址:加载器入口点、静态构造函数机制和延迟构建的 API 单例。它们聚集在低位 (0xe6…0xf8…),静态初始化数据位于 .init_array/.lbss 的高位。

VA符号角色所属页面
0xe635524.init_procDT_INIT;跳转到__do_init生命周期/elf-entry-and-init-proc
0xe63c000__do_init行走 .init_array,运行构造函数生命周期/elf-entry-and-init-proc
0xe6a83a0GetPjrtApi薄导出的 thunk → GetTpuPjrtApi生命周期/get-pjrt-api-thunk
0xe6a9d00PJRT_Plugin_Initialize一次性插件初始化 PJRT_Api 插槽生命周期/tftpu-initialize-bootstrap
0xe6aa440GetTpuPjrtApi构建 + 缓存 PJRT_Api 一次生命周期/get-pjrt-api-thunk
0xe6f54a0TfTpu_InitializeC-shim 初始化路径(非 PJRT 使用者)生命周期/tftpu-initialize-bootstrap
0xeaafba0TpuExecutable_LoadProgramAndEnqueueToStream导出的 C-shim 执行条目运行时/加载程序入队
0xf874160CreatePjrtApi填充 140 个插槽 (struct_size 1120) + 扩展链pjrt/api-vtable-reconstruction
0x204cecc0driver::InitializeDriver驱动程序启动(总线探针、核心枚举)配置/概述
0x20ccca20GetLibTpuInitArguments返回 libtpu init-arg 向量生命周期/模块初始化插件发现
0x215f26f0.init_array底座构造函数指针数组的开始生命周期/elf-entry-and-init-proc
0x215f8190.init_array 结束~2,900 个构造函数 (DT_INIT_ARRAYSZ 23,200 B)生命周期/elf-entry-and-init-proc
0x227ba840pjrt_api 单例.lbss 中的第一个对象;缓存的 PJRT_Apipjrt/api-vtable-reconstruction

QUIRK — 唯一需要的 PJRT 导出是 GetPjrtApi @ 0xe6a83a0,但它几乎什么也不做:它尾部调用 GetTpuPjrtApi @ 0xe6aa440,它延迟运行 CreatePjrtApi @ 0xf874160 一次并将结果存放在静态本地 pjrt_api @ 0x227ba840 中。追寻“API 表在哪里构建”的重新实现者将在到达组装站点之前通过三个子系统中的三个地址。


编解码器和每代锚点

每个版本工厂和 ISA 编码器。它们将 TpuVersion/DeviceType 解析为编解码器、代号字符串或 32 字节编码包,并与指令位和操作码属性数据表一起位于上部 .text 带(0x1e8…0x20b…)中。

VA符号角色所属页面
0xf6993a0DeviceTypeFromDeviceIdentifiers标识符 → 设备类型调度程序取证/每代功能调度程序
0x1e835fa0TpuCodec::CreateTpuVersion → 编解码器实例目标/tpuhal-class-hierarchy
0x1e86c7c0EncoderJf::EncodeBundleInternal水母包 → 32 字节isa/isa-发射器-注册表
0x1fa0a900BitCopy编码器使用的通用位域 blitbarnacore/bcs-32byte-bundle
0x20b1b040TpuChipParts::DefaultsForVersion每个版本芯片部件默认值目标/芯片零件-binarypb
0x20ad3020TpuTopology::LogicalDevicesPerChip每个芯片的逻辑设备(按内核类型)扭曲/兆核-偶-奇
0x20b3a480TpuVersionToStringTpuVersion → 代号字符串取证/每代功能调度程序
0x223a1320opcode_info(数据)461 × uint16 LLO 操作码属性字isa/llo-opcode-enum
0x3366d90InstBits(数据)每个操作码 TensorCore 编码位isa/instbits-master-db

明白了 — 种子简写“DefaultsForVersion@0x20b1b040”解析为 tpu::TpuChipParts::DefaultsForVersion,不是自由函数。重新实现者必须通过 TpuChipParts 聚合输入它;该 VA 处没有独立的 DefaultsForVersion 符号。


成本模型锚

成本模型主干:调度程序查询的延迟/周期/资源表和累加器。它们生活在紧张的 jellyfish/viperfish 频段 (0x1c89…0x1c8a…) 中,.rodata 中的 LUT 数据价格在 0xb438… 附近下降。

VA符号角色所属页面
0xb438aecresLUT(数据)VF资源循环LUT(定价单元)成本/vf 周期表
0x130abfc0CostModel::GetCollectiveCycles集体操作周期成本成本/tpu-hlo-成本分析
0x1c89adc0ResourceVector::Acc资源向量累加成本/减少窗口池成本
0x1c89ce20CycleTable::GetResource每指令资源查找成本/资源枚举
0x1c89f820LatencyTable::LatencyBetween调度程序的边缘延迟sched/mrb 链分配器
0x1c89fba0LatencyTable::Create每个版本延迟表工厂成本/概述
0x1c8a0d60LatencyTableJellyfish::LatencyBetweenInternalJF 延迟边缘实现isa/slot-eup-超越
0x1c8ae5c0MxuLatencyTable::GetResourceUsageMXU 每指令资源使用情况每个张量核心的成本/iars

目标和内存锚点

重新实现器不断访问的 jellyfish::Target 访问器 - 通道数、每芯片核心数、保留的同步标志数 - 以及内存空间字符串化器。全部在0x1d6…频段。

VA符号角色所属页面
0x1d60f400Target::LaneCountSIMD 目标通道目标/tpu-拓扑结构
0x1d60f420Target::GetGlobalBarrierSyncFlagNumber保留全局屏障标志屏障/推断屏障配置
0x1d60f4e0Target::GetMegacoreBarrierSyncFlagNumber保留 megacore-barrier sflag屏障/全局屏障窗口
0x1d60fc20Target::Init每目标拓扑初始化程序目标/tpu-拓扑结构
0x1d615b40Target::CoresPerChip每芯片内核数(TpuCoreType)屏障/张量核屏障
0x1d6ffae0MemorySpaceToStringMemorySpace 枚举 → 名称isa/内存空间枚举

注意 — Target::Init @ 0x1d60fc20 是填充每个其他 Target:: 访问器读取的对象的构造函数; 0x1d60f4xx 的访问器是那里设置的字段的简单 getter。跟踪来自 Init 的数据流,而不是来自 getter 的数据流。


屏障、集体和路由锚点

同步和集体几何机制:屏障配置解算器、树屏障核心枚举器、远程垂直同步编码器和扭曲环面副本组几何。分布在 0x109…0x133…0x137…0x1c6…0x1d5…

VA符号角色所属页面
0x109c6fa0TensorCoreBarrierAssignment::DetermineBarrierConfigForKey屏障配置求解器屏障/张量核屏障
0x133c2dc0ConstructConfigForCollectiveUniDirNDGroupsUniDir-ND集体配置集体/张量分割平面
0x137d3de0TwistedTorusND::GetPhase1ReplicaGroups第一阶段副本组几何路由/路由表生成
0x13a33320isa_emitter::GetVectorMaskSparseCore 矢量掩模发射稀疏核心/扫描数据路径
0x1c6a75c0net_util::BarrierCoresTreeTree-barrier核心枚举屏障/树屏障垂直同步
0x1d522f40LloRegionBuilder::VsyncAddRemote远程 vsync sflag 发射器屏障/远程标志编码器

编译器、调度器和运行时锚点

管道注册、延迟隐藏调度程序核心、flag/comp-env 管道和运行时执行路径。编译器/配置代码位于 0xf8…/0x1d7…/0x1e6… 频段; 0x10…0x13… 中的调度程序和运行时。

VA符号角色所属页面
0xf795300AutoOr<bool>::FromProtoOrDieAutoProto → 标志物化器配置/autoproto-autoor-resolution
0xf849ec0TpuCompiler::RegisterAllPhasesHLO通行证管道注册运行时/内部通行名
0x1096fac0(anon)::RunHloScheduler调度程序驱动程序sched/lhs-ilp-变体
0x12fc3080RunMemorySpaceAssignmentHBM/VMEM 内存空间分配编译器/msa-概述
0x136321a0LatencyHidingScheduler::RunImplLHS核心调度循环sched/lhs-布局后
0x13426260DeepseaExecutable::LoadProgramAndEnqueueToStream程序加载+入队运行时/加载程序入队
0x1d0b33e0System::Execute顶级异步执行运行时/加载程序入队
0x1d73e640OverrideTpuCompEnvByCmdLineFlags标志 → comp-env 覆盖附录/标志目录完整
0x1d73fcc0SetFieldFromFlagString字符串标志字段设置器配置/概述
0x1e66a860DefaultDebugOptionsIgnoringFlags硬编码 DebugOptions 默认值配置/默认调试选项

分析和数据部分锚点

跟踪管道工厂、每个设备类型信息表以及读者将滚动到的大型只读数据部分,而光标下没有函数。这些是最有可能被引用为“范围”而不是单个 VA 的锚点。

VA符号/部分角色所属页面
0x84a0000.rodata 名称池(基础)合并的以 NUL 结尾的字符串池附录/filewrapper-toc-catalog
0xbe8af30protodesc_cold(部分,→ 0xc1bf0b0)序列化 FileDescriptorProto blob附录/protodesc-cold-catalog
0xf5a2900GetTraceCodecPer-DeviceType 跟踪编解码器工厂分析/跟踪 xevent 条目
0x1c60480kDeviceTypeInfo(.lrodata,→ 0x1c64d48)DeviceTypeInfo[17]冷冻台分析/kdevicetypeinfo-生产者-读者
0x21cfa9e0AutoProto::_table_ 邻里 (.data.rel.ro)相邻 AutoProto 反射台配置/autoproto-autoor-resolution
0x22048b30.data.rel.ro(完)重新定位 RO:vtables + RTTI 图附录/二进制布局
0x224bf798filewrapper_toc(_ZL7toc_ptr,488 B)嵌入式 blob 目录附录/filewrapper-toc-catalog

QUIRK — kDeviceTypeInfo @ 0x1c60480.lrodata(perm 4,只读无写),在 [0x1c60480, 0x1c64d48) 上具有 .rela.dyn 条目 - 它在链接时冻结,并且没有运行时生成器。 .lrodata其他地方的13字节相同副本是ICF数据重复,而不是独立表;仅索引主副本。

CORRECTION (ANCHOR-1) — 数据锚点 0x84a0000(名称池)、0xb438aec(resLUT)、0x223a1320(opcode_info)、0x3366d90(InstBits)、0x224bf798 (filewrapper_toc)、0x227ba840 (pjrt_api)、0x215f26f0/0x215f8190 (.init_array) 和 0x22048b30 (.data.rel.ro end) 解析为 …_function_addresses.json 中的符号 — 该文件列出了代码函数仅。它们是数据/部分锚点,并根据所属页面的部分/符号引用进行验证(对于 kDeviceTypeInfopjrt_api,根据命名符号 _ZN5xprofL15kDeviceTypeInfoE_ZL7toc_ptr)。函数表查找失败的地址并不因此无效;在将未命中视为缺陷之前,检查所属页是否将其固定为数据。


交叉引用

  • 子系统图 — 正向索引:地址带 → 子系统;与这个平坦的反向指数配对
  • 代号备忘单 — 代号 → 每代事实;这里的许多锚点都是那里引用的每代工厂函数
  • 交叉参考图 — 页面 → 页面链接图;使用它从拥有页面走到其邻居页面
  • 符号命名空间索引 — 命名空间普查(xla::jellyfishxprof::tpu,...)位于此处索引的符号后面
  • 二进制布局 — 完整段/节表;上述每个数据部分范围的权限
  • 每代比较矩阵 — 将每个版本的工厂锚点(TpuCodec::CreateDefaultsForVersionTpuVersionToString)收集到一张表中
  • Get-PjrtApi Thunk — 生命周期锚跟踪的三跳 PJRT 入口路径
  • PJRT API-Vtable重建 — 140 槽表 CreatePjrtApi 填充和 pjrt_api 单例缓存