]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
elf: Set rel_from_abs to 1 for __ehdr_start
authorH.J. Lu <hjl.tools@gmail.com>
Mon, 16 Nov 2020 14:37:53 +0000 (06:37 -0800)
committerH.J. Lu <hjl.tools@gmail.com>
Mon, 16 Nov 2020 14:38:07 +0000 (06:38 -0800)
bfdlink.h has

  /* Symbol will be converted from absolute to section-relative.  Set for
     symbols defined by a script from "dot" (also SEGMENT_START or ORIGIN)
     outside of an output section statement.  */
  unsigned int rel_from_abs : 1;

linker.c has

.{* Return TRUE if the symbol described by a linker hash entry H
.   is going to be absolute.  Linker-script defined symbols can be
.   converted from absolute to section-relative ones late in the
.   link.  Use this macro to correctly determine whether the symbol
.   will actually end up absolute in output.  *}
.#define bfd_is_abs_symbol(H) \
.  (((H)->type == bfd_link_hash_defined \
.    || (H)->type == bfd_link_hash_defweak) \
.   && bfd_is_abs_section ((H)->u.def.section) \
.   && !(H)->rel_from_abs)
.

Set rel_from_abs to 1 for __ehdr_start which will be converted from
absolute to section-relative in assign_file_positions_for_load_sections.

PR ld/26869
* ldelf.c (ldelf_before_allocation): Set rel_from_abs to 1 for
__ehdr_start.
* testsuite/ld-i386/i386.exp: Run pr26869.
* testsuite/ld-i386/pr26869.d: New file.
* testsuite/ld-i386/pr26869.s: Likewise.

(cherry picked from commit cbd5b99cce073273f668b154d4514e8e7e7ccc51)

ld/ChangeLog
ld/ldelf.c
ld/testsuite/ld-i386/i386.exp
ld/testsuite/ld-i386/pr26869.d [new file with mode: 0644]
ld/testsuite/ld-i386/pr26869.s [new file with mode: 0644]

index 62efcf2ba07cc9f79907f3f2cec074e596124007..66f6e2811004c479e89ffe4560b7dc80afa55e54 100644 (file)
@@ -1,3 +1,12 @@
+2020-11-16  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR ld/26869
+       * ldelf.c (ldelf_before_allocation): Set rel_from_abs to 1 for
+       __ehdr_start.
+       * testsuite/ld-i386/i386.exp: Run pr26869.
+       * testsuite/ld-i386/pr26869.d: New file.
+       * testsuite/ld-i386/pr26869.s: Likewise.
+
 2020-10-07  H.J. Lu  <hongjiu.lu@intel.com>
 
        * testsuite/ld-i386/property-3.r: Updated for Fedora binary
index bada3ade2d75eac3ccb65e5eff55cce4a6528844..831d032fe568f618277e8308eee1fc5b9f18ab76 100644 (file)
@@ -1589,6 +1589,8 @@ ldelf_before_allocation (char *audit, char *depaudit,
                      (char *) &ehdr_start->u + sizeof ehdr_start->u.def.next,
                      sizeof ehdr_start_save_u);
              ehdr_start->type = bfd_link_hash_defined;
+             /* It will be converted to section-relative later.  */
+             ehdr_start->rel_from_abs = 1;
              ehdr_start->u.def.section = bfd_abs_section_ptr;
              ehdr_start->u.def.value = 0;
            }
index 3089a663377a4bf8372be5b4f3f6e6a0c555999d..f031b01ffea728620fb4d6d4a7b3b850d197cc9d 100644 (file)
@@ -473,6 +473,7 @@ run_dump_test "pr26263"
 run_dump_test "pr26711-1"
 run_dump_test "pr26711-2"
 run_dump_test "pr26711-3"
+run_dump_test "pr26869"
 
 if { !([istarget "i?86-*-linux*"]
        || [istarget "i?86-*-gnu*"]
diff --git a/ld/testsuite/ld-i386/pr26869.d b/ld/testsuite/ld-i386/pr26869.d
new file mode 100644 (file)
index 0000000..bfd00a7
--- /dev/null
@@ -0,0 +1,14 @@
+#as: --32
+#ld: -shared -melf_i386
+#readelf: -r -s --wide
+
+Relocation section '.rel.dyn' at offset 0x[a-f0-9]+ contains 1 entry:
+ Offset     Info    Type                Sym. Value  Symbol's Name
+0+[a-f0-9]+  00000008 R_386_RELATIVE        
+
+#...
+Symbol table '.symtab' contains [0-9]+ entries:
+   Num:    Value  Size Type    Bind   Vis      Ndx Name
+#...
+ +[a-f0-9]+: 00000000     0 NOTYPE  LOCAL  DEFAULT    1 __ehdr_start
+#pass
diff --git a/ld/testsuite/ld-i386/pr26869.s b/ld/testsuite/ld-i386/pr26869.s
new file mode 100644 (file)
index 0000000..e492b98
--- /dev/null
@@ -0,0 +1,3 @@
+       .text
+foo:
+       pushl   __ehdr_start@GOT(%ebx)