讲师中心 微信公众号
AI工具推荐 视频效率加速

LLVM后端怎么处理Fixup和重定位

梦芳大大_9448

梦芳大大_9448

发布时间:2026-09-29 13:05:03

|

538人浏览过

|

来源于php中文网

原创

Fixup是LLVM后端对“待修补位置”的内部抽象,当MCCodeEmitter遇到无法立即求值的符号表达式(如sym+4)时,生成MCFixup记录偏移、重定位类型和表达式,由AsmPrinter触发并最终写入目标文件的.rela.*节。

llvm后端怎么处理fixup和重定位

LLVM 后端处理 Fixup 和重定位,本质是把“地址未定”的指令或数据引用,在目标文件生成阶段打上标记,留待链接器(如 lld)或加载器填入最终地址。这不是后端一次性算出地址,而是分阶段协作:后端负责识别哪些地方需要修补、生成何种重定位类型、写进目标文件的 .rela.* 节;链接器负责解析符号、计算地址、执行修补。

什么是 Fixup?它在后端里怎么出现

Fixup 是 LLVM 后端内部对“待修补位置”的抽象,不是目标文件格式里的标准术语,而是 MCExpr / MCFixup 机制中的一环。当你在 MCInst 指令里用到一个尚未确定地址的符号(比如函数名、全局变量),MCCodeEmitter 无法直接编码成机器码,就会生成一个 MCFixup 实例,附着在该指令的操作数上。

  • MCFixup 记录了三要素:要修补的字节偏移、要应用的重定位类型(如 R_CPU0_32)、原始表达式(如 sym + 4)
  • 它通常由 AsmPrinter::EmitInstruction() 触发,在调用 MCCodeEmitter::encodeInstruction() 时,遇到无法立即求值的 MCExpr 就创建 MCFixup
  • 同一个指令可能有多个 Fixup,例如一条取地址指令同时含符号和偏移:lw $t0, sym+8($zero)

重定位类型怎么定义和使用

重定位类型(如 R_X86_64_PC32、R_AARCH64_ABS64)必须与目标架构严格匹配,由后端在 TargetInfo 子系统中注册,并在 MCCodeEmitter 或 ELFObjectWriter 中映射到具体语义。

  • 定义位置通常在 include/llvm/BinaryFormat/ELF.h(通用)或 lib/Target/Cpu0/MCTargetDesc/Cpu0FixupKinds.h(自定义)
  • 每个 Fixup 必须绑定一个 FK_* 枚举值(如 FK_CPU0_32),再由 Cpu0ELFObjectWriter::getRelocType() 映射为 ELF 标准重定位码
  • 错误常见于:自定义后端漏实现 getRelocType(),或传入了不支持的 FixupKind,导致 llc -filetype=obj 报错 unhandled fixup kind
  • 向量指令、跳转范围受限指令(如 RISC-V 的 beq)常需特殊重定位类型来支持短跳转优化或 relax 处理

后端如何把 Fixup 写进目标文件

当 llc 以 -filetype=obj 运行时,AsmPrinter 使用 MCObjectStreamer,最终交由 MCObjectWriter(如 ELFObjectWriter)落盘。此时所有 Fixup 被转换为重定位表项(Rela 条目),写入 .rela.text 或 .rela.data 等节。

  • 每个 Rela 条目含:被修补地址(r_offset)、符号索引(r_info)、加数(r_addend)
  • r_addend 来自 MCFixup 原始表达式的常量部分,例如 sym + 12 的 12 就进 r_addend,而非硬编码在指令流里
  • 若后端启用了 MCAsmBackend::shouldForceRelocation() 返回 true(如处理弱符号、TLS),即使看似可立即编码的位置也会强制生成 Fixup
  • 注意:llc -filetype=asm 不触发 Fixup 处理,所有符号以伪操作(如 .quad sym)形式输出,留给汇编器(as)二次处理

真正容易被忽略的是 Fixup 的生命周期——它只存在于 MCInst → ObjectFile 这一瞬;一旦写入 .o,就变成静态的重定位表项,后端代码再也无法干预。这意味着所有符号解析逻辑、地址计算假设(如是否 PIC、是否小内存模型)必须在 MCCodeEmitter 和 AsmPrinter 阶段就完全确定,不能指望链接器“反过来改指令”。

热门AI工具

更多
PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2163

2023.08.11

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

5790

2024.03.19

后端的主要工作内容介绍
后端的主要工作内容介绍

后端是应用程序的服务端部分,负责核心任务,如数据库交互、业务逻辑处理和响应客户端请求。想了解更多后端的相关内容,可以阅读本专题下面的文章。

5086

2024.03.19

PixTV AI视频生成与无限画布创作
PixTV AI视频生成与无限画布创作

PixTV专题整理AI视频与视觉内容创作相关功能使用教程,涵盖AI生图、视频生成、无限画布、多模型创作、素材管理、声音音乐及视频剪辑等功能,帮助用户快速掌握PixTV从创意到成片的完整制作方法。

0

2026.09.29

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

200

2026.09.23

Buffalo框架路由与请求处理实操指南
Buffalo框架路由与请求处理实操指南

本专题讲解Buffalo框架路由与请求处理机制,涵盖路由注册与分组、资源路由、Handler编写规范、Context上下文方法、参数绑定、中间件编写挂载、Session与Cookie读写、Flash消息及错误页面定制方法。

100

2026.09.23

Buffalo框架零基础入门教程
Buffalo框架零基础入门教程

本专题整理Buffalo框架入门内容,涵盖Go环境准备、buffalo CLI安装、新项目生成、目录结构说明、dev热加载启动、数据库连接配置与常见报错排查,帮助新手按约定优于配置的思路跑通第一个Buffalo框架应用。

80

2026.09.23

Conan创建软件包配方指南
Conan创建软件包配方指南

本专题介绍通过conanfile.py创建软件包的方法,讲解包名、版本、依赖和构建设置等基础信息,以及source、build、package、package_info等常用方法的作用及编写思路。

60

2026.09.22

Conan二进制包配置指南
Conan二进制包配置指南

本专题介绍Conan根据操作系统、编译器、架构和构建类型生成二进制包的方法,讲解Profile、Settings、Options及Package ID的作用,帮助管理不同平台和编译环境下的包版本。

60

2026.09.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn