MIPS/LD: Set symtab's `sh_info' correctly for IRIX emulations
authorMaciej W. Rozycki <macro@linux-mips.org>
Wed, 29 Jul 2020 19:56:41 +0000 (20:56 +0100)
committerMaciej W. Rozycki <macro@linux-mips.org>
Wed, 29 Jul 2020 19:56:41 +0000 (20:56 +0100)
commit3f1b17bbf022a34f92f3dc32d742e4901816708e
tree9d2364860d1573e12b4114557e2832f747ca0d9c
parent9811697376b3f1950419ab13b19e2995703b839b
MIPS/LD: Set symtab's `sh_info' correctly for IRIX emulations

Correct ELF linker code so as to set the `sh_info' value of the static
symbol table section according to the section symbols vs other symbols
split where required by the selection of the IRIX compatibility mode for
MIPS target.  Add a `elf_backend_elfsym_local_is_section' hook for that
purpose, returning TRUE if it is only STB_LOCAL/STT_SECTION symbols that
are to be considered local for the purpose of this split rather than all
STB_LOCAL symbols.

We do it already in generic ELF code, and have done it since 1993, with
the `elf_backend_sym_is_global' hook, affecting GAS and `objcopy', so
these tools produce correct ELF output in the IRIX compatibility mode,
however if such output is fed as input to `ld -r', then the linker's
output is no longer valid for that mode.  The relevant changes to
generic ELF code are:

commit 062189c6eab72c7ba1bab1cf30fdb27d67a7d668
Author: Ian Lance Taylor <ian@airs.com>
Date:   Thu Nov 18 17:12:47 1993 +0000

and:

commit 6e07e54f1b347f885cc6c021c3fd912c79bdaf55
Author: Ian Lance Taylor <ian@airs.com>
Date:   Thu Jan 6 20:01:42 1994 +0000

(split across two GIT commits likely due to repository conversion
peculiarities).

The `elf_backend_sym_is_global' hook however operates on BFD rather than
ELF symbols, making it unsuitable for the ELF linker as the linker does
not convert any symbol tables processed into the BFD format.  Converting
the hook to operate on ELF symbols would in principle be possible, but
it would still require a considerable rewrite of `bfd_elf_final_link' to
adapt to the interface.

Therefore, especially given that no new use for the IRIX compatibility
mode is expected, minimize changes made to the ELF linker code and just
add an entirely new hook, and wire it in the o32 and n32 MIPS backends
accordingly; the n64 backend never uses the IRIX compatibility mode.

Since we have no coverage here at all add suitable GAS, LD and `objcopy'
test cases to the relevant testsuites to keep these tools consistently
verified.

bfd/
* elf-bfd.h (elf_backend_data): Add
`elf_backend_elfsym_local_is_section' member.
* elfxx-target.h (elf_backend_elfsym_local_is_section): New
macro.
(elfNN_bed): Add `elf_backend_elfsym_local_is_section' member.
* elflink.c (bfd_elf_final_link): Use it to determine whether
set the `.symtab' section's `sh_info' value to the index of the
first non-local or non-section symbol.
* elf32-mips.c (mips_elf32_elfsym_local_is_section): New
function.
(elf_backend_elfsym_local_is_section): New macro.
* elfn32-mips.c (mips_elf_n32_elfsym_local_is_section): New
function.
(elf_backend_elfsym_local_is_section): New macro.

binutils/
* testsuite/binutils-all/mips/global-local-symtab-o32.d: New
test.
* testsuite/binutils-all/mips/global-local-symtab-o32t.d: New
test.
* testsuite/binutils-all/mips/global-local-symtab-n32.d: New
test.
* testsuite/binutils-all/mips/global-local-symtab-n32t.d: New
test.
* testsuite/binutils-all/mips/global-local-symtab-n64.d: New
test.
* testsuite/binutils-all/mips/mips.exp: Run the new tests.

gas/
* testsuite/gas/mips/global-local-symtab-o32.d: New test.
* testsuite/gas/mips/global-local-symtab-o32t.d: New test.
* testsuite/gas/mips/global-local-symtab-n32.d: New test.
* testsuite/gas/mips/global-local-symtab-n32t.d: New test.
* testsuite/gas/mips/global-local-symtab-n64.d: New test.
* testsuite/gas/mips/global-local-symtab.s: New test source.
* testsuite/gas/mips/mips.exp: Run the new tests.

ld/
* testsuite/ld-mips-elf/global-local-symtab-o32.d: New test.
* testsuite/ld-mips-elf/global-local-symtab-o32t.d: New test.
* testsuite/ld-mips-elf/global-local-symtab-n32.d: New test.
* testsuite/ld-mips-elf/global-local-symtab-n32t.d: New test.
* testsuite/ld-mips-elf/global-local-symtab-n64.d: New test.
* testsuite/ld-mips-elf/global-local-symtab.ld: New test linker
script.
* testsuite/ld-mips-elf/mips-elf.exp: Run the new tests.
29 files changed:
bfd/ChangeLog
bfd/elf-bfd.h
bfd/elf32-mips.c
bfd/elflink.c
bfd/elfn32-mips.c
bfd/elfxx-target.h
binutils/ChangeLog
binutils/testsuite/binutils-all/mips/global-local-symtab-n32.d [new file with mode: 0644]
binutils/testsuite/binutils-all/mips/global-local-symtab-n32t.d [new file with mode: 0644]
binutils/testsuite/binutils-all/mips/global-local-symtab-n64.d [new file with mode: 0644]
binutils/testsuite/binutils-all/mips/global-local-symtab-o32.d [new file with mode: 0644]
binutils/testsuite/binutils-all/mips/global-local-symtab-o32t.d [new file with mode: 0644]
binutils/testsuite/binutils-all/mips/mips.exp
gas/ChangeLog
gas/testsuite/gas/mips/global-local-symtab-n32.d [new file with mode: 0644]
gas/testsuite/gas/mips/global-local-symtab-n32t.d [new file with mode: 0644]
gas/testsuite/gas/mips/global-local-symtab-n64.d [new file with mode: 0644]
gas/testsuite/gas/mips/global-local-symtab-o32.d [new file with mode: 0644]
gas/testsuite/gas/mips/global-local-symtab-o32t.d [new file with mode: 0644]
gas/testsuite/gas/mips/global-local-symtab.s [new file with mode: 0644]
gas/testsuite/gas/mips/mips.exp
ld/ChangeLog
ld/testsuite/ld-mips-elf/global-local-symtab-n32.d [new file with mode: 0644]
ld/testsuite/ld-mips-elf/global-local-symtab-n32t.d [new file with mode: 0644]
ld/testsuite/ld-mips-elf/global-local-symtab-n64.d [new file with mode: 0644]
ld/testsuite/ld-mips-elf/global-local-symtab-o32.d [new file with mode: 0644]
ld/testsuite/ld-mips-elf/global-local-symtab-o32t.d [new file with mode: 0644]
ld/testsuite/ld-mips-elf/global-local-symtab.ld [new file with mode: 0644]
ld/testsuite/ld-mips-elf/mips-elf.exp