1
Fork 0

Fix linkage for large binaries on mips64 platforms ...

... by enabling xgot feature

Co-Authored-By: Zixing Liu <zixing.liu@canonical.com>
This commit is contained in:
Ximin Luo 2023-05-18 22:21:59 -06:00 committed by liushuyu
parent 498553fc04
commit b65c2afdfd
No known key found for this signature in database
GPG key ID: 23D1CE4534419437
4 changed files with 16 additions and 6 deletions

View file

@ -12,7 +12,7 @@ pub fn target() -> Target {
endian: Endian::Big, endian: Endian::Big,
// NOTE(mips64r2) matches C toolchain // NOTE(mips64r2) matches C toolchain
cpu: "mips64r2".into(), cpu: "mips64r2".into(),
features: "+mips64r2".into(), features: "+mips64r2,+xgot".into(),
max_atomic_width: Some(64), max_atomic_width: Some(64),
mcount: "_mcount".into(), mcount: "_mcount".into(),

View file

@ -10,7 +10,7 @@ pub fn target() -> Target {
abi: "abi64".into(), abi: "abi64".into(),
// NOTE(mips64r2) matches C toolchain // NOTE(mips64r2) matches C toolchain
cpu: "mips64r2".into(), cpu: "mips64r2".into(),
features: "+mips64r2".into(), features: "+mips64r2,+xgot".into(),
max_atomic_width: Some(64), max_atomic_width: Some(64),
mcount: "_mcount".into(), mcount: "_mcount".into(),

View file

@ -877,6 +877,12 @@ class RustBuild(object):
# preserve existing RUSTFLAGS # preserve existing RUSTFLAGS
env.setdefault("RUSTFLAGS", "") env.setdefault("RUSTFLAGS", "")
# we need to explicitly add +xgot here so that we can successfully bootstrap
# a usable stage1 compiler
# FIXME: remove this if condition on the next bootstrap bump
# cfg(bootstrap)
if self.build_triple().startswith('mips'):
env["RUSTFLAGS"] += " -Ctarget-feature=+xgot"
target_features = [] target_features = []
if self.get_toml("crt-static", build_section) == "true": if self.get_toml("crt-static", build_section) == "true":
target_features += ["+crt-static"] target_features += ["+crt-static"]

View file

@ -72,7 +72,7 @@ macro_rules! check_reg { ($func:ident, $ty:ty, $reg:tt, $mov:literal) => {
// mips32-LABEL: sym_static_32: // mips32-LABEL: sym_static_32:
// mips32: #APP // mips32: #APP
// mips32: lw $3, %got(extern_static) // mips32: lw $3, %got(extern_static)($gp)
// mips32: #NO_APP // mips32: #NO_APP
#[cfg(mips32)] #[cfg(mips32)]
#[no_mangle] #[no_mangle]
@ -82,7 +82,7 @@ pub unsafe fn sym_static_32() {
// mips32-LABEL: sym_fn_32: // mips32-LABEL: sym_fn_32:
// mips32: #APP // mips32: #APP
// mips32: lw $3, %got(extern_func) // mips32: lw $3, %got(extern_func)($gp)
// mips32: #NO_APP // mips32: #NO_APP
#[cfg(mips32)] #[cfg(mips32)]
#[no_mangle] #[no_mangle]
@ -92,7 +92,9 @@ pub unsafe fn sym_fn_32() {
// mips64-LABEL: sym_static_64: // mips64-LABEL: sym_static_64:
// mips64: #APP // mips64: #APP
// mips64: ld $3, %got_disp(extern_static) // mips64: lui $3, %got_hi(extern_static)
// mips64: daddu $3, $3, $gp
// mips64: ld $3, %got_lo(extern_static)($3)
// mips64: #NO_APP // mips64: #NO_APP
#[cfg(mips64)] #[cfg(mips64)]
#[no_mangle] #[no_mangle]
@ -102,7 +104,9 @@ pub unsafe fn sym_static_64() {
// mips64-LABEL: sym_fn_64: // mips64-LABEL: sym_fn_64:
// mips64: #APP // mips64: #APP
// mips64: ld $3, %got_disp(extern_func) // mips64: lui $3, %got_hi(extern_func)
// mips64: daddu $3, $3, $gp
// mips64: ld $3, %got_lo(extern_func)($3)
// mips64: #NO_APP // mips64: #NO_APP
#[cfg(mips64)] #[cfg(mips64)]
#[no_mangle] #[no_mangle]