参考文献
本书中的每一页都是从自由重新分发的
libtpu-0.0.40-cp314PyPI 轮 (manylinux_2_31_x86_64) 重建的libtpu.so:一个 781,691,048 字节的 ELF64 共享对象,build-id89edbbe81c5b328a958fe628a9f2207d。此页面记录了分析的工件、分析它的法律依据、读取它的工具以及重建所依赖的外部标准和公共参考。每个地址的另一个轮子都会有所不同。
摘要
这是参考页面。书中的每一页都声明有关单个(未剥离的)带有符号的共享对象;该页面记录了这些声明所依赖的设备。它被组织为五个引文寄存器:精确分析的工件的出处(精确到字节数和构建 ID); 法律依据,对公开分发的二进制文件进行逆向工程以实现互操作性和研究是合法的;执行分析的工具;二进制文件的布局和内容符合的外部标准和规范(因此读者可以解码 Itanium 损坏的符号、System V ABI 重定位或 protobuf 描述符,而无需重新导出格式);以及 TPU/XLA/PJRT 域的公共技术参考,它界定了二进制文件是什么。
本书的中心原则是这里没有从源代码中读取任何内容。所有分析均来自使用 IDA Pro 9.x 对已编译的 libtpu.so 和 sdk.so ELF 对象进行静态逆向工程。没有使用源代码或任何其他受限制或受版权保护的材料——所有发现仅来自对编译的二进制文件的分析。因此,下面的出处部分与本书的其余部分写在相同的纯 RE 寄存器中:尺寸、构建 ID 和部分事实,任何拥有方向盘和 readelf 的人都可以独立确认。法律、标准和参考部分是普通引用——它们向外指向公共、稳定的文档,并且不声明任何有关二进制文件内部结构的内容。
该轮子在 PyPI 上免费提供; Google 将其发布为官方 Cloud TPU PJRT 插件。它的公开分发和这项工作的互操作性/研究目的使得分析合法——同样的框架适用于对任何公开分发的软件工具链进行逆向工程。其权限被编录在 法律依据 下。
本页合约:
- 出处 — 确切的轮子、其中的两个 ELF 对象、它们的大小和构建 ID,以及轮子公开分发的位置,以便可以重新获取并逐位重新验证该工件。
- 法律依据 — 规范的互操作性逆向工程权威(美国法规+判例法、欧盟指令),精确引用。
- 工具、标准、参考 — 反汇编器和 ELF 工具;分析解码所依据的二进制格式和 IR 标准;以及 TPU/XLA/PJRT 的公共领域参考。
| 神器 | libtpu-0.0.40-cp314-cp314-manylinux_2_31_x86_64.whl |
| 主要对象 | libtpu/libtpu.so — 781,691,048 B,构建 ID 89edbbe81c5b328a958fe628a9f2207d |
| 次要对象 | libtpu/sdk.so — 22,541,240 B,构建 ID 4e9025466f71009fccb46a803806411c63744a0a |
| 轮式版本 | 0.0.40(来自轮子METADATA;由__init__.py显示为__version__) |
| 嵌入式工具链 | LLVM/MLIR 23-dev(主干),monorepo 提交 8918319853fbdf9e6f6cb69e96848f913a22bc31 |
| 分析工具 | IDA Pro 9.x(Hex-Rays 反编译器 + FLIRT) |
| 方法 | 未剥离、带有符号的 x86-64 ELF 的静态逆向工程 — 无源代码、无调试器、无运行的 TPU |
出处
分析的工件是一个 PyPI 轮。书中的所有内容都是从它包含的两个 ELF 共享对象中恢复的。本节通过唯一标识这些对象的属性来修复这些对象,以便读者可以重新获取轮子,提取它,并使用 readelf 和 ls 确认下面的每个图。
神器
轮文件名编码完整身份:
libtpu-0.0.40-cp314-cp314-manylinux_2_31_x86_64.whl
| | | | |
| | | | +-- platform: manylinux_2_31, x86-64 (glibc >= 2.31)
| | | +-- ABI tag: cp314 (CPython 3.14 ABI)
| | +-- Python tag: cp314 (CPython 3.14)
| +-- version: 0.0.40
+-- distribution: libtpu (Google Cloud TPU PJRT plugin)
```text
轮子是 ZIP 存档;提取它会生成一个 `libtpu/` 包目录,其中包含两个共享对象以及打包元数据(`__init__.py`、`LICENSE`、`THIRD_PARTY_NOTICES.txt`、`SDK_THIRD_PARTY_NOTICES.txt`)。软件包 `LICENSE` 将该软件标识为 `Copyright [2026] Google LLC`,根据 Google Cloud Platform 协议提供。该套件的 `__init__.py` 源自 `importlib.metadata.version("libtpu")` 的 `__version__` — 即记录在车轮 `METADATA` 中的 `0.0.40` 车轮版本。 (在 ELF 对象或提取的包文本文件中都看不到单独的“运行时版本”字符串;任何不同的内部版本号都是运行时查询,不是可从静态工件中重现的事实,并且在下面不依赖。)
### 事实表
这里的每个数字都是可以直接观察到的:来自 `ls -l` 或 `stat` 的尺寸,来自 `readelf -n` / `readelf -h` / `file` 的 build-ids 和 ELF 类。
| 属性 | `libtpu.so` | `sdk.so` | 如何确认 |
|---|---|---|---|
| 磁盘大小(字节) 提取文件上的 | 781,691,048 | 22,541,240 | `ls -l` |
| ELF级 | ELF64 LSB,x86-64 | ELF64 LSB,x86-64 | `readelf -h` / `file` |
| ELF型 | `ET_DYN` 共享对象 | `ET_DYN` 共享对象 | `readelf -h` |
| 操作系统/ABI | SYSV | GNU/Linux | `file` |
| 构建 ID | `89edbbe81c5b328a958fe628a9f2207d` | `4e9025466f71009fccb46a803806411c63744a0a` | `readelf -n` (`NT_GNU_BUILD_ID`) |
| Build-id 格式 | md5/uuid (16 B) | sha1 (20 B) | `readelf -n` 票据长度 |
| 符号表 | 存在(`.symtab` 幸存) | 存在 | `file` 报告“未剥离” |
| 角色 | 编译器+运行时; “745 MB”对象 | 较小的 SDK/主机 shim | 尺寸+[两二进制分割](forensics/two-binary-split.md) |
| 嵌入式 LLVM/MLIR | 23-dev 主干,提交 `8918319853fbdf…` | — | `.rodata` 文字;参见 [舱单](forensics/llvm-mlir-manifest.md) |
> **注释(出处)—** 两个 build-id 使用不同的注释格式:`libtpu.so` 携带 16 字节 md5/uuid build-id,`sdk.so` 携带 20 字节 sha1。 `readelf -n` 报告票据有效负载长度(`0x10` 与 `0x14`),其本身就是鉴别器。这种不对称是两个对象在同一版本中遵循不同构建规则的几个信号之一;完整的参数位于 [两个二进制拆分](forensics/two-binary-split.md) 中。
>
> **注意(RE 规则)—** 本书中的每项声明都**仅**源自这两个已编译二进制文件的静态分析。没有源树、没有调试器会话、没有运行的 TPU、也没有 Google 内部工件进入重建。上述出处事实是读者可以使用轮子和标准 binutils 独立重现的基本事实;书中的其他所有内容都锚定回这两个对象内的地址和偏移量。请参阅 [证据和置信约定](front/evidence-conventions.md) 了解每个页面适用的信任标签,并参阅 [方法论](methodology.md) 了解完整管道。
### 再现神器身份
```bash
# Acquire (the wheel is freely distributed on PyPI)
pip download libtpu==0.0.40 --no-deps \
--platform manylinux_2_31_x86_64 --python-version 3.14 \
--only-binary=:all: -d .
# A wheel is a ZIP; extract it
unzip libtpu-0.0.40-cp314-cp314-manylinux_2_31_x86_64.whl -d extracted/
# Confirm the two objects, byte-for-byte
cd extracted/libtpu
ls -l libtpu.so sdk.so # 781691048 / 22541240
readelf -n libtpu.so | grep 'Build ID' # 89edbbe81c5b328a958fe628a9f2207d
readelf -n sdk.so | grep 'Build ID' # 4e9025466f71009fccb46a803806411c63744a0a轮子的分布位置:Python 包索引 (pypi.org/project/libtpu/),作为 Google 为 TPU 上的 JAX/XLA 提供的官方 Cloud TPU PJRT 插件。该软件包的第三方通知(THIRD_PARTY_NOTICES.txt,731,537 B;SDK_THIRD_PARTY_NOTICES.txt,103,306 B)列举了静态链接的开源组件——嵌入式库图集中嵌入式库普查的已发布的权威证实,仅用作交叉检查,从不用作内部行为的来源。
法律依据 {#legal-basis}
对公开分发的二进制文件进行逆向工程以实现互操作性和研究是美国和欧盟法律中一项长期稳定的合法活动。本书依赖于以下权威权威。这里引用它们是因为重建的合法性是其出处的一部分,而不是因为本书断言它们有任何新颖之处。
美国 — 法规
- 数字千年版权法,17 U.S.C. § 1201(f) —“逆向工程”豁免。 允许规避技术保护措施,并开发这样做的方法,其唯一目的是识别和分析实现独立创建的程序的互操作性所需的程序元素 - 在版权法允许的范围内。这些规定还允许共享出于互操作性目的而获得的信息。这里的分析既不规避访问控制(轮子以明文形式分发)也不重新分发二进制文件; § 1201(f) 是互操作性框架的法定保障。
美国 — 判例法
Sega Enterprises Ltd. 诉 Accolade, Inc., 977 F.2d 1510(第 9 巡回法院,1992 年)。认为对计算机程序的合法获得的副本进行反汇编是合理使用,前提是它是访问程序中不受保护的功能元素(想法、接口)的唯一手段,并且复制者有正当理由(互操作性)寻求这种访问。美国的基本权威是,当其目的是研究不受版权保护的功能方面时,反汇编过程中的中间复制并不侵犯。
索尼计算机娱乐公司诉 Connectix 公司,203 F.3d 596(第 9 巡回法院,2000 年)。扩展 Sega:在逆向工程过程中对 PlayStation BIOS 进行中间复制以生成可互操作、独立编写的模拟器是合理使用,即使最终产品与原始产品竞争。确认变革性的、互操作性驱动的目的进行控制,而不是最终产品是否对商业不利。
欧盟
- 2009 年 4 月 23 日关于计算机程序法律保护的指令 2009/24/EC(“软件指令”)。
- 第 5(3) 条 — 程序的合法用户可以在未经授权的情况下观察、研究或测试其功能,以确定程序任何元素背后的想法和原则,同时执行他们有权执行的行为。
- 第 6 条 — 未经权利人授权,允许进行反编译,如果对于获取独立创建的程序的互操作性所必需的信息是必要的,则须遵守规定的条件(由被许可人执行,以前不易获得的信息,仅限于互操作性所需的部分)。
注意(范围)— 这些权威支持对功能/互操作性元素和想法的分析,而不是受保护表达的大规模复制。本书不复制源代码,也不复制二进制文件中受版权保护的表达方式;它记录了通过分析恢复的算法、数据布局和界面——正是 Sega、Connectix 和第 5-6 条所考虑的不受保护的功能元素。轮子本身是自由和公开分发的,因此“合法获得的副本”谓词得到满足,没有任何规避。这里的法律框架反映了已建立的 CUDA 工具包/公开分发的软件 RE 研究框架,并且同样适用于 libtpu 轮。有关管道内语句,请参阅 方法论§法律依据。
工具
重建使用了小型传统静态分析工具链。不涉及动态仪器、仿真和 TPU 硬件。
| 工具 | 版本 | 在本作品中的角色 |
|---|---|---|
| IDA Pro | 9.x | 主要反汇编器和反编译器。恢复代码/数据、每个函数的 Hex-Rays C 反编译、控制流图、类型信息和交叉引用——每页写入的基础。 |
| Hex-Rays 反编译器 | 与 IDA 9.x 捆绑 | 生成 C 级伪代码,全书中的 ### Algorithm 块都是从中提取出来的。 |
| 调情 | 与 IDA 9.x 捆绑 | 库签名匹配,用于识别静态链接的第三方代码(LLVM、Abseil、protobuf,...);为 嵌入式库图集 供电。 |
readelf (GNU binutils) | 系统 | ELF 标头、节/段表、注释 (NT_GNU_BUILD_ID)、动态表和符号表检查。上述每个出处事实的来源。 |
objdump (GNU binutils) | 系统 | 根据 IDA 的恢复交叉检查反汇编和部分内容。 |
nm (GNU binutils) | 系统 | 符号枚举/对 IDA 的 .symtab 读取进行交叉检查。 |
strings | 系统 | .rodata 字节偏移处的文字恢复(版本引脚、格式标记、错误文本) — 例如LLVM/MLIR 版本文字。 |
| Sidecar 提取管道 | 项目-内部 | 将 IDA 的每个函数输出(反汇编、反编译的 C、CFG、类型、外部引用)序列化为交叉验证传递所消耗的机器可读的 sidecar; 方法论 中描述。 |
注意(工具)— IDA 的符号表读取是假设来源,而不是基本事实。由于
libtpu.so未被剥离,因此标识符从.symtab中分解而来;本书将每个这样的名称都视为在反编译主体的评级高于“中等可信度”之前需要对其进行确认的声明。请参阅 方法论 了解根据主体确认名称的交叉验证规则。
标准和规范
二进制文件的布局和内容符合一系列公共、稳定的标准。读者不需要重新推导名称修改、vtable 布局、ELF 重定位或 protobuf 线格式 - 这些是分析解码所依据的权威参考。每一个都被精确地引用以定位。
二进制格式和 ABI
- System V 应用程序二进制接口 - AMD64 架构处理器补充(x86-64 psABI)。
libtpu.so和sdk.so的调用约定、寄存器用法、堆栈布局以及 ELF-64 对象格式。维护于gitlab.com/x86-psABI/x86-64-ABI;用于参数传递的管理文件以及本书阅读的节/段模型。此处指定了大代码模型变体 (.lrodata/.lbss),这就是二进制文件携带这些部分的原因。 - 工具接口标准 (TIS) — 可执行和链接格式 (ELF) 规范,v1.2,以及 System V ABi gABI 第 4-5 章。 ELF 容器:标头、节标头表、程序标头表、符号表(
.symtab/.dynsym)、重定位类型以及从中读取出处构建 ID 的注释格式(NT_GNU_BUILD_ID)。 - 安腾 C++ ABI (
itanium-cxx-abi.github.io/cxx-abi/abi.html)。 Linux 工具链实现的跨供应商 C++ ABI:名称修改语法 (_Z…),使.symtab标识符可解调; vtable布局(RTTI指针位于vtable[-1],然后是虚拟函数指针);和 RTTI /type_info对象布局(__class_type_info、__si_class_type_info、__vmi_class_type_info层次结构)。取证章节中的每个多态类和 vtable 声明均根据本文档进行解码 - 请参阅 RTTI/Vtable 普查。 - DWARF 调试信息格式,v5 (
dwarfstd.org)。调试信息的标准。作为负面参考相关:分析的对象带有.symtab但没有完整的 DWARF,它限制了可恢复的类型信息,并解释了为什么结构布局是从访问模式重建而不是从调试信息读取。
序列化和 IR 格式
- 协议缓冲区 - 编码 (
protobuf.dev/programming-guides/encoding/) 和descriptor.proto(自描述模式语言,github.com/protocolbuffers/protobuf→src/google/protobuf/descriptor.proto)。有线格式(变体,标记 = 字段编号≪ 3 ∣ 有线类型,长度分隔消息)和解码.rodata中嵌入的FileDescriptorProtoblob 的描述符模式。重建的原型页面完全依赖于这两个参考文献。 - LLVM 语言参考 (
llvm.org/docs/LangRef.html) 和 LLVM 位代码文件格式 (llvm.org/docs/BitCodeFormat.html)。嵌入式工具链生成和解析的 IR 和磁盘上位码;供应商的 LLVM 是 23-dev (trunk),monorepo 提交8918319853fbdf9e6f6cb69e96848f913a22bc31— 受哨兵屏蔽构建限制,而不是从发布横幅中读取(请参阅 LLVM/MLIR 清单)。 - MLIR — 语言参考、字节码格式和方言文档 (
mlir.llvm.org)。多级 IR 基础设施(核心 IR、方言注册表、pass infra、字节码读取器/编写器、转换框架、LLVM-IR 翻译)与 TPU 特定方言一起编译到libtpu.so中。与 LLVM 相同的 monorepo 提交;没有独立的MLIR版本号。 - Zstandard (zstd) 压缩格式 — RFC 8878 (
datatracker.ietf.org/doc/rfc8878/) 和facebook/zstd。尾随数据 blob 的压缩;参见 尾随 Zstd Blob。 - Riegeli/记录格式 (
github.com/google/riegeli)。 Google 面向记录的容器格式,其标记出现在二进制文件中,分层在 zstd 框架上。
注意(版本锚定)— 嵌入式 LLVM/MLIR 主要 (23-dev) 是工具链引脚中的单个推断数据:它受 LLVM 发布分支日历和构建纪元的限制,而不是从字符串中读取(Google 将
LLVM_VERSION_MAJOR重写为9999.0.0哨兵)。确切的参考是 monorepo 提交,而不是标记的版本。针对“LLVM 22”或“LLVM 23”标记源的重新实现者将看到 API 漂移。完整参数:LLVM/MLIR 清单 § 版本引脚。
公共技术参考
这些公共参考框架说明了二进制文件的含义——它实现的主机端 API 以及它所服务的编程模型。它们是周围生态系统的文档,而不是 libtpu.so 内部的文档;本书使用它们来命名重建后基于地址的概念。
PJRT — 插件合约
- PJRT C-API (
github.com/openxla/xla→xla/pjrt/c/pjrt_c_api.h)。 PJRT 插件导出和框架(JAX、XLA)调用的稳定 C ABI。libtpu.so是一个 PJRT 插件;本书文档的入口点表面是该标头函数表的二进制实现。此处指定版本握手、PJRT_Client/PJRT_Buffer/PJRT_Executable对象模型和错误约定。
XLA / OpenXLA — 插件嵌入的编译器
- OpenXLA / XLA(
github.com/openxla/xla、openxla.org)。加速器线性代数编译器的 TPU 后端、HLO/StableHLO 管道和运行时静态链接到libtpu.so。 HLO 语义、编译管道形状和运行时概念的参考,取证页面锚定到符号。 - 稳定HLO (
github.com/openxla/stablehlo)。可移植层/操作集规范,构建进入嵌入式 XLA 编译器的高级 IR。
TPU编程模型
- 云TPU系统架构和编程模型 (
cloud.google.com/tpu/docs)。 TPU 执行模型的公开描述 - 脉动 MXU、向量/标量单元、内存空间(HBM、VMEM/SMEM)和 SparseCore - 二进制目标中 LLO/Mosaic/SparseCore 方言。用于命名内存空间和执行单元 内存空间 和方言页面,然后在二进制文件中进行处理。
支持库
- Abseil C++(
abseil.io、github.com/abseil/abseil-cpp)。 Google 的基础 C++ 库,在整个libtpu.so中静态链接(absl::符号、Status/StatusOr、flat_hash_map、Span、Cord)。遍及恢复的调用图的容器和状态处理习惯用法的参考;固定版本位于 嵌入式库图集 中。 - 本征 (
eigen.tuxfamily.org)。链接到 CPU 端内核的线性代数模板(位码嵌入的数学路径,例如矢量化tanh)。 - 第三方声明 —
THIRD_PARTY_NOTICES.txt(731,537 B) 和SDK_THIRD_PARTY_NOTICES.txt(103,306 B),装在车轮内。权威发布的开源组件列表静态链接到两个对象,仅用作嵌入式库普查的外部交叉检查。