summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoremaste <emaste@FreeBSD.org>2016-05-19 20:06:56 +0000
committeremaste <emaste@FreeBSD.org>2016-05-19 20:06:56 +0000
commitdb27a04d331bc804aa12a4a70e9e0d939f3773c0 (patch)
tree5d850df4522f52e077ecb35866e624861ceeb1f6
parent8629882318b420fa69066d106434be2c546b649f (diff)
downloadFreeBSD-src-db27a04d331bc804aa12a4a70e9e0d939f3773c0.zip
FreeBSD-src-db27a04d331bc804aa12a4a70e9e0d939f3773c0.tar.gz
Import ELF Tool Chain snapshot at revision 3475
From http://svn.code.sf.net/p/elftoolchain/code/
-rw-r--r--addr2line/addr2line.c4
-rw-r--r--brandelf/brandelf.c3
-rw-r--r--common/_elftc.h4
-rw-r--r--common/elfdefinitions.h85
-rw-r--r--cxxfilt/cxxfilt.c54
-rw-r--r--elfcopy/ascii.c4
-rw-r--r--elfcopy/binary.c9
-rw-r--r--elfcopy/elfcopy.119
-rw-r--r--elfcopy/elfcopy.h9
-rw-r--r--elfcopy/main.c19
-rw-r--r--elfcopy/sections.c22
-rw-r--r--elfcopy/segments.c277
-rw-r--r--elfcopy/symbols.c8
-rw-r--r--elfdump/elfdump.c702
-rw-r--r--findtextrel/findtextrel.c10
-rw-r--r--ld/Makefile4
-rw-r--r--ld/amd64.c47
-rw-r--r--ld/i386.c52
-rw-r--r--ld/ld.1478
-rw-r--r--ld/ld_options.c12
-rw-r--r--ld/ld_options.h4
-rw-r--r--libdwarf/libdwarf_abbrev.c6
-rw-r--r--libdwarf/libdwarf_elf_init.c101
-rw-r--r--libelf/_libelf_config.h8
-rw-r--r--libelf/elf_data.c6
-rw-r--r--libelf/libelf_ar.c4
-rw-r--r--libelf/libelf_convert.m43
-rw-r--r--libelftc/Makefile4
-rw-r--r--libelftc/elftc_reloc_type_str.372
-rw-r--r--libelftc/elftc_reloc_type_str.c684
-rw-r--r--libelftc/libelftc.h3
-rw-r--r--libelftc/libelftc_dem_arm.c6
-rw-r--r--libelftc/libelftc_dem_gnu2.c10
-rw-r--r--libelftc/libelftc_dem_gnu3.c32
-rwxr-xr-xlibelftc/make-toolchain-version26
-rw-r--r--libpe/libpe_section.c4
-rw-r--r--libpe/pe.h5
-rw-r--r--nm/nm.c9
-rw-r--r--readelf/readelf.c611
-rw-r--r--size/size.c27
-rw-r--r--strings/strings.c4
-rw-r--r--test/cxxfilt/Makefile6
-rw-r--r--test/cxxfilt/tet_scen11
-rw-r--r--test/cxxfilt/tetexec.cfg5
-rw-r--r--test/cxxfilt/ts/Makefile7
-rwxr-xr-xtest/cxxfilt/ts/common/func.sh49
-rwxr-xr-xtest/cxxfilt/ts/common/gen.awk33
-rw-r--r--test/cxxfilt/ts/common/ts.mk15
-rw-r--r--test/cxxfilt/ts/misc/Makefile5
-rw-r--r--test/cxxfilt/ts/misc/tclist15
-rw-r--r--test/elfdump/ts/dso1/@S@p%libelf.so.out2
-rw-r--r--test/elfdump/ts/dso1/@c@p@n%libelf.so.out2
-rw-r--r--test/elfdump/ts/dso1/@e@p@c%libelf.so.out2
-rw-r--r--test/elfdump/ts/dso1/@p%libelf.so.out2
-rw-r--r--test/elfdump/ts/dso1/@p@s%libelf.so.out2
-rw-r--r--test/elfdump/ts/dso2/@S@p%test.so.out4
-rw-r--r--test/elfdump/ts/dso2/@c@p@n%test.so.out4
-rw-r--r--test/elfdump/ts/dso2/@e@p@c%test.so.out4
-rw-r--r--test/elfdump/ts/dso2/@p%test.so.out4
-rw-r--r--test/elfdump/ts/dso2/@p@s%test.so.out4
-rw-r--r--test/elfdump/ts/exec1/@S@e@p%ls.out2
-rw-r--r--test/elfdump/ts/exec1/@c@p@n%ls.out2
-rw-r--r--test/elfdump/ts/exec1/@e@p%ls.out2
-rw-r--r--test/elfdump/ts/exec1/@e@p@c@d%ls.out2
-rw-r--r--test/elfdump/ts/exec1/@p@e%ls.out2
-rw-r--r--test/elfdump/ts/exec1/@p@n%ls.out2
-rw-r--r--test/elfdump/ts/exec1/@p@s%ls.out2
-rw-r--r--test/elfdump/ts/exec2/@S@n%cp.out2
68 files changed, 2189 insertions, 1454 deletions
diff --git a/addr2line/addr2line.c b/addr2line/addr2line.c
index 3cd8cb5..55f450d 100644
--- a/addr2line/addr2line.c
+++ b/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/brandelf/brandelf.c b/brandelf/brandelf.c
index 22166f7..7cc93f0 100644
--- a/brandelf/brandelf.c
+++ b/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/common/_elftc.h b/common/_elftc.h
index 94272ef..38a4356 100644
--- a/common/_elftc.h
+++ b/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/common/elfdefinitions.h b/common/elfdefinitions.h
index fa6132d..ec22528 100644
--- a/common/elfdefinitions.h
+++ b/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/cxxfilt/cxxfilt.c b/cxxfilt/cxxfilt.c
index 9318c64..c6d737a 100644
--- a/cxxfilt/cxxfilt.c
+++ b/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/elfcopy/ascii.c b/elfcopy/ascii.c
index cad4eb8..fb1edb3 100644
--- a/elfcopy/ascii.c
+++ b/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/elfcopy/binary.c b/elfcopy/binary.c
index 7c834a9..ad86a65 100644
--- a/elfcopy/binary.c
+++ b/elfcopy/binary.c
@@ -26,6 +26,7 @@
#include <sys/param.h>
#include <sys/stat.h>
+#include <ctype.h>
#include <err.h>
#include <gelf.h>
#include <stdio.h>
@@ -35,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
@@ -213,9 +214,9 @@ create_elf_from_binary(struct elfcopy *ecp, int ifd, const char *ifn)
if ((sym_basename = strdup(ifn)) == NULL)
err(1, "strdup");
- p = sym_basename;
- while ((p = strchr(p, '.')) != NULL)
- *p++ = '_';
+ for (p = sym_basename; *p != '\0'; p++)
+ if (!isalnum(*p))
+ *p = '_';
#define _GEN_SYMNAME(S) do { \
snprintf(name, sizeof(name), "%s%s%s", "_binary_", sym_basename, S); \
} while (0)
diff --git a/elfcopy/elfcopy.1 b/elfcopy/elfcopy.1
index b7b0ce4..672885a 100644
--- a/elfcopy/elfcopy.1
+++ b/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/elfcopy/elfcopy.h b/elfcopy/elfcopy.h
index 614c0e7..5593a9a 100644
--- a/elfcopy/elfcopy.h
+++ b/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>
@@ -139,7 +139,8 @@ struct section {
/* Internal data structure for segments. */
struct segment {
- uint64_t addr; /* load addr */
+ uint64_t vaddr; /* virtual addr (VMA) */
+ uint64_t paddr; /* physical addr (LMA) */
uint64_t off; /* file offset */
uint64_t fsz; /* file size */
uint64_t msz; /* memory size */
@@ -177,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 */
@@ -237,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/elfcopy/main.c b/elfcopy/main.c
index b51ba4e..ebc0c92 100644
--- a/elfcopy/main.c
+++ b/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.
* _____________
* | |
@@ -641,6 +642,18 @@ create_file(struct elfcopy *ecp, const char *src, const char *dst)
* ELF object before processing.
*/
if (ecp->itf != ETF_ELF) {
+ /*
+ * If the output object is not an ELF file, choose an arbitrary
+ * ELF format for the intermediate file. srec, ihex and binary
+ * formats are independent of class, endianness and machine
+ * type so these choices do not affect the output.
+ */
+ if (ecp->otf != ETF_ELF) {
+ if (ecp->oec == ELFCLASSNONE)
+ ecp->oec = ELFCLASS64;
+ if (ecp->oed == ELFDATANONE)
+ ecp->oed = ELFDATA2LSB;
+ }
create_tempfile(&elftemp, &efd);
if ((ecp->eout = elf_begin(efd, ELF_C_WRITE, NULL)) == NULL)
errx(EXIT_FAILURE, "elf_begin() failed: %s",
@@ -1434,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/elfcopy/sections.c b/elfcopy/sections.c
index ff41015..bd703e9 100644
--- a/elfcopy/sections.c
+++ b/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);
@@ -343,7 +343,7 @@ create_scn(struct elfcopy *ecp)
GElf_Shdr ish;
size_t indx;
uint64_t oldndx, newndx;
- int elferr, sec_flags;
+ int elferr, sec_flags, reorder;
/*
* Insert a pseudo section that contains the ELF header
@@ -367,6 +367,7 @@ create_scn(struct elfcopy *ecp)
errx(EXIT_FAILURE, "elf_getshstrndx failed: %s",
elf_errmsg(-1));
+ reorder = 0;
is = NULL;
while ((is = elf_nextscn(ecp->ein, is)) != NULL) {
if (gelf_getshdr(is, &ish) == NULL)
@@ -482,8 +483,20 @@ create_scn(struct elfcopy *ecp)
/* create section header based on input object. */
if (strcmp(name, ".symtab") != 0 &&
strcmp(name, ".strtab") != 0 &&
- strcmp(name, ".shstrtab") != 0)
+ strcmp(name, ".shstrtab") != 0) {
copy_shdr(ecp, s, NULL, 0, sec_flags);
+ /*
+ * elfcopy puts .symtab, .strtab and .shstrtab
+ * sections in the end of the output object.
+ * If the input objects have more sections
+ * after any of these 3 sections, the section
+ * table will be reordered. section symbols
+ * should be regenerated for relocations.
+ */
+ if (reorder)
+ ecp->flags &= ~SYMTAB_INTACT;
+ } else
+ reorder = 1;
if (strcmp(name, ".symtab") == 0) {
ecp->flags |= SYMTAB_EXIST;
@@ -1519,6 +1532,9 @@ add_gnu_debuglink(struct elfcopy *ecp)
err(EXIT_FAILURE, "strdup failed");
if (stat(ecp->debuglink, &sb) == -1)
err(EXIT_FAILURE, "stat failed");
+ if (sb.st_size == 0)
+ errx(EXIT_FAILURE, "empty debug link target %s",
+ ecp->debuglink);
if ((buf = malloc(sb.st_size)) == NULL)
err(EXIT_FAILURE, "malloc failed");
if ((fp = fopen(ecp->debuglink, "r")) == NULL)
diff --git a/elfcopy/segments.c b/elfcopy/segments.c
index 8ce0b83..9a26bba 100644
--- a/elfcopy/segments.c
+++ b/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);
@@ -72,12 +72,12 @@ add_to_inseg_list(struct elfcopy *ecp, struct section *s)
*/
loadable = 0;
STAILQ_FOREACH(seg, &ecp->v_seg, seg_list) {
- if (s->off < seg->off || (s->vma < seg->addr && !s->pseudo))
+ if (s->off < seg->off || (s->vma < seg->vaddr && !s->pseudo))
continue;
if (s->off + s->sz > seg->off + seg->fsz &&
s->type != SHT_NOBITS)
continue;
- if (s->vma + s->sz > seg->addr + seg->msz)
+ if (s->vma + s->sz > seg->vaddr + seg->msz)
continue;
insert_to_inseg_list(seg, s);
@@ -85,7 +85,12 @@ add_to_inseg_list(struct elfcopy *ecp, struct section *s)
s->seg = seg;
else if (seg->type == PT_TLS)
s->seg_tls = seg;
- s->lma = seg->addr + (s->off - seg->off);
+ if (s->pseudo)
+ s->vma = seg->vaddr + (s->off - seg->off);
+ if (seg->paddr > 0)
+ s->lma = seg->paddr + (s->off - seg->off);
+ else
+ s->lma = 0;
loadable = 1;
}
@@ -98,7 +103,7 @@ adjust_addr(struct elfcopy *ecp)
struct section *s, *s0;
struct segment *seg;
struct sec_action *sac;
- uint64_t dl, lma, start, end;
+ uint64_t dl, vma, lma, start, end;
int found, i;
/*
@@ -110,59 +115,52 @@ adjust_addr(struct elfcopy *ecp)
if (!s->loadable)
continue;
+ /* Apply global VMA adjustment. */
+ if (ecp->change_addr != 0)
+ s->vma += ecp->change_addr;
+
/* Apply global LMA adjustment. */
- if (ecp->change_addr != 0 && s->seg != NULL)
+ if (ecp->change_addr != 0 && s->seg != NULL &&
+ s->seg->paddr > 0)
s->lma += ecp->change_addr;
-
- if (!s->pseudo) {
- /* Apply global VMA adjustment. */
- if (ecp->change_addr != 0)
- s->vma += ecp->change_addr;
-
- /* Apply section VMA adjustment. */
- sac = lookup_sec_act(ecp, s->name, 0);
- if (sac == NULL)
- continue;
- if (sac->setvma)
- s->vma = sac->vma;
- if (sac->vma_adjust != 0)
- s->vma += sac->vma_adjust;
- }
}
/*
- * Apply sections LMA change in the second iteration.
+ * Apply sections VMA change in the second iteration.
*/
TAILQ_FOREACH(s, &ecp->v_sec, sec_list) {
- /*
- * Only loadable section that's inside a segment can have
- * LMA adjusted.
- */
- if (!s->loadable || s->seg == NULL)
+ if (!s->loadable)
continue;
/*
- * Check if there is a LMA change request for this
+ * Check if there is a VMA change request for this
* section.
*/
sac = lookup_sec_act(ecp, s->name, 0);
if (sac == NULL)
continue;
- if (!sac->setlma && sac->lma_adjust == 0)
+ vma = s->vma;
+ if (sac->setvma)
+ vma = sac->vma;
+ if (sac->vma_adjust != 0)
+ vma += sac->vma_adjust;
+ if (vma == s->vma)
continue;
- lma = s->lma;
- if (sac->setlma)
- lma = sac->lma;
- if (sac->lma_adjust != 0)
- lma += sac->lma_adjust;
- if (lma == s->lma)
+
+ /*
+ * No need to make segment adjustment if the section doesn't
+ * belong to any segment.
+ */
+ if (s->seg == NULL) {
+ s->vma = vma;
continue;
+ }
/*
- * Check if the LMA change is viable.
+ * Check if the VMA change is viable.
*
- * 1. Check if the new LMA is properly aligned accroding to
+ * 1. Check if the new VMA is properly aligned accroding to
* section alignment.
*
* 2. Compute the new extent of segment that contains this
@@ -170,37 +168,36 @@ adjust_addr(struct elfcopy *ecp)
* segments.
*/
#ifdef DEBUG
- printf("LMA for section %s: %#jx\n", s->name, lma);
+ printf("VMA for section %s: %#jx\n", s->name, vma);
#endif
- if (lma % s->align != 0)
- errx(EXIT_FAILURE, "The load address %#jx for "
+ if (vma % s->align != 0)
+ errx(EXIT_FAILURE, "The VMA %#jx for "
"section %s is not aligned to %ju",
- (uintmax_t) lma, s->name, (uintmax_t) s->align);
+ (uintmax_t) vma, s->name, (uintmax_t) s->align);
- if (lma < s->lma) {
+ if (vma < s->vma) {
/* Move section to lower address. */
- if (lma < s->lma - s->seg->addr)
+ if (vma < s->vma - s->seg->vaddr)
errx(EXIT_FAILURE, "Not enough space to move "
- "section %s load address to %#jx", s->name,
- (uintmax_t) lma);
- start = lma - (s->lma - s->seg->addr);
+ "section %s VMA to %#jx", s->name,
+ (uintmax_t) vma);
+ start = vma - (s->vma - s->seg->vaddr);
if (s == s->seg->v_sec[s->seg->nsec - 1])
end = start + s->seg->msz;
else
- end = s->seg->addr + s->seg->msz;
-
+ end = s->seg->vaddr + s->seg->msz;
} else {
/* Move section to upper address. */
if (s == s->seg->v_sec[0])
- start = lma;
+ start = vma;
else
- start = s->seg->addr;
- end = lma + (s->seg->addr + s->seg->msz - s->lma);
+ start = s->seg->vaddr;
+ end = vma + (s->seg->vaddr + s->seg->msz - s->vma);
if (end < start)
errx(EXIT_FAILURE, "Not enough space to move "
- "section %s load address to %#jx", s->name,
- (uintmax_t) lma);
+ "section %s VMA to %#jx", s->name,
+ (uintmax_t) vma);
}
#ifdef DEBUG
@@ -211,34 +208,34 @@ adjust_addr(struct elfcopy *ecp)
STAILQ_FOREACH(seg, &ecp->v_seg, seg_list) {
if (seg == s->seg || seg->type != PT_LOAD)
continue;
- if (start > seg->addr + seg->msz)
+ if (start > seg->vaddr + seg->msz)
continue;
- if (end < seg->addr)
+ if (end < seg->vaddr)
continue;
errx(EXIT_FAILURE, "The extent of segment containing "
"section %s overlaps with segment(%#jx,%#jx)",
- s->name, (uintmax_t) seg->addr,
- (uintmax_t) (seg->addr + seg->msz));
+ s->name, (uintmax_t) seg->vaddr,
+ (uintmax_t) (seg->vaddr + seg->msz));
}
/*
- * Update section LMA and file offset.
+ * Update section VMA and file offset.
*/
- if (lma < s->lma) {
+ if (vma < s->vma) {
/*
- * To move a section to lower load address, we decrease
- * the load addresses of the section and all the
- * sections that are before it, and we increase the
- * file offsets of all the sections that are after it.
+ * To move a section to lower VMA, we decrease
+ * the VMA of the section and all the sections that
+ * are before it, and we increase the file offsets
+ * of all the sections that are after it.
*/
- dl = s->lma - lma;
+ dl = s->vma - vma;
for (i = 0; i < s->seg->nsec; i++) {
s0 = s->seg->v_sec[i];
- s0->lma -= dl;
+ s0->vma -= dl;
#ifdef DEBUG
- printf("section %s LMA set to %#jx\n",
- s0->name, (uintmax_t) s0->lma);
+ printf("section %s VMA set to %#jx\n",
+ s0->name, (uintmax_t) s0->vma);
#endif
if (s0 == s)
break;
@@ -253,13 +250,13 @@ adjust_addr(struct elfcopy *ecp)
}
} else {
/*
- * To move a section to upper load address, we increase
- * the load addresses of the section and all the
- * sections that are after it, and we increase the
- * their file offsets too unless the section in question
+ * To move a section to upper VMA, we increase
+ * the VMA of the section and all the sections that
+ * are after it, and we increase the their file
+ * offsets too unless the section in question
* is the first in its containing segment.
*/
- dl = lma - s->lma;
+ dl = vma - s->vma;
for (i = 0; i < s->seg->nsec; i++)
if (s->seg->v_sec[i] == s)
break;
@@ -269,9 +266,9 @@ adjust_addr(struct elfcopy *ecp)
s->name);
for (; i < s->seg->nsec; i++) {
s0 = s->seg->v_sec[i];
- s0->lma += dl;
+ s0->vma += dl;
#ifdef DEBUG
- printf("section %s LMA set to %#jx\n",
+ printf("section %s VMA set to %#jx\n",
s0->name, (uintmax_t) s0->lma);
#endif
if (s != s->seg->v_sec[0]) {
@@ -292,9 +289,8 @@ adjust_addr(struct elfcopy *ecp)
if (ecp->pad_to != 0) {
/*
- * Find the section with highest load address.
+ * Find the section with highest VMA.
*/
-
s = NULL;
STAILQ_FOREACH(seg, &ecp->v_seg, seg_list) {
if (seg->type != PT_LOAD)
@@ -308,26 +304,113 @@ adjust_addr(struct elfcopy *ecp)
s = seg->v_sec[i];
else {
s0 = seg->v_sec[i];
- if (s0->lma > s->lma)
+ if (s0->vma > s->vma)
s = s0;
}
}
if (s == NULL)
- goto issue_warn;
+ goto adjust_lma;
/* No need to pad if the pad_to address is lower. */
- if (ecp->pad_to <= s->lma + s->sz)
- goto issue_warn;
+ if (ecp->pad_to <= s->vma + s->sz)
+ goto adjust_lma;
- s->pad_sz = ecp->pad_to - (s->lma + s->sz);
+ s->pad_sz = ecp->pad_to - (s->vma + s->sz);
#ifdef DEBUG
- printf("pad section %s load to address %#jx by %#jx\n", s->name,
+ printf("pad section %s VMA to address %#jx by %#jx\n", s->name,
(uintmax_t) ecp->pad_to, (uintmax_t) s->pad_sz);
#endif
}
-issue_warn:
+
+adjust_lma:
+
+ /*
+ * Apply sections LMA change in the third iteration.
+ */
+ TAILQ_FOREACH(s, &ecp->v_sec, sec_list) {
+
+ /*
+ * Only loadable section that's inside a segment can have
+ * LMA adjusted. Also, if LMA of the containing segment is
+ * set to 0, it probably means we should ignore the LMA.
+ */
+ if (!s->loadable || s->seg == NULL || s->seg->paddr == 0)
+ continue;
+
+ /*
+ * Check if there is a LMA change request for this
+ * section.
+ */
+ sac = lookup_sec_act(ecp, s->name, 0);
+ if (sac == NULL)
+ continue;
+ if (!sac->setlma && sac->lma_adjust == 0)
+ continue;
+ lma = s->lma;
+ if (sac->setlma)
+ lma = sac->lma;
+ if (sac->lma_adjust != 0)
+ lma += sac->lma_adjust;
+ if (lma == s->lma)
+ continue;
+
+#ifdef DEBUG
+ printf("LMA for section %s: %#jx\n", s->name, lma);
+#endif
+
+ /* Check alignment. */
+ if (lma % s->align != 0)
+ errx(EXIT_FAILURE, "The LMA %#jx for "
+ "section %s is not aligned to %ju",
+ (uintmax_t) lma, s->name, (uintmax_t) s->align);
+
+ /*
+ * Update section LMA.
+ */
+
+ if (lma < s->lma) {
+ /*
+ * To move a section to lower LMA, we decrease
+ * the LMA of the section and all the sections that
+ * are before it.
+ */
+ dl = s->lma - lma;
+ for (i = 0; i < s->seg->nsec; i++) {
+ s0 = s->seg->v_sec[i];
+ s0->lma -= dl;
+#ifdef DEBUG
+ printf("section %s LMA set to %#jx\n",
+ s0->name, (uintmax_t) s0->lma);
+#endif
+ if (s0 == s)
+ break;
+ }
+ } else {
+ /*
+ * To move a section to upper LMA, we increase
+ * the LMA of the section and all the sections that
+ * are after it.
+ */
+ dl = lma - s->lma;
+ for (i = 0; i < s->seg->nsec; i++)
+ if (s->seg->v_sec[i] == s)
+ break;
+ if (i >= s->seg->nsec)
+ errx(EXIT_FAILURE, "Internal: section `%s' not"
+ " found in its containing segement",
+ s->name);
+ for (; i < s->seg->nsec; i++) {
+ s0 = s->seg->v_sec[i];
+ s0->lma += dl;
+#ifdef DEBUG
+ printf("section %s LMA set to %#jx\n",
+ s0->name, (uintmax_t) s0->lma);
+#endif
+ }
+ }
+ }
/*
* Issue a warning if there are VMA/LMA adjust requests for
@@ -385,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",
@@ -402,13 +484,14 @@ 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));
if ((seg = calloc(1, sizeof(*seg))) == NULL)
err(EXIT_FAILURE, "calloc failed");
- seg->addr = iphdr.p_vaddr;
+ seg->vaddr = iphdr.p_vaddr;
+ seg->paddr = iphdr.p_paddr;
seg->off = iphdr.p_offset;
seg->fsz = iphdr.p_filesz;
seg->msz = iphdr.p_memsz;
@@ -429,20 +512,30 @@ copy_phdr(struct elfcopy *ecp)
if (seg->type == PT_PHDR) {
if (!TAILQ_EMPTY(&ecp->v_sec)) {
s = TAILQ_FIRST(&ecp->v_sec);
- if (s->pseudo)
- seg->addr = s->lma +
+ if (s->pseudo) {
+ seg->vaddr = s->vma +
+ gelf_fsize(ecp->eout, ELF_T_EHDR,
+ 1, EV_CURRENT);
+ seg->paddr = s->lma +
gelf_fsize(ecp->eout, ELF_T_EHDR,
1, EV_CURRENT);
+ }
}
seg->fsz = seg->msz = gelf_fsize(ecp->eout, ELF_T_PHDR,
ecp->ophnum, EV_CURRENT);
continue;
}
+ if (seg->nsec > 0) {
+ s = seg->v_sec[0];
+ seg->vaddr = s->vma;
+ seg->paddr = s->lma;
+ }
+
seg->fsz = seg->msz = 0;
for (i = 0; i < seg->nsec; i++) {
s = seg->v_sec[i];
- seg->msz = s->vma + s->sz - seg->addr;
+ seg->msz = s->vma + s->sz - seg->vaddr;
if (s->type != SHT_NOBITS)
seg->fsz = s->off + s->sz - seg->off;
}
@@ -481,8 +574,8 @@ copy_phdr(struct elfcopy *ecp)
elf_errmsg(-1));
ophdr.p_type = iphdr.p_type;
- ophdr.p_vaddr = seg->addr;
- ophdr.p_paddr = seg->addr;
+ ophdr.p_vaddr = seg->vaddr;
+ ophdr.p_paddr = seg->paddr;
ophdr.p_flags = iphdr.p_flags;
ophdr.p_align = iphdr.p_align;
ophdr.p_offset = seg->off;
diff --git a/elfcopy/symbols.c b/elfcopy/symbols.c
index ae6193c..d072da8 100644
--- a/elfcopy/symbols.c
+++ b/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 $");
/* Symbol table buffer structure. */
struct symbuf {
@@ -162,7 +162,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);
@@ -252,7 +252,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)
@@ -1159,7 +1159,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/elfdump/elfdump.c b/elfdump/elfdump.c
index 334d285..cf27ea6 100644
--- a/elfdump/elfdump.c
+++ b/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/findtextrel/findtextrel.c b/findtextrel/findtextrel.c
index ad493cf..94bff9e 100644
--- a/findtextrel/findtextrel.c
+++ b/findtextrel/findtextrel.c
@@ -38,7 +38,7 @@
#include "_elftc.h"
-ELFTC_VCSID("$Id: findtextrel.c 3359 2016-01-24 17:06:20Z jkoshy $");
+ELFTC_VCSID("$Id: findtextrel.c 3461 2016-05-10 18:00:05Z emaste $");
static struct option longopts[] = {
{"help", no_argument, NULL, 'H'},
@@ -74,6 +74,10 @@ find_symbol(const char *fn, Elf *e, Elf_Data *d, GElf_Shdr *sh, uintmax_t off)
GElf_Sym sym;
int i, len;
+ if (sh->sh_entsize == 0) {
+ warnx("invalid sh_entsize");
+ return (NULL);
+ }
len = (int) (d->d_size / sh->sh_entsize);
for (i = 0; i < len; i++) {
if (gelf_getsym(d, i, &sym) != &sym) {
@@ -240,6 +244,10 @@ examine_reloc(const char *fn, Elf *e, Elf_Data *d, GElf_Shdr *sh, GElf_Phdr *ph,
int i, j, len;
GElf_Rel rel;
+ if (sh->sh_entsize == 0) {
+ warnx("invalid sh_entsize");
+ return;
+ }
len = (int) (d->d_size / sh->sh_entsize);
for (i = 0; i < len; i++) {
if (sh->sh_type == SHT_REL) {
diff --git a/ld/Makefile b/ld/Makefile
index 2037f01..0a86ef2 100644
--- a/ld/Makefile
+++ b/ld/Makefile
@@ -1,4 +1,4 @@
-# $Id: Makefile 3385 2016-01-31 14:26:26Z jkoshy $
+# $Id: Makefile 3407 2016-02-14 17:47:23Z jkoshy $
TOP= ..
@@ -45,8 +45,6 @@ LDADD= -lelftc -ldwarf -lelf
CFLAGS+= -I. -I${.CURDIR}
YFLAGS= -d
-NOMAN=
-
.SUFFIXES: .ld .c
.ld.c:
awk -f ld_script.awk ${.ALLSRC} > ${.TARGET}
diff --git a/ld/amd64.c b/ld/amd64.c
index e22520b..324aa6c 100644
--- a/ld/amd64.c
+++ b/ld/amd64.c
@@ -35,7 +35,7 @@
#include "ld_utils.h"
#include "amd64.h"
-ELFTC_VCSID("$Id: amd64.c 3390 2016-02-05 16:15:58Z emaste $");
+ELFTC_VCSID("$Id: amd64.c 3419 2016-02-19 20:07:15Z emaste $");
static void _create_plt_reloc(struct ld *ld, struct ld_symbol *lsb,
uint64_t offset);
@@ -59,7 +59,6 @@ static void _adjust_reloc(struct ld *ld, struct ld_input_section *is,
struct ld_reloc_entry *lre, struct ld_symbol *lsb, uint8_t *buf);
static void _process_reloc(struct ld *ld, struct ld_input_section *is,
struct ld_reloc_entry *lre, struct ld_symbol *lsb, uint8_t *buf);
-static const char *_reloc2str(uint64_t r);
static void _reserve_got_entry(struct ld *ld, struct ld_symbol *lsb, int num);
static void _reserve_gotplt_entry(struct ld *ld, struct ld_symbol *lsb);
static void _reserve_plt_entry(struct ld *ld, struct ld_symbol *lsb);
@@ -102,42 +101,6 @@ _get_common_page_size(struct ld *ld)
return (0x1000);
}
-static const char *
-_reloc2str(uint64_t r)
-{
- static char s[32];
-
- switch (r) {
- 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:
- snprintf(s, sizeof(s), "<unkown: %ju>", (uintmax_t) r);
- return (s);
- }
-}
-
static int
_is_absolute_reloc(uint64_t r)
{
@@ -169,10 +132,12 @@ _warn_pic(struct ld *ld, struct ld_reloc_entry *lre)
if (lsb->lsb_bind != STB_LOCAL)
ld_warn(ld, "relocation %s against `%s' can not be used"
" by runtime linker; recompile with -fPIC",
- _reloc2str(lre->lre_type), lsb->lsb_name);
+ elftc_reloc_type_str(EM_X86_64,
+ lre->lre_type), lsb->lsb_name);
else
ld_warn(ld, "relocation %s can not be used by runtime linker;"
- " recompile with -fPIC", _reloc2str(lre->lre_type));
+ " recompile with -fPIC", elftc_reloc_type_str(EM_X86_64,
+ lre->lre_type));
}
static struct ld_input_section *
@@ -1009,7 +974,7 @@ _process_reloc(struct ld *ld, struct ld_input_section *is,
default:
ld_warn(ld, "Relocation %s not supported",
- _reloc2str(lre->lre_type));
+ elftc_reloc_type_str(EM_X86_64, lre->lre_type));
break;
}
}
diff --git a/ld/i386.c b/ld/i386.c
index 760424a..0ad4f41 100644
--- a/ld/i386.c
+++ b/ld/i386.c
@@ -34,7 +34,7 @@
#include "ld_utils.h"
#include "i386.h"
-ELFTC_VCSID("$Id: i386.c 3391 2016-02-05 19:43:01Z emaste $");
+ELFTC_VCSID("$Id: i386.c 3419 2016-02-19 20:07:15Z emaste $");
static void _create_plt_reloc(struct ld *ld, struct ld_symbol *lsb,
uint64_t offset);
@@ -55,7 +55,6 @@ static uint64_t _get_max_page_size(struct ld *ld);
static uint64_t _get_common_page_size(struct ld *ld);
static void _process_reloc(struct ld *ld, struct ld_input_section *is,
struct ld_reloc_entry *lre, struct ld_symbol *lsb, uint8_t *buf);
-static const char *_reloc2str(uint64_t r);
static void _reserve_got_entry(struct ld *ld, struct ld_symbol *lsb, int num);
static void _reserve_gotplt_entry(struct ld *ld, struct ld_symbol *lsb);
static void _reserve_plt_entry(struct ld *ld, struct ld_symbol *lsb);
@@ -80,50 +79,6 @@ _get_common_page_size(struct ld *ld)
return (0x1000);
}
-static const char *
-_reloc2str(uint64_t r)
-{
- static char s[32];
-
- switch (r) {
- 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_GOTI";
- 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:
- snprintf(s, sizeof(s), "<unkown: %ju>", (uintmax_t) r);
- return (s);
- }
-}
-
static int
_is_absolute_reloc(uint64_t r)
{
@@ -154,10 +109,11 @@ _warn_pic(struct ld *ld, struct ld_reloc_entry *lre)
if (lsb->lsb_bind != STB_LOCAL)
ld_warn(ld, "relocation %s against `%s' can not be used"
" by runtime linker; recompile with -fPIC",
- _reloc2str(lre->lre_type), lsb->lsb_name);
+ elftc_reloc_type_str(EM_386, lre->lre_type), lsb->lsb_name);
else
ld_warn(ld, "relocation %s can not be used by runtime linker;"
- " recompile with -fPIC", _reloc2str(lre->lre_type));
+ " recompile with -fPIC",
+ elftc_reloc_type_str(EM_386, lre->lre_type));
}
static struct ld_input_section *
diff --git a/ld/ld.1 b/ld/ld.1
new file mode 100644
index 0000000..1220503
--- /dev/null
+++ b/ld/ld.1
@@ -0,0 +1,478 @@
+.\" Copyright (c) 2016 Joseph Koshy. All rights reserved.
+.\"
+.\" 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 14, 2016
+.Os
+.Dt LD 1
+.Sh NAME
+.Nm ld
+.Nd link editor
+.Sh SYNOPSIS
+.Nm
+.Op Fl \&(
+.Op Fl \&)
+.Op Fl Bdynamic
+.Op Fl Bshareable
+.Op Fl Bstatic
+.Op Fl I Ar file | Fl -dynamic-linker= Ns Ar file
+.Op Fl L Ar dir | Fl -library-path= Ns Ar dir
+.Op Fl M | Fl -print-map
+.Op Fl T Ar script-file | Fl -script= Ns Ar script-file
+.Op Fl V | Fl v | Fl -version
+.Op Fl a Ar linkmode
+.Op Fl b Ar input-format | Fl -format= Ns Ar input-format
+.Op Fl call_shared
+.Op Fl d | Fl dc | Fl dp
+.Op Fl dn
+.Op Fl dy
+.Op Fl e Ar symbol | Fl -entry= Ns Ar symbol
+.Op Fl h Ar name | Fl soname= Ns Ar name
+.Op Fl l Ar library | Fl -library= Ns Ar library
+.Op Fl o Ar output-file | Fl -output= Ns Ar output-file
+.Op Fl q | Fl -emit-relocs
+.Op Fl r | Fl -relocatable
+.Op Fl u Ar name | Fl -undefined= Ns Ar name
+.Op Fl z Ar keyword
+.Op Fl -as-needed
+.Op Fl -eh-frame-hdr
+.Op Fl -end-group
+.Op Fl -gc-sections
+.Op Fl -no-as-needed
+.Op Fl -no-define-common
+.Op Fl -no-gc-sections
+.Op Fl -no-print-gc-sections
+.Op Fl -no-whole-archive
+.Op Fl -oformat= Ns Ar format
+.Op Fl -pic-executable | Fl pie
+.Op Fl -print-gc-sections
+.Op Fl -rpath= Ns Ar dirs
+.Op Fl -rpath-link= Ns Ar dirs
+.Op Fl -start-group
+.Op Fl shared
+.Op Fl static
+.Op Fl -version-script= Ns Ar script
+.Op Fl -whole-archive
+.Ar
+.Sh DESCRIPTION
+The
+.Nm
+utility combines ELF objects and
+.Xr ar 1
+archives containing ELF objects into an executable or a partially
+relocated object.
+.Pp
+The
+.Nm
+utility processes options and files in the order presented on the
+command line.
+Unlike most
+.Ux
+utilities, options and file names may be interspersed.
+Options seen on the command line will generally apply to subsequent
+files, or till overridden by another option.
+.Sh OPTIONS
+.Pp
+The
+.Nm
+utility supports the following options:
+.Bl -tag -width indent
+.It Xo
+.Fl \&(
+.Ar archives Ns ...
+.Fl \&)
+.Xc
+Start a group of archives that are to be searched repeatedly until no new
+undefined references are created.
+This option is used when there are circular references between one or
+more archives in the archive group.
+.Pp
+The files named by the arguments
+.Ar archives
+are expected to be archive files.
+.Pp
+Each use of the
+.Fl \&(
+option starts a new archive group that is ended by a matching
+.Fl \&)
+option.
+.It Fl Bdynamic
+Choose dynamic libraries for the libraries specified by subsequent
+.Fl l
+options.
+.It Fl Bshareable
+Create a shared library.
+.It Fl Bstatic
+Choose static libraries for the libraries specified by subsequent
+.Fl l
+options.
+.It Fl I Ar file | Fl -dynamic-linker= Ns Ar file
+Set the name of the dynamic linker when generating ELF executables.
+.It Fl L Ar dir | Fl -library-path= Ns Ar dir
+Add directory
+.Ar dir
+to the list of paths that
+.Nm
+will search for archive libraries.
+This option may be specified multiple times.
+User supplied directories are searched in the order specified on
+the command line.
+.It Fl M | Fl -print-map
+Print a link map to standard output.
+.It Fl T Ar script-file | Fl -script= Ns Ar script-file
+Use the file name by argument
+.Ar script-file
+as the linker script instead of the default.
+.It Fl V | Fl v | Fl version
+Print a version identifier for
+.Nm
+and exit.
+.It Fl a Ar linkmode
+Select linking mode.
+The value of the argument
+.Ar linkmode
+should be one of the following literals:
+.Bl -tag -width ".Li default" -compact
+.It Cm default
+Equivalent to specifying
+.Fl Bdynamic .
+.It Cm archive
+Equivalent to specifying
+.Fl Bstatic .
+.It Cm shared
+Equivalent to specifying
+.Fl Bdynamic .
+.El
+.It Fl b Ar input-format | Fl -format Ar input-format
+Set the input format to that specified by argument
+.Ar input-format .
+The legal values for the argument
+.Ar input-format
+are those supported by
+.Xr elftc_bfd_find_target 3 .
+.It Fl d | Fl dc | Fl dp
+Assign space for common symbols even if generating a relocatable object.
+.It Fl dn
+Equivalent to specifying option
+.Fl Bstatic .
+.It Fl dy
+Equivalent to specifying option
+.Fl Bdynamic .
+.It Fl e Ar entry | Fl -entry Ar entry
+Set execution to start at the symbol named by the argument
+.Ar entry .
+The argument should be the name of a symbol.
+.It Fl h Ar name | Fl soname Ar name
+Set the
+.Li DT_SONAME
+field in the object to that specified by the argument
+.Ar name .
+.It Fl l Ar name | Fl -library= Ns Ar name
+Add the archive library or shared library named by argument
+.Ar name
+to the set of files to link.
+This file is looked for in the list of directories specified by prior
+.Fl L
+options on the command line.
+.It Fl o Ar output-file | Fl -output= Ns Ar output-file
+Use the file specified by argument
+.Ar output-file
+for the output, instead of the default file name of
+.Sq a.out .
+.It Fl q | Fl -emit-relocs
+Preserve relocation information in executables, for use by post-link
+analysis tools.
+.It Fl r | Fl -relocatable
+Generate a relocatable output file that can be used as input for subsequent
+linker runs.
+.It Fl u Ar name | Fl -undefined= Ns Ar name
+Add the symbol specified by argument
+.Ar name
+to the output file as an undefined symbol.
+This option may be specified multiple times.
+.It Fl z Ar keyword
+Recognized keywords include:
+.Bl -tag -width ".Li defaultextract" -compact
+.It Cm execstack
+Require the object to use an executable stack.
+.It Cm noexecstack
+Do not require the object to use an executable stack.
+.El
+.It Fl -as-needed
+Add
+.Li DT_NEEDED
+tags for only those shared libraries that satisfy non-weak
+unresolved references from object files or other dynamic libraries
+seen so far on the command line.
+.It Fl call_shared
+Equivalent to specifying option
+.Fl Bdynamic .
+.It Fl -eh-frame-hdr
+Create a
+.Dq ".eh_frame_hdr"
+section, and a
+.Li PT_GNU_EH_FRAME
+segment header, containing exception handling information.
+.It Fl -end-group
+Equivalent to specifying option
+.Fl \&) .
+.It Fl -gc-sections
+Garbage collect unused input sections.
+.It Fl -no-as-needed
+Insert
+.Li DT_NEEDED
+tags for all shared libraries seen henceforth on the command line,
+irrespective of whether the shared library is needed to resolve an
+undefined symbol or not.
+This behavior is the default.
+.It Fl -no-define-common
+Do not assign addresses to common symbols.
+.It Fl -no-gc-sections
+Do not garbage collect input sections that contain unreferenced
+symbols.
+.It Fl -no-print-gc-sections
+Do not print the list of sections removed when the
+.Fl -gc-sections
+directive is active.
+.It Fl -no-whole-archive
+Only include objects in an archive that satisfy an unresolved reference
+in the link.
+This behavior is the default.
+.It Fl non_shared
+Equivalent to specifying option
+.Fl Bstatic .
+.It Fl -oformat= Ns Ar format
+Set the desired output format to that specified by the argument
+.Ar format .
+Supported values for argument
+.Ar format
+are those understood by
+.Xr elftc_bfd_find_target 3 .
+.It Fl -pic-executable | Fl pie
+Create a position-independent executable.
+.It Fl -print-gc-sections
+Print the list of sections removed when the
+.Fl -gc-sections
+directive is active.
+The output is printed to stderr.
+.It Fl -rpath= Ns Ar dirs
+Add the colon-separated list of directories named by the argument
+.Ar dirs
+to the runtime library search path and to the link-time search
+path.
+.It Fl -rpath-link= Ns Ar dirs
+Add the directories specified by the colon-separated list of directories
+in argument
+.Ar dirs
+to the link-time search path for libraries.
+The directories specified by this option are searched before those
+specified by
+.Fl -rpath
+options.
+.It Fl shared
+Equivalent to specifying option
+.Fl Bshareable .
+.It Fl -start-group
+Equivalent to specifying option
+.Fl \&( .
+.It Fl static
+Equivalent to specifying option
+.Fl Bstatic .
+.It Fl -version-script= Ns Ar script-file
+Use the version script in the file named by argument
+.Ar script-file .
+.It Fl -whole-archive
+Include the entire contents of every archive file encountered on the
+command line after this option in the link.
+.El
+.Sh DIAGNOSTICS
+.Ex -std
+.Sh SEE ALSO
+.Xr ar 1 ,
+.Xr ranlib 1 ,
+.Xr archive 3 ,
+.Xr elf 3 ,
+.Xr elftc_bfd_find_target 3 ,
+.Xr dwarf 3
+.Sh IMPLEMENTATION NOTES
+The
+.Nm
+utility differs from its GNU equivalent in the following:
+.Bl -bullet
+.It
+The
+.Nm
+utility currently supports a limited range of output formats.
+.It
+The
+.Fl e
+and
+.Fl -entry
+options only accept a symbol name as an argument, and not a numeric
+address.
+.It
+The
+.Fl l
+option only searches files in the directories specified by
+prior
+.Fl L
+options.
+.It
+The
+.Fl T | Fl -script
+option does not search for script files in the directories specified
+by prior
+.Fl L
+options.
+.It
+The
+.Fl -rpath
+option accepts a colon-separated list of directories instead of
+single directory.
+.El
+.Pp
+The following options are recognized, but are currently unimplemented:
+.Fl Bgroup ,
+.Fl Bsymbolic ,
+.Fl Bsymbolic_functions ,
+.Fl E ,
+.Fl EB ,
+.Fl EL ,
+.Fl F ,
+.Fl Map ,
+.Fl N ,
+.Fl O ,
+.Fl Qy ,
+.Fl R ,
+.Fl S ,
+.Fl Tbss ,
+.Fl Tdata ,
+.Fl Ttext ,
+.Fl X ,
+.Fl Y ,
+.Fl Ur ,
+.Fl c ,
+.Fl f ,
+.Fl g ,
+.Fl i ,
+.Fl m ,
+.Fl n ,
+.Fl s ,
+.Fl t ,
+.Fl x ,
+.Fl y ,
+.Fl -accept-unknown-input-arch ,
+.Fl -allow-multiple-definition ,
+.Fl -allow-shlib-undefined ,
+.Fl -assert ,
+.Fl -auxiliary ,
+.Fl -build-id ,
+.Fl -check-sections ,
+.Fl -cref ,
+.Fl -defsym ,
+.Fl -demangle ,
+.Fl -disable-new-dtags ,
+.Fl -discard-all ,
+.Fl -discard-locals ,
+.Fl -error-unresolved-symbols ,
+.Fl -export-dynamic ,
+.Fl -emulation ,
+.Fl -enable-new-dtags ,
+.Fl -fatal-warnings ,
+.Fl -filter ,
+.Fl -fini ,
+.Fl -hash-style ,
+.Fl -help ,
+.Fl -init ,
+.Fl -just-symbols ,
+.Fl -mri-script ,
+.Fl -nmagic ,
+.Fl nostdlib ,
+.Fl -no-accept-unknown-input-arch ,
+.Fl -no-allow-shlib-undefined ,
+.Fl -no-assert ,
+.Fl -no-check-sections ,
+.Fl -no-demangle ,
+.Fl -no-keep-memory ,
+.Fl -no-omagic ,
+.Fl -no-undefined ,
+.Fl -no-undefined-version ,
+.Fl -no-warn-mismatch ,
+.Fl -omagic ,
+.Fl -qmagic ,
+.Fl -relax ,
+.Fl -retain-symbols-file ,
+.Fl -runpath ,
+.Fl -section-start ,
+.Fl -sort-common ,
+.Fl -split-by-file ,
+.Fl -split-by-reloc ,
+.Fl -stats ,
+.Fl -strip-all ,
+.Fl -strip-debug ,
+.Fl -trace ,
+.Fl -trace_symbol ,
+.Fl -traditional-format ,
+.Fl -unique ,
+.Fl -unresolved-symbols ,
+.Fl -verbose ,
+.Fl -warn-common ,
+.Fl -warn-constructors ,
+.Fl -warn-multiple-gp ,
+.Fl -warn-once ,
+.Fl -warn-section-align ,
+.Fl -warn-shared-textrel ,
+.Fl -warn-unresolved-symbols ,
+.Fl -wrap .
+.Pp
+The following keywords are recognized by the
+.Fl z
+option, but are currently unimplemented:
+.Cm allextract ,
+.Cm defaultextract ,
+.Cm defs ,
+.Cm ignore ,
+.Cm initfirst ,
+.Cm lazyload ,
+.Cm muldefs ,
+.Cm nodefaultlib ,
+.Cm nodefs ,
+.Cm nodelete ,
+.Cm nodlopen ,
+.Cm nolazyload ,
+.Cm now ,
+.Cm origin ,
+.Cm record ,
+.Cm systemlibrary ,
+.Cm weakextract .
+.Sh HISTORY
+A
+.Nm
+command first appeared in AT&T UNIX Version 1.
+.Pp
+The Elftoolchain implementation of
+.Nm
+was written by
+.An Kai Wang Aq Mt kaiwang27@gmail.com .
diff --git a/ld/ld_options.c b/ld/ld_options.c
index 8a2cd1c..bc26105 100644
--- a/ld/ld_options.c
+++ b/ld/ld_options.c
@@ -32,7 +32,7 @@
#include "ld_options.h"
#include "ld_output.h"
-ELFTC_VCSID("$Id: ld_options.c 2926 2013-03-17 22:53:54Z kaiwang27 $");
+ELFTC_VCSID("$Id: ld_options.c 3406 2016-02-14 17:45:43Z jkoshy $");
/*
* Support routines for parsing command line options.
@@ -94,7 +94,7 @@ static struct ld_option ld_opts[] = {
{"no-define-common", KEY_NO_DEFINE_COMMON, ANY_DASH, NO_ARG},
{"no-demangle", KEY_NO_DEMANGLE, ANY_DASH, OPT_ARG},
{"no-gc-sections", KEY_NO_GC_SECTIONS, ANY_DASH, NO_ARG},
- {"no-keep-memorg", KEY_NO_KEEP_MEMORY, ANY_DASH, NO_ARG},
+ {"no-keep-memory", KEY_NO_KEEP_MEMORY, ANY_DASH, NO_ARG},
{"no-omagic", KEY_NO_OMAGIC, ANY_DASH, NO_ARG},
{"no-print-gc-sections", KEY_NO_PRINT_GC_SECTIONS, ANY_DASH, NO_ARG},
{"no-undefined", KEY_Z_DEFS, ANY_DASH, NO_ARG},
@@ -118,7 +118,7 @@ static struct ld_option ld_opts[] = {
{"runpath", KEY_RUNPATH, ANY_DASH, REQ_ARG},
{"script", 'T', ANY_DASH, REQ_ARG},
{"section-start", KEY_SECTION_START, ANY_DASH, REQ_ARG},
- {"shared", KEY_SHARED, ANY_DASH, NO_ARG},
+ {"shared", KEY_SHARED, ONE_DASH, NO_ARG},
{"soname", 'h', ONE_DASH, REQ_ARG},
{"sort-common", KEY_SORT_COMMON, ANY_DASH, NO_ARG},
{"split-by-file", KEY_SPLIT_BY_FILE, ANY_DASH, REQ_ARG},
@@ -134,8 +134,8 @@ static struct ld_option ld_opts[] = {
{"undefined", 'u', ANY_DASH, REQ_ARG},
{"unique", KEY_UNIQUE, ANY_DASH, OPT_ARG},
{"unresolved-symbols", KEY_UNRESOLVED_SYMBOLS, ANY_DASH, REQ_ARG},
- {"verbose" , 'v', ANY_DASH, NO_ARG},
- {"version", KEY_VERSION, ANY_DASH, NO_ARG},
+ {"verbose" , KEY_VERBOSE, ANY_DASH, NO_ARG},
+ {"version", 'V', ANY_DASH, NO_ARG},
{"version-script", KEY_VERSION_SCRIPT, ANY_DASH, REQ_ARG},
{"warn-common", KEY_WARN_COMMON, ANY_DASH, NO_ARG},
{"warn-constructors", KEY_WARN_CONSTRUCTORS, ANY_DASH, NO_ARG},
@@ -144,7 +144,7 @@ static struct ld_option ld_opts[] = {
{"warn-section-align", KEY_WARN_SECTION_ALIGN, ANY_DASH, NO_ARG},
{"warn-shared-textrel", KEY_WARN_SHARED_TEXTREL, ANY_DASH, NO_ARG},
{"warn-unresolved-symbols", KEY_WARN_UNRESOLVE_SYM, ANY_DASH, NO_ARG},
- {"whole_archive", KEY_WHOLE_ARCHIVE, ANY_DASH, NO_ARG},
+ {"whole-archive", KEY_WHOLE_ARCHIVE, ANY_DASH, NO_ARG},
{"wrap", KEY_WRAP, ANY_DASH, REQ_ARG},
{"EB", KEY_EB, ONE_DASH, NO_ARG},
{"EL", KEY_EL, ONE_DASH, NO_ARG},
diff --git a/ld/ld_options.h b/ld/ld_options.h
index de171f2..ef43b0c 100644
--- a/ld/ld_options.h
+++ b/ld/ld_options.h
@@ -23,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: ld_options.h 2894 2013-01-15 23:05:24Z kaiwang27 $
+ * $Id: ld_options.h 3405 2016-02-14 10:56:34Z jkoshy $
*/
enum ld_dash {
@@ -103,7 +103,7 @@ enum ld_key {
KEY_UNRESOLVED_SYMBOLS,
KEY_UNIQUE,
KEY_UR,
- KEY_VERSION,
+ KEY_VERBOSE,
KEY_VERSION_SCRIPT,
KEY_WARN_COMMON,
KEY_WARN_CONSTRUCTORS,
diff --git a/libdwarf/libdwarf_abbrev.c b/libdwarf/libdwarf_abbrev.c
index abcc2fd..9e4b6ab 100644
--- a/libdwarf/libdwarf_abbrev.c
+++ b/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/libdwarf/libdwarf_elf_init.c b/libdwarf/libdwarf_elf_init.c
index af2d370..bd68afc 100644
--- a/libdwarf/libdwarf_elf_init.c
+++ b/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,46 +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)
-{
- GElf_Sym sym;
- int size;
-
- 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 (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_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;
- int j;
+ GElf_Sym sym;
+ size_t symndx;
+ uint64_t offset;
+ uint64_t addend;
+ 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);
+ 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. */
+
+ 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)
+ _dwarf_write_msb(buf, &offset, sym.st_value + addend,
+ size);
+ else
+ _dwarf_write_lsb(buf, &offset, sym.st_value + addend,
+ size);
+ }
}
static void
-_dwarf_elf_apply_rela_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)
{
+ Dwarf_Unsigned type;
GElf_Rela rela;
- int j;
+ GElf_Sym sym;
+ size_t symndx;
+ uint64_t offset;
+ int size, j;
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);
+ while (gelf_getrela(rel_data, j++, &rela) != NULL) {
+ symndx = GELF_R_SYM(rela.r_info);
+ type = GELF_R_TYPE(rela.r_info);
+
+ if (gelf_getsym(symtab_data, symndx, &sym) == NULL)
+ continue;
+
+ 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
@@ -141,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/libelf/_libelf_config.h b/libelf/_libelf_config.h
index 92e0b0a..fccb264 100644
--- a/libelf/_libelf_config.h
+++ b/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__)
@@ -99,9 +99,9 @@
#elif defined(__riscv64)
-#define LIBELF_ARCH EM_RISCV
-#define LIBELF_BYTEORDER ELFDATA2LSB
-#define LIBELF_CLASS ELFCLASS64
+#define LIBELF_ARCH EM_RISCV
+#define LIBELF_BYTEORDER ELFDATA2LSB
+#define LIBELF_CLASS ELFCLASS64
#elif defined(__sparc__)
diff --git a/libelf/elf_data.c b/libelf/elf_data.c
index 3d8ef6c..d494eda 100644
--- a/libelf/elf_data.c
+++ b/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/libelf/libelf_ar.c b/libelf/libelf_ar.c
index faeec2c..8fce741 100644
--- a/libelf/libelf_ar.c
+++ b/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/libelf/libelf_convert.m4 b/libelf/libelf_convert.m4
index 9f99f1e..ec39590 100644
--- a/libelf/libelf_convert.m4
+++ b/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__. */
@@ -1019,6 +1019,7 @@ _libelf_cvt_NOTE_tof(unsigned char *dst, size_t dsz, unsigned char *src,
WRITE_WORD(dst, type);
src += sizeof(Elf_Note);
+ count -= sizeof(Elf_Note);
if (count < sz)
sz = count;
diff --git a/libelftc/Makefile b/libelftc/Makefile
index 4af496b..6e38a87 100644
--- a/libelftc/Makefile
+++ b/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/libelftc/elftc_reloc_type_str.3 b/libelftc/elftc_reloc_type_str.3
new file mode 100644
index 0000000..5cd08a6
--- /dev/null
+++ b/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/libelftc/elftc_reloc_type_str.c b/libelftc/elftc_reloc_type_str.c
new file mode 100644
index 0000000..a22a1be
--- /dev/null
+++ b/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/libelftc/libelftc.h b/libelftc/libelftc.h
index e3adaf2..6c2b57a 100644
--- a/libelftc/libelftc.h
+++ b/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/libelftc/libelftc_dem_arm.c b/libelftc/libelftc_dem_arm.c
index e850b8b..012819e 100644
--- a/libelftc/libelftc_dem_arm.c
+++ b/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/libelftc/libelftc_dem_gnu2.c b/libelftc/libelftc_dem_gnu2.c
index 4fe141b..5dff1ca 100644
--- a/libelftc/libelftc_dem_gnu2.c
+++ b/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/libelftc/libelftc_dem_gnu3.c b/libelftc/libelftc_dem_gnu3.c
index f5ca7b3..7409363 100644
--- a/libelftc/libelftc_dem_gnu3.c
+++ b/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/libelftc/make-toolchain-version b/libelftc/make-toolchain-version
index 8891258..0cdf370 100755
--- a/libelftc/make-toolchain-version
+++ b/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/libpe/libpe_section.c b/libpe/libpe_section.c
index 7ff63fb..bc1e6f6 100644
--- a/libpe/libpe_section.c
+++ b/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/libpe/pe.h b/libpe/pe.h
index 5b6130e..33969ed 100644
--- a/libpe/pe.h
+++ b/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/nm/nm.c b/nm/nm.c
index 87a456e..ebb42ca 100644
--- a/nm/nm.c
+++ b/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/readelf/readelf.c b/readelf/readelf.c
index a8f5dd9..b8bb4a1 100644
--- a/readelf/readelf.c
+++ b/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 $");
/*
* readelf(1) options.
@@ -337,7 +337,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,
@@ -348,7 +347,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);
@@ -430,6 +430,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:
@@ -651,7 +652,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;
}
@@ -921,6 +922,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";
@@ -972,7 +975,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];
@@ -985,10 +988,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",
@@ -1050,557 +1056,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) &&
@@ -3303,11 +2763,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)
@@ -3360,11 +2820,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)
@@ -3471,7 +2931,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));
@@ -3722,6 +3182,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)) +
@@ -3787,7 +3251,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) {
@@ -3801,7 +3265,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;
}
@@ -3811,9 +3275,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 {
@@ -6803,9 +6273,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/size/size.c b/size/size.c
index be7fbf4..35471c8 100644
--- a/size/size.c
+++ b/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: {
@@ -424,8 +437,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.
*/
@@ -596,7 +609,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 */
@@ -735,7 +748,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/strings/strings.c b/strings/strings.c
index f122eba..8de29ca 100644
--- a/strings/strings.c
+++ b/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));
diff --git a/test/cxxfilt/Makefile b/test/cxxfilt/Makefile
new file mode 100644
index 0000000..adc6706
--- /dev/null
+++ b/test/cxxfilt/Makefile
@@ -0,0 +1,6 @@
+# $Id$
+
+TOP= ../..
+SUBDIR= ts
+
+.include "${TOP}/mk/elftoolchain.tetbase.mk"
diff --git a/test/cxxfilt/tet_scen b/test/cxxfilt/tet_scen
new file mode 100644
index 0000000..2f920e3
--- /dev/null
+++ b/test/cxxfilt/tet_scen
@@ -0,0 +1,11 @@
+# $Id$
+
+all
+ "Starting Test Suite"
+ ^misc
+ "Complete Test Suite"
+
+misc
+ "Starting noarg Test"
+ /ts/misc/tc
+ "Complete noarg Test"
diff --git a/test/cxxfilt/tetexec.cfg b/test/cxxfilt/tetexec.cfg
new file mode 100644
index 0000000..580b3ae
--- /dev/null
+++ b/test/cxxfilt/tetexec.cfg
@@ -0,0 +1,5 @@
+# elfdump Test Suite.
+#
+# $Id$
+
+TET_OUTPUT_CAPTURE=False
diff --git a/test/cxxfilt/ts/Makefile b/test/cxxfilt/ts/Makefile
new file mode 100644
index 0000000..0dff692
--- /dev/null
+++ b/test/cxxfilt/ts/Makefile
@@ -0,0 +1,7 @@
+# $Id$
+
+TOP= ../../..
+
+SUBDIR+= misc
+
+.include "${TOP}/mk/elftoolchain.subdir.mk" \ No newline at end of file
diff --git a/test/cxxfilt/ts/common/func.sh b/test/cxxfilt/ts/common/func.sh
new file mode 100755
index 0000000..b3956eb
--- /dev/null
+++ b/test/cxxfilt/ts/common/func.sh
@@ -0,0 +1,49 @@
+#!/bin/sh
+#
+# $Id$
+
+tpstart() # write test purpose banner and initialise variables
+{
+ tet_infoline "$*"
+ FAIL=N
+}
+
+tpresult() # give test purpose result
+{
+ # $1 is result code to give if FAIL=N (default PASS)
+ if [ $FAIL = N ]; then
+ tet_result ${1-PASS}
+ else
+ tet_result FAIL
+ fi
+}
+
+check_rlt() # execute command (saving output) and check exit code
+{
+ # $1 is command, $2 is expected exit code (0 or "N" for non-zero)
+ RLT=`$1`
+ CODE=$?
+ if [ $2 = 0 -a $CODE -ne 0 ]; then
+ tet_infoline "Command ($1) gave exit code $CODE, expected 0"
+ FAIL=Y
+ elif [ $2 != 0 -a $CODE -eq 0 ]; then
+ tet_infoline "Command ($1) gave exit code $CODE, expected non-zero"
+ FAIL=Y
+ fi
+
+ # $3 is expected result.
+ if [ "$RLT" != "$3" ]; then
+ tet_infoline "Command ($1) gave wrong result:"
+ tet_infoline "$RLT"
+ tet_infoline "expected:"
+ tet_infoline "$3"
+ FAIL=Y
+ fi
+}
+
+run()
+{
+ tpstart "Running test '$1'"
+ check_rlt "$TET_SUITE_ROOT/../../cxxfilt/c++filt $1" 0 "$2"
+ tpresult
+}
diff --git a/test/cxxfilt/ts/common/gen.awk b/test/cxxfilt/ts/common/gen.awk
new file mode 100755
index 0000000..9aa8973
--- /dev/null
+++ b/test/cxxfilt/ts/common/gen.awk
@@ -0,0 +1,33 @@
+#!/usr/bin/awk -f
+#
+# $Id$
+
+BEGIN {
+ FS = "\""
+ tp = 0
+ print "#!/bin/sh\n"
+}
+
+{
+ sub(/#.*/, "");
+ if (NF >= 5) {
+ tp++
+ printf("tp%d()\n{\n run \"%s\" \"%s\"\n}\n\n", tp, $2, $4);
+ }
+}
+
+END {
+ print "tet_startup=\"\""
+ print "tet_cleanup=\"\"\n"
+ printf("%s", "iclist=\"");
+ for (i = 1; i <= tp; i++) {
+ printf("ic%d", i);
+ if (i != tp)
+ printf(" ");
+ }
+ printf("\"\n\n");
+ for (i = 1; i <= tp; i++)
+ printf("ic%d=\"tp%d\"\n", i, i);
+ print "\n. $TET_SUITE_ROOT/ts/common/func.sh";
+ print ". $TET_ROOT/lib/xpg3sh/tcm.sh";
+}
diff --git a/test/cxxfilt/ts/common/ts.mk b/test/cxxfilt/ts/common/ts.mk
new file mode 100644
index 0000000..12429b2
--- /dev/null
+++ b/test/cxxfilt/ts/common/ts.mk
@@ -0,0 +1,15 @@
+# $Id$
+
+TCLIST?= tclist
+
+.PHONY: all
+
+all: tc
+
+tc: ${TCLIST}
+ ${.CURDIR}/../common/gen.awk ${.ALLSRC} > ${.TARGET}
+ chmod +x ${.TARGET}
+
+clean:
+ rm -rf tc
+
diff --git a/test/cxxfilt/ts/misc/Makefile b/test/cxxfilt/ts/misc/Makefile
new file mode 100644
index 0000000..ecc228b
--- /dev/null
+++ b/test/cxxfilt/ts/misc/Makefile
@@ -0,0 +1,5 @@
+# $Id$
+
+TOP= ../../../..
+
+.include "../common/ts.mk"
diff --git a/test/cxxfilt/ts/misc/tclist b/test/cxxfilt/ts/misc/tclist
new file mode 100644
index 0000000..afc1cf6
--- /dev/null
+++ b/test/cxxfilt/ts/misc/tclist
@@ -0,0 +1,15 @@
+# simple function
+
+"_Z1f", "f"
+"_Z1fi", "f(int)"
+"_Z1fic", "f(int, char)"
+
+# namespace
+
+"_ZN12elftoolchainE", "elftoolchain"
+"_ZN11elftoolchainE", "_ZN11elftoolchainE"
+"_ZN12elftoolchain", "_ZN12elftoolchain"
+"_ZN12elftoolchain3foo3barE", "elftoolchain::foo::bar"
+"_ZN12elftoolchain3foo3barEi", "elftoolchain::foo::bar(int)"
+"_ZN12elftoolchain3foo3barEic", "elftoolchain::foo::bar(int, char)"
+
diff --git a/test/elfdump/ts/dso1/@S@p%libelf.so.out b/test/elfdump/ts/dso1/@S@p%libelf.so.out
index 252f33a..77aab75 100644
--- a/test/elfdump/ts/dso1/@S@p%libelf.so.out
+++ b/test/elfdump/ts/dso1/@S@p%libelf.so.out
@@ -19,6 +19,6 @@ Program Header[2]:
Program Header[3]:
p_vaddr: 0x1610c p_flags: [ PF_R ]
- p_paddr: 0x1610c p_type: [ PT_NULL ]
+ p_paddr: 0x1610c p_type: [ PT_GNU_EH_FRAME ]
p_filesz: 0x8 p_memsz: 0x8
p_offset: 0x1610c p_align: 0x4
diff --git a/test/elfdump/ts/dso1/@c@p@n%libelf.so.out b/test/elfdump/ts/dso1/@c@p@n%libelf.so.out
index 7faaa0c..fa00cc4 100644
--- a/test/elfdump/ts/dso1/@c@p@n%libelf.so.out
+++ b/test/elfdump/ts/dso1/@c@p@n%libelf.so.out
@@ -32,7 +32,7 @@ entry: 2
p_align: 8
entry: 3
- p_type: PT_NULL
+ p_type: PT_GNU_EH_FRAME
p_offset: 90380
p_vaddr: 0x1610c
p_paddr: 0x1610c
diff --git a/test/elfdump/ts/dso1/@e@p@c%libelf.so.out b/test/elfdump/ts/dso1/@e@p@c%libelf.so.out
index 3c256c7..00d278c 100644
--- a/test/elfdump/ts/dso1/@e@p@c%libelf.so.out
+++ b/test/elfdump/ts/dso1/@e@p@c%libelf.so.out
@@ -49,7 +49,7 @@ entry: 2
p_align: 8
entry: 3
- p_type: PT_NULL
+ p_type: PT_GNU_EH_FRAME
p_offset: 90380
p_vaddr: 0x1610c
p_paddr: 0x1610c
diff --git a/test/elfdump/ts/dso1/@p%libelf.so.out b/test/elfdump/ts/dso1/@p%libelf.so.out
index a227526..cb06e52 100644
--- a/test/elfdump/ts/dso1/@p%libelf.so.out
+++ b/test/elfdump/ts/dso1/@p%libelf.so.out
@@ -32,7 +32,7 @@ entry: 2
p_align: 8
entry: 3
- p_type: PT_NULL
+ p_type: PT_GNU_EH_FRAME
p_offset: 90380
p_vaddr: 0x1610c
p_paddr: 0x1610c
diff --git a/test/elfdump/ts/dso1/@p@s%libelf.so.out b/test/elfdump/ts/dso1/@p@s%libelf.so.out
index f788b8f..8846cf4 100644
--- a/test/elfdump/ts/dso1/@p@s%libelf.so.out
+++ b/test/elfdump/ts/dso1/@p@s%libelf.so.out
@@ -32,7 +32,7 @@ entry: 2
p_align: 8
entry: 3
- p_type: PT_NULL
+ p_type: PT_GNU_EH_FRAME
p_offset: 90380
p_vaddr: 0x1610c
p_paddr: 0x1610c
diff --git a/test/elfdump/ts/dso2/@S@p%test.so.out b/test/elfdump/ts/dso2/@S@p%test.so.out
index 2182aa1..52bf7ee 100644
--- a/test/elfdump/ts/dso2/@S@p%test.so.out
+++ b/test/elfdump/ts/dso2/@S@p%test.so.out
@@ -19,12 +19,12 @@ Program Header[2]:
Program Header[3]:
p_vaddr: 0xb10 p_flags: [ PF_R ]
- p_paddr: 0xb10 p_type: [ PT_NULL ]
+ p_paddr: 0xb10 p_type: [ PT_GNU_EH_FRAME ]
p_filesz: 0x3c p_memsz: 0x3c
p_offset: 0xb10 p_align: 0x4
Program Header[4]:
p_vaddr: 0 p_flags: [ PF_W|PF_R ]
- p_paddr: 0 p_type: [ PT_LOAD ]
+ p_paddr: 0 p_type: [ PT_GNU_STACK ]
p_filesz: 0 p_memsz: 0
p_offset: 0 p_align: 0x8
diff --git a/test/elfdump/ts/dso2/@c@p@n%test.so.out b/test/elfdump/ts/dso2/@c@p@n%test.so.out
index 57a8206..95a7d07 100644
--- a/test/elfdump/ts/dso2/@c@p@n%test.so.out
+++ b/test/elfdump/ts/dso2/@c@p@n%test.so.out
@@ -32,7 +32,7 @@ entry: 2
p_align: 8
entry: 3
- p_type: PT_NULL
+ p_type: PT_GNU_EH_FRAME
p_offset: 2832
p_vaddr: 0xb10
p_paddr: 0xb10
@@ -42,7 +42,7 @@ entry: 3
p_align: 4
entry: 4
- p_type: PT_LOAD
+ p_type: PT_GNU_STACK
p_offset: 0
p_vaddr: 0
p_paddr: 0
diff --git a/test/elfdump/ts/dso2/@e@p@c%test.so.out b/test/elfdump/ts/dso2/@e@p@c%test.so.out
index f696e79..437753a 100644
--- a/test/elfdump/ts/dso2/@e@p@c%test.so.out
+++ b/test/elfdump/ts/dso2/@e@p@c%test.so.out
@@ -49,7 +49,7 @@ entry: 2
p_align: 8
entry: 3
- p_type: PT_NULL
+ p_type: PT_GNU_EH_FRAME
p_offset: 2832
p_vaddr: 0xb10
p_paddr: 0xb10
@@ -59,7 +59,7 @@ entry: 3
p_align: 4
entry: 4
- p_type: PT_LOAD
+ p_type: PT_GNU_STACK
p_offset: 0
p_vaddr: 0
p_paddr: 0
diff --git a/test/elfdump/ts/dso2/@p%test.so.out b/test/elfdump/ts/dso2/@p%test.so.out
index 99b2fb9..0ae9b8e 100644
--- a/test/elfdump/ts/dso2/@p%test.so.out
+++ b/test/elfdump/ts/dso2/@p%test.so.out
@@ -32,7 +32,7 @@ entry: 2
p_align: 8
entry: 3
- p_type: PT_NULL
+ p_type: PT_GNU_EH_FRAME
p_offset: 2832
p_vaddr: 0xb10
p_paddr: 0xb10
@@ -42,7 +42,7 @@ entry: 3
p_align: 4
entry: 4
- p_type: PT_LOAD
+ p_type: PT_GNU_STACK
p_offset: 0
p_vaddr: 0
p_paddr: 0
diff --git a/test/elfdump/ts/dso2/@p@s%test.so.out b/test/elfdump/ts/dso2/@p@s%test.so.out
index ae24ddb..c415e6b 100644
--- a/test/elfdump/ts/dso2/@p@s%test.so.out
+++ b/test/elfdump/ts/dso2/@p@s%test.so.out
@@ -32,7 +32,7 @@ entry: 2
p_align: 8
entry: 3
- p_type: PT_NULL
+ p_type: PT_GNU_EH_FRAME
p_offset: 2832
p_vaddr: 0xb10
p_paddr: 0xb10
@@ -42,7 +42,7 @@ entry: 3
p_align: 4
entry: 4
- p_type: PT_LOAD
+ p_type: PT_GNU_STACK
p_offset: 0
p_vaddr: 0
p_paddr: 0
diff --git a/test/elfdump/ts/exec1/@S@e@p%ls.out b/test/elfdump/ts/exec1/@S@e@p%ls.out
index 20e7b63..ffad8b7 100644
--- a/test/elfdump/ts/exec1/@S@e@p%ls.out
+++ b/test/elfdump/ts/exec1/@S@e@p%ls.out
@@ -47,6 +47,6 @@ Program Header[5]:
Program Header[6]:
p_vaddr: 0x40613c p_flags: [ PF_R ]
- p_paddr: 0x40613c p_type: [ PT_NULL ]
+ p_paddr: 0x40613c p_type: [ PT_GNU_EH_FRAME ]
p_filesz: 0x8 p_memsz: 0x8
p_offset: 0x613c p_align: 0x4
diff --git a/test/elfdump/ts/exec1/@c@p@n%ls.out b/test/elfdump/ts/exec1/@c@p@n%ls.out
index 47815c8..e1cf3d8 100644
--- a/test/elfdump/ts/exec1/@c@p@n%ls.out
+++ b/test/elfdump/ts/exec1/@c@p@n%ls.out
@@ -62,7 +62,7 @@ entry: 5
p_align: 4
entry: 6
- p_type: PT_NULL
+ p_type: PT_GNU_EH_FRAME
p_offset: 24892
p_vaddr: 0x40613c
p_paddr: 0x40613c
diff --git a/test/elfdump/ts/exec1/@e@p%ls.out b/test/elfdump/ts/exec1/@e@p%ls.out
index 9eecdf3..230fc36 100644
--- a/test/elfdump/ts/exec1/@e@p%ls.out
+++ b/test/elfdump/ts/exec1/@e@p%ls.out
@@ -79,7 +79,7 @@ entry: 5
p_align: 4
entry: 6
- p_type: PT_NULL
+ p_type: PT_GNU_EH_FRAME
p_offset: 24892
p_vaddr: 0x40613c
p_paddr: 0x40613c
diff --git a/test/elfdump/ts/exec1/@e@p@c@d%ls.out b/test/elfdump/ts/exec1/@e@p@c@d%ls.out
index 83e6366..3d5c881 100644
--- a/test/elfdump/ts/exec1/@e@p@c@d%ls.out
+++ b/test/elfdump/ts/exec1/@e@p@c@d%ls.out
@@ -79,7 +79,7 @@ entry: 5
p_align: 4
entry: 6
- p_type: PT_NULL
+ p_type: PT_GNU_EH_FRAME
p_offset: 24892
p_vaddr: 0x40613c
p_paddr: 0x40613c
diff --git a/test/elfdump/ts/exec1/@p@e%ls.out b/test/elfdump/ts/exec1/@p@e%ls.out
index 9eecdf3..230fc36 100644
--- a/test/elfdump/ts/exec1/@p@e%ls.out
+++ b/test/elfdump/ts/exec1/@p@e%ls.out
@@ -79,7 +79,7 @@ entry: 5
p_align: 4
entry: 6
- p_type: PT_NULL
+ p_type: PT_GNU_EH_FRAME
p_offset: 24892
p_vaddr: 0x40613c
p_paddr: 0x40613c
diff --git a/test/elfdump/ts/exec1/@p@n%ls.out b/test/elfdump/ts/exec1/@p@n%ls.out
index 329ac78..b259de7 100644
--- a/test/elfdump/ts/exec1/@p@n%ls.out
+++ b/test/elfdump/ts/exec1/@p@n%ls.out
@@ -62,7 +62,7 @@ entry: 5
p_align: 4
entry: 6
- p_type: PT_NULL
+ p_type: PT_GNU_EH_FRAME
p_offset: 24892
p_vaddr: 0x40613c
p_paddr: 0x40613c
diff --git a/test/elfdump/ts/exec1/@p@s%ls.out b/test/elfdump/ts/exec1/@p@s%ls.out
index ac70601..599e0c3 100644
--- a/test/elfdump/ts/exec1/@p@s%ls.out
+++ b/test/elfdump/ts/exec1/@p@s%ls.out
@@ -62,7 +62,7 @@ entry: 5
p_align: 4
entry: 6
- p_type: PT_NULL
+ p_type: PT_GNU_EH_FRAME
p_offset: 24892
p_vaddr: 0x40613c
p_paddr: 0x40613c
diff --git a/test/elfdump/ts/exec2/@S@n%cp.out b/test/elfdump/ts/exec2/@S@n%cp.out
index c4ac64c..59d69d8 100644
--- a/test/elfdump/ts/exec2/@S@n%cp.out
+++ b/test/elfdump/ts/exec2/@S@n%cp.out
@@ -5,4 +5,4 @@ Note Section: .note.ABI-tag
namesz 0x8:
FreeBSD
descsz 0x4:
- desc[0] ffffffac ffffffb2 0a 00
+ desc[0] ac b2 0a 00
OpenPOWER on IntegriCloud