void-packages/srcpkgs/binutils/patches/1767e3f3bd6d460491f8c8d032a...

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;
}