mirror of
https://github.com/bminor/binutils-gdb.git
synced 2025-12-08 08:33:13 +00:00
MIPS: Support `-gnuabi64' target triplet suffix for 64-bit Linux targets
Make the n64 ABI the default for 64-bit Linux targets specified with
`-gnuabi64' suffix included in the target triplet, for configurations
such as the Debian mips64el and mips64r6el ports. Adjust testsuite
configuration accordingly.
There are the following regressions with the new target triplet:
mips64-linux-gnuabi64 +FAIL: readelf -S bintest
mips64-linux-gnuabi64 +FAIL: MIPS reloc estimation 1
mips64el-linux-gnuabi64 +FAIL: readelf -S bintest
mips64el-linux-gnuabi64 +FAIL: MIPS reloc estimation 1
The `readelf' issue comes from a difference in section headers produced
that the `binutils/testsuite/binutils-all/readelf.s-64' pattern template
does not match. While there has been a precedent it does not appear to
me that there is a clear advantage from adding more and more variations
to the template rather than forking the existing template into multiple
ones for a more exact match. So this is best deferred to a separate
discussion.
The MIPS reloc estimation issue is an actual bug in `objdump', which
discards a number of trailing entries from output here for n64 composed
relocations:
DYNAMIC RELOCATION RECORDS
OFFSET TYPE VALUE
0000000000000000 R_MIPS_NONE *ABS*
0000000000000000 R_MIPS_NONE *ABS*
and consequently `ld/testsuite/ld-mips-elf/reloc-estimate-1.d' does not
match even though ELF output produced is correct according to `readelf':
Relocation section '.rel.dyn' at offset 0x10400 contains 2 entries:
Offset Info Type Sym. Value Sym. Name
000000000000 000000000000 R_MIPS_NONE
Type2: R_MIPS_NONE
Type3: R_MIPS_NONE
000000010000 000300001203 R_MIPS_REL32 0000000000010010 foo@@V2
Type2: R_MIPS_64
Type3: R_MIPS_NONE
As a genuine bug this has to be handled separately.
Co-Authored by: Maciej W. Rozycki <macro@orcam.me.uk>
bfd/
* config.bfd: Add `mips64*el-*-linux*-gnuabi64' and
`mips64*-*-linux*-gnuabi64' targets.
binutils/
* testsuite/binutils-all/mips/mips.exp: Handle `*-*-*-gnuabi64'
targets.
* testsuite/binutils-all/objcopy.exp: Handle
`mips64*-*-*-gnuabi64' targets.
* testsuite/binutils-all/remove-relocs-01.d: Likewise.
* testsuite/binutils-all/remove-relocs-04.d: Likewise.
* testsuite/binutils-all/remove-relocs-05.d: Likewise.
* testsuite/binutils-all/remove-relocs-06.d: Likewise.
gas/
* configure.ac: Handle `mips64*-linux-gnuabi64' targets.
* configure: Regenerate.
* testsuite/gas/mips/compact-eh-eb-7.d: Handle
`mips64*-*-*-gnuabi64' targets.
* testsuite/gas/mips/compact-eh-el-7.d: Likewise.
ld/
* configure.tgt: Add `mips64*el-*-linux-gnuabi64' and
`mips64*-*-linux-gnuabi64' targets.
* testsuite/ld-undefined/undefined.exp: Handle
`mips64*-*-*-gnuabi64' targets.
* testsuite/ld-mips-elf/attr-gnu-4-10.d: Likewise.
* testsuite/ld-mips-elf/compact-eh6.d: Likewise.
* testsuite/ld-mips-elf/mips-elf.exp: Handle `*-*-*-gnuabi64'
targets.
This commit is contained in:
committed by
Maciej W. Rozycki
parent
316be2b229
commit
29c108c961
@@ -941,10 +941,20 @@ case "${targ}" in
|
|||||||
targ_defvec=mips_elf32_be_vec
|
targ_defvec=mips_elf32_be_vec
|
||||||
targ_selvecs="mips_elf32_le_vec mips_elf64_be_vec mips_elf64_le_vec mips_ecoff_be_vec mips_ecoff_le_vec"
|
targ_selvecs="mips_elf32_le_vec mips_elf64_be_vec mips_elf64_le_vec mips_ecoff_be_vec mips_ecoff_le_vec"
|
||||||
;;
|
;;
|
||||||
|
mips64*el-*-linux*-gnuabi64)
|
||||||
|
targ_defvec=mips_elf64_trad_le_vec
|
||||||
|
targ_selvecs="mips_elf64_trad_be_vec mips_elf32_ntrad_le_vec mips_elf32_ntrad_be_vec mips_elf32_trad_le_vec mips_elf32_trad_be_vec"
|
||||||
|
want64=true
|
||||||
|
;;
|
||||||
mips64*el-*-linux*)
|
mips64*el-*-linux*)
|
||||||
targ_defvec=mips_elf32_ntrad_le_vec
|
targ_defvec=mips_elf32_ntrad_le_vec
|
||||||
targ_selvecs="mips_elf32_ntrad_be_vec mips_elf32_trad_le_vec mips_elf32_trad_be_vec mips_elf64_trad_le_vec mips_elf64_trad_be_vec"
|
targ_selvecs="mips_elf32_ntrad_be_vec mips_elf32_trad_le_vec mips_elf32_trad_be_vec mips_elf64_trad_le_vec mips_elf64_trad_be_vec"
|
||||||
;;
|
;;
|
||||||
|
mips64*-*-linux*-gnuabi64)
|
||||||
|
targ_defvec=mips_elf64_trad_be_vec
|
||||||
|
targ_selvecs="mips_elf64_trad_le_vec mips_elf32_ntrad_be_vec mips_elf32_ntrad_le_vec mips_elf32_trad_be_vec mips_elf32_trad_le_vec"
|
||||||
|
want64=true
|
||||||
|
;;
|
||||||
mips64*-*-linux*)
|
mips64*-*-linux*)
|
||||||
targ_defvec=mips_elf32_ntrad_be_vec
|
targ_defvec=mips_elf32_ntrad_be_vec
|
||||||
targ_selvecs="mips_elf32_ntrad_le_vec mips_elf32_trad_be_vec mips_elf32_trad_le_vec mips_elf64_trad_be_vec mips_elf64_trad_le_vec"
|
targ_selvecs="mips_elf32_ntrad_le_vec mips_elf32_trad_be_vec mips_elf32_trad_le_vec mips_elf64_trad_be_vec mips_elf64_trad_le_vec"
|
||||||
|
|||||||
@@ -125,13 +125,23 @@ if {[istarget *-*-openbsd*] } {
|
|||||||
if [istarget *el-*-*] {
|
if [istarget *el-*-*] {
|
||||||
set abi_asflags(o32) -32
|
set abi_asflags(o32) -32
|
||||||
set abi_ldflags(o32) -melf32ltsmip
|
set abi_ldflags(o32) -melf32ltsmip
|
||||||
set abi_asflags(n64) "-march=from-abi -64"
|
if [istarget *-*-*-gnuabi64] {
|
||||||
set abi_ldflags(n64) -melf64ltsmip
|
set abi_asflags(n32) "-march=from-abi -n32"
|
||||||
|
set abi_ldflags(n32) -melf32ltsmipn32
|
||||||
|
} else {
|
||||||
|
set abi_asflags(n64) "-march=from-abi -64"
|
||||||
|
set abi_ldflags(n64) -melf64ltsmip
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
set abi_asflags(o32) -32
|
set abi_asflags(o32) -32
|
||||||
set abi_ldflags(o32) -melf32btsmip
|
set abi_ldflags(o32) -melf32btsmip
|
||||||
set abi_asflags(n64) "-march=from-abi -64"
|
if [istarget *-*-*-gnuabi64] {
|
||||||
set abi_ldflags(n64) -melf64btsmip
|
set abi_asflags(n32) "-march=from-abi -n32"
|
||||||
|
set abi_ldflags(n32) -melf32btsmipn32
|
||||||
|
} else {
|
||||||
|
set abi_asflags(n64) "-march=from-abi -64"
|
||||||
|
set abi_ldflags(n64) -melf64btsmip
|
||||||
|
}
|
||||||
}
|
}
|
||||||
set irixemul 0
|
set irixemul 0
|
||||||
} elseif {[istarget *-*-linux*] } {
|
} elseif {[istarget *-*-linux*] } {
|
||||||
|
|||||||
@@ -1269,7 +1269,8 @@ if [is_elf_format] {
|
|||||||
run_dump_test "strip-9"
|
run_dump_test "strip-9"
|
||||||
run_dump_test "strip-12"
|
run_dump_test "strip-12"
|
||||||
|
|
||||||
if { [istarget "mips64*-*-openbsd*"] } {
|
if { [istarget "mips64*-*-openbsd*"] \
|
||||||
|
|| [istarget "mips64*-*-*-gnuabi64"] } {
|
||||||
set reloc_format mips64
|
set reloc_format mips64
|
||||||
}
|
}
|
||||||
# A relocation type not supported by any target
|
# A relocation type not supported by any target
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
#source: remove-relocs-01.s
|
#source: remove-relocs-01.s
|
||||||
#objcopy: --remove-relocations=.data.relocs.01
|
#objcopy: --remove-relocations=.data.relocs.01
|
||||||
#readelf: -r
|
#readelf: -r
|
||||||
#notarget: "mips64*-*-openbsd*"
|
#notarget: mips64*-*-openbsd* mips64*-*-*-gnuabi64
|
||||||
|
|
||||||
Relocation section '\.rela?\.data\.relocs\.02' at offset 0x[0-9a-f]+ contains 3 entries:
|
Relocation section '\.rela?\.data\.relocs\.02' at offset 0x[0-9a-f]+ contains 3 entries:
|
||||||
.*
|
.*
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
#source: remove-relocs-01.s
|
#source: remove-relocs-01.s
|
||||||
#objcopy: --remove-relocations=.data.relocs.0\[12\]
|
#objcopy: --remove-relocations=.data.relocs.0\[12\]
|
||||||
#readelf: -r
|
#readelf: -r
|
||||||
#notarget: "mips64*-*-openbsd*"
|
#notarget: mips64*-*-openbsd* mips64*-*-*-gnuabi64
|
||||||
|
|
||||||
Relocation section '\.rela?\.data\.relocs\.03' at offset 0x[0-9a-f]+ contains 3 entries:
|
Relocation section '\.rela?\.data\.relocs\.03' at offset 0x[0-9a-f]+ contains 3 entries:
|
||||||
.*
|
.*
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
#source: remove-relocs-01.s
|
#source: remove-relocs-01.s
|
||||||
#objcopy: --remove-section=.rela.data.relocs.01 --remove-section=.rel.data.relocs.01
|
#objcopy: --remove-section=.rela.data.relocs.01 --remove-section=.rel.data.relocs.01
|
||||||
#readelf: -r
|
#readelf: -r
|
||||||
#notarget: "mips64*-*-openbsd*"
|
#notarget: mips64*-*-openbsd* mips64*-*-*-gnuabi64
|
||||||
|
|
||||||
Relocation section '\.rela?\.data\.relocs\.02' at offset 0x[0-9a-f]+ contains 3 entries:
|
Relocation section '\.rela?\.data\.relocs\.02' at offset 0x[0-9a-f]+ contains 3 entries:
|
||||||
.*
|
.*
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
#source: remove-relocs-01.s
|
#source: remove-relocs-01.s
|
||||||
#objcopy: --remove-relocations=.data.relocs.* --remove-relocations=!.data.relocs.02
|
#objcopy: --remove-relocations=.data.relocs.* --remove-relocations=!.data.relocs.02
|
||||||
#readelf: -r
|
#readelf: -r
|
||||||
#notarget: "mips64*-*-openbsd*"
|
#notarget: mips64*-*-openbsd* mips64*-*-*-gnuabi64
|
||||||
|
|
||||||
Relocation section '\.rela?\.data\.relocs\.02' at offset 0x[0-9a-f]+ contains 3 entries:
|
Relocation section '\.rela?\.data\.relocs\.02' at offset 0x[0-9a-f]+ contains 3 entries:
|
||||||
.*
|
.*
|
||||||
|
|||||||
6
gas/configure
vendored
6
gas/configure
vendored
@@ -12225,6 +12225,9 @@ _ACEOF
|
|||||||
esac
|
esac
|
||||||
# Decide which ABI to target by default.
|
# Decide which ABI to target by default.
|
||||||
case ${target} in
|
case ${target} in
|
||||||
|
mips64*-openbsd* | mips64*-linux-gnuabi64)
|
||||||
|
mips_default_abi=N64_ABI
|
||||||
|
;;
|
||||||
mips64*-linux* | mips-sgi-irix6* | mips64*-freebsd* \
|
mips64*-linux* | mips-sgi-irix6* | mips64*-freebsd* \
|
||||||
| mips64*-kfreebsd*-gnu | mips64*-ps2-elf*)
|
| mips64*-kfreebsd*-gnu | mips64*-ps2-elf*)
|
||||||
mips_default_abi=N32_ABI
|
mips_default_abi=N32_ABI
|
||||||
@@ -12232,9 +12235,6 @@ _ACEOF
|
|||||||
mips*-linux* | mips*-freebsd* | mips*-kfreebsd*-gnu)
|
mips*-linux* | mips*-freebsd* | mips*-kfreebsd*-gnu)
|
||||||
mips_default_abi=O32_ABI
|
mips_default_abi=O32_ABI
|
||||||
;;
|
;;
|
||||||
mips64*-openbsd*)
|
|
||||||
mips_default_abi=N64_ABI
|
|
||||||
;;
|
|
||||||
*)
|
*)
|
||||||
mips_default_abi=NO_ABI
|
mips_default_abi=NO_ABI
|
||||||
;;
|
;;
|
||||||
|
|||||||
@@ -394,6 +394,9 @@ changequote([,])dnl
|
|||||||
esac
|
esac
|
||||||
# Decide which ABI to target by default.
|
# Decide which ABI to target by default.
|
||||||
case ${target} in
|
case ${target} in
|
||||||
|
mips64*-openbsd* | mips64*-linux-gnuabi64)
|
||||||
|
mips_default_abi=N64_ABI
|
||||||
|
;;
|
||||||
mips64*-linux* | mips-sgi-irix6* | mips64*-freebsd* \
|
mips64*-linux* | mips-sgi-irix6* | mips64*-freebsd* \
|
||||||
| mips64*-kfreebsd*-gnu | mips64*-ps2-elf*)
|
| mips64*-kfreebsd*-gnu | mips64*-ps2-elf*)
|
||||||
mips_default_abi=N32_ABI
|
mips_default_abi=N32_ABI
|
||||||
@@ -401,9 +404,6 @@ changequote([,])dnl
|
|||||||
mips*-linux* | mips*-freebsd* | mips*-kfreebsd*-gnu)
|
mips*-linux* | mips*-freebsd* | mips*-kfreebsd*-gnu)
|
||||||
mips_default_abi=O32_ABI
|
mips_default_abi=O32_ABI
|
||||||
;;
|
;;
|
||||||
mips64*-openbsd*)
|
|
||||||
mips_default_abi=N64_ABI
|
|
||||||
;;
|
|
||||||
*)
|
*)
|
||||||
mips_default_abi=NO_ABI
|
mips_default_abi=NO_ABI
|
||||||
;;
|
;;
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
#name: Compact EH EB #7 with personality id and fallback FDE
|
#name: Compact EH EB #7 with personality id and fallback FDE
|
||||||
#source: compact-eh-7.s
|
#source: compact-eh-7.s
|
||||||
#as: -EB -mno-pdr
|
#as: -EB -mno-pdr
|
||||||
#notarget: mips64*-*-openbsd*
|
#notarget: mips64*-*-openbsd* mips64*-*-*-gnuabi64
|
||||||
|
|
||||||
.*: file format.*
|
.*: file format.*
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
#name: Compact EH EL #7 with personality id and fallback FDE
|
#name: Compact EH EL #7 with personality id and fallback FDE
|
||||||
#source: compact-eh-7.s
|
#source: compact-eh-7.s
|
||||||
#as: -EL -mno-pdr
|
#as: -EL -mno-pdr
|
||||||
#notarget: mips64*-*-openbsd*
|
#notarget: mips64*-*-openbsd* mips64*-*-*-gnuabi64
|
||||||
|
|
||||||
.*: file format.*
|
.*: file format.*
|
||||||
|
|
||||||
|
|||||||
@@ -580,10 +580,20 @@ mips*-*-vxworks*) targ_emul=elf32ebmipvxworks
|
|||||||
;;
|
;;
|
||||||
mips*-*-windiss) targ_emul=elf32mipswindiss
|
mips*-*-windiss) targ_emul=elf32mipswindiss
|
||||||
;;
|
;;
|
||||||
|
mips64*el-*-linux-gnuabi64)
|
||||||
|
targ_emul=elf64ltsmip
|
||||||
|
targ_extra_emuls="elf64btsmip elf32ltsmipn32 elf32btsmipn32 elf32ltsmip elf32btsmip"
|
||||||
|
targ_extra_libpath=$targ_extra_emuls
|
||||||
|
;;
|
||||||
mips64*el-*-linux-*) targ_emul=elf32ltsmipn32
|
mips64*el-*-linux-*) targ_emul=elf32ltsmipn32
|
||||||
targ_extra_emuls="elf32btsmipn32 elf32ltsmip elf32btsmip elf64ltsmip elf64btsmip"
|
targ_extra_emuls="elf32btsmipn32 elf32ltsmip elf32btsmip elf64ltsmip elf64btsmip"
|
||||||
targ_extra_libpath=$targ_extra_emuls
|
targ_extra_libpath=$targ_extra_emuls
|
||||||
;;
|
;;
|
||||||
|
mips64*-*-linux-gnuabi64)
|
||||||
|
targ_emul=elf64btsmip
|
||||||
|
targ_extra_emuls="elf64ltsmip elf32btsmipn32 elf32ltsmipn32 elf32btsmip elf32ltsmip"
|
||||||
|
targ_extra_libpath=$targ_extra_emuls
|
||||||
|
;;
|
||||||
mips64*-*-linux-*) targ_emul=elf32btsmipn32
|
mips64*-*-linux-*) targ_emul=elf32btsmipn32
|
||||||
targ_extra_emuls="elf32ltsmipn32 elf32btsmip elf32ltsmip elf64btsmip elf64ltsmip"
|
targ_extra_emuls="elf32ltsmipn32 elf32btsmip elf32ltsmip elf64btsmip elf64ltsmip"
|
||||||
targ_extra_libpath=$targ_extra_emuls
|
targ_extra_libpath=$targ_extra_emuls
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
#as: -mpdr
|
#as: -mpdr
|
||||||
#ld: -r
|
#ld: -r
|
||||||
#readelf: -hA
|
#readelf: -hA
|
||||||
#notarget: mips64*-*-openbsd*
|
#notarget: mips64*-*-openbsd* mips64*-*-*-gnuabi64
|
||||||
|
|
||||||
ELF Header:
|
ELF Header:
|
||||||
Magic: .*
|
Magic: .*
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
#as: -EB
|
#as: -EB
|
||||||
#readelf: -x .eh_frame_hdr
|
#readelf: -x .eh_frame_hdr
|
||||||
#ld: -EB -e main
|
#ld: -EB -e main
|
||||||
#
|
#notarget: mips64*-*-*-gnuabi64
|
||||||
|
|
||||||
Hex dump of section \'\.eh_frame_hdr\':
|
Hex dump of section \'\.eh_frame_hdr\':
|
||||||
|
|
||||||
|
|||||||
@@ -155,13 +155,23 @@ if {[istarget *-*-openbsd*] } {
|
|||||||
if [istarget *el-*-*] {
|
if [istarget *el-*-*] {
|
||||||
set abi_asflags(o32) -32
|
set abi_asflags(o32) -32
|
||||||
set abi_ldflags(o32) -melf32ltsmip
|
set abi_ldflags(o32) -melf32ltsmip
|
||||||
set abi_asflags(n64) "-march=from-abi -64"
|
if [istarget *-*-*-gnuabi64] {
|
||||||
set abi_ldflags(n64) -melf64ltsmip
|
set abi_asflags(n32) "-march=from-abi -n32"
|
||||||
|
set abi_ldflags(n32) -melf32ltsmipn32
|
||||||
|
} else {
|
||||||
|
set abi_asflags(n64) "-march=from-abi -64"
|
||||||
|
set abi_ldflags(n64) -melf64ltsmip
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
set abi_asflags(o32) -32
|
set abi_asflags(o32) -32
|
||||||
set abi_ldflags(o32) -melf32btsmip
|
set abi_ldflags(o32) -melf32btsmip
|
||||||
set abi_asflags(n64) "-march=from-abi -64"
|
if [istarget *-*-*-gnuabi64] {
|
||||||
set abi_ldflags(n64) -melf64btsmip
|
set abi_asflags(n32) "-march=from-abi -n32"
|
||||||
|
set abi_ldflags(n32) -melf32btsmipn32
|
||||||
|
} else {
|
||||||
|
set abi_asflags(n64) "-march=from-abi -64"
|
||||||
|
set abi_ldflags(n64) -melf64btsmip
|
||||||
|
}
|
||||||
}
|
}
|
||||||
set irixemul 0
|
set irixemul 0
|
||||||
} elseif {[istarget *-*-linux*] } {
|
} elseif {[istarget *-*-linux*] } {
|
||||||
@@ -811,7 +821,8 @@ if { $linux_gnu } {
|
|||||||
run_dump_test "got-page-1"
|
run_dump_test "got-page-1"
|
||||||
run_dump_test_n32 "got-page-2"
|
run_dump_test_n32 "got-page-2"
|
||||||
run_dump_test_n64 "dyn-sec64" noarch
|
run_dump_test_n64 "dyn-sec64" noarch
|
||||||
run_dump_test "got-page-3"
|
run_dump_test_o32 "got-page-3"
|
||||||
|
run_dump_test_n32 "got-page-3" [list [list name (n32)]]
|
||||||
if $has_abi(o32) {
|
if $has_abi(o32) {
|
||||||
run_ld_link_tests [subst {
|
run_ld_link_tests [subst {
|
||||||
{"GOT page 4 (one file)"
|
{"GOT page 4 (one file)"
|
||||||
|
|||||||
@@ -206,7 +206,8 @@ if { ![is_elf_format] || ![check_shared_lib_support]} then {
|
|||||||
# triplets, and S+core targets using an extra R_SCORE_NONE
|
# triplets, and S+core targets using an extra R_SCORE_NONE
|
||||||
# relocation, so adjust for that.
|
# relocation, so adjust for that.
|
||||||
switch -glob $target_triplet {
|
switch -glob $target_triplet {
|
||||||
"mips64*-*-openbsd*" {
|
"mips64*-*-openbsd*" -
|
||||||
|
"mips64*-*-*-gnuabi64" {
|
||||||
set none_count 6
|
set none_count 6
|
||||||
set reloc_count 4
|
set reloc_count 4
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user