public inbox for binutils-cvs@sourceware.org
 help / color / mirror / Atom feed
* [binutils-gdb] Fix PR18841 ifunc relocation ordering
@ 2023-01-09 15:52 Christophe Lyon
  0 siblings, 0 replies; only message in thread
From: Christophe Lyon @ 2023-01-09 15:52 UTC (permalink / raw)
  To: bfd-cvs

https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=2b70b1b838388cc4186933a724eccd0be6b2a955

commit 2b70b1b838388cc4186933a724eccd0be6b2a955
Author: Christophe Lyon <christophe.lyon@arm.com>
Date:   Mon Jan 2 15:46:31 2023 +0000

    Fix PR18841 ifunc relocation ordering
    
    In order to get the ifunc relocs properly sorted the correct class
    needs to be returned.  The code mimics what has been done for AArch64.
    
    Fixes:
    FAIL: Run pr18841 with libpr18841b.so
    FAIL: Run pr18841 with libpr18841c.so
    FAIL: Run pr18841 with libpr18841bn.so (-z now)
    FAIL: Run pr18841 with libpr18841cn.so (-z now)
    
            bfd/
            PR ld/18841
            * elf32-arm.c (elf32_arm_reloc_type_class): Return
            reloc_class_ifunc for ifunc symbols.
    
            ld/testsuite/
            * ld-arm/ifunc-12.rd: Update relocations order.
            * ld-arm/ifunc-3.rd: Likewise.
            * ld-arm/ifunc-4.rd: Likewise.

Diff:
---
 bfd/elf32-arm.c                 | 29 ++++++++++++++++++++
 ld/testsuite/ld-arm/ifunc-12.rd |  8 +++---
 ld/testsuite/ld-arm/ifunc-3.rd  | 10 +++----
 ld/testsuite/ld-arm/ifunc-4.rd  | 60 ++++++++++++++++++++---------------------
 4 files changed, 68 insertions(+), 39 deletions(-)

