You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在mipsel-sony-psx目标下编译Rust代码,如何生成R_MIPS_16重定位静态变量?

针对mipsel-sony-psx目标编译Rust时生成特定重定位的问题

我正在为mipsel-sony-psx目标(32位指针架构)编译Rust代码,需要定义两个特定大小的静态变量:

  • 4字节变量:存储外部符号的完整指针
  • 2字节变量:存储该指针的低16位

以下是我的代码:

use core::ptr;

static mut EXT_DATA_ALL: *const u8 = ptr::addr_of!(EXT_DATA);
static mut EXT_DATA_LO: u16 = ptr::addr_of!(EXT_DATA) as u16; // 此处无法正常编译

extern "C" {
    static mut EXT_DATA: u8;
}

当前状态与问题

  • EXT_DATA_ALL可以正常编译,会生成R_MIPS_32类型的重定位。我本来希望它是u32类型,但Rust不允许编译时将指针强制转换为整数,这点我可以接受。
  • EXT_DATA_LO编译失败,报错信息如下:
error: pointers cannot be cast to integers during const eval
    --> ...
     |
     |     ptr::addr_of!(EXT_DATA) as u16,
     |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
     |
     = note: at compile-time, pointers do not have an integer value
     = note: avoiding this restriction via `transmute`, `union`, or raw pointers leads to compile-time undefined behavior

我期望这个变量存储指针的低16位,认为可以通过R_MIPS_16重定位实现(该重定位会将地址截断为16位),但不知道如何让Rust生成这种重定位。

备选方案的顾虑

我考虑过在编译后手动编辑ELF文件添加重定位,但担心编译器会对初始化时设置的占位值进行优化,这个顾虑是否合理?这是不是唯一可行的方案?

关于global_asm!的疑问

我想到可以用global_asm!通过.half %lo(EXT_DATA)来正确生成所需重定位,但需要让这个数据关联到Rust的static变量,不确定global_asm!是否能实现这一点。

内容的提问来源于stack exchange,提问作者Filipe Rodrigues

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 13:31:08