bfd: aarch64: Fix BTI stub optimization PR30957
authorSzabolcs Nagy <szabolcs.nagy@arm.com>
Fri, 13 Oct 2023 16:51:15 +0000 (17:51 +0100)
committerSzabolcs Nagy <szabolcs.nagy@arm.com>
Thu, 9 Nov 2023 14:44:37 +0000 (14:44 +0000)
The instruction was looked up in the wrong input file (file of branch
source instead of branch target) when optimizing away BTI stubs in

  commit 5834f36d93cabf1a8bcc7dd7654141aed3d296bc
  bfd: aarch64: Optimize BTI stubs PR30076

This can cause adding BTI stubs when they are not necessary or removing
them when they are (the latter is a correctness issue but it is very
unlikely in practice).

Fixes bug 30957.

bfd/elfnn-aarch64.c

index 4592bd6da2773d4001c64b389c5d70153bfb77f4..a0dd17faa7ebb4e0b82bc5c56e4aeb507cf01336 100644 (file)
@@ -3675,8 +3675,7 @@ group_sections (struct elf_aarch64_link_hash_table *htab,
 /* True if the inserted stub does not break BTI compatibility.  */
 
 static bool
-aarch64_bti_stub_p (bfd *input_bfd,
-                   struct elf_aarch64_stub_hash_entry *stub_entry)
+aarch64_bti_stub_p (struct elf_aarch64_stub_hash_entry *stub_entry)
 {
   /* Stubs without indirect branch are BTI compatible.  */
   if (stub_entry->stub_type != aarch64_stub_adrp_branch
@@ -3690,7 +3689,7 @@ aarch64_bti_stub_p (bfd *input_bfd,
   file_ptr off = stub_entry->target_value;
   bfd_size_type count = sizeof (loc);
 
-  if (!bfd_get_section_contents (input_bfd, section, loc, off, count))
+  if (!bfd_get_section_contents (section->owner, section, loc, off, count))
     return false;
 
   uint32_t insn = bfd_getl32 (loc);
@@ -4637,7 +4636,7 @@ _bfd_aarch64_add_call_stub_entries (bool *stub_changed, bfd *output_bfd,
 
              /* A stub with indirect jump may break BTI compatibility, so
                 insert another stub with direct jump near the target then.  */
-             if (need_bti && !aarch64_bti_stub_p (input_bfd, stub_entry))
+             if (need_bti && !aarch64_bti_stub_p (stub_entry))
                {
                  stub_entry->double_stub = true;
                  htab->has_double_stub = true;