summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Wielaard <mjw@redhat.com>2015-10-16 12:26:27 +0200
committerMark Wielaard <mjw@redhat.com>2015-10-16 13:11:32 +0200
commitfd2e84cb31fa7585baa7daa9dae03a8ac725ae05 (patch)
treee71bb21dac6036aa72d04762206ffbc8b17e8698
parent9bcd3cbdbc66d94d2c0f53f100ecca3f0cf1df33 (diff)
downloadelfutils-fd2e84cb31fa7585baa7daa9dae03a8ac725ae05.tar.gz
ppc: ppc_check_special_symbol): Also allow _SDA_BASE_ in .data section.
The Small Data Area Base normally points to .sdata, in which case we check it is at an offset of 0x8000. It might however fall in the .data section, in which case we cannot check the offset. The size always should be zero. Signed-off-by: Mark Wielaard <mjw@redhat.com>
-rw-r--r--backends/ChangeLog5
-rw-r--r--backends/ppc_symbol.c11
2 files changed, 13 insertions, 3 deletions
diff --git a/backends/ChangeLog b/backends/ChangeLog
index e6f37633..6ea3dc4b 100644
--- a/backends/ChangeLog
+++ b/backends/ChangeLog
@@ -1,3 +1,8 @@
+2015-10-16 Mark Wielaard <mjw@redhat.com>
+
+ * ppc_symbol.c (ppc_check_special_symbol): Also allow _SDA_BASE_
+ in .data section.
+
2015-10-05 Josh Stone <jistone@redhat.com>
* Makefile.am (libebl_%.so): Add AM_V_at and AM_V_CCLD silencers.
diff --git a/backends/ppc_symbol.c b/backends/ppc_symbol.c
index 733114b6..37d49182 100644
--- a/backends/ppc_symbol.c
+++ b/backends/ppc_symbol.c
@@ -1,5 +1,5 @@
/* PPC specific symbolic name handling.
- Copyright (C) 2004, 2005, 2007, 2014 Red Hat, Inc.
+ Copyright (C) 2004, 2005, 2007, 2014, 2015 Red Hat, Inc.
This file is part of elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2004.
@@ -143,9 +143,14 @@ ppc_check_special_symbol (Elf *elf, GElf_Ehdr *ehdr, const GElf_Sym *sym,
if (sname == NULL)
return false;
+ /* Small data area. Normally points to .sdata, in which case we
+ check it is at an offset of 0x8000. It might however fall in the
+ .data section, in which case we cannot check the offset. The
+ size always should be zero. */
if (strcmp (name, "_SDA_BASE_") == 0)
- return (strcmp (sname, ".sdata") == 0
- && sym->st_value == destshdr->sh_addr + 0x8000
+ return (((strcmp (sname, ".sdata") == 0
+ && sym->st_value == destshdr->sh_addr + 0x8000)
+ || strcmp (sname, ".data") == 0)
&& sym->st_size == 0);
if (strcmp (name, "_SDA2_BASE_") == 0)