在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
相关产品推荐
相关产品推荐

