61 lines
2.3 KiB
Diff
61 lines
2.3 KiB
Diff
From 1767e3f3bd6d460491f8c8d032a7fea88d5ec8ff Mon Sep 17 00:00:00 2001
|
|
From: "H.J. Lu" <hjl.tools@gmail.com>
|
|
Date: Mon, 16 Nov 2020 06:37:53 -0800
|
|
Subject: [PATCH] elf: Set rel_from_abs to 1 for __ehdr_start
|
|
|
|
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 | 9 +++++++++
|
|
ld/ldelf.c | 2 ++
|
|
ld/testsuite/ld-i386/i386.exp | 1 +
|
|
ld/testsuite/ld-i386/pr26869.d | 14 ++++++++++++++
|
|
ld/testsuite/ld-i386/pr26869.s | 3 +++
|
|
5 files changed, 29 insertions(+)
|
|
create mode 100644 ld/testsuite/ld-i386/pr26869.d
|
|
create mode 100644 ld/testsuite/ld-i386/pr26869.s
|
|
|
|
diff --git a/ld/ldelf.c b/ld/ldelf.c
|
|
index bada3ade2d7..831d032fe56 100644
|
|
--- a/ld/ldelf.c
|
|
+++ b/ld/ldelf.c
|
|
@@ -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;
|
|
}
|