前几天,对 Rust 编译器的数据布局字符串,或者更具体地说,底层 LLVM 的数据布局字符串的基本了解,已经在Stack Overflow上基本解决了。不幸的是,有一件事仍不清楚。
许多 Rust 编译器目标都包含p270:32:32-p271:32:32-p272:64:64在其数据布局字符串中。示例有i686-unknown-uefi、x86_64-uwp_windows-msvc、x86_64-unknown-uefi、x86_64-unknown-linux_gnu、x86_64-fuchsia或86_64-apple-darwin。
(这些目标可以在这里找到https://github.com/rust-lang/rust/tree/1.52.1/compiler/rustc_target/src/spec。)
LLVM语言参考解释道:
p[n]:<size>:<abi>:<pref>:<idx>这指定了指针的大小及其地址空间 n 的错误对齐方式。第四个参数是用于地址计算的索引的大小。如果未指定,则默认索引大小等于指针大小。所有大小均以位为单位。地址空间 n 是可选的,如果未指定,则表示默认地址空间 0。n 的值必须在 [1,2^23) 范围内。
我不明白这一点。p270有什么特别之处p272?他们指的是哪个“地址空间”?
我想使用 Cargo/Rust 编译 x86 的裸机 32 位代码(在 32 位模式下又称为 i686 或 x86_64)。我需要什么目标?在官方支持的目标列表中我找不到任何实用的东西。