diff --git a/bfd/elf32-arm.c b/bfd/elf32-arm.c
index 0cd3aec1436..96ba509f505 100644
--- a/bfd/elf32-arm.c
+++ b/bfd/elf32-arm.c
@@ -17691,6 +17691,35 @@ elf32_arm_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
 			    const asection *rel_sec ATTRIBUTE_UNUSED,
 			    const Elf_Internal_Rela *rela)
 {
+  struct elf32_arm_link_hash_table *htab = elf32_arm_hash_table (info);
+
+  if (htab->root.dynsym != NULL
+      && htab->root.dynsym->contents != NULL)
+    {
+      /* Check relocation against STT_GNU_IFUNC symbol if there are
+	 dynamic symbols.  */
+      bfd *abfd = info->output_bfd;
+      const struct elf_backend_data *bed = get_elf_backend_data (abfd);
+      unsigned long r_symndx = ELF32_R_SYM (rela->r_info);
+      if (r_symndx != STN_UNDEF)
+	{
+	  Elf_Internal_Sym sym;
+	  if (!bed->s->swap_symbol_in (abfd,
+				       (htab->root.dynsym->contents
+					+ r_symndx * bed->s->sizeof_sym),
+				       0, &sym))
+	    {
+	      /* xgettext:c-format */
+	      _bfd_error_handler (_("%pB symbol number %lu references"
+				    " nonexistent SHT_SYMTAB_SHNDX section"),
+				  abfd, r_symndx);
+	      /* Ideally an error class should be returned here.  */
+	    }
+	  else if (ELF_ST_TYPE (sym.st_info) == STT_GNU_IFUNC)
+	    return reloc_class_ifunc;
+	}
+    }
+
   switch ((int) ELF32_R_TYPE (rela->r_info))
     {
     case R_ARM_RELATIVE:
diff --git a/ld/testsuite/ld-arm/ifunc-12.rd b/ld/testsuite/ld-arm/ifunc-12.rd
index 69ed420e0d6..c5d62c1ac52 100644
--- a/ld/testsuite/ld-arm/ifunc-12.rd
+++ b/ld/testsuite/ld-arm/ifunc-12.rd
@@ -5,10 +5,6 @@ Relocation section '\.rel\.dyn' at offset 0x8000 contains 16 entries:
 00010020  ......17 R_ARM_RELATIVE   
 0001100c  ......17 R_ARM_RELATIVE   
 00011018  ......17 R_ARM_RELATIVE   
-00010008  ......02 R_ARM_ABS32       f2\(\)       f2
-00011024  ......15 R_ARM_GLOB_DAT    f2\(\)       f2
-00010014  ......02 R_ARM_ABS32       f2t\(\)      f2t
-0001101c  ......15 R_ARM_GLOB_DAT    f2t\(\)      f2t
 00010004  ......a0 R_ARM_IRELATIVE  
 0001000c  ......a0 R_ARM_IRELATIVE  
 00010010  ......a0 R_ARM_IRELATIVE  
@@ -17,3 +13,7 @@ Relocation section '\.rel\.dyn' at offset 0x8000 contains 16 entries:
 00011014  ......a0 R_ARM_IRELATIVE  
 00011020  ......a0 R_ARM_IRELATIVE  
 00011028  ......a0 R_ARM_IRELATIVE  
+00010008  ......02 R_ARM_ABS32       f2\(\)       f2
+00011024  ......15 R_ARM_GLOB_DAT    f2\(\)       f2
+00010014  ......02 R_ARM_ABS32       f2t\(\)      f2t
+0001101c  ......15 R_ARM_GLOB_DAT    f2t\(\)      f2t
diff --git a/ld/testsuite/ld-arm/ifunc-3.rd b/ld/testsuite/ld-arm/ifunc-3.rd
index e3973e44c3d..274a4e45ac4 100644
--- a/ld/testsuite/ld-arm/ifunc-3.rd
+++ b/ld/testsuite/ld-arm/ifunc-3.rd
@@ -4,16 +4,16 @@ Relocation section '\.rel\.dyn' at offset 0x8000 contains 13 entries:
 00010004  ......17 R_ARM_RELATIVE   
 0001101c  ......17 R_ARM_RELATIVE   
 00011020  ......17 R_ARM_RELATIVE   
-00010014  ......02 R_ARM_ABS32       f2\(\)       f2
-00010018  ......03 R_ARM_REL32       f2\(\)       f2
-00011024  ......15 R_ARM_GLOB_DAT    f2\(\)       f2
-00010024  ......02 R_ARM_ABS32       f4\(\)       f4
-00011028  ......15 R_ARM_GLOB_DAT    f4\(\)       f4
 0001000c  ......a0 R_ARM_IRELATIVE  
 0001001c  ......a0 R_ARM_IRELATIVE  
 00011010  ......a0 R_ARM_IRELATIVE  
 00011014  ......a0 R_ARM_IRELATIVE  
 00011018  ......a0 R_ARM_IRELATIVE  
+00010014  ......02 R_ARM_ABS32       f2\(\)       f2
+00010018  ......03 R_ARM_REL32       f2\(\)       f2
+00011024  ......15 R_ARM_GLOB_DAT    f2\(\)       f2
+00010024  ......02 R_ARM_ABS32       f4\(\)       f4
+00011028  ......15 R_ARM_GLOB_DAT    f4\(\)       f4
 
 Relocation section '\.rel\.plt' at offset 0x8068 contains 1 entry:
  Offset     Info    Type            Sym\.Value  Sym\. Name
diff --git a/ld/testsuite/ld-arm/ifunc-4.rd b/ld/testsuite/ld-arm/ifunc-4.rd
index 43a0019ca91..b8079d5c615 100644
--- a/ld/testsuite/ld-arm/ifunc-4.rd
+++ b/ld/testsuite/ld-arm/ifunc-4.rd
@@ -3,36 +3,6 @@ Relocation section '\.rel\.dyn' at offset 0x8000 contains 62 entries:
  Offset     Info    Type            Sym\.Value  Sym\. Name
 0001106c  ......17 R_ARM_RELATIVE   
 00011070  ......17 R_ARM_RELATIVE   
-00010034  ......02 R_ARM_ABS32       aaf2\(\)     aaf2
-00010038  ......03 R_ARM_REL32       aaf2\(\)     aaf2
-00011088  ......15 R_ARM_GLOB_DAT    aaf2\(\)     aaf2
-0001003c  ......02 R_ARM_ABS32       atf2\(\)     atf2
-00010040  ......03 R_ARM_REL32       atf2\(\)     atf2
-00011074  ......15 R_ARM_GLOB_DAT    atf2\(\)     atf2
-00010044  ......02 R_ARM_ABS32       abf2\(\)     abf2
-00010048  ......03 R_ARM_REL32       abf2\(\)     abf2
-000110a0  ......15 R_ARM_GLOB_DAT    abf2\(\)     abf2
-0001004c  ......02 R_ARM_ABS32       taf2\(\)     taf2
-00010050  ......03 R_ARM_REL32       taf2\(\)     taf2
-00011084  ......15 R_ARM_GLOB_DAT    taf2\(\)     taf2
-00010054  ......02 R_ARM_ABS32       ttf2\(\)     ttf2
-00010058  ......03 R_ARM_REL32       ttf2\(\)     ttf2
-0001107c  ......15 R_ARM_GLOB_DAT    ttf2\(\)     ttf2
-0001005c  ......02 R_ARM_ABS32       tbf2\(\)     tbf2
-00010060  ......03 R_ARM_REL32       tbf2\(\)     tbf2
-00011080  ......15 R_ARM_GLOB_DAT    tbf2\(\)     tbf2
-00010094  ......02 R_ARM_ABS32       aaf4\(\)     aaf4
-00011078  ......15 R_ARM_GLOB_DAT    aaf4\(\)     aaf4
-0001009c  ......02 R_ARM_ABS32       atf4\(\)     atf4
-00011098  ......15 R_ARM_GLOB_DAT    atf4\(\)     atf4
-000100a4  ......02 R_ARM_ABS32       abf4\(\)     abf4
-0001108c  ......15 R_ARM_GLOB_DAT    abf4\(\)     abf4
-000100ac  ......02 R_ARM_ABS32       taf4\(\)     taf4
-0001109c  ......15 R_ARM_GLOB_DAT    taf4\(\)     taf4
-000100b4  ......02 R_ARM_ABS32       ttf4\(\)     ttf4
-00011094  ......15 R_ARM_GLOB_DAT    ttf4\(\)     ttf4
-000100bc  ......02 R_ARM_ABS32       tbf4\(\)     tbf4
-00011090  ......15 R_ARM_GLOB_DAT    tbf4\(\)     tbf4
 00010004  ......a0 R_ARM_IRELATIVE  
 0001000c  ......a0 R_ARM_IRELATIVE  
 00010014  ......a0 R_ARM_IRELATIVE  
@@ -63,6 +33,36 @@ Relocation section '\.rel\.dyn' at offset 0x8000 contains 62 entries:
 00011060  ......a0 R_ARM_IRELATIVE  
 00011064  ......a0 R_ARM_IRELATIVE  
 00011068  ......a0 R_ARM_IRELATIVE  
+00010034  ......02 R_ARM_ABS32       aaf2\(\)     aaf2
+00010038  ......03 R_ARM_REL32       aaf2\(\)     aaf2
+00011088  ......15 R_ARM_GLOB_DAT    aaf2\(\)     aaf2
+0001003c  ......02 R_ARM_ABS32       atf2\(\)     atf2
+00010040  ......03 R_ARM_REL32       atf2\(\)     atf2
+00011074  ......15 R_ARM_GLOB_DAT    atf2\(\)     atf2
+00010044  ......02 R_ARM_ABS32       abf2\(\)     abf2
+00010048  ......03 R_ARM_REL32       abf2\(\)     abf2
+000110a0  ......15 R_ARM_GLOB_DAT    abf2\(\)     abf2
+0001004c  ......02 R_ARM_ABS32       taf2\(\)     taf2
+00010050  ......03 R_ARM_REL32       taf2\(\)     taf2
+00011084  ......15 R_ARM_GLOB_DAT    taf2\(\)     taf2
+00010054  ......02 R_ARM_ABS32       ttf2\(\)     ttf2
+00010058  ......03 R_ARM_REL32       ttf2\(\)     ttf2
+0001107c  ......15 R_ARM_GLOB_DAT    ttf2\(\)     ttf2
+0001005c  ......02 R_ARM_ABS32       tbf2\(\)     tbf2
+00010060  ......03 R_ARM_REL32       tbf2\(\)     tbf2
+00011080  ......15 R_ARM_GLOB_DAT    tbf2\(\)     tbf2
+00010094  ......02 R_ARM_ABS32       aaf4\(\)     aaf4
+00011078  ......15 R_ARM_GLOB_DAT    aaf4\(\)     aaf4
+0001009c  ......02 R_ARM_ABS32       atf4\(\)     atf4
+00011098  ......15 R_ARM_GLOB_DAT    atf4\(\)     atf4
+000100a4  ......02 R_ARM_ABS32       abf4\(\)     abf4
+0001108c  ......15 R_ARM_GLOB_DAT    abf4\(\)     abf4
+000100ac  ......02 R_ARM_ABS32       taf4\(\)     taf4
+0001109c  ......15 R_ARM_GLOB_DAT    taf4\(\)     taf4
+000100b4  ......02 R_ARM_ABS32       ttf4\(\)     ttf4
+00011094  ......15 R_ARM_GLOB_DAT    ttf4\(\)     ttf4
+000100bc  ......02 R_ARM_ABS32       tbf4\(\)     tbf4
+00011090  ......15 R_ARM_GLOB_DAT    tbf4\(\)     tbf4
 
 Relocation section '\.rel\.plt' at offset 0x81f0 contains 6 entries:
  Offset     Info    Type            Sym\.Value  Sym\. Name

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2023-01-09 15:52 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-01-09 15:52 [binutils-gdb] Fix PR18841 ifunc relocation ordering Christophe Lyon

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).