mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-01-24 12:35:55 +08:00
c77cb2a09c
Make the MIPS/IRIX naming of local section symbols consistent between
files produced by generic ELF code and ELF linker code, complementing
commit 174fd7f955
("New bfd elf hook: force naming of local section
symbols"), <https://sourceware.org/ml/binutils/2004-02/msg00072.html>.
Local section symbols have no names in the standard ELF gABI, however
the lack of a name causes problems with IRIX's MIPSpro linker. To work
around the issue we give them names, however we do that in generic ELF
code only, based on what the `elf_backend_name_local_section_symbols'
hook returns if present. That makes objects created by GAS or `objdump'
work correctly, however not ones created by `ld -r'. That would not
normally cause issues with IRIX systems using GAS and `objdump' only
with the MIPSpro linker, however if GNU LD was used for whatever reason
in producing objects later fed to IRIX's MIPSpro linker, then things
would break.
Modify ELF linker code accordingly then, using the same hook. Adjust
the `ld-elf/64ksec-r' test accordingly so that it also accepts a section
symbol with a name.
Also modify the hook itself so that only actual ET_REL objects have
names assigned to local section symbols. Other kinds of ELF files are
not ever supposed to be relocated with the MIPSpro linker, so we can
afford producing more standard output.
Add suitable GAS, LD and `objcopy' test cases to the relevant testsuites
to keep these tools consistently verified. This change also fixes:
FAIL: objcopy executable (pr25662)
across MIPS targets using the IRIX compatibility mode.
bfd/
* elflink.c (bfd_elf_final_link): Give local symbols a name if
so requested.
* elfxx-mips.c (_bfd_mips_elf_name_local_section_symbols): Only
return TRUE if making ET_REL output.
binutils/
* testsuite/binutils-all/mips/global-local-symtab-sort-o32.d:
New test.
* testsuite/binutils-all/mips/global-local-symtab-sort-o32t.d:
New test.
* testsuite/binutils-all/mips/global-local-symtab-sort-n32.d:
New test.
* testsuite/binutils-all/mips/global-local-symtab-sort-n32t.d:
New test.
* testsuite/binutils-all/mips/global-local-symtab-sort-n64.d:
New test.
* testsuite/binutils-all/mips/global-local-symtab-sort-n64t.d:
New test.
* testsuite/binutils-all/mips/global-local-symtab-final-o32.d:
New test.
* testsuite/binutils-all/mips/global-local-symtab-final-n32.d:
New test.
* testsuite/binutils-all/mips/global-local-symtab-final-n64.d:
New test.
* testsuite/binutils-all/mips/mips.exp: Run the new tests.
gas/
* testsuite/gas/mips/global-local-symtab-sort-o32.d: New test.
* testsuite/gas/mips/global-local-symtab-sort-o32t.d: New test.
* testsuite/gas/mips/global-local-symtab-sort-n32.d: New test.
* testsuite/gas/mips/global-local-symtab-sort-n32t.d: New test.
* testsuite/gas/mips/global-local-symtab-sort-n64.d: New test.
* testsuite/gas/mips/global-local-symtab-sort-n64t.d: New test.
* testsuite/gas/mips/mips.exp: Run the new tests.
ld/
* testsuite/ld-elf/sec64k.exp: Also accept a section symbol with
a name.
* testsuite/ld-mips-elf/global-local-symtab-sort-o32.d: New
test.
* testsuite/ld-mips-elf/global-local-symtab-sort-o32t.d: New
test.
* testsuite/ld-mips-elf/global-local-symtab-sort-n32.d: New
test.
* testsuite/ld-mips-elf/global-local-symtab-sort-n32t.d: New
test.
* testsuite/ld-mips-elf/global-local-symtab-sort-n64.d: New
test.
* testsuite/ld-mips-elf/global-local-symtab-sort-n64t.d: New
test.
* testsuite/ld-mips-elf/global-local-symtab-final-o32.d: New
test.
* testsuite/ld-mips-elf/global-local-symtab-final-n32.d: New
test.
* testsuite/ld-mips-elf/global-local-symtab-final-n64.d: New
test.
* testsuite/ld-mips-elf/mips-elf.exp: Run the new tests.
219 lines
6.7 KiB
Plaintext
219 lines
6.7 KiB
Plaintext
# Expect script for tests for >64k sections
|
|
# Copyright (C) 2002-2020 Free Software Foundation, Inc.
|
|
#
|
|
# This file is part of the GNU Binutils.
|
|
#
|
|
# This program is free software; you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation; either version 3 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program; if not, write to the Free Software
|
|
# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
|
|
# MA 02110-1301, USA.
|
|
#
|
|
# Written by Hans-Peter Nilsson (hp@axis.com)
|
|
#
|
|
|
|
# Exclude non-ELF targets.
|
|
|
|
if ![is_elf_format] {
|
|
return
|
|
}
|
|
|
|
# Targets using _bfd_generic_final_link don't sort section symbols
|
|
# before local symbols, so don't bother testing them.
|
|
if { [is_generic] } {
|
|
return
|
|
}
|
|
|
|
# ft32, h8300, ip2k, m68hc11 and m68hc12 run out of address space.
|
|
if {[istarget "ft32-*-*"]
|
|
|| [istarget "h8300-*-*"]
|
|
|| [istarget "ip2k-*-*"]
|
|
|| [istarget "m68hc1*-*"] } {
|
|
return
|
|
}
|
|
|
|
# Test >64k sections, with and without -r. First, create the assembly
|
|
# files. Have a relocation to another section and one within the local
|
|
# section.
|
|
|
|
set test1 "64ksec-r"
|
|
set test2 "64ksec"
|
|
|
|
if { ![runtest_file_p $runtests $test1] \
|
|
&& ![runtest_file_p $runtests $test2] } {
|
|
return
|
|
}
|
|
|
|
set sfiles {}
|
|
set max_sec 66000
|
|
set secs_per_file 1000
|
|
for { set i 0 } { $i < $max_sec / $secs_per_file } { incr i } {
|
|
set sfile "./tmpdir/sec64-$i.s"
|
|
lappend sfiles $sfile
|
|
if [catch { set ofd [open $sfile w] } x] {
|
|
perror "$x"
|
|
unresolved $test1
|
|
unresolved $test2
|
|
return
|
|
}
|
|
|
|
if { $i == 0 } {
|
|
puts $ofd " .global start"
|
|
puts $ofd "start:"
|
|
puts $ofd " .global _start"
|
|
puts $ofd "_start:"
|
|
puts $ofd " .global __start"
|
|
puts $ofd "__start:"
|
|
puts $ofd " .global main"
|
|
puts $ofd "main:"
|
|
puts $ofd " .global _main"
|
|
puts $ofd "_main:"
|
|
puts $ofd " .global foo_0"
|
|
puts $ofd "foo_0: .dc.a 0"
|
|
}
|
|
|
|
# Make sure the used section is not covered by common linker scripts.
|
|
# They should get separate section entries even without -r.
|
|
puts $ofd " .altmacro"
|
|
puts $ofd " .macro sec secn, secp"
|
|
if {![istarget "frv-*-*linux*"]} then {
|
|
puts $ofd " .section .foo.\\secn,\"ax\""
|
|
} else {
|
|
puts $ofd " .section .foo.\\secn,\"aw\""
|
|
}
|
|
puts $ofd " .global foo_\\secn"
|
|
puts $ofd "foo_\\secn:"
|
|
puts $ofd " .dc.a foo_\\secp"
|
|
puts $ofd "bar_\\secn:"
|
|
puts $ofd " .dc.a bar_\\secn"
|
|
puts $ofd " .endm"
|
|
if {![istarget "bfin-*-*"]} then {
|
|
puts $ofd " secn = [expr $i * $secs_per_file]"
|
|
} else {
|
|
puts $ofd " .set secn, [expr $i * $secs_per_file]"
|
|
}
|
|
puts $ofd " .rept $secs_per_file"
|
|
if {![istarget "bfin-*-*"]} then {
|
|
puts $ofd " secn = secn + 1"
|
|
} else {
|
|
puts $ofd " .set secn, secn + 1"
|
|
}
|
|
puts $ofd " sec %(secn), %(secn-1)"
|
|
puts $ofd " .endr"
|
|
|
|
close $ofd
|
|
}
|
|
|
|
if [catch { set ofd [open "tmpdir/$test1.d" w] } x] {
|
|
perror "$x"
|
|
unresolved $test1
|
|
unresolved $test2
|
|
return
|
|
}
|
|
|
|
# The ld-r linked file will contain relocation-sections too, so make it
|
|
# half the size in order to try and keep the test-time down.
|
|
|
|
# The m32r target generates both REL and RELA relocs (for historical
|
|
# reasons) so the expected number of sections will be much more than
|
|
# 68000, which throws this particular test right off.
|
|
if { ![istarget "m32r-*-*"] } then {
|
|
foreach sfile [lrange $sfiles 0 [expr [llength $sfiles] / 2]] {
|
|
puts $ofd "#source: $sfile"
|
|
}
|
|
#force z80 target to compile for eZ80 in ADL mode
|
|
if { [istarget "z80-*-*"] } then {
|
|
puts $ofd "#as: -ez80-adl"
|
|
}
|
|
puts $ofd "#ld: -r"
|
|
puts $ofd "#readelf: -W -Ss"
|
|
puts $ofd "There are 680.. section headers.*:"
|
|
puts $ofd "#..."
|
|
puts $ofd " \\\[ 0\\\] .* 680\[0-9\]\[0-9\]\[ \]+0\[ \]+0"
|
|
puts $ofd "#..."
|
|
puts $ofd " \\\[ \[0-9\]\\\] \.foo\.1\[ \]+PROGBITS\[ \]+.*"
|
|
puts $ofd "#..."
|
|
puts $ofd " \\\[65279\\\] (.rel\[a\]?)?\\.foo\\.\[0-9\]+ .*"
|
|
puts $ofd " \\\[65280\\\] (.rel\[a\]?)?\\.foo\\.\[0-9\]+ .*"
|
|
puts $ofd "#..."
|
|
puts $ofd " 340..: 0+\[ \]+0\[ \]+SECTION\[ \]+LOCAL\[ \]+DEFAULT\[ \]+68... .*"
|
|
puts $ofd "#..."
|
|
puts $ofd " 340..: 0+(2|4|8)\[ \]+0\[ \]+NOTYPE\[ \]+LOCAL\[ \]+DEFAULT\[ \]+\[2-7\] bar_1$"
|
|
puts $ofd "#..."
|
|
puts $ofd ".* bar_34000$"
|
|
puts $ofd "#..."
|
|
# Global symbols are not in "alphanumeric" order, so we just check
|
|
# that the first and the last are present in any order (assuming no
|
|
# duplicates).
|
|
puts $ofd ".* (\[0-9\] foo_1|68... foo_34000)$"
|
|
puts $ofd "#..."
|
|
puts $ofd ".* (\[0-9\] foo_1|68... foo_34000)$"
|
|
puts $ofd "#pass"
|
|
close $ofd
|
|
run_dump_test "tmpdir/$test1"
|
|
}
|
|
|
|
if [catch { set ofd [open "tmpdir/$test2.d" w] } x] {
|
|
perror "$x"
|
|
unresolved $test2
|
|
return
|
|
}
|
|
|
|
# too big for avr, d10v and msp
|
|
# lack of fancy orphan section handling causes overlap on fr30 and iq2000
|
|
if { ![istarget "d10v-*-*"]
|
|
&& ![istarget "avr-*-*"]
|
|
&& ![istarget "msp*-*-*"]
|
|
&& ![istarget "fr30-*-*"]
|
|
&& ![istarget "iq2000-*-*"]
|
|
&& ![istarget "pru-*-*"] } {
|
|
foreach sfile $sfiles { puts $ofd "#source: $sfile" }
|
|
if { [istarget spu*-*-*] } {
|
|
puts $ofd "#ld: --local-store 0:0"
|
|
} elseif { [istarget "i?86-*-linux*"] || [istarget "x86_64-*-linux*"] } {
|
|
puts $ofd "#ld: -z noseparate-code"
|
|
} else {
|
|
puts $ofd "#ld:"
|
|
}
|
|
#force z80 target to compile for eZ80 in ADL mode
|
|
if { [istarget "z80-*-*"] } then {
|
|
puts $ofd "#as: -ez80-adl"
|
|
}
|
|
puts $ofd "#readelf: -W -Ss"
|
|
puts $ofd "There are 660.. section headers.*:"
|
|
puts $ofd "#..."
|
|
puts $ofd " \\\[ 0\\\] .* 660..\[ \]+0\[ \]+0"
|
|
puts $ofd "#..."
|
|
puts $ofd " \\\[65279\\\] \\.foo\\.\[0-9\]+ .*"
|
|
puts $ofd " \\\[65280\\\] \\.foo\\.\[0-9\]+ .*"
|
|
puts $ofd "#..."
|
|
puts $ofd " 660..: \[0-9a-f\]+\[ \]+0\[ \]+SECTION\[ \]+LOCAL\[ \]+DEFAULT\[ \]+660.. "
|
|
puts $ofd "#..."
|
|
puts $ofd " 660..: \[0-9a-f\]+\[ \]+0\[ \]+NOTYPE\[ \]+LOCAL\[ \]+DEFAULT\[ \]+\[0-9\] bar_1$"
|
|
puts $ofd "#..."
|
|
puts $ofd ".* bar_66000$"
|
|
puts $ofd "#..."
|
|
# Global symbols are not in "alphanumeric" order, so we just check
|
|
# that the first and the last are present in any order (assuming no
|
|
# duplicates).
|
|
puts $ofd ".* (\[0-9\] foo_1|66... foo_66000)$"
|
|
puts $ofd "#..."
|
|
puts $ofd ".* (\[0-9\] foo_1|66... foo_66000)$"
|
|
puts $ofd "#pass"
|
|
close $ofd
|
|
run_dump_test "tmpdir/$test2"
|
|
}
|
|
|
|
for { set i 1 } { $i < $max_sec / $secs_per_file } { incr i } {
|
|
catch "exec rm -f tmpdir/dump$i.o" status
|
|
}
|