summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Wielaard <mark@klomp.org>2018-08-04 20:36:09 +0200
committerMark Wielaard <mark@klomp.org>2018-09-13 14:30:30 +0200
commitba2a7f4fa5f453c2b0a729bf519240a8f66a1867 (patch)
tree6fd2f8cd25f5750e815d7cab22adbd4f5d345e68
parentfb0457f4671e7e0f8331453348005ed6beab275e (diff)
downloadelfutils-ba2a7f4fa5f453c2b0a729bf519240a8f66a1867.tar.gz
backends: Always use elf_getshdrstrndx in check_special_symbol.
The check_special_symbol backend functions used the Ehdr e_shstrndx field to get at the name of sections. This is not correct if there are more than SHN_LORESERVE sections. Always use elf_getshdrstrndx to get the shstrtab section. And drop the Ehdr argument that isn't necessary anymore. Signed-off-by: Mark Wielaard <mark@klomp.org>
-rw-r--r--backends/ChangeLog10
-rw-r--r--backends/aarch64_symbol.c9
-rw-r--r--backends/alpha_symbol.c1
-rw-r--r--backends/ppc64_symbol.c7
-rw-r--r--backends/ppc_symbol.c7
-rw-r--r--backends/riscv_symbol.c7
-rw-r--r--libebl/ChangeLog7
-rw-r--r--libebl/ebl-hooks.h2
-rw-r--r--libebl/ebl_check_special_symbol.c4
-rw-r--r--libebl/eblopenbackend.c3
-rw-r--r--libebl/libebl.h2
-rw-r--r--src/ChangeLog5
-rw-r--r--src/elflint.c4
13 files changed, 50 insertions, 18 deletions
diff --git a/backends/ChangeLog b/backends/ChangeLog
index 52149482..ada349fe 100644
--- a/backends/ChangeLog
+++ b/backends/ChangeLog
@@ -1,3 +1,13 @@
+2018-09-12 Mark Wielaard <mark@klomp.org>
+
+ * aarch64_symbol.c (aarch64_check_special_symbol): Drop ehdr argument,
+ use elf_getshdrstrndx.
+ * alpha_symbol.c (alpha_check_special_symbol): Drop ehdr argument.
+ * ppc64_symbol.c (ppc64_check_special_symbol): Likewise and use
+ elf_getshdrstrndx.
+ * ppc_symbol.c (ppc_check_special_symbol): Likewise.
+ * riscv_symbol.c (riscv_check_special_symbol): Likewise.
+
2018-07-21 Andreas Schwab <schwab@linux-m68k.org>
* Makefile.am (m68k_SRCS): Add m68k_cfi.c and m68k_initreg.c.
diff --git a/backends/aarch64_symbol.c b/backends/aarch64_symbol.c
index da3382e9..dfd755a5 100644
--- a/backends/aarch64_symbol.c
+++ b/backends/aarch64_symbol.c
@@ -62,13 +62,16 @@ aarch64_reloc_simple_type (Ebl *ebl __attribute__ ((unused)), int type)
https://bugzilla.redhat.com/show_bug.cgi?id=1201778
*/
bool
-aarch64_check_special_symbol (Elf *elf, GElf_Ehdr *ehdr, const GElf_Sym *sym,
+aarch64_check_special_symbol (Elf *elf, const GElf_Sym *sym,
const char *name, const GElf_Shdr *destshdr)
{
if (name != NULL
&& strcmp (name, "_GLOBAL_OFFSET_TABLE_") == 0)
{
- const char *sname = elf_strptr (elf, ehdr->e_shstrndx, destshdr->sh_name);
+ size_t shstrndx;
+ if (elf_getshdrstrndx (elf, &shstrndx) != 0)
+ return false;
+ const char *sname = elf_strptr (elf, shstrndx, destshdr->sh_name);
if (sname != NULL
&& (strcmp (sname, ".got") == 0 || strcmp (sname, ".got.plt") == 0))
{
@@ -79,7 +82,7 @@ aarch64_check_special_symbol (Elf *elf, GElf_Ehdr *ehdr, const GElf_Sym *sym,
GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
if (shdr != NULL)
{
- sname = elf_strptr (elf, ehdr->e_shstrndx, shdr->sh_name);
+ sname = elf_strptr (elf, shstrndx, shdr->sh_name);
if (sname != NULL && strcmp (sname, ".got") == 0)
return (sym->st_value >= shdr->sh_addr
&& sym->st_value < shdr->sh_addr + shdr->sh_size);
diff --git a/backends/alpha_symbol.c b/backends/alpha_symbol.c
index 657d9eec..b7f7c17a 100644
--- a/backends/alpha_symbol.c
+++ b/backends/alpha_symbol.c
@@ -130,7 +130,6 @@ alpha_check_special_section (Ebl *ebl,
normal checks. */
bool
alpha_check_special_symbol (Elf *elf __attribute__ ((unused)),
- GElf_Ehdr *ehdr __attribute__ ((unused)),
const GElf_Sym *sym __attribute__ ((unused)),
const char *name,
const GElf_Shdr *destshdr __attribute__ ((unused)))
diff --git a/backends/ppc64_symbol.c b/backends/ppc64_symbol.c
index 0feddcee..40ba4f74 100644
--- a/backends/ppc64_symbol.c
+++ b/backends/ppc64_symbol.c
@@ -94,12 +94,15 @@ ppc64_dynamic_tag_check (int64_t tag)
/* Check whether given symbol's st_value and st_size are OK despite failing
normal checks. */
bool
-ppc64_check_special_symbol (Elf *elf, GElf_Ehdr *ehdr,
+ppc64_check_special_symbol (Elf *elf,
const GElf_Sym *sym __attribute__ ((unused)),
const char *name __attribute__ ((unused)),
const GElf_Shdr *destshdr)
{
- const char *sname = elf_strptr (elf, ehdr->e_shstrndx, destshdr->sh_name);
+ size_t shstrndx;
+ if (elf_getshdrstrndx (elf, &shstrndx) != 0)
+ return false;
+ const char *sname = elf_strptr (elf, shstrndx, destshdr->sh_name);
if (sname == NULL)
return false;
return strcmp (sname, ".opd") == 0;
diff --git a/backends/ppc_symbol.c b/backends/ppc_symbol.c
index 4b32003a..35b14319 100644
--- a/backends/ppc_symbol.c
+++ b/backends/ppc_symbol.c
@@ -135,7 +135,7 @@ find_dyn_got (Elf *elf, GElf_Addr *addr)
/* Check whether given symbol's st_value and st_size are OK despite failing
normal checks. */
bool
-ppc_check_special_symbol (Elf *elf, GElf_Ehdr *ehdr, const GElf_Sym *sym,
+ppc_check_special_symbol (Elf *elf, const GElf_Sym *sym,
const char *name, const GElf_Shdr *destshdr)
{
if (name == NULL)
@@ -152,7 +152,10 @@ ppc_check_special_symbol (Elf *elf, GElf_Ehdr *ehdr, const GElf_Sym *sym,
return true;
}
- const char *sname = elf_strptr (elf, ehdr->e_shstrndx, destshdr->sh_name);
+ size_t shstrndx;
+ if (elf_getshdrstrndx (elf, &shstrndx) != 0)
+ return false;
+ const char *sname = elf_strptr (elf, shstrndx, destshdr->sh_name);
if (sname == NULL)
return false;
diff --git a/backends/riscv_symbol.c b/backends/riscv_symbol.c
index dce8e358..866a2d7a 100644
--- a/backends/riscv_symbol.c
+++ b/backends/riscv_symbol.c
@@ -64,13 +64,16 @@ riscv_machine_flag_check (GElf_Word flags)
/* Check whether given symbol's st_value and st_size are OK despite failing
normal checks. */
bool
-riscv_check_special_symbol (Elf *elf, GElf_Ehdr *ehdr, const GElf_Sym *sym,
+riscv_check_special_symbol (Elf *elf, const GElf_Sym *sym,
const char *name, const GElf_Shdr *destshdr)
{
if (name == NULL)
return false;
- const char *sname = elf_strptr (elf, ehdr->e_shstrndx, destshdr->sh_name);
+ size_t shstrndx;
+ if (elf_getshdrstrndx (elf, &shstrndx) != 0)
+ return false;
+ const char *sname = elf_strptr (elf, shstrndx, destshdr->sh_name);
if (sname == NULL)
return false;
diff --git a/libebl/ChangeLog b/libebl/ChangeLog
index f76afd10..574aae6e 100644
--- a/libebl/ChangeLog
+++ b/libebl/ChangeLog
@@ -1,3 +1,10 @@
+2018-09-12 Mark Wielaard <mark@klomp.org>
+
+ * ebl-hooks.h (check_special_symbol): Drop ehdr argument.
+ * ebl_check_special_symbol.c (ebl_check_special_symbol): Likewise.
+ * eblopenbackend.c (default_check_special_symbol): Likewise.
+ * libebl.h (ebl_check_special_symbol): Likewise.
+
2018-07-04 Ross Burton <ross.burton@intel.com>
* eblopenbackend.c: Remove error.h include.
diff --git a/libebl/ebl-hooks.h b/libebl/ebl-hooks.h
index f3a0e64a..7a355cd1 100644
--- a/libebl/ebl-hooks.h
+++ b/libebl/ebl-hooks.h
@@ -118,7 +118,7 @@ bool EBLHOOK(none_reloc_p) (int);
bool EBLHOOK(relative_reloc_p) (int);
/* Check whether given symbol's value is ok despite normal checks. */
-bool EBLHOOK(check_special_symbol) (Elf *, GElf_Ehdr *, const GElf_Sym *,
+bool EBLHOOK(check_special_symbol) (Elf *, const GElf_Sym *,
const char *, const GElf_Shdr *);
/* Check if this is a data marker symbol. e.g. '$d' symbols for ARM. */
diff --git a/libebl/ebl_check_special_symbol.c b/libebl/ebl_check_special_symbol.c
index bdcb026c..1f60c3f0 100644
--- a/libebl/ebl_check_special_symbol.c
+++ b/libebl/ebl_check_special_symbol.c
@@ -35,11 +35,11 @@
bool
-ebl_check_special_symbol (Ebl *ebl, GElf_Ehdr *ehdr, const GElf_Sym *sym,
+ebl_check_special_symbol (Ebl *ebl, const GElf_Sym *sym,
const char *name, const GElf_Shdr *destshdr)
{
if (ebl == NULL)
return false;
- return ebl->check_special_symbol (ebl->elf, ehdr, sym, name, destshdr);
+ return ebl->check_special_symbol (ebl->elf, sym, name, destshdr);
}
diff --git a/libebl/eblopenbackend.c b/libebl/eblopenbackend.c
index 1962e608..f5b3de29 100644
--- a/libebl/eblopenbackend.c
+++ b/libebl/eblopenbackend.c
@@ -181,7 +181,7 @@ static bool default_debugscn_p (const char *name);
static bool default_copy_reloc_p (int reloc);
static bool default_none_reloc_p (int reloc);
static bool default_relative_reloc_p (int reloc);
-static bool default_check_special_symbol (Elf *elf, GElf_Ehdr *ehdr,
+static bool default_check_special_symbol (Elf *elf,
const GElf_Sym *sym,
const char *name,
const GElf_Shdr *destshdr);
@@ -673,7 +673,6 @@ strong_alias (default_copy_reloc_p, default_relative_reloc_p)
static bool
default_check_special_symbol (Elf *elf __attribute__ ((unused)),
- GElf_Ehdr *ehdr __attribute__ ((unused)),
const GElf_Sym *sym __attribute__ ((unused)),
const char *name __attribute__ ((unused)),
const GElf_Shdr *destshdr __attribute__ ((unused)))
diff --git a/libebl/libebl.h b/libebl/libebl.h
index 882bdb99..0e1f41be 100644
--- a/libebl/libebl.h
+++ b/libebl/libebl.h
@@ -152,7 +152,7 @@ extern bool ebl_dynamic_tag_check (Ebl *ebl, int64_t tag);
/* Check whether given symbol's st_value and st_size are OK despite failing
normal checks. */
-extern bool ebl_check_special_symbol (Ebl *ebl, GElf_Ehdr *ehdr,
+extern bool ebl_check_special_symbol (Ebl *ebl,
const GElf_Sym *sym, const char *name,
const GElf_Shdr *destshdr);
diff --git a/src/ChangeLog b/src/ChangeLog
index 29d36446..a118519f 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,8 @@
+2018-09-12 Mark Wielaard <mark@klomp.org>
+
+ * elflint.c (check_symtab): Call ebl_check_special_symbol without
+ ehdr.
+
2018-07-30 Mark Wielaard <mark@klomp.org>
* strip.c (handle_elf): Track allocated/unallocated sections seen. Set
diff --git a/src/elflint.c b/src/elflint.c
index 90e8fed4..b49436ca 100644
--- a/src/elflint.c
+++ b/src/elflint.c
@@ -796,7 +796,7 @@ section [%2d] '%s': symbol %zu: function in COMMON section is nonsense\n"),
st_value = sym->st_value;
if (GELF_ST_TYPE (sym->st_info) != STT_TLS)
{
- if (! ebl_check_special_symbol (ebl, ehdr, sym, name,
+ if (! ebl_check_special_symbol (ebl, sym, name,
destshdr))
{
if (st_value - sh_addr > destshdr->sh_size)
@@ -997,7 +997,7 @@ section [%2d] '%s'\n"),
if (destshdr != NULL)
{
/* Found it. */
- if (!ebl_check_special_symbol (ebl, ehdr, sym, name,
+ if (!ebl_check_special_symbol (ebl, sym, name,
destshdr))
{
if (ehdr->e_type != ET_REL