ld: print branch fixups into the map file for ppc elf targets
authorClément Chigot <chigot@adacore.com>
Mon, 6 Nov 2023 09:50:23 +0000 (10:50 +0100)
committerClément Chigot <chigot@adacore.com>
Wed, 8 Nov 2023 08:07:02 +0000 (09:07 +0100)
In a safety context, it could interesting to track the trampolines being
generated, ensuring there are expected or not.

bfd/ChangeLog:

* elf32-ppc.c (ppc_elf_relax_section): Log branch fixups.

ld/ChangeLog:

* ld.texi (--print-map): Add new item about fixups.

bfd/elf32-ppc.c
ld/ld.texi

index 5622aaa30c0f415f7b01ab29d7da783765c1b7d1..bdbd1b4fb36f4f6545b9113e2da0da2602e0a5b7 100644 (file)
@@ -6169,7 +6169,7 @@ ppc_elf_relax_section (bfd *abfd,
          asection *tsec;
          struct one_branch_fixup *f;
          size_t insn_offset = 0;
-         bfd_vma max_branch_offset = 0, val;
+         bfd_vma max_branch_offset = 0, val, reladdr;
          bfd_byte *hit_addr;
          unsigned long t0;
          struct elf_link_hash_entry *h;
@@ -6415,6 +6415,7 @@ ppc_elf_relax_section (bfd *abfd,
            continue;
 
          roff = irel->r_offset;
+         reladdr = isec->output_section->vma + isec->output_offset + roff;
 
          /* Avoid creating a lot of unnecessary fixups when
             relocatable if the output section size is such that a
@@ -6433,10 +6434,9 @@ ppc_elf_relax_section (bfd *abfd,
                     final link, so do not presume they remain in range.  */
                  || tsec->output_section == isec->output_section))
            {
-             bfd_vma symaddr, reladdr;
+             bfd_vma symaddr;
 
              symaddr = tsec->output_section->vma + tsec->output_offset + toff;
-             reladdr = isec->output_section->vma + isec->output_offset + roff;
              if (symaddr - reladdr + max_branch_offset
                  < 2 * max_branch_offset)
                continue;
@@ -6507,6 +6507,12 @@ ppc_elf_relax_section (bfd *abfd,
              irel->r_info = ELF32_R_INFO (0, R_PPC_NONE);
            }
 
+         link_info->callbacks->minfo
+           (_("%pB: Adjusting branch at 0x%V towards \"%s\" in section %s\n"),
+            abfd, reladdr,
+            (h && h->root.root.string? h->root.root.string : "<unknown>"),
+            f->tsec->name);
+
          /* Get the section contents.  */
          if (contents == NULL)
            {
index f710c02c3d40877a42c420ace2267934bca5e9b7..1c132561d71fb2ab44459b395d0bf824e4ff484d 100644 (file)
@@ -920,6 +920,17 @@ Updated property 0xc0010001 (0x1) to merge foo.o (0x1) and bar.o (0x1)
 This indicates that property 0xc0010001 value is updated to 0x1 in output
 when merging properties in  @file{foo.o}, whose 0xc0010001 property value
 is 0x1, and @file{bar.o}, whose 0xc0010001 property value is 0x1.
+
+@item
+On some ELF targets, a list of fixups inserted by @option{--relax}
+
+@smallexample
+foo.o: Adjusting branch at 0x00000008 towards "far" in section .text
+@end smallexample
+
+This indicates that the branch at 0x00000008 in foo.o, targeting
+the symbol "far" in section .text, has been replaced by a trampoline.
+
 @end itemize
 
 @cindex link map discarded