mirror of
https://git.yoctoproject.org/poky
synced 2026-02-13 12:13:02 +01:00
"ld:i386 crashes with -static -fPIE -pie" https://bugs.launchpad.net/ubuntu/+source/binutils/+bug/1266492 This adds in two upstream binutils fixes to avoid the internal error triggered by the combination of -static with -pie on x86 builds. This triggers a backtrace which then triggers a bug in glibc where the process ends up hanging on some systems with broken libcs. We can't fix the libc but we can stop the internal error and hence avoid the hanging builds. (From OE-Core rev: e949f9a8fc337bd768c7e8a3fd082775a94e0ad4) Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
76 lines
2.3 KiB
Diff
76 lines
2.3 KiB
Diff
From d1ec1e40b5b457c92aaa23f7af40e026e4596a99 Mon Sep 17 00:00:00 2001
|
|
From: H.J. Lu <hjl.tools@gmail.com>
|
|
Date: Tue, 14 Jan 2014 10:48:39 -0800
|
|
Subject: [PATCH 1/1] Don't update reloc count if there are any non pc-relative relocs
|
|
|
|
PR ld/16428
|
|
* elf32-i386.c (elf_i386_allocate_dynrelocs): Don't update reloc
|
|
count if there are any non pc-relative relocs.
|
|
* elf64-x86-64.c (elf_x86_64_allocate_dynrelocs): Likewise.
|
|
---
|
|
bfd/ChangeLog | 7 +++++++
|
|
bfd/elf32-i386.c | 9 +++++++--
|
|
bfd/elf64-x86-64.c | 9 +++++++--
|
|
3 files changed, 21 insertions(+), 4 deletions(-)
|
|
|
|
Upstream-Status: Backport
|
|
|
|
#diff --git a/bfd/ChangeLog b/bfd/ChangeLog
|
|
#index a8f1f94..7a49fd1 100644
|
|
#--- a/bfd/ChangeLog
|
|
#+++ b/bfd/ChangeLog
|
|
#@@ -1,3 +1,10 @@
|
|
#+2014-01-14 H.J. Lu <hongjiu.lu@intel.com>
|
|
#+
|
|
#+ PR ld/16428
|
|
#+ * elf32-i386.c (elf_i386_allocate_dynrelocs): Don't update reloc
|
|
#+ count if there are any non pc-relative relocs.
|
|
#+ * elf64-x86-64.c (elf_x86_64_allocate_dynrelocs): Likewise.
|
|
#+
|
|
# 2014-01-14 Michael Hudson-Doyle <michael.hudson@linaro.org>
|
|
# Kugan Vivekanandarajah <kugan.vivekanandarajah@linaro.org>
|
|
#
|
|
diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c
|
|
index 4d391e1..d7f59e5 100644
|
|
--- a/bfd/elf32-i386.c
|
|
+++ b/bfd/elf32-i386.c
|
|
@@ -2368,8 +2368,13 @@ elf_i386_allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
|
|
|
|
for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
|
|
{
|
|
- p->count -= p->pc_count;
|
|
- p->pc_count = 0;
|
|
+ /* Don't update reloc count if there are any non
|
|
+ pc-relative relocs. */
|
|
+ if (!h->pointer_equality_needed)
|
|
+ {
|
|
+ p->count -= p->pc_count;
|
|
+ p->pc_count = 0;
|
|
+ }
|
|
if (p->count == 0)
|
|
*pp = p->next;
|
|
else
|
|
diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c
|
|
index edee8ec..999011b 100644
|
|
--- a/bfd/elf64-x86-64.c
|
|
+++ b/bfd/elf64-x86-64.c
|
|
@@ -2463,8 +2463,13 @@ elf_x86_64_allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf)
|
|
|
|
for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
|
|
{
|
|
- p->count -= p->pc_count;
|
|
- p->pc_count = 0;
|
|
+ /* Don't update reloc count if there are any non
|
|
+ pc-relative relocs. */
|
|
+ if (!h->pointer_equality_needed)
|
|
+ {
|
|
+ p->count -= p->pc_count;
|
|
+ p->pc_count = 0;
|
|
+ }
|
|
if (p->count == 0)
|
|
*pp = p->next;
|
|
else
|
|
--
|
|
1.7.1
|
|
|