prelink: Fix Segmentation fault error when prelink qemu

The info->resolvetls might be NULL according to src/prelink.c:
[snip]
 /* Dynamic linker does not depend on any other library,
    all symbols resolve to themselves with the exception
    of SHN_UNDEF symbols which resolve to 0.  */
if (info->symtab[r_sym].st_shndx == SHN_UNDEF)
  {
    info->resolveent = NULL;
    info->resolvetls = NULL;
[snip]

So we must check it before use its members, otherwise, there might be
Segmentation fault error.

Fixed:
MACHINE = "qemumips"
IMAGE_INSTALL_append = " qemu"
$ bitbake core-image-minimal
[snip]
| /path/to/qemumips-poky-linux/core-image-minimal/1.0-r0/temp/run.prelink_image.1000: line 111:  1010 Segmentation fault      (core dumped)
[snip]

(From OE-Core rev: 7f5d6f6b70cb1eb486d3ff5c029fc3c6202fc826)

Signed-off-by: Robert Yang <liezhi.yang@windriver.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Robert Yang
2018-10-11 12:06:53 +08:00
committed by Richard Purdie
parent 25f0252d61
commit f302012bdd
2 changed files with 52 additions and 0 deletions

View File

@@ -0,0 +1,51 @@
From 2136969e3e196b9cf7f4788340efa4b1d9b39565 Mon Sep 17 00:00:00 2001
From: Robert Yang <liezhi.yang@windriver.com>
Date: Thu, 11 Oct 2018 10:05:52 +0800
Subject: [PATCH] src/arch-mips.c: check info->resolvetls before use its member
The info->resolvetls might be NULL according to src/prelink.c:
[snip]
/* Dynamic linker does not depend on any other library,
all symbols resolve to themselves with the exception
of SHN_UNDEF symbols which resolve to 0. */
if (info->symtab[r_sym].st_shndx == SHN_UNDEF)
{
info->resolveent = NULL;
info->resolvetls = NULL;
[snip]
So we must check it before use its members, otherwise, there might be
Segmentation fault error.
Fixed:
MACHINE = "qemumips"
IMAGE_INSTALL_append = " qemu"
$ bitbake core-image-minimal
[snip]
| /path/to/qemumips-poky-linux/core-image-minimal/1.0-r0/temp/run.prelink_image.1000: line 111: 1010 Segmentation fault (core dumped)
[snip]
Upstream-Status: Submitted [https://lists.yoctoproject.org/pipermail/yocto/2018-October/042812.html]
Signed-off-by: Robert Yang <liezhi.yang@windriver.com>
---
src/arch-mips.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/src/arch-mips.c b/src/arch-mips.c
index ccb1834..02c608f 100644
--- a/src/arch-mips.c
+++ b/src/arch-mips.c
@@ -567,7 +567,8 @@ mips_prelink_reloc (struct prelink_info *info, GElf_Addr r_offset,
if (dso->ehdr.e_type == ET_EXEC)
{
value = info->resolve (info, r_sym, r_type);
- value += info->resolvetls->offset - TLS_TP_OFFSET;
+ if (info->resolvetls != NULL)
+ value += info->resolvetls->offset - TLS_TP_OFFSET;
if (r_type == R_MIPS_TLS_TPREL32)
mips_prelink_32bit_reloc (dso, rela, value);
else
--
2.7.4

View File

@@ -32,6 +32,7 @@ SRC_URI = "git://git.yoctoproject.org/prelink-cross.git;branch=cross_prelink_sta
file://prelink.cron.daily \
file://prelink.default \
file://macros.prelink \
file://0001-src-arch-mips.c-check-info-resolvetls-before-use-its.patch \
"
UPSTREAM_CHECK_COMMITS = "1"