summaryrefslogtreecommitdiffstats
path: root/contrib/elftoolchain
diff options
context:
space:
mode:
authoremaste <emaste@FreeBSD.org>2016-05-20 17:24:34 +0000
committeremaste <emaste@FreeBSD.org>2016-05-20 17:24:34 +0000
commite1afa8a66332bcb42ea042ec5dfb59de5b33ee08 (patch)
tree53f16cf467b740bb55f778ee1a5c3b117e43c2e0 /contrib/elftoolchain
parent1860a225caf7329b3bc2038750624b9d0b47139a (diff)
parentdb27a04d331bc804aa12a4a70e9e0d939f3773c0 (diff)
downloadFreeBSD-src-e1afa8a66332bcb42ea042ec5dfb59de5b33ee08.zip
FreeBSD-src-e1afa8a66332bcb42ea042ec5dfb59de5b33ee08.tar.gz
Update to ELF Tool Chain r3475
Improvements include: * Add support for reporting and handling a number of new constants in various tools, including: * CloudABI OSABI * DT_TLSDESC_* * i386, MIPS, SPARC and amd64 relocations * C++ demangler bug fixes * Man page updates * Improved input validation in several tools This update also reduces diffs against upstream as a number of fixes included in upstream were previously cherry-picked into FreeBSD. Sponsored by: The FreeBSD Foundation
Diffstat (limited to 'contrib/elftoolchain')
-rw-r--r--contrib/elftoolchain/addr2line/addr2line.c4
-rw-r--r--contrib/elftoolchain/brandelf/brandelf.c3
-rw-r--r--contrib/elftoolchain/common/_elftc.h4
-rw-r--r--contrib/elftoolchain/common/elfdefinitions.h85
-rw-r--r--contrib/elftoolchain/cxxfilt/cxxfilt.c54
-rw-r--r--contrib/elftoolchain/elfcopy/ascii.c4
-rw-r--r--contrib/elftoolchain/elfcopy/binary.c2
-rw-r--r--contrib/elftoolchain/elfcopy/elfcopy.119
-rw-r--r--contrib/elftoolchain/elfcopy/elfcopy.h6
-rw-r--r--contrib/elftoolchain/elfcopy/main.c7
-rw-r--r--contrib/elftoolchain/elfcopy/sections.c2
-rw-r--r--contrib/elftoolchain/elfcopy/segments.c7
-rw-r--r--contrib/elftoolchain/elfcopy/symbols.c8
-rw-r--r--contrib/elftoolchain/elfdump/elfdump.c702
-rw-r--r--contrib/elftoolchain/libdwarf/libdwarf_abbrev.c6
-rw-r--r--contrib/elftoolchain/libdwarf/libdwarf_elf_init.c102
-rw-r--r--contrib/elftoolchain/libelf/_libelf_config.h2
-rw-r--r--contrib/elftoolchain/libelf/elf_data.c6
-rw-r--r--contrib/elftoolchain/libelf/libelf_ar.c4
-rw-r--r--contrib/elftoolchain/libelf/libelf_convert.m42
-rw-r--r--contrib/elftoolchain/libelftc/Makefile4
-rw-r--r--contrib/elftoolchain/libelftc/elftc_reloc_type_str.372
-rw-r--r--contrib/elftoolchain/libelftc/elftc_reloc_type_str.c684
-rw-r--r--contrib/elftoolchain/libelftc/libelftc.h3
-rw-r--r--contrib/elftoolchain/libelftc/libelftc_dem_arm.c6
-rw-r--r--contrib/elftoolchain/libelftc/libelftc_dem_gnu2.c10
-rw-r--r--contrib/elftoolchain/libelftc/libelftc_dem_gnu3.c32
-rwxr-xr-xcontrib/elftoolchain/libelftc/make-toolchain-version26
-rw-r--r--contrib/elftoolchain/libpe/libpe_section.c4
-rw-r--r--contrib/elftoolchain/libpe/pe.h5
-rw-r--r--contrib/elftoolchain/nm/nm.c9
-rw-r--r--contrib/elftoolchain/readelf/readelf.c611
-rw-r--r--contrib/elftoolchain/size/size.c27
-rw-r--r--contrib/elftoolchain/strings/strings.c4
34 files changed, 1288 insertions, 1238 deletions
diff --git a/contrib/elftoolchain/addr2line/addr2line.c b/contrib/elftoolchain/addr2line/addr2line.c
index 3cd8cb5..55f450d 100644
--- a/contrib/elftoolchain/addr2line/addr2line.c
+++ b/contrib/elftoolchain/addr2line/addr2line.c
@@ -40,7 +40,7 @@
#include "uthash.h"
#include "_elftc.h"
-ELFTC_VCSID("$Id: addr2line.c 3273 2015-12-11 21:38:57Z kaiwang27 $");
+ELFTC_VCSID("$Id: addr2line.c 3446 2016-05-03 01:31:17Z emaste $");
struct Func {
char *name;
@@ -284,7 +284,7 @@ collect_func(Dwarf_Debug dbg, Dwarf_Die die, struct Func *parent, struct CU *cu)
&de) == DW_DLV_OK)
goto add_func;
- /* Skip if no name assoicated with this DIE. */
+ /* Skip if no name associated with this DIE. */
goto cont_search;
add_func:
diff --git a/contrib/elftoolchain/brandelf/brandelf.c b/contrib/elftoolchain/brandelf/brandelf.c
index 22166f7..7cc93f0 100644
--- a/contrib/elftoolchain/brandelf/brandelf.c
+++ b/contrib/elftoolchain/brandelf/brandelf.c
@@ -44,7 +44,7 @@
#include "_elftc.h"
-ELFTC_VCSID("$Id: brandelf.c 3354 2016-01-18 21:50:15Z jkoshy $");
+ELFTC_VCSID("$Id: brandelf.c 3440 2016-04-07 14:51:47Z emaste $");
static int elftype(const char *);
static const char *iselftype(int);
@@ -62,6 +62,7 @@ static struct ELFtypes elftypes[] = {
{ "AIX", ELFOSABI_AIX },
{ "ARM", ELFOSABI_ARM },
{ "AROS", ELFOSABI_AROS },
+ { "CloudABI", ELFOSABI_CLOUDABI },
{ "FreeBSD", ELFOSABI_FREEBSD },
{ "GNU", ELFOSABI_GNU },
{ "HP/UX", ELFOSABI_HPUX},
diff --git a/contrib/elftoolchain/common/_elftc.h b/contrib/elftoolchain/common/_elftc.h
index 94272ef..38a4356 100644
--- a/contrib/elftoolchain/common/_elftc.h
+++ b/contrib/elftoolchain/common/_elftc.h
@@ -23,11 +23,11 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: _elftc.h 3244 2015-08-31 19:53:08Z emaste $
+ * $Id: _elftc.h 3446 2016-05-03 01:31:17Z emaste $
*/
/**
- ** Miscellanous definitions needed by multiple components.
+ ** Miscellaneous definitions needed by multiple components.
**/
#ifndef _ELFTC_H
diff --git a/contrib/elftoolchain/common/elfdefinitions.h b/contrib/elftoolchain/common/elfdefinitions.h
index fa6132d..ec22528 100644
--- a/contrib/elftoolchain/common/elfdefinitions.h
+++ b/contrib/elftoolchain/common/elfdefinitions.h
@@ -23,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: elfdefinitions.h 3392 2016-02-05 19:51:22Z emaste $
+ * $Id: elfdefinitions.h 3455 2016-05-09 13:47:29Z emaste $
*/
/*
@@ -184,6 +184,10 @@ _ELF_DEFINE_DT(DT_ADDRRNGLO, 0x6FFFFE00UL, \
"start of range using the d_ptr field") \
_ELF_DEFINE_DT(DT_GNU_HASH, 0x6FFFFEF5UL, \
"GNU style hash tables") \
+_ELF_DEFINE_DT(DT_TLSDESC_PLT, 0x6FFFFEF6UL, \
+ "location of PLT entry for TLS descriptor resolver calls") \
+_ELF_DEFINE_DT(DT_TLSDESC_GOT, 0x6FFFFEF7UL, \
+ "location of GOT entry used by TLS descriptor resolver PLT entry") \
_ELF_DEFINE_DT(DT_GNU_CONFLICT, 0x6FFFFEF8UL, \
"address of conflict section") \
_ELF_DEFINE_DT(DT_GNU_LIBLIST, 0x6FFFFEF9UL, \
@@ -269,7 +273,7 @@ _ELF_DEFINE_DT(DT_MIPS_DELTA_RELOC, 0x7000001BUL, \
_ELF_DEFINE_DT(DT_MIPS_DELTA_RELOC_NO, 0x7000001CUL, \
"number of entries in DT_MIPS_DELTA_RELOC") \
_ELF_DEFINE_DT(DT_MIPS_DELTA_SYM, 0x7000001DUL, \
- "Delta symbols refered by Delta relocations") \
+ "Delta symbols referred by Delta relocations") \
_ELF_DEFINE_DT(DT_MIPS_DELTA_SYM_NO, 0x7000001EUL, \
"number of entries in DT_MIPS_DELTA_SYM") \
_ELF_DEFINE_DT(DT_MIPS_DELTA_CLASSSYM, 0x70000020UL, \
@@ -540,6 +544,7 @@ _ELF_DEFINE_EABI(ELFOSABI_NSK, 14, \
_ELF_DEFINE_EABI(ELFOSABI_AROS, 15, "Amiga Research OS") \
_ELF_DEFINE_EABI(ELFOSABI_FENIXOS, 16, \
"The FenixOS highly scalable multi-core OS") \
+_ELF_DEFINE_EABI(ELFOSABI_CLOUDABI, 17, "Nuxi CloudABI") \
_ELF_DEFINE_EABI(ELFOSABI_ARM_AEABI, 64, \
"ARM specific symbol versioning extensions") \
_ELF_DEFINE_EABI(ELFOSABI_ARM, 97, "ARM ABI") \
@@ -1193,7 +1198,7 @@ _ELF_DEFINE_SHT(SHT_MIPS_ABIFLAGS, 0x7000002AUL, \
"ABI flags") \
_ELF_DEFINE_SHT(SHT_SPARC_GOTDATA, 0x70000000UL, \
"SPARC-specific data") \
-_ELF_DEFINE_SHT(SHT_AMD64_UNWIND, 0x70000001UL, \
+_ELF_DEFINE_SHT(SHT_X86_64_UNWIND, 0x70000001UL, \
"unwind tables for the AMD64") \
_ELF_DEFINE_SHT(SHT_ORDERED, 0x7FFFFFFFUL, \
"sort entries in the section") \
@@ -1212,6 +1217,7 @@ enum {
};
/* Aliases for section types. */
+#define SHT_AMD64_UNWIND SHT_X86_64_UNWIND
#define SHT_GNU_verdef SHT_SUNW_verdef
#define SHT_GNU_verneed SHT_SUNW_verneed
#define SHT_GNU_versym SHT_SUNW_versym
@@ -1255,6 +1261,7 @@ _ELF_DEFINE_STT(STT_FILE, 4, "source file") \
_ELF_DEFINE_STT(STT_COMMON, 5, "uninitialized common block") \
_ELF_DEFINE_STT(STT_TLS, 6, "thread local storage") \
_ELF_DEFINE_STT(STT_LOOS, 10, "start of OS-specific types") \
+_ELF_DEFINE_STT(STT_GNU_IFUNC, 10, "indirect function") \
_ELF_DEFINE_STT(STT_HIOS, 12, "end of OS-specific types") \
_ELF_DEFINE_STT(STT_LOPROC, 13, \
"start of processor-specific types") \
@@ -1402,10 +1409,37 @@ _ELF_DEFINE_RELOC(R_386_RELATIVE, 8) \
_ELF_DEFINE_RELOC(R_386_GOTOFF, 9) \
_ELF_DEFINE_RELOC(R_386_GOTPC, 10) \
_ELF_DEFINE_RELOC(R_386_32PLT, 11) \
+_ELF_DEFINE_RELOC(R_386_TLS_TPOFF, 14) \
+_ELF_DEFINE_RELOC(R_386_TLS_IE, 15) \
+_ELF_DEFINE_RELOC(R_386_TLS_GOTIE, 16) \
+_ELF_DEFINE_RELOC(R_386_TLS_LE, 17) \
+_ELF_DEFINE_RELOC(R_386_TLS_GD, 18) \
+_ELF_DEFINE_RELOC(R_386_TLS_LDM, 19) \
_ELF_DEFINE_RELOC(R_386_16, 20) \
_ELF_DEFINE_RELOC(R_386_PC16, 21) \
_ELF_DEFINE_RELOC(R_386_8, 22) \
-_ELF_DEFINE_RELOC(R_386_PC8, 23)
+_ELF_DEFINE_RELOC(R_386_PC8, 23) \
+_ELF_DEFINE_RELOC(R_386_TLS_GD_32, 24) \
+_ELF_DEFINE_RELOC(R_386_TLS_GD_PUSH, 25) \
+_ELF_DEFINE_RELOC(R_386_TLS_GD_CALL, 26) \
+_ELF_DEFINE_RELOC(R_386_TLS_GD_POP, 27) \
+_ELF_DEFINE_RELOC(R_386_TLS_LDM_32, 28) \
+_ELF_DEFINE_RELOC(R_386_TLS_LDM_PUSH, 29) \
+_ELF_DEFINE_RELOC(R_386_TLS_LDM_CALL, 30) \
+_ELF_DEFINE_RELOC(R_386_TLS_LDM_POP, 31) \
+_ELF_DEFINE_RELOC(R_386_TLS_LDO_32, 32) \
+_ELF_DEFINE_RELOC(R_386_TLS_IE_32, 33) \
+_ELF_DEFINE_RELOC(R_386_TLS_LE_32, 34) \
+_ELF_DEFINE_RELOC(R_386_TLS_DTPMOD32, 35) \
+_ELF_DEFINE_RELOC(R_386_TLS_DTPOFF32, 36) \
+_ELF_DEFINE_RELOC(R_386_TLS_TPOFF32, 37) \
+_ELF_DEFINE_RELOC(R_386_SIZE32, 38) \
+_ELF_DEFINE_RELOC(R_386_TLS_GOTDESC, 39) \
+_ELF_DEFINE_RELOC(R_386_TLS_DESC_CALL, 40) \
+_ELF_DEFINE_RELOC(R_386_TLS_DESC, 41) \
+_ELF_DEFINE_RELOC(R_386_IRELATIVE, 42) \
+_ELF_DEFINE_RELOC(R_386_GOT32X, 43)
+
/*
*/
@@ -1795,11 +1829,18 @@ _ELF_DEFINE_RELOC(R_MIPS_GOT16, 9) \
_ELF_DEFINE_RELOC(R_MIPS_PC16, 10) \
_ELF_DEFINE_RELOC(R_MIPS_CALL16, 11) \
_ELF_DEFINE_RELOC(R_MIPS_GPREL32, 12) \
+_ELF_DEFINE_RELOC(R_MIPS_SHIFT5, 16) \
+_ELF_DEFINE_RELOC(R_MIPS_SHIFT6, 17) \
_ELF_DEFINE_RELOC(R_MIPS_64, 18) \
-_ELF_DEFINE_RELOC(R_MIPS_GOTHI16, 21) \
-_ELF_DEFINE_RELOC(R_MIPS_GOTLO16, 22) \
+_ELF_DEFINE_RELOC(R_MIPS_GOT_DISP, 19) \
+_ELF_DEFINE_RELOC(R_MIPS_GOT_PAGE, 20) \
+_ELF_DEFINE_RELOC(R_MIPS_GOT_OFST, 21) \
+_ELF_DEFINE_RELOC(R_MIPS_GOT_HI16, 22) \
+_ELF_DEFINE_RELOC(R_MIPS_GOT_LO16, 23) \
+_ELF_DEFINE_RELOC(R_MIPS_SUB, 24) \
_ELF_DEFINE_RELOC(R_MIPS_CALLHI16, 30) \
_ELF_DEFINE_RELOC(R_MIPS_CALLLO16, 31) \
+_ELF_DEFINE_RELOC(R_MIPS_JALR, 37) \
_ELF_DEFINE_RELOC(R_MIPS_TLS_DTPMOD32, 38) \
_ELF_DEFINE_RELOC(R_MIPS_TLS_DTPREL32, 39) \
_ELF_DEFINE_RELOC(R_MIPS_TLS_DTPMOD64, 40) \
@@ -2095,6 +2136,7 @@ _ELF_DEFINE_RELOC(R_SPARC_PC_HM10, 38) \
_ELF_DEFINE_RELOC(R_SPARC_PC_LM22, 39) \
_ELF_DEFINE_RELOC(R_SPARC_WDISP16, 40) \
_ELF_DEFINE_RELOC(R_SPARC_WDISP19, 41) \
+_ELF_DEFINE_RELOC(R_SPARC_GLOB_JMP, 42) \
_ELF_DEFINE_RELOC(R_SPARC_7, 43) \
_ELF_DEFINE_RELOC(R_SPARC_5, 44) \
_ELF_DEFINE_RELOC(R_SPARC_6, 45) \
@@ -2108,6 +2150,30 @@ _ELF_DEFINE_RELOC(R_SPARC_L44, 52) \
_ELF_DEFINE_RELOC(R_SPARC_REGISTER, 53) \
_ELF_DEFINE_RELOC(R_SPARC_UA64, 54) \
_ELF_DEFINE_RELOC(R_SPARC_UA16, 55) \
+_ELF_DEFINE_RELOC(R_SPARC_TLS_GD_HI22, 56) \
+_ELF_DEFINE_RELOC(R_SPARC_TLS_GD_LO10, 57) \
+_ELF_DEFINE_RELOC(R_SPARC_TLS_GD_ADD, 58) \
+_ELF_DEFINE_RELOC(R_SPARC_TLS_GD_CALL, 59) \
+_ELF_DEFINE_RELOC(R_SPARC_TLS_LDM_HI22, 60) \
+_ELF_DEFINE_RELOC(R_SPARC_TLS_LDM_LO10, 61) \
+_ELF_DEFINE_RELOC(R_SPARC_TLS_LDM_ADD, 62) \
+_ELF_DEFINE_RELOC(R_SPARC_TLS_LDM_CALL, 63) \
+_ELF_DEFINE_RELOC(R_SPARC_TLS_LDO_HIX22, 64) \
+_ELF_DEFINE_RELOC(R_SPARC_TLS_LDO_LOX10, 65) \
+_ELF_DEFINE_RELOC(R_SPARC_TLS_LDO_ADD, 66) \
+_ELF_DEFINE_RELOC(R_SPARC_TLS_IE_HI22, 67) \
+_ELF_DEFINE_RELOC(R_SPARC_TLS_IE_LO10, 68) \
+_ELF_DEFINE_RELOC(R_SPARC_TLS_IE_LD, 69) \
+_ELF_DEFINE_RELOC(R_SPARC_TLS_IE_LDX, 70) \
+_ELF_DEFINE_RELOC(R_SPARC_TLS_IE_ADD, 71) \
+_ELF_DEFINE_RELOC(R_SPARC_TLS_LE_HIX22, 72) \
+_ELF_DEFINE_RELOC(R_SPARC_TLS_LE_LOX10, 73) \
+_ELF_DEFINE_RELOC(R_SPARC_TLS_DTPMOD32, 74) \
+_ELF_DEFINE_RELOC(R_SPARC_TLS_DTPMOD64, 75) \
+_ELF_DEFINE_RELOC(R_SPARC_TLS_DTPOFF32, 76) \
+_ELF_DEFINE_RELOC(R_SPARC_TLS_DTPOFF64, 77) \
+_ELF_DEFINE_RELOC(R_SPARC_TLS_TPOFF32, 78) \
+_ELF_DEFINE_RELOC(R_SPARC_TLS_TPOFF64, 79) \
_ELF_DEFINE_RELOC(R_SPARC_GOTDATA_HIX22, 80) \
_ELF_DEFINE_RELOC(R_SPARC_GOTDATA_LOX10, 81) \
_ELF_DEFINE_RELOC(R_SPARC_GOTDATA_OP_HIX22, 82) \
@@ -2153,7 +2219,10 @@ _ELF_DEFINE_RELOC(R_X86_64_SIZE64, 33) \
_ELF_DEFINE_RELOC(R_X86_64_GOTPC32_TLSDESC, 34) \
_ELF_DEFINE_RELOC(R_X86_64_TLSDESC_CALL, 35) \
_ELF_DEFINE_RELOC(R_X86_64_TLSDESC, 36) \
-_ELF_DEFINE_RELOC(R_X86_64_IRELATIVE, 37)
+_ELF_DEFINE_RELOC(R_X86_64_IRELATIVE, 37) \
+_ELF_DEFINE_RELOC(R_X86_64_RELATIVE64, 38) \
+_ELF_DEFINE_RELOC(R_X86_64_GOTPCRELX, 41) \
+_ELF_DEFINE_RELOC(R_X86_64_REX_GOTPCRELX, 42)
#define _ELF_DEFINE_RELOCATIONS() \
_ELF_DEFINE_386_RELOCATIONS() \
@@ -2424,7 +2493,7 @@ _ELF_DEFINE_ODK(ODK_HWOR, 8, "hardware OR patch applied") \
_ELF_DEFINE_ODK(ODK_GP_GROUP, 9, \
"GP group to use for text/data sections") \
_ELF_DEFINE_ODK(ODK_IDENT, 10, "ID information") \
-_ELF_DEFINE_ODK(ODK_PAGESIZE, 11, "page size infomation")
+_ELF_DEFINE_ODK(ODK_PAGESIZE, 11, "page size information")
#undef _ELF_DEFINE_ODK
#define _ELF_DEFINE_ODK(N, V, DESCR) N = V ,
diff --git a/contrib/elftoolchain/cxxfilt/cxxfilt.c b/contrib/elftoolchain/cxxfilt/cxxfilt.c
index 9318c64..c6d737a 100644
--- a/contrib/elftoolchain/cxxfilt/cxxfilt.c
+++ b/contrib/elftoolchain/cxxfilt/cxxfilt.c
@@ -35,7 +35,7 @@
#include "_elftc.h"
-ELFTC_VCSID("$Id: cxxfilt.c 3356 2016-01-22 22:31:38Z jkoshy $");
+ELFTC_VCSID("$Id: cxxfilt.c 3454 2016-05-07 17:11:05Z kaiwang27 $");
#define STRBUFSZ 8192
@@ -112,35 +112,18 @@ find_format(const char *fstr)
}
static char *
-demangle(char *name, int strict, size_t *pos)
+demangle(char *name)
{
static char dem[STRBUFSZ];
- char nb[STRBUFSZ];
- size_t p, t;
- if (stripus && *name == '_') {
- strncpy(nb, name + 1, sizeof(nb) - 1);
- t = 1;
- } else {
- strncpy(nb, name, sizeof(nb) - 1);
- t = 0;
- }
- nb[sizeof(nb) - 1] = '\0';
-
- p = strlen(nb);
- if (p == 0)
- return NULL;
-
- while (elftc_demangle(nb, dem, sizeof(dem), (unsigned) format) < 0) {
- if (!strict && p > 1) {
- nb[--p] = '\0';
- continue;
- } else
- return (NULL);
- }
+ if (stripus && *name == '_')
+ name++;
+
+ if (strlen(name) == 0)
+ return (NULL);
- if (pos != NULL)
- *pos = t ? p + 1 : p;
+ if (elftc_demangle(name, dem, sizeof(dem), (unsigned) format) < 0)
+ return (NULL);
return (dem);
}
@@ -149,7 +132,7 @@ int
main(int argc, char **argv)
{
char *dem, buf[STRBUFSZ];
- size_t i, p, s;
+ size_t p;
int c, n, opt;
while ((opt = getopt_long(argc, argv, "_nps:V", longopts, NULL)) !=
@@ -184,8 +167,8 @@ main(int argc, char **argv)
if (*argv != NULL) {
for (n = 0; n < argc; n++) {
- if ((dem = demangle(argv[n], 1, NULL)) == NULL)
- fprintf(stderr, "Failed: %s\n", argv[n]);
+ if ((dem = demangle(argv[n])) == NULL)
+ printf("%s\n", argv[n]);
else
printf("%s\n", dem);
}
@@ -193,23 +176,18 @@ main(int argc, char **argv)
p = 0;
for (;;) {
c = fgetc(stdin);
- if (c == EOF || !isprint(c) || strchr(" \t\n", c)) {
+ if (c == EOF || !(isalnum(c) || strchr(".$_", c))) {
if (p > 0) {
buf[p] = '\0';
- if ((dem = demangle(buf, 0, &s)) ==
- NULL)
+ if ((dem = demangle(buf)) == NULL)
printf("%s", buf);
- else {
+ else
printf("%s", dem);
- for (i = s; i < p; i++)
- putchar(buf[i]);
- }
p = 0;
}
if (c == EOF)
break;
- if (isprint(c) || strchr(" \t\n", c))
- putchar(c);
+ putchar(c);
} else {
if ((size_t) p >= sizeof(buf) - 1)
warnx("buffer overflowed");
diff --git a/contrib/elftoolchain/elfcopy/ascii.c b/contrib/elftoolchain/elfcopy/ascii.c
index cad4eb8..fb1edb3 100644
--- a/contrib/elftoolchain/elfcopy/ascii.c
+++ b/contrib/elftoolchain/elfcopy/ascii.c
@@ -36,7 +36,7 @@
#include "elfcopy.h"
-ELFTC_VCSID("$Id: ascii.c 3177 2015-03-30 18:19:41Z emaste $");
+ELFTC_VCSID("$Id: ascii.c 3446 2016-05-03 01:31:17Z emaste $");
static void append_data(struct section *s, const void *buf, size_t sz);
static char hex_digit(uint8_t n);
@@ -187,7 +187,7 @@ create_srec(struct elfcopy *ecp, int ifd, int ofd, const char *ofn)
if (elferr != 0)
warnx("elf_nextscn failed: %s", elf_errmsg(elferr));
- /* Generate S{7,8,9} end of block recrod. */
+ /* Generate S{7,8,9} end of block record. */
if (gelf_getehdr(e, &eh) == NULL)
errx(EXIT_FAILURE, "gelf_getehdr() failed: %s",
elf_errmsg(-1));
diff --git a/contrib/elftoolchain/elfcopy/binary.c b/contrib/elftoolchain/elfcopy/binary.c
index 476e6c7..ad86a65 100644
--- a/contrib/elftoolchain/elfcopy/binary.c
+++ b/contrib/elftoolchain/elfcopy/binary.c
@@ -36,7 +36,7 @@
#include "elfcopy.h"
-ELFTC_VCSID("$Id: binary.c 3270 2015-12-11 18:48:56Z emaste $");
+ELFTC_VCSID("$Id: binary.c 3445 2016-04-20 19:08:30Z emaste $");
/*
* Convert ELF object to `binary'. Sections with SHF_ALLOC flag set
diff --git a/contrib/elftoolchain/elfcopy/elfcopy.1 b/contrib/elftoolchain/elfcopy/elfcopy.1
index b7b0ce4..672885a 100644
--- a/contrib/elftoolchain/elfcopy/elfcopy.1
+++ b/contrib/elftoolchain/elfcopy/elfcopy.1
@@ -21,9 +21,9 @@
.\" out of the use of this software, even if advised of the possibility of
.\" such damage.
.\"
-.\" $Id: elfcopy.1 3381 2016-01-30 19:39:47Z jkoshy $
+.\" $Id: elfcopy.1 3426 2016-03-05 13:32:28Z emaste $
.\"
-.Dd January 29, 2016
+.Dd March 5, 2016
.Os
.Dt ELFCOPY 1
.Sh NAME
@@ -67,7 +67,10 @@
.Op Fl -change-section-vma Ar section Ns {+|-|=} Ns Ar val
.Op Fl -extract-dwo
.Op Fl -gap-fill Ns = Ns Ar val
+.Op Fl -globalize-symbol Ns = Ns ar symbolname
+.Op Fl -globalize-symbols Ns = Ns Ar filename
.Op Fl -localize-hidden
+.Op Fl -localize-symbols Ns = Ns Ar filename
.Op Fl -no-adjust-warnings | Fl -no-change-warnings
.Op Fl -only-keep-debug
.Op Fl -pad-to Ns = Ns Ar address
@@ -239,9 +242,21 @@ Copy only .dwo debug sections to the output file.
Fill the gaps between sections with the byte value specified by
the argument
.Ar val .
+.It Fl -globalize-symbol Ns = Ns Ar symbolname
+Make the symbol named by argument
+.Ar symbolname
+global, so that it is visible outside of the file in which it is defined.
+.It Fl -globalize-symbols Ns = Ns Ar filename
+Make each symbol listed in the file specified by
+.Ar filename
+global.
.It Fl -localize-hidden
Make all hidden symbols local to the output file.
This includes symbols with internal visiblity.
+.It Fl -localize-symbols Ns = Ns Ar filename
+Make each symbol listed in the file specified by
+.Ar filename
+local to the output file.
.It Fl -no-adjust-warnings | Fl -no-change-warnings
Do not issue a warning if the section specified by the options
.Fl -change-section-address ,
diff --git a/contrib/elftoolchain/elfcopy/elfcopy.h b/contrib/elftoolchain/elfcopy/elfcopy.h
index f88aaf4..5593a9a 100644
--- a/contrib/elftoolchain/elfcopy/elfcopy.h
+++ b/contrib/elftoolchain/elfcopy/elfcopy.h
@@ -23,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: elfcopy.h 3310 2016-01-10 09:10:54Z kaiwang27 $
+ * $Id: elfcopy.h 3446 2016-05-03 01:31:17Z emaste $
*/
#include <sys/queue.h>
@@ -178,7 +178,7 @@ struct elfcopy {
Elftc_Bfd_Target_Flavor otf; /* flavour of output object */
const char *otgt; /* output target name */
int oec; /* elfclass of output object */
- unsigned char oed; /* endianess of output object */
+ unsigned char oed; /* endianness of output object */
int oem; /* EM_XXX of output object */
int abi; /* OSABI of output object */
Elf *ein; /* ELF descriptor of input object */
@@ -238,7 +238,7 @@ struct elfcopy {
uint64_t *secndx; /* section index map. */
uint64_t *symndx; /* symbol index map. */
unsigned char *v_rel; /* symbols needed by relocation. */
- unsigned char *v_grp; /* symbols refered by section group. */
+ unsigned char *v_grp; /* symbols referred by section group. */
unsigned char *v_secsym; /* sections with section symbol. */
STAILQ_HEAD(, segment) v_seg; /* list of segments. */
STAILQ_HEAD(, sec_action) v_sac;/* list of section operations. */
diff --git a/contrib/elftoolchain/elfcopy/main.c b/contrib/elftoolchain/elfcopy/main.c
index 31d34a8..ebc0c92 100644
--- a/contrib/elftoolchain/elfcopy/main.c
+++ b/contrib/elftoolchain/elfcopy/main.c
@@ -39,7 +39,7 @@
#include "elfcopy.h"
-ELFTC_VCSID("$Id: main.c 3399 2016-02-12 18:07:56Z emaste $");
+ELFTC_VCSID("$Id: main.c 3446 2016-05-03 01:31:17Z emaste $");
enum options
{
@@ -209,6 +209,7 @@ static struct {
{"openbsd", ELFOSABI_OPENBSD},
{"openvms", ELFOSABI_OPENVMS},
{"nsk", ELFOSABI_NSK},
+ {"cloudabi", ELFOSABI_CLOUDABI},
{"arm", ELFOSABI_ARM},
{"standalone", ELFOSABI_STANDALONE},
{NULL, 0}
@@ -235,7 +236,7 @@ static void strip_main(struct elfcopy *ecp, int argc, char **argv);
static void strip_usage(void);
/*
- * An ELF object usually has a sturcture described by the
+ * An ELF object usually has a structure described by the
* diagram below.
* _____________
* | |
@@ -1446,7 +1447,7 @@ Usage: %s [options] infile [outfile]\n\
sections.\n\
--only-keep-debug Copy only debugging information.\n\
--output-target=FORMAT Use the specified format for the output.\n\
- --pad-to=ADDRESS Pad the output object upto the given address.\n\
+ --pad-to=ADDRESS Pad the output object up to the given address.\n\
--prefix-alloc-sections=STRING\n\
Prefix the section names of all the allocated\n\
sections with STRING.\n\
diff --git a/contrib/elftoolchain/elfcopy/sections.c b/contrib/elftoolchain/elfcopy/sections.c
index 1434138..298fce4 100644
--- a/contrib/elftoolchain/elfcopy/sections.c
+++ b/contrib/elftoolchain/elfcopy/sections.c
@@ -34,7 +34,7 @@
#include "elfcopy.h"
-ELFTC_VCSID("$Id: sections.c 3346 2016-01-17 20:09:15Z kaiwang27 $");
+ELFTC_VCSID("$Id: sections.c 3443 2016-04-15 18:57:54Z kaiwang27 $");
static void add_gnu_debuglink(struct elfcopy *ecp);
static uint32_t calc_crc32(const char *p, size_t len, uint32_t crc);
diff --git a/contrib/elftoolchain/elfcopy/segments.c b/contrib/elftoolchain/elfcopy/segments.c
index 78782a4..9a26bba 100644
--- a/contrib/elftoolchain/elfcopy/segments.c
+++ b/contrib/elftoolchain/elfcopy/segments.c
@@ -34,7 +34,7 @@
#include "elfcopy.h"
-ELFTC_VCSID("$Id: segments.c 3397 2016-02-12 14:35:19Z emaste $");
+ELFTC_VCSID("$Id: segments.c 3449 2016-05-03 13:59:29Z emaste $");
static void insert_to_inseg_list(struct segment *seg, struct section *sec);
@@ -468,8 +468,7 @@ setup_phdr(struct elfcopy *ecp)
{
struct segment *seg;
GElf_Phdr iphdr;
- size_t iphnum;
- int i;
+ size_t iphnum, i;
if (elf_getphnum(ecp->ein, &iphnum) == 0)
errx(EXIT_FAILURE, "elf_getphnum failed: %s",
@@ -485,7 +484,7 @@ setup_phdr(struct elfcopy *ecp)
return;
}
- for (i = 0; (size_t)i < iphnum; i++) {
+ for (i = 0; i < iphnum; i++) {
if (gelf_getphdr(ecp->ein, i, &iphdr) != &iphdr)
errx(EXIT_FAILURE, "gelf_getphdr failed: %s",
elf_errmsg(-1));
diff --git a/contrib/elftoolchain/elfcopy/symbols.c b/contrib/elftoolchain/elfcopy/symbols.c
index 4423ca2..299ae56 100644
--- a/contrib/elftoolchain/elfcopy/symbols.c
+++ b/contrib/elftoolchain/elfcopy/symbols.c
@@ -34,7 +34,7 @@
#include "elfcopy.h"
-ELFTC_VCSID("$Id: symbols.c 3376 2016-01-26 18:41:39Z emaste $");
+ELFTC_VCSID("$Id: symbols.c 3446 2016-05-03 01:31:17Z emaste $");
/* Backwards compatibility for systems with older ELF definitions. */
#ifndef STB_GNU_UNIQUE
@@ -168,7 +168,7 @@ is_needed_symbol(struct elfcopy *ecp, int i, GElf_Sym *s)
if (BIT_ISSET(ecp->v_rel, i))
return (1);
- /* Symbols refered by COMDAT sections are needed. */
+ /* Symbols referred by COMDAT sections are needed. */
if (BIT_ISSET(ecp->v_grp, i))
return (1);
@@ -258,7 +258,7 @@ is_remove_symbol(struct elfcopy *ecp, size_t sc, int i, GElf_Sym *s,
}
/*
- * Mark symbols refered by relocation entries.
+ * Mark symbols referred by relocation entries.
*/
static void
mark_reloc_symbols(struct elfcopy *ecp, size_t sc)
@@ -1165,7 +1165,7 @@ lookup_symop_list(struct elfcopy *ecp, const char *name, unsigned int op)
if ((s->op & op) == 0)
continue;
if (name == NULL || !strcmp(name, s->name))
- return (s);
+ return (s);
if ((ecp->flags & WILDCARD) == 0)
continue;
diff --git a/contrib/elftoolchain/elfdump/elfdump.c b/contrib/elftoolchain/elfdump/elfdump.c
index 334d285..cf27ea6 100644
--- a/contrib/elftoolchain/elfdump/elfdump.c
+++ b/contrib/elftoolchain/elfdump/elfdump.c
@@ -50,7 +50,7 @@
#include "_elftc.h"
-ELFTC_VCSID("$Id: elfdump.c 3391 2016-02-05 19:43:01Z emaste $");
+ELFTC_VCSID("$Id: elfdump.c 3474 2016-05-17 20:44:53Z emaste $");
#if defined(ELFTC_NEED_ELF_NOTE_DEFINITION)
#include "native-elf-format.h"
@@ -263,34 +263,99 @@ e_machines(unsigned int mach)
return (machdesc);
}
-static const char *e_types[] = {
- "ET_NONE", "ET_REL", "ET_EXEC", "ET_DYN", "ET_CORE"
-};
+static const char *
+elf_type_str(unsigned int type)
+{
+ static char s_type[32];
-static const char *ei_versions[] = {
- "EV_NONE", "EV_CURRENT"
-};
+ switch (type)
+ {
+ case ET_NONE: return "ET_NONE";
+ case ET_REL: return "ET_REL";
+ case ET_EXEC: return "ET_EXEC";
+ case ET_DYN: return "ET_DYN";
+ case ET_CORE: return "ET_CORE";
+ }
+ if (type >= ET_LOPROC)
+ snprintf(s_type, sizeof(s_type), "<proc: %#x>", type);
+ else if (type >= ET_LOOS && type <= ET_HIOS)
+ snprintf(s_type, sizeof(s_type), "<os: %#x>", type);
+ else
+ snprintf(s_type, sizeof(s_type), "<unknown: %#x", type);
+ return (s_type);
+}
-static const char *ei_classes[] = {
- "ELFCLASSNONE", "ELFCLASS32", "ELFCLASS64"
-};
+static const char *
+elf_version_str(unsigned int ver)
+{
+ static char s_ver[32];
-static const char *ei_data[] = {
- "ELFDATANONE", "ELFDATA2LSB", "ELFDATA2MSB"
-};
+ switch (ver) {
+ case EV_NONE: return "EV_NONE";
+ case EV_CURRENT: return "EV_CURRENT";
+ }
+ snprintf(s_ver, sizeof(s_ver), "<unknown: %#x>", ver);
+ return (s_ver);
+}
+
+static const char *
+elf_class_str(unsigned int class)
+{
+ static char s_class[32];
+
+ switch (class) {
+ case ELFCLASSNONE: return "ELFCLASSNONE";
+ case ELFCLASS32: return "ELFCLASS32";
+ case ELFCLASS64: return "ELFCLASS64";
+ }
+ snprintf(s_class, sizeof(s_class), "<unknown: %#x>", class);
+ return (s_class);
+}
+
+static const char *
+elf_data_str(unsigned int data)
+{
+ static char s_data[32];
+
+ switch (data) {
+ case ELFDATANONE: return "ELFDATANONE";
+ case ELFDATA2LSB: return "ELFDATA2LSB";
+ case ELFDATA2MSB: return "ELFDATA2MSB";
+ }
+ snprintf(s_data, sizeof(s_data), "<unknown: %#x>", data);
+ return (s_data);
+}
static const char *ei_abis[256] = {
"ELFOSABI_NONE", "ELFOSABI_HPUX", "ELFOSABI_NETBSD", "ELFOSABI_LINUX",
"ELFOSABI_HURD", "ELFOSABI_86OPEN", "ELFOSABI_SOLARIS", "ELFOSABI_AIX",
"ELFOSABI_IRIX", "ELFOSABI_FREEBSD", "ELFOSABI_TRU64",
"ELFOSABI_MODESTO", "ELFOSABI_OPENBSD",
+ [17] = "ELFOSABI_CLOUDABI",
[255] = "ELFOSABI_STANDALONE"
};
-static const char *p_types[] = {
- "PT_NULL", "PT_LOAD", "PT_DYNAMIC", "PT_INTERP", "PT_NOTE",
- "PT_SHLIB", "PT_PHDR", "PT_TLS"
-};
+static const char *
+elf_phdr_type_str(unsigned int type)
+{
+ static char s_type[32];
+
+ switch (type) {
+ case PT_NULL: return "PT_NULL";
+ case PT_LOAD: return "PT_LOAD";
+ case PT_DYNAMIC: return "PT_DYNAMIC";
+ case PT_INTERP: return "PT_INTERP";
+ case PT_NOTE: return "PT_NOTE";
+ case PT_SHLIB: return "PT_SHLIB";
+ case PT_PHDR: return "PT_PHDR";
+ case PT_TLS: return "PT_TLS";
+ case PT_GNU_EH_FRAME: return "PT_GNU_EH_FRAME";
+ case PT_GNU_STACK: return "PT_GNU_STACK";
+ case PT_GNU_RELRO: return "PT_GNU_RELRO";
+ }
+ snprintf(s_type, sizeof(s_type), "<unknown: %#x>", type);
+ return (s_type);
+}
static const char *p_flags[] = {
"", "PF_X", "PF_W", "PF_X|PF_W", "PF_R", "PF_X|PF_R", "PF_W|PF_R",
@@ -407,7 +472,8 @@ sh_types(uint64_t mach, uint64_t sht) {
DEFINE_SHF(LINK_ORDER) \
DEFINE_SHF(OS_NONCONFORMING) \
DEFINE_SHF(GROUP) \
- DEFINE_SHF(TLS)
+ DEFINE_SHF(TLS) \
+ DEFINE_SHF(COMPRESSED)
#undef DEFINE_SHF
#define DEFINE_SHF(F) "SHF_" #F "|"
@@ -518,387 +584,6 @@ static unsigned char st_others[] = {
'D', 'I', 'H', 'P'
};
-static const char *
-r_type(unsigned int mach, unsigned int type)
-{
- switch(mach) {
- case EM_NONE: return "";
- case EM_386:
- case EM_IAMCU:
- switch(type) {
- case 0: return "R_386_NONE";
- case 1: return "R_386_32";
- case 2: return "R_386_PC32";
- case 3: return "R_386_GOT32";
- case 4: return "R_386_PLT32";
- case 5: return "R_386_COPY";
- case 6: return "R_386_GLOB_DAT";
- case 7: return "R_386_JUMP_SLOT";
- case 8: return "R_386_RELATIVE";
- case 9: return "R_386_GOTOFF";
- case 10: return "R_386_GOTPC";
- case 14: return "R_386_TLS_TPOFF";
- case 15: return "R_386_TLS_IE";
- case 16: return "R_386_TLS_GOTIE";
- case 17: return "R_386_TLS_LE";
- case 18: return "R_386_TLS_GD";
- case 19: return "R_386_TLS_LDM";
- case 24: return "R_386_TLS_GD_32";
- case 25: return "R_386_TLS_GD_PUSH";
- case 26: return "R_386_TLS_GD_CALL";
- case 27: return "R_386_TLS_GD_POP";
- case 28: return "R_386_TLS_LDM_32";
- case 29: return "R_386_TLS_LDM_PUSH";
- case 30: return "R_386_TLS_LDM_CALL";
- case 31: return "R_386_TLS_LDM_POP";
- case 32: return "R_386_TLS_LDO_32";
- case 33: return "R_386_TLS_IE_32";
- case 34: return "R_386_TLS_LE_32";
- case 35: return "R_386_TLS_DTPMOD32";
- case 36: return "R_386_TLS_DTPOFF32";
- case 37: return "R_386_TLS_TPOFF32";
- default: return "";
- }
- case EM_ARM:
- switch(type) {
- case 0: return "R_ARM_NONE";
- case 1: return "R_ARM_PC24";
- case 2: return "R_ARM_ABS32";
- case 3: return "R_ARM_REL32";
- case 4: return "R_ARM_PC13";
- case 5: return "R_ARM_ABS16";
- case 6: return "R_ARM_ABS12";
- case 7: return "R_ARM_THM_ABS5";
- case 8: return "R_ARM_ABS8";
- case 9: return "R_ARM_SBREL32";
- case 10: return "R_ARM_THM_PC22";
- case 11: return "R_ARM_THM_PC8";
- case 12: return "R_ARM_AMP_VCALL9";
- case 13: return "R_ARM_SWI24";
- case 14: return "R_ARM_THM_SWI8";
- case 15: return "R_ARM_XPC25";
- case 16: return "R_ARM_THM_XPC22";
- case 20: return "R_ARM_COPY";
- case 21: return "R_ARM_GLOB_DAT";
- case 22: return "R_ARM_JUMP_SLOT";
- case 23: return "R_ARM_RELATIVE";
- case 24: return "R_ARM_GOTOFF";
- case 25: return "R_ARM_GOTPC";
- case 26: return "R_ARM_GOT32";
- case 27: return "R_ARM_PLT32";
- case 100: return "R_ARM_GNU_VTENTRY";
- case 101: return "R_ARM_GNU_VTINHERIT";
- case 250: return "R_ARM_RSBREL32";
- case 251: return "R_ARM_THM_RPC22";
- case 252: return "R_ARM_RREL32";
- case 253: return "R_ARM_RABS32";
- case 254: return "R_ARM_RPC24";
- case 255: return "R_ARM_RBASE";
- default: return "";
- }
- case EM_IA_64:
- switch(type) {
- case 0: return "R_IA_64_NONE";
- case 33: return "R_IA_64_IMM14";
- case 34: return "R_IA_64_IMM22";
- case 35: return "R_IA_64_IMM64";
- case 36: return "R_IA_64_DIR32MSB";
- case 37: return "R_IA_64_DIR32LSB";
- case 38: return "R_IA_64_DIR64MSB";
- case 39: return "R_IA_64_DIR64LSB";
- case 42: return "R_IA_64_GPREL22";
- case 43: return "R_IA_64_GPREL64I";
- case 44: return "R_IA_64_GPREL32MSB";
- case 45: return "R_IA_64_GPREL32LSB";
- case 46: return "R_IA_64_GPREL64MSB";
- case 47: return "R_IA_64_GPREL64LSB";
- case 50: return "R_IA_64_LTOFF22";
- case 51: return "R_IA_64_LTOFF64I";
- case 58: return "R_IA_64_PLTOFF22";
- case 59: return "R_IA_64_PLTOFF64I";
- case 62: return "R_IA_64_PLTOFF64MSB";
- case 63: return "R_IA_64_PLTOFF64LSB";
- case 67: return "R_IA_64_FPTR64I";
- case 68: return "R_IA_64_FPTR32MSB";
- case 69: return "R_IA_64_FPTR32LSB";
- case 70: return "R_IA_64_FPTR64MSB";
- case 71: return "R_IA_64_FPTR64LSB";
- case 72: return "R_IA_64_PCREL60B";
- case 73: return "R_IA_64_PCREL21B";
- case 74: return "R_IA_64_PCREL21M";
- case 75: return "R_IA_64_PCREL21F";
- case 76: return "R_IA_64_PCREL32MSB";
- case 77: return "R_IA_64_PCREL32LSB";
- case 78: return "R_IA_64_PCREL64MSB";
- case 79: return "R_IA_64_PCREL64LSB";
- case 82: return "R_IA_64_LTOFF_FPTR22";
- case 83: return "R_IA_64_LTOFF_FPTR64I";
- case 84: return "R_IA_64_LTOFF_FPTR32MSB";
- case 85: return "R_IA_64_LTOFF_FPTR32LSB";
- case 86: return "R_IA_64_LTOFF_FPTR64MSB";
- case 87: return "R_IA_64_LTOFF_FPTR64LSB";
- case 92: return "R_IA_64_SEGREL32MSB";
- case 93: return "R_IA_64_SEGREL32LSB";
- case 94: return "R_IA_64_SEGREL64MSB";
- case 95: return "R_IA_64_SEGREL64LSB";
- case 100: return "R_IA_64_SECREL32MSB";
- case 101: return "R_IA_64_SECREL32LSB";
- case 102: return "R_IA_64_SECREL64MSB";
- case 103: return "R_IA_64_SECREL64LSB";
- case 108: return "R_IA_64_REL32MSB";
- case 109: return "R_IA_64_REL32LSB";
- case 110: return "R_IA_64_REL64MSB";
- case 111: return "R_IA_64_REL64LSB";
- case 116: return "R_IA_64_LTV32MSB";
- case 117: return "R_IA_64_LTV32LSB";
- case 118: return "R_IA_64_LTV64MSB";
- case 119: return "R_IA_64_LTV64LSB";
- case 121: return "R_IA_64_PCREL21BI";
- case 122: return "R_IA_64_PCREL22";
- case 123: return "R_IA_64_PCREL64I";
- case 128: return "R_IA_64_IPLTMSB";
- case 129: return "R_IA_64_IPLTLSB";
- case 133: return "R_IA_64_SUB";
- case 134: return "R_IA_64_LTOFF22X";
- case 135: return "R_IA_64_LDXMOV";
- case 145: return "R_IA_64_TPREL14";
- case 146: return "R_IA_64_TPREL22";
- case 147: return "R_IA_64_TPREL64I";
- case 150: return "R_IA_64_TPREL64MSB";
- case 151: return "R_IA_64_TPREL64LSB";
- case 154: return "R_IA_64_LTOFF_TPREL22";
- case 166: return "R_IA_64_DTPMOD64MSB";
- case 167: return "R_IA_64_DTPMOD64LSB";
- case 170: return "R_IA_64_LTOFF_DTPMOD22";
- case 177: return "R_IA_64_DTPREL14";
- case 178: return "R_IA_64_DTPREL22";
- case 179: return "R_IA_64_DTPREL64I";
- case 180: return "R_IA_64_DTPREL32MSB";
- case 181: return "R_IA_64_DTPREL32LSB";
- case 182: return "R_IA_64_DTPREL64MSB";
- case 183: return "R_IA_64_DTPREL64LSB";
- case 186: return "R_IA_64_LTOFF_DTPREL22";
- default: return "";
- }
- case EM_MIPS:
- switch(type) {
- case 0: return "R_MIPS_NONE";
- case 1: return "R_MIPS_16";
- case 2: return "R_MIPS_32";
- case 3: return "R_MIPS_REL32";
- case 4: return "R_MIPS_26";
- case 5: return "R_MIPS_HI16";
- case 6: return "R_MIPS_LO16";
- case 7: return "R_MIPS_GPREL16";
- case 8: return "R_MIPS_LITERAL";
- case 9: return "R_MIPS_GOT16";
- case 10: return "R_MIPS_PC16";
- case 11: return "R_MIPS_CALL16";
- case 12: return "R_MIPS_GPREL32";
- case 21: return "R_MIPS_GOTHI16";
- case 22: return "R_MIPS_GOTLO16";
- case 30: return "R_MIPS_CALLHI16";
- case 31: return "R_MIPS_CALLLO16";
- default: return "";
- }
- case EM_PPC:
- switch(type) {
- case 0: return "R_PPC_NONE";
- case 1: return "R_PPC_ADDR32";
- case 2: return "R_PPC_ADDR24";
- case 3: return "R_PPC_ADDR16";
- case 4: return "R_PPC_ADDR16_LO";
- case 5: return "R_PPC_ADDR16_HI";
- case 6: return "R_PPC_ADDR16_HA";
- case 7: return "R_PPC_ADDR14";
- case 8: return "R_PPC_ADDR14_BRTAKEN";
- case 9: return "R_PPC_ADDR14_BRNTAKEN";
- case 10: return "R_PPC_REL24";
- case 11: return "R_PPC_REL14";
- case 12: return "R_PPC_REL14_BRTAKEN";
- case 13: return "R_PPC_REL14_BRNTAKEN";
- case 14: return "R_PPC_GOT16";
- case 15: return "R_PPC_GOT16_LO";
- case 16: return "R_PPC_GOT16_HI";
- case 17: return "R_PPC_GOT16_HA";
- case 18: return "R_PPC_PLTREL24";
- case 19: return "R_PPC_COPY";
- case 20: return "R_PPC_GLOB_DAT";
- case 21: return "R_PPC_JMP_SLOT";
- case 22: return "R_PPC_RELATIVE";
- case 23: return "R_PPC_LOCAL24PC";
- case 24: return "R_PPC_UADDR32";
- case 25: return "R_PPC_UADDR16";
- case 26: return "R_PPC_REL32";
- case 27: return "R_PPC_PLT32";
- case 28: return "R_PPC_PLTREL32";
- case 29: return "R_PPC_PLT16_LO";
- case 30: return "R_PPC_PLT16_HI";
- case 31: return "R_PPC_PLT16_HA";
- case 32: return "R_PPC_SDAREL16";
- case 33: return "R_PPC_SECTOFF";
- case 34: return "R_PPC_SECTOFF_LO";
- case 35: return "R_PPC_SECTOFF_HI";
- case 36: return "R_PPC_SECTOFF_HA";
- case 67: return "R_PPC_TLS";
- case 68: return "R_PPC_DTPMOD32";
- case 69: return "R_PPC_TPREL16";
- case 70: return "R_PPC_TPREL16_LO";
- case 71: return "R_PPC_TPREL16_HI";
- case 72: return "R_PPC_TPREL16_HA";
- case 73: return "R_PPC_TPREL32";
- case 74: return "R_PPC_DTPREL16";
- case 75: return "R_PPC_DTPREL16_LO";
- case 76: return "R_PPC_DTPREL16_HI";
- case 77: return "R_PPC_DTPREL16_HA";
- case 78: return "R_PPC_DTPREL32";
- case 79: return "R_PPC_GOT_TLSGD16";
- case 80: return "R_PPC_GOT_TLSGD16_LO";
- case 81: return "R_PPC_GOT_TLSGD16_HI";
- case 82: return "R_PPC_GOT_TLSGD16_HA";
- case 83: return "R_PPC_GOT_TLSLD16";
- case 84: return "R_PPC_GOT_TLSLD16_LO";
- case 85: return "R_PPC_GOT_TLSLD16_HI";
- case 86: return "R_PPC_GOT_TLSLD16_HA";
- case 87: return "R_PPC_GOT_TPREL16";
- case 88: return "R_PPC_GOT_TPREL16_LO";
- case 89: return "R_PPC_GOT_TPREL16_HI";
- case 90: return "R_PPC_GOT_TPREL16_HA";
- case 101: return "R_PPC_EMB_NADDR32";
- case 102: return "R_PPC_EMB_NADDR16";
- case 103: return "R_PPC_EMB_NADDR16_LO";
- case 104: return "R_PPC_EMB_NADDR16_HI";
- case 105: return "R_PPC_EMB_NADDR16_HA";
- case 106: return "R_PPC_EMB_SDAI16";
- case 107: return "R_PPC_EMB_SDA2I16";
- case 108: return "R_PPC_EMB_SDA2REL";
- case 109: return "R_PPC_EMB_SDA21";
- case 110: return "R_PPC_EMB_MRKREF";
- case 111: return "R_PPC_EMB_RELSEC16";
- case 112: return "R_PPC_EMB_RELST_LO";
- case 113: return "R_PPC_EMB_RELST_HI";
- case 114: return "R_PPC_EMB_RELST_HA";
- case 115: return "R_PPC_EMB_BIT_FLD";
- case 116: return "R_PPC_EMB_RELSDA";
- default: return "";
- }
- case EM_SPARC:
- case EM_SPARCV9:
- switch(type) {
- case 0: return "R_SPARC_NONE";
- case 1: return "R_SPARC_8";
- case 2: return "R_SPARC_16";
- case 3: return "R_SPARC_32";
- case 4: return "R_SPARC_DISP8";
- case 5: return "R_SPARC_DISP16";
- case 6: return "R_SPARC_DISP32";
- case 7: return "R_SPARC_WDISP30";
- case 8: return "R_SPARC_WDISP22";
- case 9: return "R_SPARC_HI22";
- case 10: return "R_SPARC_22";
- case 11: return "R_SPARC_13";
- case 12: return "R_SPARC_LO10";
- case 13: return "R_SPARC_GOT10";
- case 14: return "R_SPARC_GOT13";
- case 15: return "R_SPARC_GOT22";
- case 16: return "R_SPARC_PC10";
- case 17: return "R_SPARC_PC22";
- case 18: return "R_SPARC_WPLT30";
- case 19: return "R_SPARC_COPY";
- case 20: return "R_SPARC_GLOB_DAT";
- case 21: return "R_SPARC_JMP_SLOT";
- case 22: return "R_SPARC_RELATIVE";
- case 23: return "R_SPARC_UA32";
- case 24: return "R_SPARC_PLT32";
- case 25: return "R_SPARC_HIPLT22";
- case 26: return "R_SPARC_LOPLT10";
- case 27: return "R_SPARC_PCPLT32";
- case 28: return "R_SPARC_PCPLT22";
- case 29: return "R_SPARC_PCPLT10";
- case 30: return "R_SPARC_10";
- case 31: return "R_SPARC_11";
- case 32: return "R_SPARC_64";
- case 33: return "R_SPARC_OLO10";
- case 34: return "R_SPARC_HH22";
- case 35: return "R_SPARC_HM10";
- case 36: return "R_SPARC_LM22";
- case 37: return "R_SPARC_PC_HH22";
- case 38: return "R_SPARC_PC_HM10";
- case 39: return "R_SPARC_PC_LM22";
- case 40: return "R_SPARC_WDISP16";
- case 41: return "R_SPARC_WDISP19";
- case 42: return "R_SPARC_GLOB_JMP";
- case 43: return "R_SPARC_7";
- case 44: return "R_SPARC_5";
- case 45: return "R_SPARC_6";
- case 46: return "R_SPARC_DISP64";
- case 47: return "R_SPARC_PLT64";
- case 48: return "R_SPARC_HIX22";
- case 49: return "R_SPARC_LOX10";
- case 50: return "R_SPARC_H44";
- case 51: return "R_SPARC_M44";
- case 52: return "R_SPARC_L44";
- case 53: return "R_SPARC_REGISTER";
- case 54: return "R_SPARC_UA64";
- case 55: return "R_SPARC_UA16";
- case 56: return "R_SPARC_TLS_GD_HI22";
- case 57: return "R_SPARC_TLS_GD_LO10";
- case 58: return "R_SPARC_TLS_GD_ADD";
- case 59: return "R_SPARC_TLS_GD_CALL";
- case 60: return "R_SPARC_TLS_LDM_HI22";
- case 61: return "R_SPARC_TLS_LDM_LO10";
- case 62: return "R_SPARC_TLS_LDM_ADD";
- case 63: return "R_SPARC_TLS_LDM_CALL";
- case 64: return "R_SPARC_TLS_LDO_HIX22";
- case 65: return "R_SPARC_TLS_LDO_LOX10";
- case 66: return "R_SPARC_TLS_LDO_ADD";
- case 67: return "R_SPARC_TLS_IE_HI22";
- case 68: return "R_SPARC_TLS_IE_LO10";
- case 69: return "R_SPARC_TLS_IE_LD";
- case 70: return "R_SPARC_TLS_IE_LDX";
- case 71: return "R_SPARC_TLS_IE_ADD";
- case 72: return "R_SPARC_TLS_LE_HIX22";
- case 73: return "R_SPARC_TLS_LE_LOX10";
- case 74: return "R_SPARC_TLS_DTPMOD32";
- case 75: return "R_SPARC_TLS_DTPMOD64";
- case 76: return "R_SPARC_TLS_DTPOFF32";
- case 77: return "R_SPARC_TLS_DTPOFF64";
- case 78: return "R_SPARC_TLS_TPOFF32";
- case 79: return "R_SPARC_TLS_TPOFF64";
- default: return "";
- }
- case EM_X86_64:
- switch(type) {
- case 0: return "R_X86_64_NONE";
- case 1: return "R_X86_64_64";
- case 2: return "R_X86_64_PC32";
- case 3: return "R_X86_64_GOT32";
- case 4: return "R_X86_64_PLT32";
- case 5: return "R_X86_64_COPY";
- case 6: return "R_X86_64_GLOB_DAT";
- case 7: return "R_X86_64_JUMP_SLOT";
- case 8: return "R_X86_64_RELATIVE";
- case 9: return "R_X86_64_GOTPCREL";
- case 10: return "R_X86_64_32";
- case 11: return "R_X86_64_32S";
- case 12: return "R_X86_64_16";
- case 13: return "R_X86_64_PC16";
- case 14: return "R_X86_64_8";
- case 15: return "R_X86_64_PC8";
- case 16: return "R_X86_64_DTPMOD64";
- case 17: return "R_X86_64_DTPOFF64";
- case 18: return "R_X86_64_TPOFF64";
- case 19: return "R_X86_64_TLSGD";
- case 20: return "R_X86_64_TLSLD";
- case 21: return "R_X86_64_DTPOFF32";
- case 22: return "R_X86_64_GOTTPOFF";
- case 23: return "R_X86_64_TPOFF32";
- default: return "";
- }
- default: return "";
- }
-}
-
static void add_name(struct elfdump *ed, const char *name);
static void elf_print_object(struct elfdump *ed);
static void elf_print_elf(struct elfdump *ed);
@@ -931,7 +616,7 @@ static void find_gotrel(struct elfdump *ed, struct section *gs,
struct rel_entry *got);
static struct spec_name *find_name(struct elfdump *ed, const char *name);
static int get_ent_count(const struct section *s, int *ent_count);
-static const char *get_symbol_name(struct elfdump *ed, int symtab, int i);
+static const char *get_symbol_name(struct elfdump *ed, uint32_t symtab, int i);
static const char *get_string(struct elfdump *ed, int strtab, size_t off);
static void get_versym(struct elfdump *ed, int i, uint16_t **vs, int *nvs);
static void load_sections(struct elfdump *ed);
@@ -1110,8 +795,8 @@ ac_print_ar(struct elfdump *ed, int fd)
char idx[10], *b;
void *buff;
size_t size;
- uint32_t cnt;
- int i, r;
+ uint32_t cnt, i;
+ int r;
if (lseek(fd, 0, SEEK_SET) == -1)
err(EXIT_FAILURE, "lseek failed");
@@ -1160,11 +845,11 @@ ac_print_ar(struct elfdump *ed, int fd)
if (arsym == NULL)
err(EXIT_FAILURE, "calloc failed");
b += sizeof(uint32_t);
- for (i = 0; (size_t)i < cnt; i++) {
+ for (i = 0; i < cnt; i++) {
arsym[i].off = be32dec(b);
b += sizeof(uint32_t);
}
- for (i = 0; (size_t)i < cnt; i++) {
+ for (i = 0; i < cnt; i++) {
arsym[i].sym_name = b;
b += strlen(b) + 1;
}
@@ -1173,7 +858,7 @@ ac_print_ar(struct elfdump *ed, int fd)
PRT(" index offset symbol\n");
} else
PRT("\nsymbol table (archive):\n");
- for (i = 0; (size_t)i < cnt; i++) {
+ for (i = 0; i < cnt; i++) {
if (ed->flags & SOLARIS_FMT) {
snprintf(idx, sizeof(idx), "[%d]", i);
PRT("%10s ", idx);
@@ -1229,8 +914,7 @@ elf_print_ar(struct elfdump *ed, int fd)
Elf_Arsym *arsym;
Elf_Cmd cmd;
char idx[10];
- size_t cnt;
- int i;
+ size_t cnt, i;
ed->ar = ed->elf;
@@ -1247,7 +931,7 @@ elf_print_ar(struct elfdump *ed, int fd)
PRT(" index offset member name and symbol\n");
} else
PRT("\nsymbol table (archive):\n");
- for (i = 0; (size_t)i < cnt - 1; i++) {
+ for (i = 0; i < cnt - 1; i++) {
if (elf_rand(ed->ar, arsym[i].as_off) !=
arsym[i].as_off) {
warnx("elf_rand failed: %s", elf_errmsg(-1));
@@ -1263,14 +947,14 @@ elf_print_ar(struct elfdump *ed, int fd)
break;
}
if (ed->flags & SOLARIS_FMT) {
- snprintf(idx, sizeof(idx), "[%d]", i);
+ snprintf(idx, sizeof(idx), "[%zu]", i);
PRT("%10s ", idx);
PRT("0x%8.8jx ",
(uintmax_t)arsym[i].as_off);
PRT("(%s):%s\n", arh->ar_name,
arsym[i].as_name);
} else {
- PRT("\nentry: %d\n", i);
+ PRT("\nentry: %zu\n", i);
PRT("\toffset: %#jx\n",
(uintmax_t)arsym[i].as_off);
PRT("\tmember: %s\n", arh->ar_name);
@@ -1531,7 +1215,7 @@ find_name(struct elfdump *ed, const char *name)
* table and the index of the symbol within that table.
*/
static const char *
-get_symbol_name(struct elfdump *ed, int symtab, int i)
+get_symbol_name(struct elfdump *ed, uint32_t symtab, int i)
{
static char sname[64];
struct section *s;
@@ -1540,6 +1224,8 @@ get_symbol_name(struct elfdump *ed, int symtab, int i)
Elf_Data *data;
int elferr;
+ if (symtab >= ed->shnum)
+ return ("");
s = &ed->sl[symtab];
if (s->type != SHT_SYMTAB && s->type != SHT_DYNSYM)
return ("");
@@ -1596,11 +1282,13 @@ elf_print_ehdr(struct elfdump *ed)
ed->ehdr.e_ident[0], ed->ehdr.e_ident[1],
ed->ehdr.e_ident[2], ed->ehdr.e_ident[3]);
PRT(" ei_class: %-18s",
- ei_classes[ed->ehdr.e_ident[EI_CLASS]]);
- PRT(" ei_data: %s\n", ei_data[ed->ehdr.e_ident[EI_DATA]]);
+ elf_class_str(ed->ehdr.e_ident[EI_CLASS]));
+ PRT(" ei_data: %s\n",
+ elf_data_str(ed->ehdr.e_ident[EI_DATA]));
PRT(" e_machine: %-18s", e_machines(ed->ehdr.e_machine));
- PRT(" e_version: %s\n", ei_versions[ed->ehdr.e_version]);
- PRT(" e_type: %s\n", e_types[ed->ehdr.e_type]);
+ PRT(" e_version: %s\n",
+ elf_version_str(ed->ehdr.e_version));
+ PRT(" e_type: %s\n", elf_type_str(ed->ehdr.e_type));
PRT(" e_flags: %18d\n", ed->ehdr.e_flags);
PRT(" e_entry: %#18jx", (uintmax_t)ed->ehdr.e_entry);
PRT(" e_ehsize: %6d", ed->ehdr.e_ehsize);
@@ -1615,12 +1303,12 @@ elf_print_ehdr(struct elfdump *ed)
PRT("\nelf header:\n");
PRT("\n");
PRT("\te_ident: %s %s %s\n",
- ei_classes[ed->ehdr.e_ident[EI_CLASS]],
- ei_data[ed->ehdr.e_ident[EI_DATA]],
+ elf_class_str(ed->ehdr.e_ident[EI_CLASS]),
+ elf_data_str(ed->ehdr.e_ident[EI_DATA]),
ei_abis[ed->ehdr.e_ident[EI_OSABI]]);
- PRT("\te_type: %s\n", e_types[ed->ehdr.e_type]);
+ PRT("\te_type: %s\n", elf_type_str(ed->ehdr.e_type));
PRT("\te_machine: %s\n", e_machines(ed->ehdr.e_machine));
- PRT("\te_version: %s\n", ei_versions[ed->ehdr.e_version]);
+ PRT("\te_version: %s\n", elf_version_str(ed->ehdr.e_version));
PRT("\te_entry: %#jx\n", (uintmax_t)ed->ehdr.e_entry);
PRT("\te_phoff: %ju\n", (uintmax_t)ed->ehdr.e_phoff);
PRT("\te_shoff: %ju\n", (uintmax_t) ed->ehdr.e_shoff);
@@ -1641,28 +1329,30 @@ static void
elf_print_phdr(struct elfdump *ed)
{
GElf_Phdr ph;
- size_t phnum;
- int header, i;
+ size_t phnum, i;
+ int header;
if (elf_getphnum(ed->elf, &phnum) == 0) {
warnx("elf_getphnum failed: %s", elf_errmsg(-1));
return;
}
header = 0;
- for (i = 0; (u_int64_t) i < phnum; i++) {
+ for (i = 0; i < phnum; i++) {
if (gelf_getphdr(ed->elf, i, &ph) != &ph) {
warnx("elf_getphdr failed: %s", elf_errmsg(-1));
continue;
}
if (!STAILQ_EMPTY(&ed->snl) &&
- find_name(ed, p_types[ph.p_type & 0x7]) == NULL)
+ find_name(ed, elf_phdr_type_str(ph.p_type)) == NULL)
continue;
if (ed->flags & SOLARIS_FMT) {
- PRT("\nProgram Header[%d]:\n", i);
+ PRT("\nProgram Header[%zu]:\n", i);
PRT(" p_vaddr: %#-14jx", (uintmax_t)ph.p_vaddr);
- PRT(" p_flags: [ %s ]\n", p_flags[ph.p_flags]);
+ PRT(" p_flags: [ %s ]\n",
+ p_flags[ph.p_flags & 0x7]);
PRT(" p_paddr: %#-14jx", (uintmax_t)ph.p_paddr);
- PRT(" p_type: [ %s ]\n", p_types[ph.p_type & 0x7]);
+ PRT(" p_type: [ %s ]\n",
+ elf_phdr_type_str(ph.p_type));
PRT(" p_filesz: %#-14jx",
(uintmax_t)ph.p_filesz);
PRT(" p_memsz: %#jx\n", (uintmax_t)ph.p_memsz);
@@ -1675,14 +1365,14 @@ elf_print_phdr(struct elfdump *ed)
header = 1;
}
PRT("\n");
- PRT("entry: %d\n", i);
- PRT("\tp_type: %s\n", p_types[ph.p_type & 0x7]);
+ PRT("entry: %zu\n", i);
+ PRT("\tp_type: %s\n", elf_phdr_type_str(ph.p_type));
PRT("\tp_offset: %ju\n", (uintmax_t)ph.p_offset);
PRT("\tp_vaddr: %#jx\n", (uintmax_t)ph.p_vaddr);
PRT("\tp_paddr: %#jx\n", (uintmax_t)ph.p_paddr);
PRT("\tp_filesz: %ju\n", (uintmax_t)ph.p_filesz);
PRT("\tp_memsz: %ju\n", (uintmax_t)ph.p_memsz);
- PRT("\tp_flags: %s\n", p_flags[ph.p_flags]);
+ PRT("\tp_flags: %s\n", p_flags[ph.p_flags & 0x7]);
PRT("\tp_align: %ju\n", (uintmax_t)ph.p_align);
}
}
@@ -1695,19 +1385,19 @@ static void
elf_print_shdr(struct elfdump *ed)
{
struct section *s;
- int i;
+ size_t i;
if (!STAILQ_EMPTY(&ed->snl))
return;
if ((ed->flags & SOLARIS_FMT) == 0)
PRT("\nsection header:\n");
- for (i = 0; (size_t)i < ed->shnum; i++) {
+ for (i = 0; i < ed->shnum; i++) {
s = &ed->sl[i];
if (ed->flags & SOLARIS_FMT) {
if (i == 0)
continue;
- PRT("\nSection Header[%d]:", i);
+ PRT("\nSection Header[%zu]:", i);
PRT(" sh_name: %s\n", s->name);
PRT(" sh_addr: %#-14jx", (uintmax_t)s->addr);
if (s->flags != 0)
@@ -1767,15 +1457,16 @@ get_versym(struct elfdump *ed, int i, uint16_t **vs, int *nvs)
{
struct section *s;
Elf_Data *data;
- int j, elferr;
+ size_t j;
+ int elferr;
s = NULL;
- for (j = 0; (size_t)j < ed->shnum; j++) {
+ for (j = 0; j < ed->shnum; j++) {
s = &ed->sl[j];
if (s->type == SHT_SUNW_versym && s->link == (uint32_t)i)
break;
}
- if ((size_t)j >= ed->shnum) {
+ if (j >= ed->shnum) {
*vs = NULL;
return;
}
@@ -1880,9 +1571,9 @@ elf_print_symtab(struct elfdump *ed, int i)
static void
elf_print_symtabs(struct elfdump *ed)
{
- int i;
+ size_t i;
- for (i = 0; (size_t)i < ed->shnum; i++)
+ for (i = 0; i < ed->shnum; i++)
if ((ed->sl[i].type == SHT_SYMTAB ||
ed->sl[i].type == SHT_DYNSYM) &&
(STAILQ_EMPTY(&ed->snl) || find_name(ed, ed->sl[i].name)))
@@ -1945,6 +1636,7 @@ elf_print_dynamic(struct elfdump *ed)
case DT_NEEDED:
case DT_SONAME:
case DT_RPATH:
+ case DT_RUNPATH:
if ((name = elf_strptr(ed->elf, s->link,
dyn.d_un.d_val)) == NULL)
name = "";
@@ -2011,7 +1703,7 @@ elf_print_rel_entry(struct elfdump *ed, struct section *s, int j,
{
if (ed->flags & SOLARIS_FMT) {
- PRT(" %-23s ", r_type(ed->ehdr.e_machine,
+ PRT(" %-23s ", elftc_reloc_type_str(ed->ehdr.e_machine,
GELF_R_TYPE(r->u_r.rel.r_info)));
PRT("%#12jx ", (uintmax_t)r->u_r.rel.r_offset);
if (r->type == SHT_RELA)
@@ -2105,9 +1797,10 @@ elf_print_reloc(struct elfdump *ed)
{
struct section *s;
Elf_Data *data;
- int i, elferr;
+ size_t i;
+ int elferr;
- for (i = 0; (size_t)i < ed->shnum; i++) {
+ for (i = 0; i < ed->shnum; i++) {
s = &ed->sl[i];
if ((s->type == SHT_REL || s->type == SHT_RELA) &&
(STAILQ_EMPTY(&ed->snl) || find_name(ed, s->name))) {
@@ -2135,13 +1828,12 @@ elf_print_interp(struct elfdump *ed)
{
const char *s;
GElf_Phdr phdr;
- size_t phnum;
- int i;
+ size_t filesize, i, phnum;
if (!STAILQ_EMPTY(&ed->snl) && find_name(ed, "PT_INTERP") == NULL)
return;
- if ((s = elf_rawfile(ed->elf, NULL)) == NULL) {
+ if ((s = elf_rawfile(ed->elf, &filesize)) == NULL) {
warnx("elf_rawfile failed: %s", elf_errmsg(-1));
return;
}
@@ -2149,12 +1841,16 @@ elf_print_interp(struct elfdump *ed)
warnx("elf_getphnum failed: %s", elf_errmsg(-1));
return;
}
- for (i = 0; (size_t)i < phnum; i++) {
+ for (i = 0; i < phnum; i++) {
if (gelf_getphdr(ed->elf, i, &phdr) != &phdr) {
warnx("elf_getphdr failed: %s", elf_errmsg(-1));
continue;
}
if (phdr.p_type == PT_INTERP) {
+ if (phdr.p_offset >= filesize) {
+ warnx("invalid phdr offset");
+ continue;
+ }
PRT("\ninterp:\n");
PRT("\t%s\n", s + phdr.p_offset);
}
@@ -2162,7 +1858,7 @@ elf_print_interp(struct elfdump *ed)
}
/*
- * Search the relocation sections for entries refering to the .got section.
+ * Search the relocation sections for entries referring to the .got section.
*/
static void
find_gotrel(struct elfdump *ed, struct section *gs, struct rel_entry *got)
@@ -2170,9 +1866,10 @@ find_gotrel(struct elfdump *ed, struct section *gs, struct rel_entry *got)
struct section *s;
struct rel_entry r;
Elf_Data *data;
- int elferr, i, j, k, len;
+ size_t i;
+ int elferr, j, k, len;
- for(i = 0; (size_t)i < ed->shnum; i++) {
+ for(i = 0; i < ed->shnum; i++) {
s = &ed->sl[i];
if (s->type != SHT_REL && s->type != SHT_RELA)
continue;
@@ -2249,7 +1946,7 @@ elf_print_got_section(struct elfdump *ed, struct section *s)
/*
* GOT section has section type SHT_PROGBITS, thus libelf treats it as
- * byte stream and will not perfrom any translation on it. As a result,
+ * byte stream and will not perform any translation on it. As a result,
* an exlicit call to gelf_xlatetom is needed here. Depends on arch,
* GOT section should be translated to either WORD or XWORD.
*/
@@ -2292,7 +1989,7 @@ elf_print_got_section(struct elfdump *ed, struct section *s)
PRT("%-16.16jx ",
(uintmax_t) *((uint64_t *)dst.d_buf + i));
}
- PRT("%-18s ", r_type(ed->ehdr.e_machine,
+ PRT("%-18s ", elftc_reloc_type_str(ed->ehdr.e_machine,
GELF_R_TYPE(got[i].u_r.rel.r_info)));
if (ed->ec == ELFCLASS32)
PRT("%-8.8jd ",
@@ -2324,13 +2021,13 @@ static void
elf_print_got(struct elfdump *ed)
{
struct section *s;
- int i;
+ size_t i;
if (!STAILQ_EMPTY(&ed->snl))
return;
s = NULL;
- for (i = 0; (size_t)i < ed->shnum; i++) {
+ for (i = 0; i < ed->shnum; i++) {
s = &ed->sl[i];
if (s->name && !strncmp(s->name, ".got", 4) &&
(STAILQ_EMPTY(&ed->snl) || find_name(ed, s->name)))
@@ -2352,7 +2049,8 @@ elf_print_note(struct elfdump *ed)
uint32_t desc;
size_t count;
int elferr, i;
- char *src, idx[10];
+ uint8_t *src;
+ char idx[10];
s = NULL;
for (i = 0; (size_t)i < ed->shnum; i++) {
@@ -2383,6 +2081,10 @@ elf_print_note(struct elfdump *ed)
descsz = en->n_descsz;
src += sizeof(Elf_Note);
count -= sizeof(Elf_Note);
+ if (roundup2(namesz, 4) + roundup2(descsz, 4) > count) {
+ warnx("truncated note section");
+ return;
+ }
if (ed->flags & SOLARIS_FMT) {
PRT("\n type %#x\n", en->n_type);
PRT(" namesz %#x:\n", en->n_namesz);
@@ -2433,7 +2135,8 @@ elf_print_svr4_hash(struct elfdump *ed, struct section *s)
uint32_t *bucket, *chain;
uint32_t nbucket, nchain;
uint32_t *bl, *c, maxl, total;
- int i, j, first, elferr;
+ uint32_t i, j;
+ int first, elferr;
char idx[10];
if (ed->flags & SOLARIS_FMT)
@@ -2459,7 +2162,8 @@ elf_print_svr4_hash(struct elfdump *ed, struct section *s)
warnx("Malformed .hash section");
return;
}
- if (data->d_size != (nbucket + nchain + 2) * sizeof(uint32_t)) {
+ if (data->d_size !=
+ ((uint64_t)nbucket + (uint64_t)nchain + 2) * sizeof(uint32_t)) {
warnx("Malformed .hash section");
return;
}
@@ -2470,20 +2174,18 @@ elf_print_svr4_hash(struct elfdump *ed, struct section *s)
maxl = 0;
if ((bl = calloc(nbucket, sizeof(*bl))) == NULL)
err(EXIT_FAILURE, "calloc failed");
- for (i = 0; (uint32_t)i < nbucket; i++)
- for (j = bucket[i]; j > 0 && (uint32_t)j < nchain;
- j = chain[j])
+ for (i = 0; i < nbucket; i++)
+ for (j = bucket[i]; j > 0 && j < nchain; j = chain[j])
if (++bl[i] > maxl)
maxl = bl[i];
if ((c = calloc(maxl + 1, sizeof(*c))) == NULL)
err(EXIT_FAILURE, "calloc failed");
- for (i = 0; (uint32_t)i < nbucket; i++)
+ for (i = 0; i < nbucket; i++)
c[bl[i]]++;
PRT(" bucket symndx name\n");
- for (i = 0; (uint32_t)i < nbucket; i++) {
+ for (i = 0; i < nbucket; i++) {
first = 1;
- for (j = bucket[i]; j > 0 && (uint32_t)j < nchain;
- j = chain[j]) {
+ for (j = bucket[i]; j > 0 && j < nchain; j = chain[j]) {
if (first) {
PRT("%10d ", i);
first = 0;
@@ -2496,7 +2198,7 @@ elf_print_svr4_hash(struct elfdump *ed, struct section *s)
}
PRT("\n");
total = 0;
- for (i = 0; (uint32_t)i <= maxl; i++) {
+ for (i = 0; i <= maxl; i++) {
total += c[i] * i;
PRT("%10u buckets contain %8d symbols\n", c[i], i);
}
@@ -2505,9 +2207,9 @@ elf_print_svr4_hash(struct elfdump *ed, struct section *s)
} else {
PRT("\nnbucket: %u\n", nbucket);
PRT("nchain: %u\n\n", nchain);
- for (i = 0; (uint32_t)i < nbucket; i++)
+ for (i = 0; i < nbucket; i++)
PRT("bucket[%d]:\n\t%u\n\n", i, bucket[i]);
- for (i = 0; (uint32_t)i < nchain; i++)
+ for (i = 0; i < nchain; i++)
PRT("chain[%d]:\n\t%u\n\n", i, chain[i]);
}
}
@@ -2523,7 +2225,8 @@ elf_print_svr4_hash64(struct elfdump *ed, struct section *s)
uint64_t *bucket, *chain;
uint64_t nbucket, nchain;
uint64_t *bl, *c, maxl, total;
- int i, j, elferr, first;
+ uint64_t i, j;
+ int elferr, first;
char idx[10];
if (ed->flags & SOLARIS_FMT)
@@ -2573,35 +2276,33 @@ elf_print_svr4_hash64(struct elfdump *ed, struct section *s)
maxl = 0;
if ((bl = calloc(nbucket, sizeof(*bl))) == NULL)
err(EXIT_FAILURE, "calloc failed");
- for (i = 0; (uint64_t)i < nbucket; i++)
- for (j = bucket[i]; j > 0 && (uint64_t)j < nchain;
- j = chain[j])
+ for (i = 0; i < nbucket; i++)
+ for (j = bucket[i]; j > 0 && j < nchain; j = chain[j])
if (++bl[i] > maxl)
maxl = bl[i];
if ((c = calloc(maxl + 1, sizeof(*c))) == NULL)
err(EXIT_FAILURE, "calloc failed");
- for (i = 0; (uint64_t)i < nbucket; i++)
+ for (i = 0; i < nbucket; i++)
c[bl[i]]++;
PRT(" bucket symndx name\n");
- for (i = 0; (uint64_t)i < nbucket; i++) {
+ for (i = 0; i < nbucket; i++) {
first = 1;
- for (j = bucket[i]; j > 0 && (uint64_t)j < nchain;
- j = chain[j]) {
+ for (j = bucket[i]; j > 0 && j < nchain; j = chain[j]) {
if (first) {
- PRT("%10d ", i);
+ PRT("%10zu ", i);
first = 0;
} else
PRT(" ");
- snprintf(idx, sizeof(idx), "[%d]", j);
+ snprintf(idx, sizeof(idx), "[%zu]", (size_t)j);
PRT("%-10s ", idx);
PRT("%s\n", get_symbol_name(ed, s->link, j));
}
}
PRT("\n");
total = 0;
- for (i = 0; (uint64_t)i <= maxl; i++) {
+ for (i = 0; i <= maxl; i++) {
total += c[i] * i;
- PRT("%10ju buckets contain %8d symbols\n",
+ PRT("%10ju buckets contain %8zu symbols\n",
(uintmax_t)c[i], i);
}
PRT("%10ju buckets %8ju symbols (globals)\n",
@@ -2609,10 +2310,10 @@ elf_print_svr4_hash64(struct elfdump *ed, struct section *s)
} else {
PRT("\nnbucket: %ju\n", (uintmax_t)nbucket);
PRT("nchain: %ju\n\n", (uintmax_t)nchain);
- for (i = 0; (uint64_t)i < nbucket; i++)
- PRT("bucket[%d]:\n\t%ju\n\n", i, (uintmax_t)bucket[i]);
- for (i = 0; (uint64_t)i < nchain; i++)
- PRT("chain[%d]:\n\t%ju\n\n", i, (uintmax_t)chain[i]);
+ for (i = 0; i < nbucket; i++)
+ PRT("bucket[%zu]:\n\t%ju\n\n", i, (uintmax_t)bucket[i]);
+ for (i = 0; i < nchain; i++)
+ PRT("chain[%zu]:\n\t%ju\n\n", i, (uintmax_t)chain[i]);
}
}
@@ -2629,7 +2330,8 @@ elf_print_gnu_hash(struct elfdump *ed, struct section *s)
uint32_t *bucket, *chain;
uint32_t nbucket, nchain, symndx, maskwords, shift2;
uint32_t *bl, *c, maxl, total;
- int i, j, first, elferr, dynsymcount;
+ uint32_t i, j;
+ int first, elferr, dynsymcount;
char idx[10];
if (ed->flags & SOLARIS_FMT)
@@ -2654,13 +2356,21 @@ elf_print_gnu_hash(struct elfdump *ed, struct section *s)
maskwords = buf[2];
shift2 = buf[3];
buf += 4;
+ if (s->link >= ed->shnum) {
+ warnx("Malformed .gnu.hash section");
+ return;
+ }
ds = &ed->sl[s->link];
if (!get_ent_count(ds, &dynsymcount))
return;
+ if (symndx >= (uint32_t)dynsymcount) {
+ warnx("Malformed .gnu.hash section");
+ return;
+ }
nchain = dynsymcount - symndx;
if (data->d_size != 4 * sizeof(uint32_t) + maskwords *
(ed->ec == ELFCLASS32 ? sizeof(uint32_t) : sizeof(uint64_t)) +
- (nbucket + nchain) * sizeof(uint32_t)) {
+ ((uint64_t)nbucket + (uint64_t)nchain) * sizeof(uint32_t)) {
warnx("Malformed .gnu.hash section");
return;
}
@@ -2671,10 +2381,8 @@ elf_print_gnu_hash(struct elfdump *ed, struct section *s)
maxl = 0;
if ((bl = calloc(nbucket, sizeof(*bl))) == NULL)
err(EXIT_FAILURE, "calloc failed");
- for (i = 0; (uint32_t)i < nbucket; i++)
- for (j = bucket[i];
- j > 0 && (uint32_t)j - symndx < nchain;
- j++) {
+ for (i = 0; i < nbucket; i++)
+ for (j = bucket[i]; j > 0 && j - symndx < nchain; j++) {
if (++bl[i] > maxl)
maxl = bl[i];
if (chain[j - symndx] & 1)
@@ -2682,14 +2390,12 @@ elf_print_gnu_hash(struct elfdump *ed, struct section *s)
}
if ((c = calloc(maxl + 1, sizeof(*c))) == NULL)
err(EXIT_FAILURE, "calloc failed");
- for (i = 0; (uint32_t)i < nbucket; i++)
+ for (i = 0; i < nbucket; i++)
c[bl[i]]++;
PRT(" bucket symndx name\n");
- for (i = 0; (uint32_t)i < nbucket; i++) {
+ for (i = 0; i < nbucket; i++) {
first = 1;
- for (j = bucket[i];
- j > 0 && (uint32_t)j - symndx < nchain;
- j++) {
+ for (j = bucket[i]; j > 0 && j - symndx < nchain; j++) {
if (first) {
PRT("%10d ", i);
first = 0;
@@ -2704,7 +2410,7 @@ elf_print_gnu_hash(struct elfdump *ed, struct section *s)
}
PRT("\n");
total = 0;
- for (i = 0; (uint32_t)i <= maxl; i++) {
+ for (i = 0; i <= maxl; i++) {
total += c[i] * i;
PRT("%10u buckets contain %8d symbols\n", c[i], i);
}
@@ -2716,9 +2422,9 @@ elf_print_gnu_hash(struct elfdump *ed, struct section *s)
PRT("maskwords: %u\n", maskwords);
PRT("shift2: %u\n", shift2);
PRT("nchain: %u\n\n", nchain);
- for (i = 0; (uint32_t)i < nbucket; i++)
+ for (i = 0; i < nbucket; i++)
PRT("bucket[%d]:\n\t%u\n\n", i, bucket[i]);
- for (i = 0; (uint32_t)i < nchain; i++)
+ for (i = 0; i < nchain; i++)
PRT("chain[%d]:\n\t%u\n\n", i, chain[i]);
}
}
@@ -2730,9 +2436,9 @@ static void
elf_print_hash(struct elfdump *ed)
{
struct section *s;
- int i;
+ size_t i;
- for (i = 0; (size_t)i < ed->shnum; i++) {
+ for (i = 0; i < ed->shnum; i++) {
s = &ed->sl[i];
if ((s->type == SHT_HASH || s->type == SHT_GNU_HASH) &&
(STAILQ_EMPTY(&ed->snl) || find_name(ed, s->name))) {
@@ -2915,9 +2621,9 @@ static void
elf_print_symver(struct elfdump *ed)
{
struct section *s;
- int i;
+ size_t i;
- for (i = 0; (size_t)i < ed->shnum; i++) {
+ for (i = 0; i < ed->shnum; i++) {
s = &ed->sl[i];
if (!STAILQ_EMPTY(&ed->snl) && !find_name(ed, s->name))
continue;
diff --git a/contrib/elftoolchain/libdwarf/libdwarf_abbrev.c b/contrib/elftoolchain/libdwarf/libdwarf_abbrev.c
index abcc2fd..9e4b6ab 100644
--- a/contrib/elftoolchain/libdwarf/libdwarf_abbrev.c
+++ b/contrib/elftoolchain/libdwarf/libdwarf_abbrev.c
@@ -27,7 +27,7 @@
#include "_libdwarf.h"
-ELFTC_VCSID("$Id: libdwarf_abbrev.c 3136 2014-12-24 16:04:38Z kaiwang27 $");
+ELFTC_VCSID("$Id: libdwarf_abbrev.c 3420 2016-02-27 02:14:05Z emaste $");
int
_dwarf_abbrev_add(Dwarf_CU cu, uint64_t entry, uint64_t tag, uint8_t children,
@@ -115,9 +115,7 @@ _dwarf_abbrev_parse(Dwarf_Debug dbg, Dwarf_CU cu, Dwarf_Unsigned *offset,
assert(abp != NULL);
ds = _dwarf_find_section(dbg, ".debug_abbrev");
- assert(ds != NULL);
-
- if (*offset >= ds->ds_size)
+ if (ds == NULL || *offset >= ds->ds_size)
return (DW_DLE_NO_ENTRY);
aboff = *offset;
diff --git a/contrib/elftoolchain/libdwarf/libdwarf_elf_init.c b/contrib/elftoolchain/libdwarf/libdwarf_elf_init.c
index 5ab6ffc..bd68afc 100644
--- a/contrib/elftoolchain/libdwarf/libdwarf_elf_init.c
+++ b/contrib/elftoolchain/libdwarf/libdwarf_elf_init.c
@@ -26,7 +26,7 @@
#include "_libdwarf.h"
-ELFTC_VCSID("$Id: libdwarf_elf_init.c 3161 2015-02-15 21:43:36Z emaste $");
+ELFTC_VCSID("$Id: libdwarf_elf_init.c 3475 2016-05-18 18:11:26Z emaste $");
static const char *debug_name[] = {
".debug_abbrev",
@@ -50,55 +50,81 @@ static const char *debug_name[] = {
};
static void
-_dwarf_elf_write_reloc(Dwarf_Debug dbg, Elf_Data *symtab_data, int endian,
- void *buf, uint64_t offset, GElf_Xword r_info, GElf_Sxword r_addend,
- int is_rel)
+_dwarf_elf_apply_rel_reloc(Dwarf_Debug dbg, void *buf, uint64_t bufsize,
+ Elf_Data *rel_data, Elf_Data *symtab_data, int endian)
{
+ Dwarf_Unsigned type;
+ GElf_Rel rel;
GElf_Sym sym;
- int size;
+ size_t symndx;
+ uint64_t offset;
+ uint64_t addend;
+ int size, j;
+
+ j = 0;
+ while (gelf_getrel(rel_data, j++, &rel) != NULL) {
+ symndx = GELF_R_SYM(rel.r_info);
+ type = GELF_R_TYPE(rel.r_info);
+
+ if (gelf_getsym(symtab_data, symndx, &sym) == NULL)
+ continue;
+
+ size = _dwarf_get_reloc_size(dbg, type);
+ if (size == 0)
+ continue; /* Unknown or non-absolute relocation. */
- if (gelf_getsym(symtab_data, GELF_R_SYM(r_info), &sym) == NULL)
- return;
- if ((size = _dwarf_get_reloc_size(dbg, GELF_R_TYPE(r_info))) == 0)
- return; /* Unknown or non-absolute relocation. */
- if (is_rel) {
- uint64_t roffset = offset;
+ offset = rel.r_offset;
+ if (offset + size >= bufsize)
+ continue;
+
+ if (endian == ELFDATA2MSB)
+ addend = _dwarf_read_msb(buf, &offset, size);
+ else
+ addend = _dwarf_read_lsb(buf, &offset, size);
+ offset = rel.r_offset;
if (endian == ELFDATA2MSB)
- r_addend = _dwarf_read_msb(buf, &roffset, size);
+ _dwarf_write_msb(buf, &offset, sym.st_value + addend,
+ size);
else
- r_addend = _dwarf_read_lsb(buf, &roffset, size);
+ _dwarf_write_lsb(buf, &offset, sym.st_value + addend,
+ size);
}
- if (endian == ELFDATA2MSB)
- _dwarf_write_msb(buf, &offset, sym.st_value + r_addend, size);
- else
- _dwarf_write_lsb(buf, &offset, sym.st_value + r_addend, size);
}
static void
-_dwarf_elf_apply_rel_reloc(Dwarf_Debug dbg, void *buf, Elf_Data *rel_data,
- Elf_Data *symtab_data, int endian)
+_dwarf_elf_apply_rela_reloc(Dwarf_Debug dbg, void *buf, uint64_t bufsize,
+ Elf_Data *rel_data, Elf_Data *symtab_data, int endian)
{
- GElf_Rel rel;
- int j;
+ Dwarf_Unsigned type;
+ GElf_Rela rela;
+ GElf_Sym sym;
+ size_t symndx;
+ uint64_t offset;
+ int size, j;
j = 0;
- while (gelf_getrel(rel_data, j++, &rel) != NULL)
- _dwarf_elf_write_reloc(dbg, symtab_data, endian, buf,
- rel.r_offset, rel.r_info, 0, 1);
-}
+ while (gelf_getrela(rel_data, j++, &rela) != NULL) {
+ symndx = GELF_R_SYM(rela.r_info);
+ type = GELF_R_TYPE(rela.r_info);
-static void
-_dwarf_elf_apply_rela_reloc(Dwarf_Debug dbg, void *buf, Elf_Data *rel_data,
- Elf_Data *symtab_data, int endian)
-{
- GElf_Rela rela;
- int j;
+ if (gelf_getsym(symtab_data, symndx, &sym) == NULL)
+ continue;
- j = 0;
- while (gelf_getrela(rel_data, j++, &rela) != NULL)
- _dwarf_elf_write_reloc(dbg, symtab_data, endian, buf,
- rela.r_offset, rela.r_info, rela.r_addend, 0);
+ offset = rela.r_offset;
+ size = _dwarf_get_reloc_size(dbg, type);
+ if (size == 0)
+ continue; /* Unknown or non-absolute relocation. */
+ if (offset + size >= bufsize)
+ continue;
+
+ if (endian == ELFDATA2MSB)
+ _dwarf_write_msb(buf, &offset,
+ sym.st_value + rela.r_addend, size);
+ else
+ _dwarf_write_lsb(buf, &offset,
+ sym.st_value + rela.r_addend, size);
+ }
}
static int
@@ -150,10 +176,12 @@ _dwarf_elf_relocate(Dwarf_Debug dbg, Elf *elf, Dwarf_Elf_Data *ed, size_t shndx,
memcpy(ed->ed_alloc, ed->ed_data->d_buf,
ed->ed_data->d_size);
if (sh.sh_type == SHT_REL)
- _dwarf_elf_apply_rel_reloc(dbg, ed->ed_alloc,
+ _dwarf_elf_apply_rel_reloc(dbg,
+ ed->ed_alloc, ed->ed_data->d_size,
rel, symtab_data, eh.e_ident[EI_DATA]);
else
- _dwarf_elf_apply_rela_reloc(dbg, ed->ed_alloc,
+ _dwarf_elf_apply_rela_reloc(dbg,
+ ed->ed_alloc, ed->ed_data->d_size,
rel, symtab_data, eh.e_ident[EI_DATA]);
return (DW_DLE_NONE);
diff --git a/contrib/elftoolchain/libelf/_libelf_config.h b/contrib/elftoolchain/libelf/_libelf_config.h
index 1bcf333..fccb264 100644
--- a/contrib/elftoolchain/libelf/_libelf_config.h
+++ b/contrib/elftoolchain/libelf/_libelf_config.h
@@ -23,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: _libelf_config.h 3396 2016-02-10 21:50:05Z emaste $
+ * $Id: _libelf_config.h 3400 2016-02-12 18:38:49Z emaste $
*/
#if defined(__APPLE__) || defined(__DragonFly__)
diff --git a/contrib/elftoolchain/libelf/elf_data.c b/contrib/elftoolchain/libelf/elf_data.c
index 3d8ef6c..d494eda 100644
--- a/contrib/elftoolchain/libelf/elf_data.c
+++ b/contrib/elftoolchain/libelf/elf_data.c
@@ -32,7 +32,7 @@
#include "_libelf.h"
-ELFTC_VCSID("$Id: elf_data.c 3258 2015-11-20 18:59:43Z emaste $");
+ELFTC_VCSID("$Id: elf_data.c 3466 2016-05-11 18:35:44Z emaste $");
Elf_Data *
elf_getdata(Elf_Scn *s, Elf_Data *ed)
@@ -94,7 +94,7 @@ elf_getdata(Elf_Scn *s, Elf_Data *ed)
if ((elftype = _libelf_xlate_shtype(sh_type)) < ELF_T_FIRST ||
elftype > ELF_T_LAST || (sh_type != SHT_NOBITS &&
- sh_offset + sh_size > (uint64_t) e->e_rawsize)) {
+ (sh_offset > e->e_rawsize || sh_size > e->e_rawsize - sh_offset))) {
LIBELF_SET_ERROR(SECTION, 0);
return (NULL);
}
@@ -254,7 +254,7 @@ elf_rawdata(Elf_Scn *s, Elf_Data *ed)
}
if (sh_type != SHT_NOBITS &&
- sh_offset + sh_size > (uint64_t) e->e_rawsize) {
+ (sh_offset > e->e_rawsize || sh_size > e->e_rawsize - sh_offset)) {
LIBELF_SET_ERROR(SECTION, 0);
return (NULL);
}
diff --git a/contrib/elftoolchain/libelf/libelf_ar.c b/contrib/elftoolchain/libelf/libelf_ar.c
index faeec2c..8fce741 100644
--- a/contrib/elftoolchain/libelf/libelf_ar.c
+++ b/contrib/elftoolchain/libelf/libelf_ar.c
@@ -33,7 +33,7 @@
#include "_libelf.h"
#include "_libelf_ar.h"
-ELFTC_VCSID("$Id: libelf_ar.c 3174 2015-03-27 17:13:41Z emaste $");
+ELFTC_VCSID("$Id: libelf_ar.c 3446 2016-05-03 01:31:17Z emaste $");
#define LIBELF_NALLOC_SIZE 16
@@ -64,7 +64,7 @@ ELFTC_VCSID("$Id: libelf_ar.c 3174 2015-03-27 17:13:41Z emaste $");
* table where the actual file name of the object starts. Strings in
* the string table are padded to start on even addresses.
*
- * In the BSD format, file names can be upto 16 characters. File
+ * In the BSD format, file names can be up to 16 characters. File
* names shorter than 16 characters are padded to 16 characters using
* (ASCII) space characters. File names with embedded spaces and file
* names longer than 16 characters are stored immediately after the
diff --git a/contrib/elftoolchain/libelf/libelf_convert.m4 b/contrib/elftoolchain/libelf/libelf_convert.m4
index 0eddbe7..ec39590 100644
--- a/contrib/elftoolchain/libelf/libelf_convert.m4
+++ b/contrib/elftoolchain/libelf/libelf_convert.m4
@@ -30,7 +30,7 @@
#include "_libelf.h"
-ELFTC_VCSID("$Id: libelf_convert.m4 3174 2015-03-27 17:13:41Z emaste $");
+ELFTC_VCSID("$Id: libelf_convert.m4 3429 2016-03-12 04:12:39Z emaste $");
/* WARNING: GENERATED FROM __file__. */
diff --git a/contrib/elftoolchain/libelftc/Makefile b/contrib/elftoolchain/libelftc/Makefile
index 4af496b..6e38a87 100644
--- a/contrib/elftoolchain/libelftc/Makefile
+++ b/contrib/elftoolchain/libelftc/Makefile
@@ -1,4 +1,4 @@
-# $Id: Makefile 3292 2016-01-06 21:46:32Z jkoshy $
+# $Id: Makefile 3418 2016-02-19 20:04:42Z emaste $
TOP= ${.CURDIR}/..
@@ -7,6 +7,7 @@ LIB= elftc
SRCS= elftc_bfdtarget.c \
elftc_copyfile.c \
elftc_demangle.c \
+ elftc_reloc_type_str.c \
elftc_set_timestamps.c \
elftc_string_table.c \
elftc_version.c \
@@ -34,6 +35,7 @@ MAN= elftc.3 \
elftc_bfd_find_target.3 \
elftc_copyfile.3 \
elftc_demangle.3 \
+ elftc_reloc_type_str.3 \
elftc_set_timestamps.3 \
elftc_string_table_create.3 \
elftc_version.3
diff --git a/contrib/elftoolchain/libelftc/elftc_reloc_type_str.3 b/contrib/elftoolchain/libelftc/elftc_reloc_type_str.3
new file mode 100644
index 0000000..5cd08a6
--- /dev/null
+++ b/contrib/elftoolchain/libelftc/elftc_reloc_type_str.3
@@ -0,0 +1,72 @@
+.\" Copyright (c) 2016 The FreeBSD Foundation. All rights reserved.
+.\"
+.\" This documentation was written by Ed Maste under sponsorship of
+.\" the FreeBSD Foundation.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\" notice, this list of conditions and the following disclaimer in the
+.\" documentation and/or other materials provided with the distribution.
+.\"
+.\" This software is provided by the author and contributors ``as is'' and
+.\" any express or implied warranties, including, but not limited to, the
+.\" implied warranties of merchantability and fitness for a particular purpose
+.\" are disclaimed. In no event shall the author or contributors be liable
+.\" for any direct, indirect, incidental, special, exemplary, or consequential
+.\" damages (including, but not limited to, procurement of substitute goods
+.\" or services; loss of use, data, or profits; or business interruption)
+.\" however caused and on any theory of liability, whether in contract, strict
+.\" liability, or tort (including negligence or otherwise) arising in any way
+.\" out of the use of this software, even if advised of the possibility of
+.\" such damage.
+.\"
+.\" $Id$
+.\"
+.Dd February 19, 2016
+.Os
+.Dt ELFTC_RELOC_TYPE_STR 3
+.Sh NAME
+.Nm elftc_reloc_type_str
+.Nd return the type name for an ELF relocation
+.Sh LIBRARY
+.Lb libelftc
+.Sh SYNOPSIS
+.In libelftc.h
+.Ft const char *
+.Fo elftc_reloc_type_str
+.Fa "unsigned int mach"
+.Fa "unsigned int type"
+.Fc
+.Sh DESCRIPTION
+Function
+.Fn elftc_reloc_type_str
+returns the name for specified relocation type.
+.Pp
+Argument
+.Ar mach
+specifies the machine (architecture) type.
+Argument
+.Ar type
+specifies the relocation value.
+.Sh RETURN VALUE
+Function
+.Fn elftc_program_version
+returns a pointer to a string constant, or to an internal character buffer
+if the relocation type is unknown.
+.Sh EXAMPLES
+To print ARM relocation type 7, use:
+.Bd -literal -offset indent
+#include <sys/types.h>
+#include <libelftc.h>
+#include <stdio.h>
+
+(void) printf("%s\en", elftc_reloc_type_str(EM_ARM, 7));
+.Ed
+.Sh ERRORS
+Function
+.Fn elftc_reloc_type_str
+always succeeds.
diff --git a/contrib/elftoolchain/libelftc/elftc_reloc_type_str.c b/contrib/elftoolchain/libelftc/elftc_reloc_type_str.c
new file mode 100644
index 0000000..a22a1be
--- /dev/null
+++ b/contrib/elftoolchain/libelftc/elftc_reloc_type_str.c
@@ -0,0 +1,684 @@
+/*-
+ * Copyright (c) 2009-2015 Kai Wang
+ * Copyright (c) 2016 The FreeBSD Foundation
+ * All rights reserved.
+ *
+ * Portions of this software were developed by Ed Maste under sponsorship
+ * of the FreeBSD Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <libelftc.h>
+#include <stdio.h>
+
+const char *
+elftc_reloc_type_str(unsigned int mach, unsigned int type)
+{
+ static char s_type[32];
+
+ switch(mach) {
+ case EM_386:
+ case EM_IAMCU:
+ switch(type) {
+ case 0: return "R_386_NONE";
+ case 1: return "R_386_32";
+ case 2: return "R_386_PC32";
+ case 3: return "R_386_GOT32";
+ case 4: return "R_386_PLT32";
+ case 5: return "R_386_COPY";
+ case 6: return "R_386_GLOB_DAT";
+ case 7: return "R_386_JUMP_SLOT";
+ case 8: return "R_386_RELATIVE";
+ case 9: return "R_386_GOTOFF";
+ case 10: return "R_386_GOTPC";
+ case 11: return "R_386_32PLT"; /* Not in psabi */
+ case 14: return "R_386_TLS_TPOFF";
+ case 15: return "R_386_TLS_IE";
+ case 16: return "R_386_TLS_GOTIE";
+ case 17: return "R_386_TLS_LE";
+ case 18: return "R_386_TLS_GD";
+ case 19: return "R_386_TLS_LDM";
+ case 20: return "R_386_16";
+ case 21: return "R_386_PC16";
+ case 22: return "R_386_8";
+ case 23: return "R_386_PC8";
+ case 24: return "R_386_TLS_GD_32";
+ case 25: return "R_386_TLS_GD_PUSH";
+ case 26: return "R_386_TLS_GD_CALL";
+ case 27: return "R_386_TLS_GD_POP";
+ case 28: return "R_386_TLS_LDM_32";
+ case 29: return "R_386_TLS_LDM_PUSH";
+ case 30: return "R_386_TLS_LDM_CALL";
+ case 31: return "R_386_TLS_LDM_POP";
+ case 32: return "R_386_TLS_LDO_32";
+ case 33: return "R_386_TLS_IE_32";
+ case 34: return "R_386_TLS_LE_32";
+ case 35: return "R_386_TLS_DTPMOD32";
+ case 36: return "R_386_TLS_DTPOFF32";
+ case 37: return "R_386_TLS_TPOFF32";
+ case 38: return "R_386_SIZE32";
+ case 39: return "R_386_TLS_GOTDESC";
+ case 40: return "R_386_TLS_DESC_CALL";
+ case 41: return "R_386_TLS_DESC";
+ case 42: return "R_386_IRELATIVE";
+ case 43: return "R_386_GOT32X";
+ }
+ break;
+ case EM_AARCH64:
+ switch(type) {
+ case 0: return "R_AARCH64_NONE";
+ case 257: return "R_AARCH64_ABS64";
+ case 258: return "R_AARCH64_ABS32";
+ case 259: return "R_AARCH64_ABS16";
+ case 260: return "R_AARCH64_PREL64";
+ case 261: return "R_AARCH64_PREL32";
+ case 262: return "R_AARCH64_PREL16";
+ case 263: return "R_AARCH64_MOVW_UABS_G0";
+ case 264: return "R_AARCH64_MOVW_UABS_G0_NC";
+ case 265: return "R_AARCH64_MOVW_UABS_G1";
+ case 266: return "R_AARCH64_MOVW_UABS_G1_NC";
+ case 267: return "R_AARCH64_MOVW_UABS_G2";
+ case 268: return "R_AARCH64_MOVW_UABS_G2_NC";
+ case 269: return "R_AARCH64_MOVW_UABS_G3";
+ case 270: return "R_AARCH64_MOVW_SABS_G0";
+ case 271: return "R_AARCH64_MOVW_SABS_G1";
+ case 272: return "R_AARCH64_MOVW_SABS_G2";
+ case 273: return "R_AARCH64_LD_PREL_LO19";
+ case 274: return "R_AARCH64_ADR_PREL_LO21";
+ case 275: return "R_AARCH64_ADR_PREL_PG_HI21";
+ case 276: return "R_AARCH64_ADR_PREL_PG_HI21_NC";
+ case 277: return "R_AARCH64_ADD_ABS_LO12_NC";
+ case 278: return "R_AARCH64_LDST8_ABS_LO12_NC";
+ case 279: return "R_AARCH64_TSTBR14";
+ case 280: return "R_AARCH64_CONDBR19";
+ case 282: return "R_AARCH64_JUMP26";
+ case 283: return "R_AARCH64_CALL26";
+ case 284: return "R_AARCH64_LDST16_ABS_LO12_NC";
+ case 285: return "R_AARCH64_LDST32_ABS_LO12_NC";
+ case 286: return "R_AARCH64_LDST64_ABS_LO12_NC";
+ case 287: return "R_AARCH64_MOVW_PREL_G0";
+ case 288: return "R_AARCH64_MOVW_PREL_G0_NC";
+ case 289: return "R_AARCH64_MOVW_PREL_G1";
+ case 290: return "R_AARCH64_MOVW_PREL_G1_NC";
+ case 291: return "R_AARCH64_MOVW_PREL_G2";
+ case 292: return "R_AARCH64_MOVW_PREL_G2_NC";
+ case 293: return "R_AARCH64_MOVW_PREL_G3";
+ case 299: return "R_AARCH64_LDST128_ABS_LO12_NC";
+ case 300: return "R_AARCH64_MOVW_GOTOFF_G0";
+ case 301: return "R_AARCH64_MOVW_GOTOFF_G0_NC";
+ case 302: return "R_AARCH64_MOVW_GOTOFF_G1";
+ case 303: return "R_AARCH64_MOVW_GOTOFF_G1_NC";
+ case 304: return "R_AARCH64_MOVW_GOTOFF_G2";
+ case 305: return "R_AARCH64_MOVW_GOTOFF_G2_NC";
+ case 306: return "R_AARCH64_MOVW_GOTOFF_G3";
+ case 307: return "R_AARCH64_GOTREL64";
+ case 308: return "R_AARCH64_GOTREL32";
+ case 309: return "R_AARCH64_GOT_LD_PREL19";
+ case 310: return "R_AARCH64_LD64_GOTOFF_LO15";
+ case 311: return "R_AARCH64_ADR_GOT_PAGE";
+ case 312: return "R_AARCH64_LD64_GOT_LO12_NC";
+ case 313: return "R_AARCH64_LD64_GOTPAGE_LO15";
+ case 560: return "R_AARCH64_TLSDESC_LD_PREL19";
+ case 561: return "R_AARCH64_TLSDESC_ADR_PREL21";
+ case 562: return "R_AARCH64_TLSDESC_ADR_PAGE21";
+ case 563: return "R_AARCH64_TLSDESC_LD64_LO12";
+ case 564: return "R_AARCH64_TLSDESC_ADD_LO12";
+ case 565: return "R_AARCH64_TLSDESC_OFF_G1";
+ case 566: return "R_AARCH64_TLSDESC_OFF_G0_NC";
+ case 567: return "R_AARCH64_TLSDESC_LDR";
+ case 568: return "R_AARCH64_TLSDESC_ADD";
+ case 569: return "R_AARCH64_TLSDESC_CALL";
+ case 1024: return "R_AARCH64_COPY";
+ case 1025: return "R_AARCH64_GLOB_DAT";
+ case 1026: return "R_AARCH64_JUMP_SLOT";
+ case 1027: return "R_AARCH64_RELATIVE";
+ case 1028: return "R_AARCH64_TLS_DTPREL64";
+ case 1029: return "R_AARCH64_TLS_DTPMOD64";
+ case 1030: return "R_AARCH64_TLS_TPREL64";
+ case 1031: return "R_AARCH64_TLSDESC";
+ case 1032: return "R_AARCH64_IRELATIVE";
+ }
+ break;
+ case EM_ARM:
+ switch(type) {
+ case 0: return "R_ARM_NONE";
+ case 1: return "R_ARM_PC24"; /* Deprecated */
+ case 2: return "R_ARM_ABS32";
+ case 3: return "R_ARM_REL32";
+ case 4: return "R_ARM_LDR_PC_G0"; /* Also R_ARM_PC13 */
+ case 5: return "R_ARM_ABS16";
+ case 6: return "R_ARM_ABS12";
+ case 7: return "R_ARM_THM_ABS5";
+ case 8: return "R_ARM_ABS8";
+ case 9: return "R_ARM_SBREL32";
+ case 10: return "R_ARM_THM_CALL"; /* Also R_ARM_THM_PC22 */
+ case 11: return "R_ARM_THM_PC8";
+ case 12: return "R_ARM_BREL_ADJ"; /* Also R_ARM_AMP_VCALL9 */
+ case 13: return "R_ARM_TLS_DESC"; /* Also R_ARM_SWI24 */
+ case 14: return "R_ARM_THM_SWI8"; /* Obsolete */
+ case 15: return "R_ARM_XPC25"; /* Obsolete */
+ case 16: return "R_ARM_THM_XPC22"; /* Obsolete */
+ case 17: return "R_ARM_TLS_DTPMOD32";
+ case 18: return "R_ARM_TLS_DTPOFF32";
+ case 19: return "R_ARM_TLS_TPOFF32";
+ case 20: return "R_ARM_COPY";
+ case 21: return "R_ARM_GLOB_DAT";
+ case 22: return "R_ARM_JUMP_SLOT";
+ case 23: return "R_ARM_RELATIVE";
+ case 24: return "R_ARM_GOTOFF32"; /* Also R_ARM_GOTOFF */
+ case 25: return "R_ARM_BASE_PREL"; /* GNU R_ARM_GOTPC */
+ case 26: return "R_ARM_GOT_BREL"; /* GNU R_ARM_GOT32 */
+ case 27: return "R_ARM_PLT32"; /* Deprecated */
+ case 28: return "R_ARM_CALL";
+ case 29: return "R_ARM_JUMP24";
+ case 30: return "R_ARM_THM_JUMP24";
+ case 31: return "R_ARM_BASE_ABS";
+ case 32: return "R_ARM_ALU_PCREL_7_0"; /* Obsolete */
+ case 33: return "R_ARM_ALU_PCREL_15_8"; /* Obsolete */
+ case 34: return "R_ARM_ALU_PCREL_23_15"; /* Obsolete */
+ case 35: return "R_ARM_LDR_SBREL_11_0_NC"; /* Deprecated */
+ case 36: return "R_ARM_ALU_SBREL_19_12_NC"; /* Deprecated */
+ case 37: return "R_ARM_ALU_SBREL_27_20_CK"; /* Deprecated */
+ case 38: return "R_ARM_TARGET1";
+ case 39: return "R_ARM_SBREL31"; /* Deprecated. */
+ case 40: return "R_ARM_V4BX";
+ case 41: return "R_ARM_TARGET2";
+ case 42: return "R_ARM_PREL31";
+ case 43: return "R_ARM_MOVW_ABS_NC";
+ case 44: return "R_ARM_MOVT_ABS";
+ case 45: return "R_ARM_MOVW_PREL_NC";
+ case 46: return "R_ARM_MOVT_PREL";
+ case 47: return "R_ARM_THM_MOVW_ABS_NC";
+ case 48: return "R_ARM_THM_MOVT_ABS";
+ case 49: return "R_ARM_THM_MOVW_PREL_NC";
+ case 50: return "R_ARM_THM_MOVT_PREL";
+ case 51: return "R_ARM_THM_JUMP19";
+ case 52: return "R_ARM_THM_JUMP6";
+ case 53: return "R_ARM_THM_ALU_PREL_11_0";
+ case 54: return "R_ARM_THM_PC12";
+ case 55: return "R_ARM_ABS32_NOI";
+ case 56: return "R_ARM_REL32_NOI";
+ case 57: return "R_ARM_ALU_PC_G0_NC";
+ case 58: return "R_ARM_ALU_PC_G0";
+ case 59: return "R_ARM_ALU_PC_G1_NC";
+ case 60: return "R_ARM_ALU_PC_G1";
+ case 61: return "R_ARM_ALU_PC_G2";
+ case 62: return "R_ARM_LDR_PC_G1";
+ case 63: return "R_ARM_LDR_PC_G2";
+ case 64: return "R_ARM_LDRS_PC_G0";
+ case 65: return "R_ARM_LDRS_PC_G1";
+ case 66: return "R_ARM_LDRS_PC_G2";
+ case 67: return "R_ARM_LDC_PC_G0";
+ case 68: return "R_ARM_LDC_PC_G1";
+ case 69: return "R_ARM_LDC_PC_G2";
+ case 70: return "R_ARM_ALU_SB_G0_NC";
+ case 71: return "R_ARM_ALU_SB_G0";
+ case 72: return "R_ARM_ALU_SB_G1_NC";
+ case 73: return "R_ARM_ALU_SB_G1";
+ case 74: return "R_ARM_ALU_SB_G2";
+ case 75: return "R_ARM_LDR_SB_G0";
+ case 76: return "R_ARM_LDR_SB_G1";
+ case 77: return "R_ARM_LDR_SB_G2";
+ case 78: return "R_ARM_LDRS_SB_G0";
+ case 79: return "R_ARM_LDRS_SB_G1";
+ case 80: return "R_ARM_LDRS_SB_G2";
+ case 81: return "R_ARM_LDC_SB_G0";
+ case 82: return "R_ARM_LDC_SB_G1";
+ case 83: return "R_ARM_LDC_SB_G2";
+ case 84: return "R_ARM_MOVW_BREL_NC";
+ case 85: return "R_ARM_MOVT_BREL";
+ case 86: return "R_ARM_MOVW_BREL";
+ case 87: return "R_ARM_THM_MOVW_BREL_NC";
+ case 88: return "R_ARM_THM_MOVT_BREL";
+ case 89: return "R_ARM_THM_MOVW_BREL";
+ case 90: return "R_ARM_TLS_GOTDESC";
+ case 91: return "R_ARM_TLS_CALL";
+ case 92: return "R_ARM_TLS_DESCSEQ";
+ case 93: return "R_ARM_THM_TLS_CALL";
+ case 94: return "R_ARM_PLT32_ABS";
+ case 95: return "R_ARM_GOT_ABS";
+ case 96: return "R_ARM_GOT_PREL";
+ case 97: return "R_ARM_GOT_BREL12";
+ case 98: return "R_ARM_GOTOFF12";
+ case 99: return "R_ARM_GOTRELAX";
+ case 100: return "R_ARM_GNU_VTENTRY";
+ case 101: return "R_ARM_GNU_VTINHERIT";
+ case 102: return "R_ARM_THM_JUMP11"; /* Also R_ARM_THM_PC11 */
+ case 103: return "R_ARM_THM_JUMP8"; /* Also R_ARM_THM_PC9 */
+ case 104: return "R_ARM_TLS_GD32";
+ case 105: return "R_ARM_TLS_LDM32";
+ case 106: return "R_ARM_TLS_LDO32";
+ case 107: return "R_ARM_TLS_IE32";
+ case 108: return "R_ARM_TLS_LE32";
+ case 109: return "R_ARM_TLS_LDO12";
+ case 110: return "R_ARM_TLS_LE12";
+ case 111: return "R_ARM_TLS_IE12GP";
+ /* 112-127 R_ARM_PRIVATE_<n> */
+ case 128: return "R_ARM_ME_TOO"; /* Obsolete */
+ case 129: return "R_ARM_THM_TLS_DESCSEQ16";
+ case 130: return "R_ARM_THM_TLS_DESCSEQ32";
+ case 131: return "R_ARM_THM_GOT_BREL12";
+ case 132: return "R_ARM_THM_ALU_ABS_G0_NC";
+ case 133: return "R_ARM_THM_ALU_ABS_G1_NC";
+ case 134: return "R_ARM_THM_ALU_ABS_G2_NC";
+ case 135: return "R_ARM_THM_ALU_ABS_G3";
+ /* 136-159 Reserved for future allocation. */
+ case 160: return "R_ARM_IRELATIVE";
+ /* 161-255 Reserved for future allocation. */
+ case 249: return "R_ARM_RXPC25";
+ case 250: return "R_ARM_RSBREL32";
+ case 251: return "R_ARM_THM_RPC22";
+ case 252: return "R_ARM_RREL32";
+ case 253: return "R_ARM_RABS32";
+ case 254: return "R_ARM_RPC24";
+ case 255: return "R_ARM_RBASE";
+ }
+ break;
+ case EM_IA_64:
+ switch(type) {
+ case 0: return "R_IA_64_NONE";
+ case 33: return "R_IA_64_IMM14";
+ case 34: return "R_IA_64_IMM22";
+ case 35: return "R_IA_64_IMM64";
+ case 36: return "R_IA_64_DIR32MSB";
+ case 37: return "R_IA_64_DIR32LSB";
+ case 38: return "R_IA_64_DIR64MSB";
+ case 39: return "R_IA_64_DIR64LSB";
+ case 42: return "R_IA_64_GPREL22";
+ case 43: return "R_IA_64_GPREL64I";
+ case 44: return "R_IA_64_GPREL32MSB";
+ case 45: return "R_IA_64_GPREL32LSB";
+ case 46: return "R_IA_64_GPREL64MSB";
+ case 47: return "R_IA_64_GPREL64LSB";
+ case 50: return "R_IA_64_LTOFF22";
+ case 51: return "R_IA_64_LTOFF64I";
+ case 58: return "R_IA_64_PLTOFF22";
+ case 59: return "R_IA_64_PLTOFF64I";
+ case 62: return "R_IA_64_PLTOFF64MSB";
+ case 63: return "R_IA_64_PLTOFF64LSB";
+ case 67: return "R_IA_64_FPTR64I";
+ case 68: return "R_IA_64_FPTR32MSB";
+ case 69: return "R_IA_64_FPTR32LSB";
+ case 70: return "R_IA_64_FPTR64MSB";
+ case 71: return "R_IA_64_FPTR64LSB";
+ case 72: return "R_IA_64_PCREL60B";
+ case 73: return "R_IA_64_PCREL21B";
+ case 74: return "R_IA_64_PCREL21M";
+ case 75: return "R_IA_64_PCREL21F";
+ case 76: return "R_IA_64_PCREL32MSB";
+ case 77: return "R_IA_64_PCREL32LSB";
+ case 78: return "R_IA_64_PCREL64MSB";
+ case 79: return "R_IA_64_PCREL64LSB";
+ case 82: return "R_IA_64_LTOFF_FPTR22";
+ case 83: return "R_IA_64_LTOFF_FPTR64I";
+ case 84: return "R_IA_64_LTOFF_FPTR32MSB";
+ case 85: return "R_IA_64_LTOFF_FPTR32LSB";
+ case 86: return "R_IA_64_LTOFF_FPTR64MSB";
+ case 87: return "R_IA_64_LTOFF_FPTR64LSB";
+ case 92: return "R_IA_64_SEGREL32MSB";
+ case 93: return "R_IA_64_SEGREL32LSB";
+ case 94: return "R_IA_64_SEGREL64MSB";
+ case 95: return "R_IA_64_SEGREL64LSB";
+ case 100: return "R_IA_64_SECREL32MSB";
+ case 101: return "R_IA_64_SECREL32LSB";
+ case 102: return "R_IA_64_SECREL64MSB";
+ case 103: return "R_IA_64_SECREL64LSB";
+ case 108: return "R_IA_64_REL32MSB";
+ case 109: return "R_IA_64_REL32LSB";
+ case 110: return "R_IA_64_REL64MSB";
+ case 111: return "R_IA_64_REL64LSB";
+ case 116: return "R_IA_64_LTV32MSB";
+ case 117: return "R_IA_64_LTV32LSB";
+ case 118: return "R_IA_64_LTV64MSB";
+ case 119: return "R_IA_64_LTV64LSB";
+ case 121: return "R_IA_64_PCREL21BI";
+ case 122: return "R_IA_64_PCREL22";
+ case 123: return "R_IA_64_PCREL64I";
+ case 128: return "R_IA_64_IPLTMSB";
+ case 129: return "R_IA_64_IPLTLSB";
+ case 133: return "R_IA_64_SUB";
+ case 134: return "R_IA_64_LTOFF22X";
+ case 135: return "R_IA_64_LDXMOV";
+ case 145: return "R_IA_64_TPREL14";
+ case 146: return "R_IA_64_TPREL22";
+ case 147: return "R_IA_64_TPREL64I";
+ case 150: return "R_IA_64_TPREL64MSB";
+ case 151: return "R_IA_64_TPREL64LSB";
+ case 154: return "R_IA_64_LTOFF_TPREL22";
+ case 166: return "R_IA_64_DTPMOD64MSB";
+ case 167: return "R_IA_64_DTPMOD64LSB";
+ case 170: return "R_IA_64_LTOFF_DTPMOD22";
+ case 177: return "R_IA_64_DTPREL14";
+ case 178: return "R_IA_64_DTPREL22";
+ case 179: return "R_IA_64_DTPREL64I";
+ case 180: return "R_IA_64_DTPREL32MSB";
+ case 181: return "R_IA_64_DTPREL32LSB";
+ case 182: return "R_IA_64_DTPREL64MSB";
+ case 183: return "R_IA_64_DTPREL64LSB";
+ case 186: return "R_IA_64_LTOFF_DTPREL22";
+ }
+ break;
+ case EM_MIPS:
+ switch(type) {
+ case 0: return "R_MIPS_NONE";
+ case 1: return "R_MIPS_16";
+ case 2: return "R_MIPS_32";
+ case 3: return "R_MIPS_REL32";
+ case 4: return "R_MIPS_26";
+ case 5: return "R_MIPS_HI16";
+ case 6: return "R_MIPS_LO16";
+ case 7: return "R_MIPS_GPREL16";
+ case 8: return "R_MIPS_LITERAL";
+ case 9: return "R_MIPS_GOT16";
+ case 10: return "R_MIPS_PC16";
+ case 11: return "R_MIPS_CALL16";
+ case 12: return "R_MIPS_GPREL32";
+ case 16: return "R_MIPS_SHIFT5";
+ case 17: return "R_MIPS_SHIFT6";
+ case 18: return "R_MIPS_64";
+ case 19: return "R_MIPS_GOT_DISP";
+ case 20: return "R_MIPS_GOT_PAGE";
+ case 21: return "R_MIPS_GOT_OFST";
+ case 22: return "R_MIPS_GOT_HI16";
+ case 23: return "R_MIPS_GOT_LO16";
+ case 24: return "R_MIPS_SUB";
+ case 30: return "R_MIPS_CALLHI16";
+ case 31: return "R_MIPS_CALLLO16";
+ case 37: return "R_MIPS_JALR";
+ case 38: return "R_MIPS_TLS_DTPMOD32";
+ case 39: return "R_MIPS_TLS_DTPREL32";
+ case 40: return "R_MIPS_TLS_DTPMOD64";
+ case 41: return "R_MIPS_TLS_DTPREL64";
+ case 42: return "R_MIPS_TLS_GD";
+ case 43: return "R_MIPS_TLS_LDM";
+ case 44: return "R_MIPS_TLS_DTPREL_HI16";
+ case 45: return "R_MIPS_TLS_DTPREL_LO16";
+ case 46: return "R_MIPS_TLS_GOTTPREL";
+ case 47: return "R_MIPS_TLS_TPREL32";
+ case 48: return "R_MIPS_TLS_TPREL64";
+ case 49: return "R_MIPS_TLS_TPREL_HI16";
+ case 50: return "R_MIPS_TLS_TPREL_LO16";
+ }
+ break;
+ case EM_PPC:
+ switch(type) {
+ case 0: return "R_PPC_NONE";
+ case 1: return "R_PPC_ADDR32";
+ case 2: return "R_PPC_ADDR24";
+ case 3: return "R_PPC_ADDR16";
+ case 4: return "R_PPC_ADDR16_LO";
+ case 5: return "R_PPC_ADDR16_HI";
+ case 6: return "R_PPC_ADDR16_HA";
+ case 7: return "R_PPC_ADDR14";
+ case 8: return "R_PPC_ADDR14_BRTAKEN";
+ case 9: return "R_PPC_ADDR14_BRNTAKEN";
+ case 10: return "R_PPC_REL24";
+ case 11: return "R_PPC_REL14";
+ case 12: return "R_PPC_REL14_BRTAKEN";
+ case 13: return "R_PPC_REL14_BRNTAKEN";
+ case 14: return "R_PPC_GOT16";
+ case 15: return "R_PPC_GOT16_LO";
+ case 16: return "R_PPC_GOT16_HI";
+ case 17: return "R_PPC_GOT16_HA";
+ case 18: return "R_PPC_PLTREL24";
+ case 19: return "R_PPC_COPY";
+ case 20: return "R_PPC_GLOB_DAT";
+ case 21: return "R_PPC_JMP_SLOT";
+ case 22: return "R_PPC_RELATIVE";
+ case 23: return "R_PPC_LOCAL24PC";
+ case 24: return "R_PPC_UADDR32";
+ case 25: return "R_PPC_UADDR16";
+ case 26: return "R_PPC_REL32";
+ case 27: return "R_PPC_PLT32";
+ case 28: return "R_PPC_PLTREL32";
+ case 29: return "R_PPC_PLT16_LO";
+ case 30: return "R_PPC_PLT16_HI";
+ case 31: return "R_PPC_PLT16_HA";
+ case 32: return "R_PPC_SDAREL16";
+ case 33: return "R_PPC_SECTOFF";
+ case 34: return "R_PPC_SECTOFF_LO";
+ case 35: return "R_PPC_SECTOFF_HI";
+ case 36: return "R_PPC_SECTOFF_HA";
+ case 67: return "R_PPC_TLS";
+ case 68: return "R_PPC_DTPMOD32";
+ case 69: return "R_PPC_TPREL16";
+ case 70: return "R_PPC_TPREL16_LO";
+ case 71: return "R_PPC_TPREL16_HI";
+ case 72: return "R_PPC_TPREL16_HA";
+ case 73: return "R_PPC_TPREL32";
+ case 74: return "R_PPC_DTPREL16";
+ case 75: return "R_PPC_DTPREL16_LO";
+ case 76: return "R_PPC_DTPREL16_HI";
+ case 77: return "R_PPC_DTPREL16_HA";
+ case 78: return "R_PPC_DTPREL32";
+ case 79: return "R_PPC_GOT_TLSGD16";
+ case 80: return "R_PPC_GOT_TLSGD16_LO";
+ case 81: return "R_PPC_GOT_TLSGD16_HI";
+ case 82: return "R_PPC_GOT_TLSGD16_HA";
+ case 83: return "R_PPC_GOT_TLSLD16";
+ case 84: return "R_PPC_GOT_TLSLD16_LO";
+ case 85: return "R_PPC_GOT_TLSLD16_HI";
+ case 86: return "R_PPC_GOT_TLSLD16_HA";
+ case 87: return "R_PPC_GOT_TPREL16";
+ case 88: return "R_PPC_GOT_TPREL16_LO";
+ case 89: return "R_PPC_GOT_TPREL16_HI";
+ case 90: return "R_PPC_GOT_TPREL16_HA";
+ case 101: return "R_PPC_EMB_NADDR32";
+ case 102: return "R_PPC_EMB_NADDR16";
+ case 103: return "R_PPC_EMB_NADDR16_LO";
+ case 104: return "R_PPC_EMB_NADDR16_HI";
+ case 105: return "R_PPC_EMB_NADDR16_HA";
+ case 106: return "R_PPC_EMB_SDAI16";
+ case 107: return "R_PPC_EMB_SDA2I16";
+ case 108: return "R_PPC_EMB_SDA2REL";
+ case 109: return "R_PPC_EMB_SDA21";
+ case 110: return "R_PPC_EMB_MRKREF";
+ case 111: return "R_PPC_EMB_RELSEC16";
+ case 112: return "R_PPC_EMB_RELST_LO";
+ case 113: return "R_PPC_EMB_RELST_HI";
+ case 114: return "R_PPC_EMB_RELST_HA";
+ case 115: return "R_PPC_EMB_BIT_FLD";
+ case 116: return "R_PPC_EMB_RELSDA";
+ }
+ break;
+ case EM_RISCV:
+ switch(type) {
+ case 0: return "R_RISCV_NONE";
+ case 1: return "R_RISCV_32";
+ case 2: return "R_RISCV_64";
+ case 3: return "R_RISCV_RELATIVE";
+ case 4: return "R_RISCV_COPY";
+ case 5: return "R_RISCV_JUMP_SLOT";
+ case 6: return "R_RISCV_TLS_DTPMOD32";
+ case 7: return "R_RISCV_TLS_DTPMOD64";
+ case 8: return "R_RISCV_TLS_DTPREL32";
+ case 9: return "R_RISCV_TLS_DTPREL64";
+ case 10: return "R_RISCV_TLS_TPREL32";
+ case 11: return "R_RISCV_TLS_TPREL64";
+ case 16: return "R_RISCV_BRANCH";
+ case 17: return "R_RISCV_JAL";
+ case 18: return "R_RISCV_CALL";
+ case 19: return "R_RISCV_CALL_PLT";
+ case 20: return "R_RISCV_GOT_HI20";
+ case 21: return "R_RISCV_TLS_GOT_HI20";
+ case 22: return "R_RISCV_TLS_GD_HI20";
+ case 23: return "R_RISCV_PCREL_HI20";
+ case 24: return "R_RISCV_PCREL_LO12_I";
+ case 25: return "R_RISCV_PCREL_LO12_S";
+ case 26: return "R_RISCV_HI20";
+ case 27: return "R_RISCV_LO12_I";
+ case 28: return "R_RISCV_LO12_S";
+ case 29: return "R_RISCV_TPREL_HI20";
+ case 30: return "R_RISCV_TPREL_LO12_I";
+ case 31: return "R_RISCV_TPREL_LO12_S";
+ case 32: return "R_RISCV_TPREL_ADD";
+ case 33: return "R_RISCV_ADD8";
+ case 34: return "R_RISCV_ADD16";
+ case 35: return "R_RISCV_ADD32";
+ case 36: return "R_RISCV_ADD64";
+ case 37: return "R_RISCV_SUB8";
+ case 38: return "R_RISCV_SUB16";
+ case 39: return "R_RISCV_SUB32";
+ case 40: return "R_RISCV_SUB64";
+ case 41: return "R_RISCV_GNU_VTINHERIT";
+ case 42: return "R_RISCV_GNU_VTENTRY";
+ case 43: return "R_RISCV_ALIGN";
+ case 44: return "R_RISCV_RVC_BRANCH";
+ case 45: return "R_RISCV_RVC_JUMP";
+ }
+ break;
+ case EM_SPARC:
+ case EM_SPARCV9:
+ switch(type) {
+ case 0: return "R_SPARC_NONE";
+ case 1: return "R_SPARC_8";
+ case 2: return "R_SPARC_16";
+ case 3: return "R_SPARC_32";
+ case 4: return "R_SPARC_DISP8";
+ case 5: return "R_SPARC_DISP16";
+ case 6: return "R_SPARC_DISP32";
+ case 7: return "R_SPARC_WDISP30";
+ case 8: return "R_SPARC_WDISP22";
+ case 9: return "R_SPARC_HI22";
+ case 10: return "R_SPARC_22";
+ case 11: return "R_SPARC_13";
+ case 12: return "R_SPARC_LO10";
+ case 13: return "R_SPARC_GOT10";
+ case 14: return "R_SPARC_GOT13";
+ case 15: return "R_SPARC_GOT22";
+ case 16: return "R_SPARC_PC10";
+ case 17: return "R_SPARC_PC22";
+ case 18: return "R_SPARC_WPLT30";
+ case 19: return "R_SPARC_COPY";
+ case 20: return "R_SPARC_GLOB_DAT";
+ case 21: return "R_SPARC_JMP_SLOT";
+ case 22: return "R_SPARC_RELATIVE";
+ case 23: return "R_SPARC_UA32";
+ case 24: return "R_SPARC_PLT32";
+ case 25: return "R_SPARC_HIPLT22";
+ case 26: return "R_SPARC_LOPLT10";
+ case 27: return "R_SPARC_PCPLT32";
+ case 28: return "R_SPARC_PCPLT22";
+ case 29: return "R_SPARC_PCPLT10";
+ case 30: return "R_SPARC_10";
+ case 31: return "R_SPARC_11";
+ case 32: return "R_SPARC_64";
+ case 33: return "R_SPARC_OLO10";
+ case 34: return "R_SPARC_HH22";
+ case 35: return "R_SPARC_HM10";
+ case 36: return "R_SPARC_LM22";
+ case 37: return "R_SPARC_PC_HH22";
+ case 38: return "R_SPARC_PC_HM10";
+ case 39: return "R_SPARC_PC_LM22";
+ case 40: return "R_SPARC_WDISP16";
+ case 41: return "R_SPARC_WDISP19";
+ case 42: return "R_SPARC_GLOB_JMP";
+ case 43: return "R_SPARC_7";
+ case 44: return "R_SPARC_5";
+ case 45: return "R_SPARC_6";
+ case 46: return "R_SPARC_DISP64";
+ case 47: return "R_SPARC_PLT64";
+ case 48: return "R_SPARC_HIX22";
+ case 49: return "R_SPARC_LOX10";
+ case 50: return "R_SPARC_H44";
+ case 51: return "R_SPARC_M44";
+ case 52: return "R_SPARC_L44";
+ case 53: return "R_SPARC_REGISTER";
+ case 54: return "R_SPARC_UA64";
+ case 55: return "R_SPARC_UA16";
+ case 56: return "R_SPARC_TLS_GD_HI22";
+ case 57: return "R_SPARC_TLS_GD_LO10";
+ case 58: return "R_SPARC_TLS_GD_ADD";
+ case 59: return "R_SPARC_TLS_GD_CALL";
+ case 60: return "R_SPARC_TLS_LDM_HI22";
+ case 61: return "R_SPARC_TLS_LDM_LO10";
+ case 62: return "R_SPARC_TLS_LDM_ADD";
+ case 63: return "R_SPARC_TLS_LDM_CALL";
+ case 64: return "R_SPARC_TLS_LDO_HIX22";
+ case 65: return "R_SPARC_TLS_LDO_LOX10";
+ case 66: return "R_SPARC_TLS_LDO_ADD";
+ case 67: return "R_SPARC_TLS_IE_HI22";
+ case 68: return "R_SPARC_TLS_IE_LO10";
+ case 69: return "R_SPARC_TLS_IE_LD";
+ case 70: return "R_SPARC_TLS_IE_LDX";
+ case 71: return "R_SPARC_TLS_IE_ADD";
+ case 72: return "R_SPARC_TLS_LE_HIX22";
+ case 73: return "R_SPARC_TLS_LE_LOX10";
+ case 74: return "R_SPARC_TLS_DTPMOD32";
+ case 75: return "R_SPARC_TLS_DTPMOD64";
+ case 76: return "R_SPARC_TLS_DTPOFF32";
+ case 77: return "R_SPARC_TLS_DTPOFF64";
+ case 78: return "R_SPARC_TLS_TPOFF32";
+ case 79: return "R_SPARC_TLS_TPOFF64";
+ }
+ break;
+ case EM_X86_64:
+ switch(type) {
+ case 0: return "R_X86_64_NONE";
+ case 1: return "R_X86_64_64";
+ case 2: return "R_X86_64_PC32";
+ case 3: return "R_X86_64_GOT32";
+ case 4: return "R_X86_64_PLT32";
+ case 5: return "R_X86_64_COPY";
+ case 6: return "R_X86_64_GLOB_DAT";
+ case 7: return "R_X86_64_JUMP_SLOT";
+ case 8: return "R_X86_64_RELATIVE";
+ case 9: return "R_X86_64_GOTPCREL";
+ case 10: return "R_X86_64_32";
+ case 11: return "R_X86_64_32S";
+ case 12: return "R_X86_64_16";
+ case 13: return "R_X86_64_PC16";
+ case 14: return "R_X86_64_8";
+ case 15: return "R_X86_64_PC8";
+ case 16: return "R_X86_64_DTPMOD64";
+ case 17: return "R_X86_64_DTPOFF64";
+ case 18: return "R_X86_64_TPOFF64";
+ case 19: return "R_X86_64_TLSGD";
+ case 20: return "R_X86_64_TLSLD";
+ case 21: return "R_X86_64_DTPOFF32";
+ case 22: return "R_X86_64_GOTTPOFF";
+ case 23: return "R_X86_64_TPOFF32";
+ case 24: return "R_X86_64_PC64";
+ case 25: return "R_X86_64_GOTOFF64";
+ case 26: return "R_X86_64_GOTPC32";
+ case 27: return "R_X86_64_GOT64";
+ case 28: return "R_X86_64_GOTPCREL64";
+ case 29: return "R_X86_64_GOTPC64";
+ case 30: return "R_X86_64_GOTPLT64";
+ case 31: return "R_X86_64_PLTOFF64";
+ case 32: return "R_X86_64_SIZE32";
+ case 33: return "R_X86_64_SIZE64";
+ case 34: return "R_X86_64_GOTPC32_TLSDESC";
+ case 35: return "R_X86_64_TLSDESC_CALL";
+ case 36: return "R_X86_64_TLSDESC";
+ case 37: return "R_X86_64_IRELATIVE";
+ case 38: return "R_X86_64_RELATIVE64";
+ case 41: return "R_X86_64_GOTPCRELX";
+ case 42: return "R_X86_64_REX_GOTPCRELX";
+ }
+ break;
+ }
+
+ snprintf(s_type, sizeof(s_type), "<unknown: %#x>", type);
+ return (s_type);
+}
diff --git a/contrib/elftoolchain/libelftc/libelftc.h b/contrib/elftoolchain/libelftc/libelftc.h
index e3adaf2..6c2b57a 100644
--- a/contrib/elftoolchain/libelftc/libelftc.h
+++ b/contrib/elftoolchain/libelftc/libelftc.h
@@ -24,7 +24,7 @@
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* $FreeBSD: users/kaiwang27/elftc/libelftc.h 392 2009-05-31 19:17:46Z kaiwang27 $
- * $Id: libelftc.h 3309 2016-01-10 09:10:51Z kaiwang27 $
+ * $Id: libelftc.h 3418 2016-02-19 20:04:42Z emaste $
*/
#ifndef _LIBELFTC_H_
@@ -75,6 +75,7 @@ unsigned int elftc_bfd_target_machine(Elftc_Bfd_Target *_tgt);
int elftc_copyfile(int _srcfd, int _dstfd);
int elftc_demangle(const char *_mangledname, char *_buffer,
size_t _bufsize, unsigned int _flags);
+const char *elftc_reloc_type_str(unsigned int mach, unsigned int type);
int elftc_set_timestamps(const char *_filename, struct stat *_sb);
Elftc_String_Table *elftc_string_table_create(int _hint);
void elftc_string_table_destroy(Elftc_String_Table *_table);
diff --git a/contrib/elftoolchain/libelftc/libelftc_dem_arm.c b/contrib/elftoolchain/libelftc/libelftc_dem_arm.c
index e850b8b..012819e 100644
--- a/contrib/elftoolchain/libelftc/libelftc_dem_arm.c
+++ b/contrib/elftoolchain/libelftc/libelftc_dem_arm.c
@@ -37,7 +37,7 @@
#include "_libelftc.h"
-ELFTC_VCSID("$Id: libelftc_dem_arm.c 2065 2011-10-26 15:24:47Z jkoshy $");
+ELFTC_VCSID("$Id: libelftc_dem_arm.c 3447 2016-05-03 13:32:23Z emaste $");
/**
* @file cpp_demangle_arm.c
@@ -1171,8 +1171,8 @@ read_type(struct demangle_data *d)
break;
default :
break;
- };
- };
+ }
+ }
if (ELFTC_ISDIGIT(*d->p))
return (read_class(d));
diff --git a/contrib/elftoolchain/libelftc/libelftc_dem_gnu2.c b/contrib/elftoolchain/libelftc/libelftc_dem_gnu2.c
index 4fe141b..5dff1ca 100644
--- a/contrib/elftoolchain/libelftc/libelftc_dem_gnu2.c
+++ b/contrib/elftoolchain/libelftc/libelftc_dem_gnu2.c
@@ -37,7 +37,7 @@
#include "_libelftc.h"
-ELFTC_VCSID("$Id: libelftc_dem_gnu2.c 2065 2011-10-26 15:24:47Z jkoshy $");
+ELFTC_VCSID("$Id: libelftc_dem_gnu2.c 3447 2016-05-03 13:32:23Z emaste $");
/**
* @file cpp_demangle_gnu2.c
@@ -135,7 +135,7 @@ cpp_demangle_gnu2(const char *org)
case ENCODE_OP_TI :
case ENCODE_OP_VT :
goto flat;
- };
+ }
if (*d.p == 'F')
++d.p;
@@ -315,7 +315,7 @@ is_cpp_mangled_gnu2(const char *org)
rtn |= true;
break;
- };
+ }
}
}
@@ -1308,8 +1308,8 @@ read_type(struct demangle_data *d)
break;
default :
break;
- };
- };
+ }
+ }
if (ELFTC_ISDIGIT(*d->p))
return (read_class(d));
diff --git a/contrib/elftoolchain/libelftc/libelftc_dem_gnu3.c b/contrib/elftoolchain/libelftc/libelftc_dem_gnu3.c
index f5ca7b3..7409363 100644
--- a/contrib/elftoolchain/libelftc/libelftc_dem_gnu3.c
+++ b/contrib/elftoolchain/libelftc/libelftc_dem_gnu3.c
@@ -36,7 +36,7 @@
#include "_libelftc.h"
-ELFTC_VCSID("$Id: libelftc_dem_gnu3.c 3291 2016-01-04 02:36:38Z emaste $");
+ELFTC_VCSID("$Id: libelftc_dem_gnu3.c 3447 2016-05-03 13:32:23Z emaste $");
/**
* @file cpp_demangle.c
@@ -553,7 +553,7 @@ cpp_demangle_push_type_qualifier(struct cpp_demangle_data *ddata,
free(buf);
++e_idx;
break;
- };
+ }
--idx;
}
@@ -714,7 +714,7 @@ cpp_demangle_read_expr_primary(struct cpp_demangle_data *ddata)
return (cpp_demangle_push_str(ddata, "true", 4));
default:
return (0);
- };
+ }
case 'd':
++ddata->cur;
@@ -764,7 +764,7 @@ cpp_demangle_read_expr_primary(struct cpp_demangle_data *ddata)
default:
return (0);
- };
+ }
}
static int
@@ -1039,14 +1039,14 @@ cpp_demangle_read_expression(struct cpp_demangle_data *ddata)
/* operator sizeof */
ddata->cur += 2;
return (cpp_demangle_read_expression_unary(ddata, "sizeof", 6));
- };
+ }
switch (*ddata->cur) {
case 'L':
return (cpp_demangle_read_expr_primary(ddata));
case 'T':
return (cpp_demangle_read_tmpl_param(ddata));
- };
+ }
return (0);
}
@@ -1421,7 +1421,7 @@ cpp_demangle_read_encoding(struct cpp_demangle_data *ddata)
if (*ddata->cur == '\0')
return (0);
break;
- };
+ }
return (cpp_demangle_read_name(ddata));
}
@@ -1493,7 +1493,7 @@ cpp_demangle_read_name(struct cpp_demangle_data *ddata)
return (cpp_demangle_read_nested_name(ddata));
case 'Z':
return (cpp_demangle_read_local_name(ddata));
- };
+ }
if (!vector_str_init(&v))
return (0);
@@ -1594,7 +1594,7 @@ cpp_demangle_read_nested_name(struct cpp_demangle_data *ddata)
case 'K':
ddata->mem_cst = true;
break;
- };
+ }
++ddata->cur;
}
@@ -1622,7 +1622,7 @@ cpp_demangle_read_nested_name(struct cpp_demangle_data *ddata)
default:
if (!cpp_demangle_read_uqname(ddata))
goto clean;
- };
+ }
if ((subst_str = vector_str_substr(output, p_idx,
output->size - 1, &subst_str_len)) == NULL)
@@ -1947,7 +1947,7 @@ cpp_demangle_read_subst(struct cpp_demangle_data *ddata)
case SIMPLE_HASH('S', 't'):
/* std:: */
return (cpp_demangle_read_subst_std(ddata));
- };
+ }
if (*(++ddata->cur) == '\0')
return (0);
@@ -2095,7 +2095,7 @@ cpp_demangle_read_tmpl_arg(struct cpp_demangle_data *ddata)
return (cpp_demangle_read_expr_primary(ddata));
case 'X':
return (cpp_demangle_read_expression(ddata));
- };
+ }
return (cpp_demangle_read_type(ddata, 0));
}
@@ -2576,7 +2576,7 @@ again:
goto clean;
++ddata->cur;
goto rtn;
- };
+ }
if (!cpp_demangle_read_name(ddata))
goto clean;
@@ -3040,7 +3040,7 @@ cpp_demangle_read_uqname(struct cpp_demangle_data *ddata)
return (0);
ddata->cur += 2;
return (1);
- };
+ }
/* vendor extened operator */
if (*ddata->cur == 'v' && ELFTC_ISDIGIT(*(ddata->cur + 1))) {
@@ -3086,7 +3086,7 @@ cpp_demangle_read_uqname(struct cpp_demangle_data *ddata)
return (0);
ddata->cur +=2;
return (1);
- };
+ }
/* source name */
if (ELFTC_ISDIGIT(*ddata->cur) != 0)
@@ -3449,7 +3449,7 @@ hex_to_dec(char c)
return (15);
default:
return (-1);
- };
+ }
}
/**
diff --git a/contrib/elftoolchain/libelftc/make-toolchain-version b/contrib/elftoolchain/libelftc/make-toolchain-version
index 8891258..0cdf370 100755
--- a/contrib/elftoolchain/libelftc/make-toolchain-version
+++ b/contrib/elftoolchain/libelftc/make-toolchain-version
@@ -3,7 +3,7 @@
# This script generates a project-wide version identifier for use by
# the `elftc_version()' API.
#
-# $Id: make-toolchain-version 3299 2016-01-09 19:58:46Z jkoshy $
+# $Id: make-toolchain-version 3414 2016-02-16 22:55:28Z jkoshy $
#
# Defaults.
@@ -64,19 +64,25 @@ done
curdir=`pwd`
cd ${top} || usage "ERROR: Cannot change directory to \"${top}\"."
-if [ -d .svn -o -d ../.svn ]; then # FreeBSD and SF.Net sources.
- versionstring=" svn:"$(svnversion)
-elif [ -d CVS ]; then # NetBSD.
+if [ -d CVS ]; then # Look for CVS (NetBSD).
versionstring=" cvs:unknown"
-else # DragonFlyBSD.
- versionstring=" git:"$(git describe --all --dirty --long 2> /dev/null)
-
- # Cannot determine an in-tree version number.
- if [ $? -ne 0 ]; then
- versionstring=""
+else # Try git (DragonFlyBSD).
+ gitversion="$(git describe --all --dirty --long 2> /dev/null)"
+ if [ -n "${gitversion}" ]; then
+ versionstring=" git:${gitversion}"
+ else # Assume an SVN checkout (SourceForge or FreeBSD).
+ svnversion="$(svnversion)"
+ if [ -n "${svnversion}" ]; then
+ versionstring=" svn:$(svnversion)"
+ fi
fi
fi
+if [ -z "${versionstring}" ]; then
+ echo "ERROR: cannot determine a revision number." 1>&2
+ exit 1
+fi
+
cd ${curdir} || usage "Cannot change back to ${curdir}."
#
diff --git a/contrib/elftoolchain/libpe/libpe_section.c b/contrib/elftoolchain/libpe/libpe_section.c
index 7ff63fb..bc1e6f6 100644
--- a/contrib/elftoolchain/libpe/libpe_section.c
+++ b/contrib/elftoolchain/libpe/libpe_section.c
@@ -33,7 +33,7 @@
#include "_libpe.h"
-ELFTC_VCSID("$Id: libpe_section.c 3312 2016-01-10 09:23:51Z kaiwang27 $");
+ELFTC_VCSID("$Id: libpe_section.c 3446 2016-05-03 01:31:17Z emaste $");
PE_Scn *
libpe_alloc_scn(PE *pe)
@@ -486,7 +486,7 @@ libpe_write_sections(PE *pe, off_t off)
/*
* Padding between sections. (padding always written
* in case the the section headers or sections are
- * moved or shrinked.)
+ * moved or shrunk.)
*/
assert(off <= sh->sh_rawptr);
if (off < sh->sh_rawptr)
diff --git a/contrib/elftoolchain/libpe/pe.h b/contrib/elftoolchain/libpe/pe.h
index 5b6130e..33969ed 100644
--- a/contrib/elftoolchain/libpe/pe.h
+++ b/contrib/elftoolchain/libpe/pe.h
@@ -23,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: pe.h 3312 2016-01-10 09:23:51Z kaiwang27 $
+ * $Id: pe.h 3441 2016-04-07 15:04:20Z emaste $
*/
#ifndef _PE_H_
@@ -88,6 +88,9 @@ typedef struct _PE_RichHdr {
#define IMAGE_FILE_MACHINE_POWERPC 0x1f0 /* Power PC LE */
#define IMAGE_FILE_MACHINE_POWERPCFP 0x1f1 /* Power PC floating point */
#define IMAGE_FILE_MACHINE_R4000 0x166 /* MIPS R4000 LE */
+#define IMAGE_FILE_MACHINE_RISCV32 0x5032 /* RISC-V 32-bit */
+#define IMAGE_FILE_MACHINE_RISCV64 0x5064 /* RISC-V 64-bit */
+#define IMAGE_FILE_MACHINE_RISCV128 0x5128 /* RISC-V 128-bit */
#define IMAGE_FILE_MACHINE_SH3 0x1a2 /* Hitachi SH3 */
#define IMAGE_FILE_MACHINE_SH3DSP 0x1a3 /* Hitachi SH3 DSP */
#define IMAGE_FILE_MACHINE_SH4 0x1a6 /* Hitachi SH4 */
diff --git a/contrib/elftoolchain/nm/nm.c b/contrib/elftoolchain/nm/nm.c
index 87a456e..ebb42ca 100644
--- a/contrib/elftoolchain/nm/nm.c
+++ b/contrib/elftoolchain/nm/nm.c
@@ -48,7 +48,7 @@
#include "_elftc.h"
-ELFTC_VCSID("$Id: nm.c 3179 2015-03-31 19:38:56Z emaste $");
+ELFTC_VCSID("$Id: nm.c 3472 2016-05-17 20:11:16Z emaste $");
/* symbol information list */
STAILQ_HEAD(sym_head, sym_entry);
@@ -790,7 +790,8 @@ is_sec_debug(const char *shname)
};
const char **p;
- assert(shname != NULL && "shname is NULL");
+ if (shname == NULL)
+ return (false);
for (p = dbg_sec; *p; p++) {
if (!strncmp(shname, *p, strlen(*p)))
@@ -1716,7 +1717,7 @@ sym_elem_print_all_sysv(char type, const char *sec, const GElf_Sym *sym,
case STT_NOTYPE:
default:
printf("%18s|", "NOTYPE");
- };
+ }
if (sym->st_size != 0)
nm_opts.size_print_fn(sym);
@@ -1945,7 +1946,7 @@ sym_list_print_each(struct sym_entry *ep, struct sym_print_data *p,
return;
sec = p->s_table[ep->sym->st_shndx];
break;
- };
+ }
nm_opts.elem_print_fn(type, sec, ep->sym, ep->name);
diff --git a/contrib/elftoolchain/readelf/readelf.c b/contrib/elftoolchain/readelf/readelf.c
index d8e44dd..79cb8b7 100644
--- a/contrib/elftoolchain/readelf/readelf.c
+++ b/contrib/elftoolchain/readelf/readelf.c
@@ -47,7 +47,7 @@
#include "_elftc.h"
-ELFTC_VCSID("$Id: readelf.c 3395 2016-02-10 16:29:44Z emaste $");
+ELFTC_VCSID("$Id: readelf.c 3469 2016-05-15 23:16:09Z emaste $");
/* Backwards compatability for older FreeBSD releases. */
#ifndef STB_GNU_UNIQUE
@@ -346,7 +346,6 @@ static const char *option_kind(uint8_t kind);
static const char *phdr_type(unsigned int ptype);
static const char *ppc_abi_fp(uint64_t fp);
static const char *ppc_abi_vector(uint64_t vec);
-static const char *r_type(unsigned int mach, unsigned int type);
static void readelf_usage(int status);
static void readelf_version(void);
static void search_loclist_at(struct readelf *re, Dwarf_Die die,
@@ -357,7 +356,8 @@ static void set_cu_context(struct readelf *re, Dwarf_Half psize,
Dwarf_Half osize, Dwarf_Half ver);
static const char *st_bind(unsigned int sbind);
static const char *st_shndx(unsigned int shndx);
-static const char *st_type(unsigned int mach, unsigned int stype);
+static const char *st_type(unsigned int mach, unsigned int os,
+ unsigned int stype);
static const char *st_vis(unsigned int svis);
static const char *top_tag(unsigned int tag);
static void unload_sections(struct readelf *re);
@@ -439,6 +439,7 @@ elf_osabi(unsigned int abi)
case ELFOSABI_OPENBSD: return "OpenBSD";
case ELFOSABI_OPENVMS: return "OpenVMS";
case ELFOSABI_NSK: return "NSK";
+ case ELFOSABI_CLOUDABI: return "CloudABI";
case ELFOSABI_ARM: return "ARM";
case ELFOSABI_STANDALONE: return "StandAlone";
default:
@@ -660,7 +661,7 @@ section_type(unsigned int mach, unsigned int stype)
switch (mach) {
case EM_X86_64:
switch (stype) {
- case SHT_AMD64_UNWIND: return "AMD64_UNWIND";
+ case SHT_X86_64_UNWIND: return "X86_64_UNWIND";
default:
break;
}
@@ -930,6 +931,8 @@ dt_type(unsigned int mach, unsigned int dtype)
case DT_SYMINSZ: return "SYMINSZ";
case DT_SYMINENT: return "SYMINENT";
case DT_GNU_HASH: return "GNU_HASH";
+ case DT_TLSDESC_PLT: return "DT_TLSDESC_PLT";
+ case DT_TLSDESC_GOT: return "DT_TLSDESC_GOT";
case DT_GNU_CONFLICT: return "GNU_CONFLICT";
case DT_GNU_LIBLIST: return "GNU_LIBLIST";
case DT_CONFIG: return "CONFIG";
@@ -981,7 +984,7 @@ st_bind(unsigned int sbind)
}
static const char *
-st_type(unsigned int mach, unsigned int stype)
+st_type(unsigned int mach, unsigned int os, unsigned int stype)
{
static char s_stype[32];
@@ -994,10 +997,13 @@ st_type(unsigned int mach, unsigned int stype)
case STT_COMMON: return "COMMON";
case STT_TLS: return "TLS";
default:
- if (stype >= STT_LOOS && stype <= STT_HIOS)
+ if (stype >= STT_LOOS && stype <= STT_HIOS) {
+ if ((os == ELFOSABI_GNU || os == ELFOSABI_FREEBSD) &&
+ stype == STT_GNU_IFUNC)
+ return "IFUNC";
snprintf(s_stype, sizeof(s_stype), "OS+%#x",
stype - STT_LOOS);
- else if (stype >= STT_LOPROC && stype <= STT_HIPROC) {
+ } else if (stype >= STT_LOPROC && stype <= STT_HIPROC) {
if (mach == EM_SPARCV9 && stype == STT_SPARC_REGISTER)
return "REGISTER";
snprintf(s_stype, sizeof(s_stype), "PROC+%#x",
@@ -1059,557 +1065,11 @@ static struct {
{"OS NONCONF", 'O', SHF_OS_NONCONFORMING},
{"GROUP", 'G', SHF_GROUP},
{"TLS", 'T', SHF_TLS},
+ {"COMPRESSED", 'C', SHF_COMPRESSED},
{NULL, 0, 0}
};
static const char *
-r_type(unsigned int mach, unsigned int type)
-{
- static char s_type[32];
-
- switch(mach) {
- case EM_386:
- case EM_IAMCU:
- switch(type) {
- case 0: return "R_386_NONE";
- case 1: return "R_386_32";
- case 2: return "R_386_PC32";
- case 3: return "R_386_GOT32";
- case 4: return "R_386_PLT32";
- case 5: return "R_386_COPY";
- case 6: return "R_386_GLOB_DAT";
- case 7: return "R_386_JUMP_SLOT";
- case 8: return "R_386_RELATIVE";
- case 9: return "R_386_GOTOFF";
- case 10: return "R_386_GOTPC";
- case 14: return "R_386_TLS_TPOFF";
- case 15: return "R_386_TLS_IE";
- case 16: return "R_386_TLS_GOTIE";
- case 17: return "R_386_TLS_LE";
- case 18: return "R_386_TLS_GD";
- case 19: return "R_386_TLS_LDM";
- case 24: return "R_386_TLS_GD_32";
- case 25: return "R_386_TLS_GD_PUSH";
- case 26: return "R_386_TLS_GD_CALL";
- case 27: return "R_386_TLS_GD_POP";
- case 28: return "R_386_TLS_LDM_32";
- case 29: return "R_386_TLS_LDM_PUSH";
- case 30: return "R_386_TLS_LDM_CALL";
- case 31: return "R_386_TLS_LDM_POP";
- case 32: return "R_386_TLS_LDO_32";
- case 33: return "R_386_TLS_IE_32";
- case 34: return "R_386_TLS_LE_32";
- case 35: return "R_386_TLS_DTPMOD32";
- case 36: return "R_386_TLS_DTPOFF32";
- case 37: return "R_386_TLS_TPOFF32";
- }
- break;
- case EM_AARCH64:
- switch(type) {
- case 0: return "R_AARCH64_NONE";
- case 257: return "R_AARCH64_ABS64";
- case 258: return "R_AARCH64_ABS32";
- case 259: return "R_AARCH64_ABS16";
- case 260: return "R_AARCH64_PREL64";
- case 261: return "R_AARCH64_PREL32";
- case 262: return "R_AARCH64_PREL16";
- case 263: return "R_AARCH64_MOVW_UABS_G0";
- case 264: return "R_AARCH64_MOVW_UABS_G0_NC";
- case 265: return "R_AARCH64_MOVW_UABS_G1";
- case 266: return "R_AARCH64_MOVW_UABS_G1_NC";
- case 267: return "R_AARCH64_MOVW_UABS_G2";
- case 268: return "R_AARCH64_MOVW_UABS_G2_NC";
- case 269: return "R_AARCH64_MOVW_UABS_G3";
- case 270: return "R_AARCH64_MOVW_SABS_G0";
- case 271: return "R_AARCH64_MOVW_SABS_G1";
- case 272: return "R_AARCH64_MOVW_SABS_G2";
- case 273: return "R_AARCH64_LD_PREL_LO19";
- case 274: return "R_AARCH64_ADR_PREL_LO21";
- case 275: return "R_AARCH64_ADR_PREL_PG_HI21";
- case 276: return "R_AARCH64_ADR_PREL_PG_HI21_NC";
- case 277: return "R_AARCH64_ADD_ABS_LO12_NC";
- case 278: return "R_AARCH64_LDST8_ABS_LO12_NC";
- case 279: return "R_AARCH64_TSTBR14";
- case 280: return "R_AARCH64_CONDBR19";
- case 282: return "R_AARCH64_JUMP26";
- case 283: return "R_AARCH64_CALL26";
- case 284: return "R_AARCH64_LDST16_ABS_LO12_NC";
- case 285: return "R_AARCH64_LDST32_ABS_LO12_NC";
- case 286: return "R_AARCH64_LDST64_ABS_LO12_NC";
- case 287: return "R_AARCH64_MOVW_PREL_G0";
- case 288: return "R_AARCH64_MOVW_PREL_G0_NC";
- case 289: return "R_AARCH64_MOVW_PREL_G1";
- case 290: return "R_AARCH64_MOVW_PREL_G1_NC";
- case 291: return "R_AARCH64_MOVW_PREL_G2";
- case 292: return "R_AARCH64_MOVW_PREL_G2_NC";
- case 293: return "R_AARCH64_MOVW_PREL_G3";
- case 299: return "R_AARCH64_LDST128_ABS_LO12_NC";
- case 300: return "R_AARCH64_MOVW_GOTOFF_G0";
- case 301: return "R_AARCH64_MOVW_GOTOFF_G0_NC";
- case 302: return "R_AARCH64_MOVW_GOTOFF_G1";
- case 303: return "R_AARCH64_MOVW_GOTOFF_G1_NC";
- case 304: return "R_AARCH64_MOVW_GOTOFF_G2";
- case 305: return "R_AARCH64_MOVW_GOTOFF_G2_NC";
- case 306: return "R_AARCH64_MOVW_GOTOFF_G3";
- case 307: return "R_AARCH64_GOTREL64";
- case 308: return "R_AARCH64_GOTREL32";
- case 309: return "R_AARCH64_GOT_LD_PREL19";
- case 310: return "R_AARCH64_LD64_GOTOFF_LO15";
- case 311: return "R_AARCH64_ADR_GOT_PAGE";
- case 312: return "R_AARCH64_LD64_GOT_LO12_NC";
- case 313: return "R_AARCH64_LD64_GOTPAGE_LO15";
- case 560: return "R_AARCH64_TLSDESC_LD_PREL19";
- case 561: return "R_AARCH64_TLSDESC_ADR_PREL21";
- case 562: return "R_AARCH64_TLSDESC_ADR_PAGE21";
- case 563: return "R_AARCH64_TLSDESC_LD64_LO12";
- case 564: return "R_AARCH64_TLSDESC_ADD_LO12";
- case 565: return "R_AARCH64_TLSDESC_OFF_G1";
- case 566: return "R_AARCH64_TLSDESC_OFF_G0_NC";
- case 567: return "R_AARCH64_TLSDESC_LDR";
- case 568: return "R_AARCH64_TLSDESC_ADD";
- case 569: return "R_AARCH64_TLSDESC_CALL";
- case 1024: return "R_AARCH64_COPY";
- case 1025: return "R_AARCH64_GLOB_DAT";
- case 1026: return "R_AARCH64_JUMP_SLOT";
- case 1027: return "R_AARCH64_RELATIVE";
- case 1028: return "R_AARCH64_TLS_DTPREL64";
- case 1029: return "R_AARCH64_TLS_DTPMOD64";
- case 1030: return "R_AARCH64_TLS_TPREL64";
- case 1031: return "R_AARCH64_TLSDESC";
- case 1032: return "R_AARCH64_IRELATIVE";
- }
- break;
- case EM_ARM:
- switch(type) {
- case 0: return "R_ARM_NONE";
- case 1: return "R_ARM_PC24";
- case 2: return "R_ARM_ABS32";
- case 3: return "R_ARM_REL32";
- case 4: return "R_ARM_PC13";
- case 5: return "R_ARM_ABS16";
- case 6: return "R_ARM_ABS12";
- case 7: return "R_ARM_THM_ABS5";
- case 8: return "R_ARM_ABS8";
- case 9: return "R_ARM_SBREL32";
- case 10: return "R_ARM_THM_PC22";
- case 11: return "R_ARM_THM_PC8";
- case 12: return "R_ARM_AMP_VCALL9";
- case 13: return "R_ARM_TLS_DESC";
- /* Obsolete R_ARM_SWI24 is also 13 */
- case 14: return "R_ARM_THM_SWI8";
- case 15: return "R_ARM_XPC25";
- case 16: return "R_ARM_THM_XPC22";
- case 17: return "R_ARM_TLS_DTPMOD32";
- case 18: return "R_ARM_TLS_DTPOFF32";
- case 19: return "R_ARM_TLS_TPOFF32";
- case 20: return "R_ARM_COPY";
- case 21: return "R_ARM_GLOB_DAT";
- case 22: return "R_ARM_JUMP_SLOT";
- case 23: return "R_ARM_RELATIVE";
- case 24: return "R_ARM_GOTOFF";
- case 25: return "R_ARM_GOTPC";
- case 26: return "R_ARM_GOT32";
- case 27: return "R_ARM_PLT32";
- case 28: return "R_ARM_CALL";
- case 29: return "R_ARM_JUMP24";
- case 30: return "R_ARM_THM_JUMP24";
- case 31: return "R_ARM_BASE_ABS";
- case 38: return "R_ARM_TARGET1";
- case 40: return "R_ARM_V4BX";
- case 42: return "R_ARM_PREL31";
- case 43: return "R_ARM_MOVW_ABS_NC";
- case 44: return "R_ARM_MOVT_ABS";
- case 45: return "R_ARM_MOVW_PREL_NC";
- case 46: return "R_ARM_MOVT_PREL";
- case 100: return "R_ARM_GNU_VTENTRY";
- case 101: return "R_ARM_GNU_VTINHERIT";
- case 250: return "R_ARM_RSBREL32";
- case 251: return "R_ARM_THM_RPC22";
- case 252: return "R_ARM_RREL32";
- case 253: return "R_ARM_RABS32";
- case 254: return "R_ARM_RPC24";
- case 255: return "R_ARM_RBASE";
- }
- break;
- case EM_IA_64:
- switch(type) {
- case 0: return "R_IA_64_NONE";
- case 33: return "R_IA_64_IMM14";
- case 34: return "R_IA_64_IMM22";
- case 35: return "R_IA_64_IMM64";
- case 36: return "R_IA_64_DIR32MSB";
- case 37: return "R_IA_64_DIR32LSB";
- case 38: return "R_IA_64_DIR64MSB";
- case 39: return "R_IA_64_DIR64LSB";
- case 42: return "R_IA_64_GPREL22";
- case 43: return "R_IA_64_GPREL64I";
- case 44: return "R_IA_64_GPREL32MSB";
- case 45: return "R_IA_64_GPREL32LSB";
- case 46: return "R_IA_64_GPREL64MSB";
- case 47: return "R_IA_64_GPREL64LSB";
- case 50: return "R_IA_64_LTOFF22";
- case 51: return "R_IA_64_LTOFF64I";
- case 58: return "R_IA_64_PLTOFF22";
- case 59: return "R_IA_64_PLTOFF64I";
- case 62: return "R_IA_64_PLTOFF64MSB";
- case 63: return "R_IA_64_PLTOFF64LSB";
- case 67: return "R_IA_64_FPTR64I";
- case 68: return "R_IA_64_FPTR32MSB";
- case 69: return "R_IA_64_FPTR32LSB";
- case 70: return "R_IA_64_FPTR64MSB";
- case 71: return "R_IA_64_FPTR64LSB";
- case 72: return "R_IA_64_PCREL60B";
- case 73: return "R_IA_64_PCREL21B";
- case 74: return "R_IA_64_PCREL21M";
- case 75: return "R_IA_64_PCREL21F";
- case 76: return "R_IA_64_PCREL32MSB";
- case 77: return "R_IA_64_PCREL32LSB";
- case 78: return "R_IA_64_PCREL64MSB";
- case 79: return "R_IA_64_PCREL64LSB";
- case 82: return "R_IA_64_LTOFF_FPTR22";
- case 83: return "R_IA_64_LTOFF_FPTR64I";
- case 84: return "R_IA_64_LTOFF_FPTR32MSB";
- case 85: return "R_IA_64_LTOFF_FPTR32LSB";
- case 86: return "R_IA_64_LTOFF_FPTR64MSB";
- case 87: return "R_IA_64_LTOFF_FPTR64LSB";
- case 92: return "R_IA_64_SEGREL32MSB";
- case 93: return "R_IA_64_SEGREL32LSB";
- case 94: return "R_IA_64_SEGREL64MSB";
- case 95: return "R_IA_64_SEGREL64LSB";
- case 100: return "R_IA_64_SECREL32MSB";
- case 101: return "R_IA_64_SECREL32LSB";
- case 102: return "R_IA_64_SECREL64MSB";
- case 103: return "R_IA_64_SECREL64LSB";
- case 108: return "R_IA_64_REL32MSB";
- case 109: return "R_IA_64_REL32LSB";
- case 110: return "R_IA_64_REL64MSB";
- case 111: return "R_IA_64_REL64LSB";
- case 116: return "R_IA_64_LTV32MSB";
- case 117: return "R_IA_64_LTV32LSB";
- case 118: return "R_IA_64_LTV64MSB";
- case 119: return "R_IA_64_LTV64LSB";
- case 121: return "R_IA_64_PCREL21BI";
- case 122: return "R_IA_64_PCREL22";
- case 123: return "R_IA_64_PCREL64I";
- case 128: return "R_IA_64_IPLTMSB";
- case 129: return "R_IA_64_IPLTLSB";
- case 133: return "R_IA_64_SUB";
- case 134: return "R_IA_64_LTOFF22X";
- case 135: return "R_IA_64_LDXMOV";
- case 145: return "R_IA_64_TPREL14";
- case 146: return "R_IA_64_TPREL22";
- case 147: return "R_IA_64_TPREL64I";
- case 150: return "R_IA_64_TPREL64MSB";
- case 151: return "R_IA_64_TPREL64LSB";
- case 154: return "R_IA_64_LTOFF_TPREL22";
- case 166: return "R_IA_64_DTPMOD64MSB";
- case 167: return "R_IA_64_DTPMOD64LSB";
- case 170: return "R_IA_64_LTOFF_DTPMOD22";
- case 177: return "R_IA_64_DTPREL14";
- case 178: return "R_IA_64_DTPREL22";
- case 179: return "R_IA_64_DTPREL64I";
- case 180: return "R_IA_64_DTPREL32MSB";
- case 181: return "R_IA_64_DTPREL32LSB";
- case 182: return "R_IA_64_DTPREL64MSB";
- case 183: return "R_IA_64_DTPREL64LSB";
- case 186: return "R_IA_64_LTOFF_DTPREL22";
- }
- break;
- case EM_MIPS:
- switch(type) {
- case 0: return "R_MIPS_NONE";
- case 1: return "R_MIPS_16";
- case 2: return "R_MIPS_32";
- case 3: return "R_MIPS_REL32";
- case 4: return "R_MIPS_26";
- case 5: return "R_MIPS_HI16";
- case 6: return "R_MIPS_LO16";
- case 7: return "R_MIPS_GPREL16";
- case 8: return "R_MIPS_LITERAL";
- case 9: return "R_MIPS_GOT16";
- case 10: return "R_MIPS_PC16";
- case 11: return "R_MIPS_CALL16";
- case 12: return "R_MIPS_GPREL32";
- case 21: return "R_MIPS_GOTHI16";
- case 22: return "R_MIPS_GOTLO16";
- case 30: return "R_MIPS_CALLHI16";
- case 31: return "R_MIPS_CALLLO16";
- case 38: return "R_MIPS_TLS_DTPMOD32";
- case 39: return "R_MIPS_TLS_DTPREL32";
- case 40: return "R_MIPS_TLS_DTPMOD64";
- case 41: return "R_MIPS_TLS_DTPREL64";
- case 42: return "R_MIPS_TLS_GD";
- case 43: return "R_MIPS_TLS_LDM";
- case 44: return "R_MIPS_TLS_DTPREL_HI16";
- case 45: return "R_MIPS_TLS_DTPREL_LO16";
- case 46: return "R_MIPS_TLS_GOTTPREL";
- case 47: return "R_MIPS_TLS_TPREL32";
- case 48: return "R_MIPS_TLS_TPREL64";
- case 49: return "R_MIPS_TLS_TPREL_HI16";
- case 50: return "R_MIPS_TLS_TPREL_LO16";
- }
- break;
- case EM_PPC:
- switch(type) {
- case 0: return "R_PPC_NONE";
- case 1: return "R_PPC_ADDR32";
- case 2: return "R_PPC_ADDR24";
- case 3: return "R_PPC_ADDR16";
- case 4: return "R_PPC_ADDR16_LO";
- case 5: return "R_PPC_ADDR16_HI";
- case 6: return "R_PPC_ADDR16_HA";
- case 7: return "R_PPC_ADDR14";
- case 8: return "R_PPC_ADDR14_BRTAKEN";
- case 9: return "R_PPC_ADDR14_BRNTAKEN";
- case 10: return "R_PPC_REL24";
- case 11: return "R_PPC_REL14";
- case 12: return "R_PPC_REL14_BRTAKEN";
- case 13: return "R_PPC_REL14_BRNTAKEN";
- case 14: return "R_PPC_GOT16";
- case 15: return "R_PPC_GOT16_LO";
- case 16: return "R_PPC_GOT16_HI";
- case 17: return "R_PPC_GOT16_HA";
- case 18: return "R_PPC_PLTREL24";
- case 19: return "R_PPC_COPY";
- case 20: return "R_PPC_GLOB_DAT";
- case 21: return "R_PPC_JMP_SLOT";
- case 22: return "R_PPC_RELATIVE";
- case 23: return "R_PPC_LOCAL24PC";
- case 24: return "R_PPC_UADDR32";
- case 25: return "R_PPC_UADDR16";
- case 26: return "R_PPC_REL32";
- case 27: return "R_PPC_PLT32";
- case 28: return "R_PPC_PLTREL32";
- case 29: return "R_PPC_PLT16_LO";
- case 30: return "R_PPC_PLT16_HI";
- case 31: return "R_PPC_PLT16_HA";
- case 32: return "R_PPC_SDAREL16";
- case 33: return "R_PPC_SECTOFF";
- case 34: return "R_PPC_SECTOFF_LO";
- case 35: return "R_PPC_SECTOFF_HI";
- case 36: return "R_PPC_SECTOFF_HA";
- case 67: return "R_PPC_TLS";
- case 68: return "R_PPC_DTPMOD32";
- case 69: return "R_PPC_TPREL16";
- case 70: return "R_PPC_TPREL16_LO";
- case 71: return "R_PPC_TPREL16_HI";
- case 72: return "R_PPC_TPREL16_HA";
- case 73: return "R_PPC_TPREL32";
- case 74: return "R_PPC_DTPREL16";
- case 75: return "R_PPC_DTPREL16_LO";
- case 76: return "R_PPC_DTPREL16_HI";
- case 77: return "R_PPC_DTPREL16_HA";
- case 78: return "R_PPC_DTPREL32";
- case 79: return "R_PPC_GOT_TLSGD16";
- case 80: return "R_PPC_GOT_TLSGD16_LO";
- case 81: return "R_PPC_GOT_TLSGD16_HI";
- case 82: return "R_PPC_GOT_TLSGD16_HA";
- case 83: return "R_PPC_GOT_TLSLD16";
- case 84: return "R_PPC_GOT_TLSLD16_LO";
- case 85: return "R_PPC_GOT_TLSLD16_HI";
- case 86: return "R_PPC_GOT_TLSLD16_HA";
- case 87: return "R_PPC_GOT_TPREL16";
- case 88: return "R_PPC_GOT_TPREL16_LO";
- case 89: return "R_PPC_GOT_TPREL16_HI";
- case 90: return "R_PPC_GOT_TPREL16_HA";
- case 101: return "R_PPC_EMB_NADDR32";
- case 102: return "R_PPC_EMB_NADDR16";
- case 103: return "R_PPC_EMB_NADDR16_LO";
- case 104: return "R_PPC_EMB_NADDR16_HI";
- case 105: return "R_PPC_EMB_NADDR16_HA";
- case 106: return "R_PPC_EMB_SDAI16";
- case 107: return "R_PPC_EMB_SDA2I16";
- case 108: return "R_PPC_EMB_SDA2REL";
- case 109: return "R_PPC_EMB_SDA21";
- case 110: return "R_PPC_EMB_MRKREF";
- case 111: return "R_PPC_EMB_RELSEC16";
- case 112: return "R_PPC_EMB_RELST_LO";
- case 113: return "R_PPC_EMB_RELST_HI";
- case 114: return "R_PPC_EMB_RELST_HA";
- case 115: return "R_PPC_EMB_BIT_FLD";
- case 116: return "R_PPC_EMB_RELSDA";
- }
- break;
- case EM_RISCV:
- switch(type) {
- case 0: return "R_RISCV_NONE";
- case 1: return "R_RISCV_32";
- case 2: return "R_RISCV_64";
- case 3: return "R_RISCV_RELATIVE";
- case 4: return "R_RISCV_COPY";
- case 5: return "R_RISCV_JUMP_SLOT";
- case 6: return "R_RISCV_TLS_DTPMOD32";
- case 7: return "R_RISCV_TLS_DTPMOD64";
- case 8: return "R_RISCV_TLS_DTPREL32";
- case 9: return "R_RISCV_TLS_DTPREL64";
- case 10: return "R_RISCV_TLS_TPREL32";
- case 11: return "R_RISCV_TLS_TPREL64";
- case 16: return "R_RISCV_BRANCH";
- case 17: return "R_RISCV_JAL";
- case 18: return "R_RISCV_CALL";
- case 19: return "R_RISCV_CALL_PLT";
- case 20: return "R_RISCV_GOT_HI20";
- case 21: return "R_RISCV_TLS_GOT_HI20";
- case 22: return "R_RISCV_TLS_GD_HI20";
- case 23: return "R_RISCV_PCREL_HI20";
- case 24: return "R_RISCV_PCREL_LO12_I";
- case 25: return "R_RISCV_PCREL_LO12_S";
- case 26: return "R_RISCV_HI20";
- case 27: return "R_RISCV_LO12_I";
- case 28: return "R_RISCV_LO12_S";
- case 29: return "R_RISCV_TPREL_HI20";
- case 30: return "R_RISCV_TPREL_LO12_I";
- case 31: return "R_RISCV_TPREL_LO12_S";
- case 32: return "R_RISCV_TPREL_ADD";
- case 33: return "R_RISCV_ADD8";
- case 34: return "R_RISCV_ADD16";
- case 35: return "R_RISCV_ADD32";
- case 36: return "R_RISCV_ADD64";
- case 37: return "R_RISCV_SUB8";
- case 38: return "R_RISCV_SUB16";
- case 39: return "R_RISCV_SUB32";
- case 40: return "R_RISCV_SUB64";
- case 41: return "R_RISCV_GNU_VTINHERIT";
- case 42: return "R_RISCV_GNU_VTENTRY";
- case 43: return "R_RISCV_ALIGN";
- case 44: return "R_RISCV_RVC_BRANCH";
- case 45: return "R_RISCV_RVC_JUMP";
- }
- break;
- case EM_SPARC:
- case EM_SPARCV9:
- switch(type) {
- case 0: return "R_SPARC_NONE";
- case 1: return "R_SPARC_8";
- case 2: return "R_SPARC_16";
- case 3: return "R_SPARC_32";
- case 4: return "R_SPARC_DISP8";
- case 5: return "R_SPARC_DISP16";
- case 6: return "R_SPARC_DISP32";
- case 7: return "R_SPARC_WDISP30";
- case 8: return "R_SPARC_WDISP22";
- case 9: return "R_SPARC_HI22";
- case 10: return "R_SPARC_22";
- case 11: return "R_SPARC_13";
- case 12: return "R_SPARC_LO10";
- case 13: return "R_SPARC_GOT10";
- case 14: return "R_SPARC_GOT13";
- case 15: return "R_SPARC_GOT22";
- case 16: return "R_SPARC_PC10";
- case 17: return "R_SPARC_PC22";
- case 18: return "R_SPARC_WPLT30";
- case 19: return "R_SPARC_COPY";
- case 20: return "R_SPARC_GLOB_DAT";
- case 21: return "R_SPARC_JMP_SLOT";
- case 22: return "R_SPARC_RELATIVE";
- case 23: return "R_SPARC_UA32";
- case 24: return "R_SPARC_PLT32";
- case 25: return "R_SPARC_HIPLT22";
- case 26: return "R_SPARC_LOPLT10";
- case 27: return "R_SPARC_PCPLT32";
- case 28: return "R_SPARC_PCPLT22";
- case 29: return "R_SPARC_PCPLT10";
- case 30: return "R_SPARC_10";
- case 31: return "R_SPARC_11";
- case 32: return "R_SPARC_64";
- case 33: return "R_SPARC_OLO10";
- case 34: return "R_SPARC_HH22";
- case 35: return "R_SPARC_HM10";
- case 36: return "R_SPARC_LM22";
- case 37: return "R_SPARC_PC_HH22";
- case 38: return "R_SPARC_PC_HM10";
- case 39: return "R_SPARC_PC_LM22";
- case 40: return "R_SPARC_WDISP16";
- case 41: return "R_SPARC_WDISP19";
- case 42: return "R_SPARC_GLOB_JMP";
- case 43: return "R_SPARC_7";
- case 44: return "R_SPARC_5";
- case 45: return "R_SPARC_6";
- case 46: return "R_SPARC_DISP64";
- case 47: return "R_SPARC_PLT64";
- case 48: return "R_SPARC_HIX22";
- case 49: return "R_SPARC_LOX10";
- case 50: return "R_SPARC_H44";
- case 51: return "R_SPARC_M44";
- case 52: return "R_SPARC_L44";
- case 53: return "R_SPARC_REGISTER";
- case 54: return "R_SPARC_UA64";
- case 55: return "R_SPARC_UA16";
- case 56: return "R_SPARC_TLS_GD_HI22";
- case 57: return "R_SPARC_TLS_GD_LO10";
- case 58: return "R_SPARC_TLS_GD_ADD";
- case 59: return "R_SPARC_TLS_GD_CALL";
- case 60: return "R_SPARC_TLS_LDM_HI22";
- case 61: return "R_SPARC_TLS_LDM_LO10";
- case 62: return "R_SPARC_TLS_LDM_ADD";
- case 63: return "R_SPARC_TLS_LDM_CALL";
- case 64: return "R_SPARC_TLS_LDO_HIX22";
- case 65: return "R_SPARC_TLS_LDO_LOX10";
- case 66: return "R_SPARC_TLS_LDO_ADD";
- case 67: return "R_SPARC_TLS_IE_HI22";
- case 68: return "R_SPARC_TLS_IE_LO10";
- case 69: return "R_SPARC_TLS_IE_LD";
- case 70: return "R_SPARC_TLS_IE_LDX";
- case 71: return "R_SPARC_TLS_IE_ADD";
- case 72: return "R_SPARC_TLS_LE_HIX22";
- case 73: return "R_SPARC_TLS_LE_LOX10";
- case 74: return "R_SPARC_TLS_DTPMOD32";
- case 75: return "R_SPARC_TLS_DTPMOD64";
- case 76: return "R_SPARC_TLS_DTPOFF32";
- case 77: return "R_SPARC_TLS_DTPOFF64";
- case 78: return "R_SPARC_TLS_TPOFF32";
- case 79: return "R_SPARC_TLS_TPOFF64";
- }
- break;
- case EM_X86_64:
- switch(type) {
- case 0: return "R_X86_64_NONE";
- case 1: return "R_X86_64_64";
- case 2: return "R_X86_64_PC32";
- case 3: return "R_X86_64_GOT32";
- case 4: return "R_X86_64_PLT32";
- case 5: return "R_X86_64_COPY";
- case 6: return "R_X86_64_GLOB_DAT";
- case 7: return "R_X86_64_JUMP_SLOT";
- case 8: return "R_X86_64_RELATIVE";
- case 9: return "R_X86_64_GOTPCREL";
- case 10: return "R_X86_64_32";
- case 11: return "R_X86_64_32S";
- case 12: return "R_X86_64_16";
- case 13: return "R_X86_64_PC16";
- case 14: return "R_X86_64_8";
- case 15: return "R_X86_64_PC8";
- case 16: return "R_X86_64_DTPMOD64";
- case 17: return "R_X86_64_DTPOFF64";
- case 18: return "R_X86_64_TPOFF64";
- case 19: return "R_X86_64_TLSGD";
- case 20: return "R_X86_64_TLSLD";
- case 21: return "R_X86_64_DTPOFF32";
- case 22: return "R_X86_64_GOTTPOFF";
- case 23: return "R_X86_64_TPOFF32";
- case 24: return "R_X86_64_PC64";
- case 25: return "R_X86_64_GOTOFF64";
- case 26: return "R_X86_64_GOTPC32";
- case 27: return "R_X86_64_GOT64";
- case 28: return "R_X86_64_GOTPCREL64";
- case 29: return "R_X86_64_GOTPC64";
- case 30: return "R_X86_64_GOTPLT64";
- case 31: return "R_X86_64_PLTOFF64";
- case 32: return "R_X86_64_SIZE32";
- case 33: return "R_X86_64_SIZE64";
- case 34: return "R_X86_64_GOTPC32_TLSDESC";
- case 35: return "R_X86_64_TLSDESC_CALL";
- case 36: return "R_X86_64_TLSDESC";
- case 37: return "R_X86_64_IRELATIVE";
- }
- break;
- }
-
- snprintf(s_type, sizeof(s_type), "<unknown: %#x>", type);
- return (s_type);
-}
-
-static const char *
note_type(const char *name, unsigned int et, unsigned int nt)
{
if ((strcmp(name, "CORE") == 0 || strcmp(name, "LINUX") == 0) &&
@@ -3312,11 +2772,11 @@ dump_rel(struct readelf *re, struct section *s, Elf_Data *d)
#define REL_HDR "r_offset", "r_info", "r_type", "st_value", "st_name"
#define REL_CT32 (uintmax_t)r.r_offset, (uintmax_t)r.r_info, \
- r_type(re->ehdr.e_machine, ELF32_R_TYPE(r.r_info)), \
- (uintmax_t)symval, symname
+ elftc_reloc_type_str(re->ehdr.e_machine, \
+ ELF32_R_TYPE(r.r_info)), (uintmax_t)symval, symname
#define REL_CT64 (uintmax_t)r.r_offset, (uintmax_t)r.r_info, \
- r_type(re->ehdr.e_machine, ELF64_R_TYPE(r.r_info)), \
- (uintmax_t)symval, symname
+ elftc_reloc_type_str(re->ehdr.e_machine, \
+ ELF64_R_TYPE(r.r_info)), (uintmax_t)symval, symname
printf("\nRelocation section (%s):\n", s->name);
if (re->ec == ELFCLASS32)
@@ -3369,11 +2829,11 @@ dump_rela(struct readelf *re, struct section *s, Elf_Data *d)
#define RELA_HDR "r_offset", "r_info", "r_type", "st_value", \
"st_name + r_addend"
#define RELA_CT32 (uintmax_t)r.r_offset, (uintmax_t)r.r_info, \
- r_type(re->ehdr.e_machine, ELF32_R_TYPE(r.r_info)), \
- (uintmax_t)symval, symname
+ elftc_reloc_type_str(re->ehdr.e_machine, \
+ ELF32_R_TYPE(r.r_info)), (uintmax_t)symval, symname
#define RELA_CT64 (uintmax_t)r.r_offset, (uintmax_t)r.r_info, \
- r_type(re->ehdr.e_machine, ELF64_R_TYPE(r.r_info)), \
- (uintmax_t)symval, symname
+ elftc_reloc_type_str(re->ehdr.e_machine, \
+ ELF64_R_TYPE(r.r_info)), (uintmax_t)symval, symname
printf("\nRelocation section with addend (%s):\n", s->name);
if (re->ec == ELFCLASS32)
@@ -3480,7 +2940,7 @@ dump_symtab(struct readelf *re, int i)
printf(" %16.16jx", (uintmax_t) sym.st_value);
printf(" %5ju", (uintmax_t) sym.st_size);
printf(" %-7s", st_type(re->ehdr.e_machine,
- GELF_ST_TYPE(sym.st_info)));
+ re->ehdr.e_ident[EI_OSABI], GELF_ST_TYPE(sym.st_info)));
printf(" %-6s", st_bind(GELF_ST_BIND(sym.st_info)));
printf(" %-8s", st_vis(GELF_ST_VISIBILITY(sym.st_other)));
printf(" %3s", st_shndx(sym.st_shndx));
@@ -3731,6 +3191,10 @@ dump_gnu_hash(struct readelf *re, struct section *s)
ds = &re->sl[s->link];
if (!get_ent_count(ds, &dynsymcount))
return;
+ if (symndx >= (uint32_t)dynsymcount) {
+ warnx("Malformed .gnu.hash section (symndx out of range)");
+ return;
+ }
nchain = dynsymcount - symndx;
if (d->d_size != 4 * sizeof(uint32_t) + maskwords *
(re->ec == ELFCLASS32 ? sizeof(uint32_t) : sizeof(uint64_t)) +
@@ -3796,7 +3260,7 @@ dump_notes(struct readelf *re)
const char *rawfile;
GElf_Phdr phdr;
Elf_Data *d;
- size_t phnum;
+ size_t filesize, phnum;
int i, elferr;
if (re->ehdr.e_type == ET_CORE) {
@@ -3810,7 +3274,7 @@ dump_notes(struct readelf *re)
}
if (phnum == 0)
return;
- if ((rawfile = elf_rawfile(re->elf, NULL)) == NULL) {
+ if ((rawfile = elf_rawfile(re->elf, &filesize)) == NULL) {
warnx("elf_rawfile failed: %s", elf_errmsg(-1));
return;
}
@@ -3820,9 +3284,15 @@ dump_notes(struct readelf *re)
elf_errmsg(-1));
continue;
}
- if (phdr.p_type == PT_NOTE)
+ if (phdr.p_type == PT_NOTE) {
+ if (phdr.p_offset >= filesize ||
+ phdr.p_filesz > filesize - phdr.p_offset) {
+ warnx("invalid PHDR offset");
+ continue;
+ }
dump_notes_content(re, rawfile + phdr.p_offset,
phdr.p_filesz, phdr.p_offset);
+ }
}
} else {
@@ -6815,9 +6285,12 @@ get_symbol_name(struct readelf *re, int symtab, int i)
if (gelf_getsym(data, i, &sym) != &sym)
return ("");
/* Return section name for STT_SECTION symbol. */
- if (GELF_ST_TYPE(sym.st_info) == STT_SECTION &&
- re->sl[sym.st_shndx].name != NULL)
- return (re->sl[sym.st_shndx].name);
+ if (GELF_ST_TYPE(sym.st_info) == STT_SECTION) {
+ if (sym.st_shndx < re->shnum &&
+ re->sl[sym.st_shndx].name != NULL)
+ return (re->sl[sym.st_shndx].name);
+ return ("");
+ }
if (s->link >= re->shnum ||
(name = elf_strptr(re->elf, s->link, sym.st_name)) == NULL)
return ("");
diff --git a/contrib/elftoolchain/size/size.c b/contrib/elftoolchain/size/size.c
index cdbe3e4..e3a6ce4 100644
--- a/contrib/elftoolchain/size/size.c
+++ b/contrib/elftoolchain/size/size.c
@@ -38,7 +38,7 @@
#include "_elftc.h"
-ELFTC_VCSID("$Id: size.c 3242 2015-08-07 12:47:11Z emaste $");
+ELFTC_VCSID("$Id: size.c 3458 2016-05-09 15:01:25Z emaste $");
#define BUF_SIZE 1024
#define ELF_ALIGN(val,x) (((val)+(x)-1) & ~((x)-1))
@@ -262,7 +262,7 @@ static void
handle_core_note(Elf *elf, GElf_Ehdr *elfhdr, GElf_Phdr *phdr,
char **cmd_line)
{
- size_t max_size;
+ size_t max_size, segment_end;
uint64_t raw_size;
GElf_Off offset;
static pid_t pid;
@@ -276,7 +276,13 @@ handle_core_note(Elf *elf, GElf_Ehdr *elfhdr, GElf_Phdr *phdr,
data = elf_rawfile(elf, &max_size);
offset = phdr->p_offset;
- while (data != NULL && offset < phdr->p_offset + phdr->p_filesz) {
+ if (offset >= max_size || phdr->p_filesz > max_size - offset) {
+ warnx("invalid PHDR offset");
+ return;
+ }
+ segment_end = phdr->p_offset + phdr->p_filesz;
+
+ while (data != NULL && offset + sizeof(Elf32_Nhdr) < segment_end) {
nhdr = (Elf32_Nhdr *)(uintptr_t)((char*)data + offset);
memset(&nhdr_l, 0, sizeof(Elf32_Nhdr));
if (!xlatetom(elf, elfhdr, &nhdr->n_type, &nhdr_l.n_type,
@@ -287,6 +293,13 @@ handle_core_note(Elf *elf, GElf_Ehdr *elfhdr, GElf_Phdr *phdr,
ELF_T_WORD, sizeof(Elf32_Word)))
break;
+ if (offset + sizeof(Elf32_Nhdr) +
+ ELF_ALIGN(nhdr_l.n_namesz, 4) +
+ ELF_ALIGN(nhdr_l.n_descsz, 4) >= segment_end) {
+ warnx("invalid note header");
+ return;
+ }
+
name = (char *)((char *)nhdr + sizeof(Elf32_Nhdr));
switch (nhdr_l.n_type) {
case NT_PRSTATUS: {
@@ -428,8 +441,8 @@ handle_core_note(Elf *elf, GElf_Ehdr *elfhdr, GElf_Phdr *phdr,
}
/*
- * Handles program headers except for PT_NOTE, when sysv output stlye is
- * choosen, prints out the segment name and length. For berkely output
+ * Handles program headers except for PT_NOTE, when sysv output style is
+ * chosen, prints out the segment name and length. For berkely output
* style only PT_LOAD segments are handled, and text,
* data, bss size is calculated for them.
*/
@@ -600,7 +613,7 @@ handle_elf(char const *name)
elf_cmd = elf_next(elf);
(void) elf_end(elf);
warnx("%s: File format not recognized",
- arhdr->ar_name);
+ arhdr != NULL ? arhdr->ar_name : name);
continue;
}
/* Core dumps are handled separately */
@@ -739,7 +752,7 @@ berkeley_calc(GElf_Shdr *shdr)
static void
berkeley_totals(void)
{
- long unsigned int grand_total;
+ uint64_t grand_total;
grand_total = text_size_total + data_size_total + bss_size_total;
tbl_append();
diff --git a/contrib/elftoolchain/strings/strings.c b/contrib/elftoolchain/strings/strings.c
index f122eba..8de29ca 100644
--- a/contrib/elftoolchain/strings/strings.c
+++ b/contrib/elftoolchain/strings/strings.c
@@ -46,7 +46,7 @@
#include "_elftc.h"
-ELFTC_VCSID("$Id: strings.c 3360 2016-01-24 18:34:06Z jkoshy $");
+ELFTC_VCSID("$Id: strings.c 3446 2016-05-03 01:31:17Z emaste $");
enum return_code {
RETURN_OK,
@@ -258,7 +258,7 @@ handle_elf(const char *name, int fd)
int rc;
rc = RETURN_OK;
- /* If entire file is choosen, treat it as a binary file */
+ /* If entire file is chosen, treat it as a binary file */
if (entire_file)
return (handle_binary(name, fd));
OpenPOWER on IntegriCloud