summaryrefslogtreecommitdiff
path: root/libebl
diff options
context:
space:
mode:
authorMark Wielaard <mark@klomp.org>2017-07-20 22:34:29 +0200
committerMark Wielaard <mark@klomp.org>2017-07-24 12:20:01 +0200
commit55cb7dfa7e9afb3660b21e51434641c7287baf11 (patch)
tree9fc5ed4d912e682084cf97dca3b655be0905b6c0 /libebl
parent1609679b1ef3611c71a08900c2f6b94bb97d454d (diff)
downloadelfutils-55cb7dfa7e9afb3660b21e51434641c7287baf11.tar.gz
strip: Deal with ARM data marker symbols pointing to debug sections.
ARM data marker symbols "$d" indicate the start of a sequence of data items in a section. For data only sections no data marker symbol is necessary, but may be put pointing to the start of the section. binutils however has a bug which places a data marker symbol somewhere inside the section (at least for .debug_frame). https://sourceware.org/bugzilla/show_bug.cgi?id=21809 When strip finds a symbol pointing to a debug section that would be put into the .debug file then it will copy over the whole symbol table. This isn't necessary because the symbol is redundant. Add an ebl hook to recognize data marker symbols with implementations for arm and aarch64. Use it in strip to strip such symbols from the symbol table if they point to a debug section. Signed-off-by: Mark Wielaard <mark@klomp.org>
Diffstat (limited to 'libebl')
-rw-r--r--libebl/ChangeLog9
-rw-r--r--libebl/Makefile.am5
-rw-r--r--libebl/ebl-hooks.h5
-rw-r--r--libebl/ebl_data_marker_symbol.c44
-rw-r--r--libebl/eblopenbackend.c11
-rw-r--r--libebl/libebl.h6
6 files changed, 75 insertions, 5 deletions
diff --git a/libebl/ChangeLog b/libebl/ChangeLog
index 506915ba..f4474496 100644
--- a/libebl/ChangeLog
+++ b/libebl/ChangeLog
@@ -1,3 +1,12 @@
+2017-07-20 Mark Wielaard <mark@klomp.org>
+
+ * Makefile.am (gen_SOURCES): Add ebl_data_marker_symbol.c.
+ * ebl-hooks.h (data_marker_symbol): New hook.
+ * ebl_data_marker_symbol.c: New file.
+ * eblopenbackend.c (default_data_marker_symbol): New function.
+ (fill_defaults): Add default_data_marker_symbol.
+ * libebl.h (ebl_data_marker_symbol): New function.
+
2017-04-20 Ulf Hermann <ulf.hermann@qt.io>
* libebl.h: Use __pure_attribute__.
diff --git a/libebl/Makefile.am b/libebl/Makefile.am
index 6f945eb8..2491df80 100644
--- a/libebl/Makefile.am
+++ b/libebl/Makefile.am
@@ -1,6 +1,6 @@
## Process this file with automake to create Makefile.in
##
-## Copyright (C) 2000-2010, 2013, 2016 Red Hat, Inc.
+## Copyright (C) 2000-2010, 2013, 2016, 2017 Red Hat, Inc.
## This file is part of elfutils.
##
## This file is free software; you can redistribute it and/or modify
@@ -53,7 +53,8 @@ gen_SOURCES = eblopenbackend.c eblclosebackend.c \
eblsysvhashentrysize.c eblauxvinfo.c eblcheckobjattr.c \
ebl_check_special_section.c ebl_syscall_abi.c eblabicfi.c \
eblstother.c eblinitreg.c ebldwarftoregno.c eblnormalizepc.c \
- eblunwind.c eblresolvesym.c eblcheckreloctargettype.c
+ eblunwind.c eblresolvesym.c eblcheckreloctargettype.c \
+ ebl_data_marker_symbol.c
libebl_a_SOURCES = $(gen_SOURCES)
diff --git a/libebl/ebl-hooks.h b/libebl/ebl-hooks.h
index b7253748..f3a0e64a 100644
--- a/libebl/ebl-hooks.h
+++ b/libebl/ebl-hooks.h
@@ -1,5 +1,5 @@
/* Backend hook signatures internal interface for libebl.
- Copyright (C) 2000-2011, 2013, 2014, 2016 Red Hat, Inc.
+ Copyright (C) 2000-2011, 2013, 2014, 2016, 2017 Red Hat, Inc.
This file is part of elfutils.
This file is free software; you can redistribute it and/or modify
@@ -121,6 +121,9 @@ bool EBLHOOK(relative_reloc_p) (int);
bool EBLHOOK(check_special_symbol) (Elf *, GElf_Ehdr *, const GElf_Sym *,
const char *, const GElf_Shdr *);
+/* Check if this is a data marker symbol. e.g. '$d' symbols for ARM. */
+bool EBLHOOK(data_marker_symbol) (const GElf_Sym *sym, const char *sname);
+
/* Check whether only valid bits are set on the st_other symbol flag.
Standard ST_VISIBILITY have already been masked off. */
bool EBLHOOK(check_st_other_bits) (unsigned char st_other);
diff --git a/libebl/ebl_data_marker_symbol.c b/libebl/ebl_data_marker_symbol.c
new file mode 100644
index 00000000..922d7203
--- /dev/null
+++ b/libebl/ebl_data_marker_symbol.c
@@ -0,0 +1,44 @@
+/* Check whether a symbol is a special data marker.
+ Copyright (C) 2017 Red Hat, Inc.
+ This file is part of elfutils.
+
+ This file is free software; you can redistribute it and/or modify
+ it under the terms of either
+
+ * the GNU Lesser General Public License as published by the Free
+ Software Foundation; either version 3 of the License, or (at
+ your option) any later version
+
+ or
+
+ * the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at
+ your option) any later version
+
+ or both in parallel, as here.
+
+ elfutils is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received copies of the GNU General Public License and
+ the GNU Lesser General Public License along with this program. If
+ not, see <http://www.gnu.org/licenses/>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <inttypes.h>
+#include <libeblP.h>
+
+
+bool
+ebl_data_marker_symbol (Ebl *ebl, const GElf_Sym *sym, const char *sname)
+{
+ if (ebl == NULL)
+ return false;
+
+ return ebl->data_marker_symbol (sym, sname);
+}
diff --git a/libebl/eblopenbackend.c b/libebl/eblopenbackend.c
index f3a65cfa..1f814776 100644
--- a/libebl/eblopenbackend.c
+++ b/libebl/eblopenbackend.c
@@ -1,5 +1,5 @@
/* Generate ELF backend handle.
- Copyright (C) 2000-2016 Red Hat, Inc.
+ Copyright (C) 2000-2017 Red Hat, Inc.
This file is part of elfutils.
This file is free software; you can redistribute it and/or modify
@@ -184,6 +184,7 @@ static bool default_check_special_symbol (Elf *elf, GElf_Ehdr *ehdr,
const GElf_Sym *sym,
const char *name,
const GElf_Shdr *destshdr);
+static bool default_data_marker_symbol (const GElf_Sym *sym, const char *sname);
static bool default_check_st_other_bits (unsigned char st_other);
static bool default_check_special_section (Ebl *, int,
const GElf_Shdr *, const char *);
@@ -235,6 +236,7 @@ fill_defaults (Ebl *result)
result->none_reloc_p = default_none_reloc_p;
result->relative_reloc_p = default_relative_reloc_p;
result->check_special_symbol = default_check_special_symbol;
+ result->data_marker_symbol = default_data_marker_symbol;
result->check_st_other_bits = default_check_st_other_bits;
result->bss_plt_p = default_bss_plt_p;
result->return_value_location = default_return_value_location;
@@ -672,6 +674,13 @@ default_check_special_symbol (Elf *elf __attribute__ ((unused)),
}
static bool
+default_data_marker_symbol (const GElf_Sym *sym __attribute__ ((unused)),
+ const char *sname __attribute__ ((unused)))
+{
+ return false;
+}
+
+static bool
default_check_st_other_bits (unsigned char st_other __attribute__ ((unused)))
{
return false;
diff --git a/libebl/libebl.h b/libebl/libebl.h
index 87896e4a..882bdb99 100644
--- a/libebl/libebl.h
+++ b/libebl/libebl.h
@@ -1,5 +1,5 @@
/* Interface for libebl.
- Copyright (C) 2000-2010, 2013, 2014, 2015, 2016 Red Hat, Inc.
+ Copyright (C) 2000-2010, 2013, 2014, 2015, 2016, 2017 Red Hat, Inc.
This file is part of elfutils.
This file is free software; you can redistribute it and/or modify
@@ -156,6 +156,10 @@ extern bool ebl_check_special_symbol (Ebl *ebl, GElf_Ehdr *ehdr,
const GElf_Sym *sym, const char *name,
const GElf_Shdr *destshdr);
+/* Check if this is a data marker symbol. e.g. '$d' symbols for ARM. */
+extern bool ebl_data_marker_symbol (Ebl *ebl, const GElf_Sym *sym,
+ const char *sname);
+
/* Check whether only valid bits are set on the st_other symbol flag. */
extern bool ebl_check_st_other_bits (Ebl *ebl, unsigned char st_other);