]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commit
MIPS: Add o32 RELA relocations for VxWorks targets
authorMaciej W. Rozycki <macro@orcam.me.uk>
Thu, 30 Oct 2025 14:24:23 +0000 (14:24 +0000)
committerMaciej W. Rozycki <macro@orcam.me.uk>
Thu, 30 Oct 2025 14:24:23 +0000 (14:24 +0000)
commit6b218502034c1e2f1efbbb7f2f012be7f221ae85
treeccbd14fe7444bf8adac29a9e9dbf92440a1a2b4e
parent040b85bd572f3c9ef4cd197d4e2e5dea297c4e6d
MIPS: Add o32 RELA relocations for VxWorks targets

MIPS/VxWorks targets have an unusual arrangement in that they use RELA
relocations with the o32 ABI, unlike any other MIPS target.  Due to an
inconsistency in BFD however "hybrid" relocations are produced by GAS,
where despite the relocations being of the RELA type the field to be
relocated also holds an in-place addend to be applied at link time.

For example:

$ cat vxworks-rela.s
.text
foo:
la $2, bar + 0x12345678
$ mips-vxworks-as -o vxworks-rela.o vxworks-rela.s
$ mips-vxworks-objdump -dr vxworks-rela.o

vxworks-rela.o:     file format elf32-bigmips-vxworks

Disassembly of section .text:

00000000 <foo>:
   0: 3c021234  lui v0,0x1234
0: R_MIPS_HI16 bar+0x12345678
   4: 24425678  addiu v0,v0,22136
4: R_MIPS_LO16 bar+0x12345678
$

This is due to the BFD backend being strapped for RELA relocations:

#undef elf_backend_may_use_rel_p
#define elf_backend_may_use_rel_p 0
#undef elf_backend_may_use_rela_p
#define elf_backend_may_use_rela_p 1
#undef elf_backend_default_use_rela_p
#define elf_backend_default_use_rela_p 1

but the howtos in use requesting an in-place addend, e.g.:

  /* High 16 bits of symbol value.  */
  HOWTO (R_MIPS_HI16, /* type */
 16, /* rightshift */
 4, /* size */
 16, /* bitsize */
 false, /* pc_relative */
 0, /* bitpos */
 complain_overflow_dont, /* complain_on_overflow */
 _bfd_mips_elf_hi16_reloc, /* special_function */
 "R_MIPS_HI16", /* name */
 true, /* partial_inplace */
 0x0000ffff, /* src_mask */
 0x0000ffff, /* dst_mask */
 false), /* pcrel_offset */

  /* Low 16 bits of symbol value.  */
  HOWTO (R_MIPS_LO16, /* type */
 0, /* rightshift */
 4, /* size */
 16, /* bitsize */
 false, /* pc_relative */
 0, /* bitpos */
 complain_overflow_dont, /* complain_on_overflow */
 _bfd_mips_elf_lo16_reloc, /* special_function */
 "R_MIPS_LO16", /* name */
 true, /* partial_inplace */
 0x0000ffff, /* src_mask */
 0x0000ffff, /* dst_mask */
 false), /* pcrel_offset */

This arrangement nevertheless happens to produce correct ELF executables
owing to the ELF linker avoiding the use of howtos and doing relocation
calculations using its own knowledge of relocation semantics embedded
directly in `mips_elf_calculate_relocation' code.

Beyond producing questionable link object files it however breaks badly
with the generic linker, such as when output is srec.

Fix the problem by providing a set of o32 RELA howtos and making VxWorks
targets use it.  Complement it with a set of test cases for GAS and LD;
we expect link object files to be essentially the same as n32 ones for
other MIPS targets sans the ABI2 ELF file header flag, and machine code
produced to be the same between SREC and ELF executables.
bfd/elf32-mips.c
bfd/elfxx-mips.c
gas/config/tc-mips.c
gas/testsuite/gas/mips/mips.exp
gas/testsuite/gas/mips/vxworks-micromips-hilo.d [new file with mode: 0644]
gas/testsuite/gas/mips/vxworks-mips-hilo.d [new file with mode: 0644]
gas/testsuite/gas/mips/vxworks-mips16-hilo.d [new file with mode: 0644]
gas/testsuite/gas/mips/vxworks-mips16e2-hilo.d [new file with mode: 0644]
gas/testsuite/gas/mips/vxworks-pcrel-hilo.d [new file with mode: 0644]
ld/testsuite/ld-mips-elf/mips-elf.exp