From 5eccfb5cf5403e9e564066e0a75d80534b49e91d Mon Sep 17 00:00:00 2001 From: Ed Maste Date: Mon, 22 Dec 2014 20:32:23 +0000 Subject: [PATCH] Import elftoolchain rev 3130 From svn.code.sf.net/p/elftoolchain/code/trunk --- INSTALL | 33 +- Makefile | 5 +- ar/Makefile | 6 +- ar/acpyacc.y | 7 +- ar/os.Linux.mk | 9 + ar/read.c | 7 +- ar/write.c | 8 +- brandelf/brandelf.1 | 8 +- brandelf/brandelf.c | 7 +- common/Makefile | 5 +- common/elfdefinitions.h | 39 +- elfcopy/archive.c | 11 +- elfcopy/main.c | 5 +- elfcopy/sections.c | 25 +- elfcopy/segments.c | 12 +- elfcopy/symbols.c | 5 +- libdwarf/Makefile | 15 +- libdwarf/Version.map | 13 +- libdwarf/_libdwarf.h | 51 +- libdwarf/dwarf.3 | 48 +- libdwarf/dwarf.h | 59 +- libdwarf/dwarf_attr.3 | 3 +- libdwarf/dwarf_attr.c | 39 +- libdwarf/dwarf_attroffset.3 | 86 ++ libdwarf/dwarf_attrval.c | 3 +- libdwarf/dwarf_attrval_signed.3 | 31 +- libdwarf/dwarf_child.3 | 96 +- libdwarf/dwarf_cu.c | 92 +- libdwarf/dwarf_die.c | 160 ++- libdwarf/dwarf_dieoffset.3 | 50 +- libdwarf/dwarf_dump.c | 94 +- libdwarf/dwarf_errmsg.c | 4 +- libdwarf/dwarf_frame.c | 6 +- libdwarf/dwarf_get_die_infotypes_flag.3 | 73 ++ libdwarf/dwarf_get_section_max_offsets.3 | 116 ++ libdwarf/dwarf_highpc.3 | 39 +- libdwarf/dwarf_lineno.c | 6 +- libdwarf/dwarf_loclist.c | 224 ++-- libdwarf/dwarf_loclist_from_expr.3 | 36 +- libdwarf/dwarf_next_cu_header.3 | 210 ++- libdwarf/dwarf_next_types_section.3 | 134 ++ libdwarf/dwarf_ranges.c | 4 +- libdwarf/dwarf_sections.c | 111 ++ libdwarf/libdwarf.h | 35 +- libdwarf/libdwarf_arange.c | 8 +- libdwarf/libdwarf_attr.c | 5 +- libdwarf/libdwarf_die.c | 8 +- libdwarf/libdwarf_frame.c | 81 +- libdwarf/libdwarf_info.c | 129 +- libdwarf/libdwarf_init.c | 12 +- libdwarf/libdwarf_lineno.c | 18 +- libdwarf/libdwarf_loc.c | 110 +- libdwarf/libdwarf_loclist.c | 133 +- libdwarf/libdwarf_nametbl.c | 4 +- libdwarf/libdwarf_sections.c | 25 +- libelf/_libelf.h | 76 +- libelf/_libelf_ar.h | 13 +- libelf/elf.3 | 34 +- libelf/elf_data.c | 25 +- libelf/elf_errmsg.c | 6 +- libelf/elf_flag.c | 6 +- libelf/elf_memory.c | 4 +- libelf/elf_next.c | 12 +- libelf/elf_open.c | 2 +- libelf/elf_rand.c | 4 +- libelf/elf_rawfile.c | 6 +- libelf/elf_scn.c | 17 +- libelf/elf_strptr.c | 6 +- libelf/elf_update.c | 117 +- libelf/gelf_cap.c | 6 +- libelf/gelf_dyn.c | 11 +- libelf/gelf_move.c | 11 +- libelf/gelf_rel.c | 16 +- libelf/gelf_rela.c | 16 +- libelf/gelf_sym.c | 16 +- libelf/gelf_syminfo.c | 11 +- libelf/gelf_symshndx.c | 11 +- libelf/libelf.h | 4 +- libelf/libelf_align.c | 10 +- libelf/libelf_ar.c | 49 +- libelf/libelf_ar_util.c | 45 +- libelf/libelf_checksum.c | 8 +- libelf/libelf_convert.m4 | 207 +-- libelf/libelf_data.c | 17 +- libelf/libelf_ehdr.c | 18 +- libelf/libelf_extended.c | 14 +- libelf/libelf_memory.c | 6 +- libelf/libelf_open.c | 8 +- libelf/libelf_phdr.c | 5 +- libelf/libelf_xlate.c | 10 +- libelftc/elftc_copyfile.c | 8 +- libelftc/elftc_demangle.c | 3 +- libelftc/libelftc.h | 5 +- libelftc/libelftc_dem_gnu3.c | 4 +- mk/elftoolchain.lib.mk | 7 +- mk/elftoolchain.os.mk | 6 +- mk/elftoolchain.prog.mk | 4 +- mk/elftoolchain.subdir.mk | 6 +- mk/elftoolchain.tetbase.mk | 46 + mk/os.Linux.mk | 12 +- mk/os.NetBSD.mk | 10 +- nm/nm.c | 4 +- readelf/readelf.1 | 4 +- readelf/readelf.c | 1133 ++++++++++++----- strings/strings.c | 8 +- test/ar/Makefile | 4 +- test/ar/plugin/Makefile | 4 +- test/ar/plugin/Makefile.ardiff | 4 +- test/ar/plugin/ardiff.c | 13 +- test/ar/plugin/teraser.c | 10 +- test/elfcopy/Makefile | 4 +- test/elfcopy/plugin/Makefile | 4 +- test/elfcopy/plugin/Makefile.ardiff | 4 +- test/elfcopy/plugin/ardiff.c | 13 +- test/elfcopy/plugin/teraser.c | 10 +- .../tc/strip-empty-1/in/strip-empty-1.in.shar | 32 + .../strip-empty-1/out/strip-empty-1.out.shar | 22 + .../tc/strip-empty-1/strip-empty-1.err | 0 .../tc/strip-empty-1/strip-empty-1.eval | 1 + .../tc/strip-empty-1/strip-empty-1.out | 0 .../elfcopy/tc/strip-empty-1/strip-empty-1.sh | 6 + test/elfdump/Makefile | 20 +- test/libdwarf/Makefile | 34 +- test/libdwarf/ts/Makefile | 6 +- test/libdwarf/ts/Makefile.tset | 12 +- test/libdwarf/ts/README | 14 +- test/libdwarf/ts/common/die_traverse2.c | 120 ++ test/libdwarf/ts/common/driver.h | 11 +- .../ts/common/object/ld_symver.o-64-g1.gz | Bin 0 -> 36785 bytes test/libdwarf/ts/dwarf_attrlist/Makefile | 4 +- .../libdwarf/ts/dwarf_attrlist/dt32-g1.xml.gz | Bin 750 -> 750 bytes .../libdwarf/ts/dwarf_attrlist/dt64-g1.xml.gz | Bin 753 -> 753 bytes .../ts/dwarf_attrlist/dwarf_attrlist.c | 7 +- .../libdwarf/ts/dwarf_attrlist/ec32-g1.xml.gz | Bin 5465 -> 5465 bytes .../libdwarf/ts/dwarf_attrlist/ec64-g1.xml.gz | Bin 5475 -> 5475 bytes .../dwarf_attrlist/ld_symver.o-64-g1.xml.gz | Bin 0 -> 3754 bytes test/libdwarf/ts/dwarf_die_query/Makefile | 4 +- .../ts/dwarf_die_query/dt32-g1.xml.gz | Bin 1461 -> 1467 bytes .../ts/dwarf_die_query/dt64-g1.xml.gz | Bin 1459 -> 1465 bytes .../ts/dwarf_die_query/dto64-g1.xml.gz | Bin 1458 -> 1465 bytes .../ts/dwarf_die_query/dwarf_die_query.c | 26 +- .../ts/dwarf_die_query/ec32-g1.xml.gz | Bin 12687 -> 12695 bytes .../ts/dwarf_die_query/ec64-g1.xml.gz | Bin 12685 -> 12692 bytes .../dwarf_die_query/ld_symver.o-64-g1.xml.gz | Bin 0 -> 8494 bytes test/libdwarf/ts/dwarf_form/Makefile | 4 +- test/libdwarf/ts/dwarf_form/dt32-g1.xml.gz | Bin 8114 -> 9400 bytes test/libdwarf/ts/dwarf_form/dt64-g1.xml.gz | Bin 8140 -> 9406 bytes test/libdwarf/ts/dwarf_form/dwarf_form.c | 20 +- test/libdwarf/ts/dwarf_form/ec32-g1.xml.gz | Bin 89574 -> 101798 bytes test/libdwarf/ts/dwarf_form/ec64-g1.xml.gz | Bin 89610 -> 101875 bytes .../ts/dwarf_form/ld_symver.o-64-g1.xml.gz | Bin 0 -> 64812 bytes .../libdwarf/ts/dwarf_next_cu_header/Makefile | 4 +- .../ts/dwarf_next_cu_header/dt32-g1.xml.gz | Bin 244 -> 250 bytes .../ts/dwarf_next_cu_header/dt64-g1.xml.gz | Bin 246 -> 252 bytes .../dwarf_next_cu_header.c | 68 +- .../ts/dwarf_next_cu_header/ec32-g1.xml.gz | Bin 352 -> 372 bytes .../ts/dwarf_next_cu_header/ec64-g1.xml.gz | Bin 358 -> 378 bytes .../ld_symver.o-64-g1.xml.gz | Bin 0 -> 1970 bytes test/libelf/Makefile | 36 +- test/libelf/tset/Makefile | 6 +- test/libelf/tset/elf_update/update.m4 | 86 +- test/libelftc/Makefile | 36 +- test/libelftc/tset/Makefile | 5 +- test/libelftc/tset/Makefile.tset | 9 +- .../tset/elftc_string_table/string_table.m4 | 4 +- test/nm/Makefile | 36 +- test/nm/ts/Makefile | 6 +- test/tet/Makefile | 4 +- 168 files changed, 3860 insertions(+), 1503 deletions(-) create mode 100644 ar/os.Linux.mk create mode 100644 libdwarf/dwarf_attroffset.3 create mode 100644 libdwarf/dwarf_get_die_infotypes_flag.3 create mode 100644 libdwarf/dwarf_get_section_max_offsets.3 create mode 100644 libdwarf/dwarf_next_types_section.3 create mode 100644 libdwarf/dwarf_sections.c create mode 100644 mk/elftoolchain.tetbase.mk create mode 100644 test/elfcopy/tc/strip-empty-1/in/strip-empty-1.in.shar create mode 100644 test/elfcopy/tc/strip-empty-1/out/strip-empty-1.out.shar create mode 100644 test/elfcopy/tc/strip-empty-1/strip-empty-1.err create mode 100644 test/elfcopy/tc/strip-empty-1/strip-empty-1.eval create mode 100644 test/elfcopy/tc/strip-empty-1/strip-empty-1.out create mode 100755 test/elfcopy/tc/strip-empty-1/strip-empty-1.sh create mode 100644 test/libdwarf/ts/common/die_traverse2.c create mode 100644 test/libdwarf/ts/common/object/ld_symver.o-64-g1.gz create mode 100644 test/libdwarf/ts/dwarf_attrlist/ld_symver.o-64-g1.xml.gz create mode 100644 test/libdwarf/ts/dwarf_die_query/ld_symver.o-64-g1.xml.gz create mode 100644 test/libdwarf/ts/dwarf_form/ld_symver.o-64-g1.xml.gz create mode 100644 test/libdwarf/ts/dwarf_next_cu_header/ld_symver.o-64-g1.xml.gz diff --git a/INSTALL b/INSTALL index bd8d294d00af..4171ce816f7b 100644 --- a/INSTALL +++ b/INSTALL @@ -19,6 +19,7 @@ operating systems. NetBSD_ v5.0.2 i386 OpenBSD_ v5.0 i386 Ubuntu_ GNU/Linux 10.04LTS i386 & x86_64 + Ubuntu_ GNU/Linux 12.04LTS i386 & x86_64 ================= ======== ======================= .. _DragonFly BSD: http://www.dragonflybsd.org/ @@ -114,6 +115,26 @@ Prerequisites - Building additional documentation is not currently supported under OpenBSD. +:OpenBSD 5.4: + - The following packages are pre-requisites for building the + sources on OpenBSD 5.4: + + =================== ===================================== + **Package** **Description** + =================== ===================================== + ``libarchive`` An archive access library. + =================== ===================================== + + The following command line may be used to install the necessary + pre-requisites:: + + # pkg_add libarchive + + - The test suites cannot currently be built under OpenBSD. + + - Building additional documentation is not currently supported + under OpenBSD. + :NetBSD 5.0.2: - The core libraries and utilities should build out of the box on a stock install of NetBSD. @@ -174,16 +195,16 @@ Prerequisites % sudo apt-get install pgf -:Ubuntu GNU/Linux 11.10: +:Ubuntu GNU/Linux 12.04: - The following packages are pre-requisites for building the - sources on Ubuntu GNU/Linux 11.10: + sources on Ubuntu GNU/Linux 12.04: =================== ===================================== **Package** **Description** =================== ===================================== ``bison`` Parser generator. + ``build-essential`` Basic build tools. ``flex`` Lexical analyser. - ``gcc`` C compiler. ``libarchive-dev`` Archive access library. ``libexpat1-dev`` An XML processing library. ``m4`` Macro processor. @@ -195,7 +216,7 @@ Prerequisites The following command line may be used to install the necessary pre-requisites:: - % sudo apt-get install bison flex gcc libarchive-dev \ + % sudo apt-get install bison build-essential flex libarchive-dev \ m4 pmake - To build and run the test suite: @@ -210,7 +231,7 @@ Prerequisites % sudo apt-get install libexpat1-dev python-yaml sharutils - Builds of additional documentation are not currently supported - under Ubuntu GNU/Linux 11.10. + under Ubuntu GNU/Linux 12.04. .. _Test Execution Toolkit: http://tetworks.opengroup.org/ .. _OpenGroup: http://www.opengroup.org/ @@ -276,7 +297,7 @@ website`_. .. _project website: http://elftoolchain.sourceforge.net/ -.. $Id: INSTALL 2777 2012-12-12 17:21:36Z jkoshy $ +.. $Id: INSTALL 3020 2014-04-17 15:52:31Z jkoshy $ .. Local Variables: .. mode: rst diff --git a/Makefile b/Makefile index 64d2a444fc62..b217fdda1f11 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile 2872 2013-01-07 13:57:54Z jkoshy $ +# $Id: Makefile 3016 2014-04-10 16:01:42Z jkoshy $ TOP= . @@ -15,7 +15,8 @@ SUBDIR += libdwarf SUBDIR += libelftc # Build the tools needed for the rest of the build. -SUBDIR += isa + +# SUBDIR += isa # ('isa' does not build on all platforms yet). # Build tools after the libraries. SUBDIR += addr2line diff --git a/ar/Makefile b/ar/Makefile index c20a9f7ffbd1..ddd811338d92 100644 --- a/ar/Makefile +++ b/ar/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile 2741 2012-12-10 18:47:00Z jkoshy $ +# $Id: Makefile 3107 2014-12-20 08:31:58Z kaiwang27 $ TOP= .. @@ -9,8 +9,8 @@ YSRC= acpyacc.y WARNS?= 5 -DPADD= ${LIBARCHIVE} ${LIBELFTC} ${LIBELF} -LDADD= -larchive -lelftc -lelf +DPADD= ${LIBARCHIVE} ${LIBELFTC} ${LIBELF} ${LIBZ} +LDADD= -larchive -lelftc -lelf -lz CFLAGS+=-I. -I${.CURDIR} diff --git a/ar/acpyacc.y b/ar/acpyacc.y index bbe26e021dbf..e1d02ec82513 100644 --- a/ar/acpyacc.y +++ b/ar/acpyacc.y @@ -253,13 +253,12 @@ arscp_open(char *fname) if ((a = archive_read_new()) == NULL) bsdar_errc(bsdar, 0, "archive_read_new failed"); - archive_read_support_compression_none(a); archive_read_support_format_ar(a); - AC(archive_read_open_file(a, fname, DEF_BLKSZ)); + AC(archive_read_open_filename(a, fname, DEF_BLKSZ)); if ((r = archive_read_next_header(a, &entry))) bsdar_warnc(bsdar, 0, "%s", archive_error_string(a)); AC(archive_read_close(a)); - ACV(archive_read_finish(a)); + ACV(archive_read_free(a)); if (r != ARCHIVE_OK) return; arscp_create(fname, fname); @@ -317,7 +316,7 @@ arscp_create(char *in, char *out) archive_write_set_format_ar_svr4(a); AC(archive_write_open_fd(a, ofd)); AC(archive_write_close(a)); - ACV(archive_write_finish(a)); + ACV(archive_write_free(a)); } /* Override the previous target, if any. */ diff --git a/ar/os.Linux.mk b/ar/os.Linux.mk new file mode 100644 index 000000000000..daed864eee9e --- /dev/null +++ b/ar/os.Linux.mk @@ -0,0 +1,9 @@ +.if ${OS_DISTRIBUTION} == "Ubuntu" +.if ${OS_DISTRIBUTION_VERSION} >= 14 +# Ubuntu Trusty Tahr and later. + +# Use the --nounput option to flex(1), to prevent unused functions from +# being generated. +LFLAGS += --nounput +.endif +.endif diff --git a/ar/read.c b/ar/read.c index 6c2affe57438..4e79ff2568ae 100644 --- a/ar/read.c +++ b/ar/read.c @@ -39,7 +39,7 @@ #include "ar.h" -ELFTC_VCSID("$Id: read.c 2229 2011-11-27 13:25:37Z jkoshy $"); +ELFTC_VCSID("$Id: read.c 3102 2014-10-29 21:09:01Z jkoshy $"); /* * Handle read modes: 'x', 't' and 'p'. @@ -68,9 +68,8 @@ ar_read_archive(struct bsdar *bsdar, int mode) if ((a = archive_read_new()) == NULL) bsdar_errc(bsdar, 0, "archive_read_new failed"); - archive_read_support_compression_none(a); archive_read_support_format_ar(a); - AC(archive_read_open_file(a, bsdar->filename, DEF_BLKSZ)); + AC(archive_read_open_filename(a, bsdar->filename, DEF_BLKSZ)); out = bsdar->output; @@ -188,5 +187,5 @@ ar_read_archive(struct bsdar *bsdar, int mode) } } AC(archive_read_close(a)); - ACV(archive_read_finish(a)); + ACV(archive_read_free(a)); } diff --git a/ar/write.c b/ar/write.c index f637d378f226..490b22fab07b 100644 --- a/ar/write.c +++ b/ar/write.c @@ -41,7 +41,7 @@ #include "ar.h" -ELFTC_VCSID("$Id: write.c 2496 2012-04-24 02:33:40Z jkoshy $"); +ELFTC_VCSID("$Id: write.c 3102 2014-10-29 21:09:01Z jkoshy $"); #define _ARMAG_LEN 8 /* length of the magic string */ #define _ARHDR_LEN 60 /* length of the archive header */ @@ -259,7 +259,6 @@ read_objs(struct bsdar *bsdar, const char *archive, int checkargv) if ((a = archive_read_new()) == NULL) bsdar_errc(bsdar, 0, "archive_read_new failed"); - archive_read_support_compression_none(a); archive_read_support_format_ar(a); AC(archive_read_open_filename(a, archive, DEF_BLKSZ)); for (;;) { @@ -349,7 +348,7 @@ read_objs(struct bsdar *bsdar, const char *archive, int checkargv) TAILQ_INSERT_TAIL(&bsdar->v_obj, obj, objs); } AC(archive_read_close(a)); - ACV(archive_read_finish(a)); + ACV(archive_read_free(a)); } /* @@ -732,7 +731,6 @@ write_objs(struct bsdar *bsdar) archive_write_set_format_ar_bsd(a); else archive_write_set_format_ar_svr4(a); - archive_write_set_compression_none(a); AC(archive_write_open_filename(a, bsdar->filename)); @@ -795,7 +793,7 @@ write_objs(struct bsdar *bsdar) } AC(archive_write_close(a)); - ACV(archive_write_finish(a)); + ACV(archive_write_free(a)); } /* diff --git a/brandelf/brandelf.1 b/brandelf/brandelf.1 index 5665b412bb41..5913360d87bd 100644 --- a/brandelf/brandelf.1 +++ b/brandelf/brandelf.1 @@ -26,9 +26,9 @@ .\" SUCH DAMAGE. .\" .\" $FreeBSD: src/usr.bin/brandelf/brandelf.1,v 1.17 2007/03/09 14:36:18 ru Exp $ -.\" $Id: brandelf.1 2245 2011-11-29 08:11:00Z jkoshy $ +.\" $Id: brandelf.1 3101 2014-10-27 22:24:40Z jkoshy $ .\" -.Dd November 29, 2011 +.Dd October 27, 2014 .Dt BRANDELF 1 .Os .Sh NAME @@ -90,7 +90,9 @@ Supported ABIs include and .Dq Li Tru64 . .It Fl v -Turns on verbose output. +This option is accepted for compatibility with other versions of +.Nm , +but is otherwise ignored. .It Fl V | Fl -version Print a version identifier and exit. .El diff --git a/brandelf/brandelf.c b/brandelf/brandelf.c index fac218750ee7..286b6ab12359 100644 --- a/brandelf/brandelf.c +++ b/brandelf/brandelf.c @@ -46,7 +46,7 @@ #include "_elftc.h" -ELFTC_VCSID("$Id: brandelf.c 2324 2011-12-12 06:36:27Z jkoshy $"); +ELFTC_VCSID("$Id: brandelf.c 3101 2014-10-27 22:24:40Z jkoshy $"); static int elftype(const char *); static const char *iselftype(int); @@ -96,7 +96,7 @@ main(int argc, char **argv) Elf_Kind kind; int type = ELFOSABI_NONE; int retval = 0; - int ch, change = 0, verbose = 0, force = 0, listed = 0; + int ch, change = 0, force = 0, listed = 0; if (elf_version(EV_CURRENT) == EV_NONE) errx(EXIT_FAILURE, "elf_version error"); @@ -124,7 +124,7 @@ main(int argc, char **argv) listed = 1; break; case 'v': - verbose = 1; + /* This flag is ignored. */ break; case 't': if (force) @@ -256,7 +256,6 @@ Usage: %s [options] file...\n\ -h | --help Print a usage message and exit.\n\ -l List known ELF ABI names.\n\ -t ABI Set the ELF ABI to the value named by \"ABI\".\n\ - -v Be verbose.\n\ -V | --version Print a version identifier and exit.\n" static void diff --git a/common/Makefile b/common/Makefile index d3df246e78fc..9551bcd20f34 100644 --- a/common/Makefile +++ b/common/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile 2606 2012-10-02 17:52:57Z jkoshy $ +# $Id: Makefile 3022 2014-04-17 18:05:58Z jkoshy $ TOP= .. @@ -12,4 +12,7 @@ all depend obj: clean clobber: rm -f ${CLEANFILES} +cleandepend: + rm -f .depend + .include "${TOP}/mk/elftoolchain.inc.mk" diff --git a/common/elfdefinitions.h b/common/elfdefinitions.h index 7bed9a19a0dc..f63dc7f2178d 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 2950 2013-06-15 13:36:02Z jkoshy $ + * $Id: elfdefinitions.h 3110 2014-12-20 08:32:46Z kaiwang27 $ */ /* @@ -770,6 +770,8 @@ _ELF_DEFINE_EM(EM_ETPU, 178, \ "Freescale Extended Time Processing Unit") \ _ELF_DEFINE_EM(EM_SLE9X, 179, \ "Infineon Technologies SLE9X core") \ +_ELF_DEFINE_EM(EM_AARCH64, 183, \ + "AArch64 (64-bit ARM)") \ _ELF_DEFINE_EM(EM_AVR32, 185, \ "Atmel Corporation 32-bit microprocessor family") \ _ELF_DEFINE_EM(EM_STM8, 186, \ @@ -819,7 +821,8 @@ enum { EM__LAST__ }; -/* Older synonyms. */ +/* Other synonyms. */ +#define EM_AMD64 EM_X86_64 #define EM_ARC_A5 EM_ARC_COMPACT /* @@ -2112,11 +2115,11 @@ typedef struct { /* 64-bit entry. */ typedef struct { - Elf64_Word l_name; - Elf64_Word l_time_stamp; - Elf64_Word l_checksum; - Elf64_Word l_version; - Elf64_Word l_flags; + Elf64_Word l_name; /* The name of a shared object. */ + Elf64_Word l_time_stamp; /* 32-bit timestamp. */ + Elf64_Word l_checksum; /* Checksum of visible symbols, sizes. */ + Elf64_Word l_version; /* Interface version string index. */ + Elf64_Word l_flags; /* Flags (LL_*). */ } Elf64_Lib; #define _ELF_DEFINE_LL_FLAGS() \ @@ -2364,12 +2367,12 @@ typedef struct { /* 64 bit PHDR entry. */ typedef struct { Elf64_Word p_type; /* Type of segment. */ - Elf64_Word p_flags; /* File offset to segment. */ - Elf64_Off p_offset; /* Virtual address in memory. */ - Elf64_Addr p_vaddr; /* Physical address (if relevant). */ - Elf64_Addr p_paddr; /* Size of segment in file. */ - Elf64_Xword p_filesz; /* Size of segment in memory. */ - Elf64_Xword p_memsz; /* Segment flags. */ + Elf64_Word p_flags; /* Segment flags. */ + Elf64_Off p_offset; /* File offset to segment. */ + Elf64_Addr p_vaddr; /* Virtual address in memory. */ + Elf64_Addr p_paddr; /* Physical address (if relevant). */ + Elf64_Xword p_filesz; /* Size of segment in file. */ + Elf64_Xword p_memsz; /* Size of segment in memory. */ Elf64_Xword p_align; /* Alignment constraints. */ } Elf64_Phdr; @@ -2453,11 +2456,11 @@ typedef struct { typedef struct { Elf64_Word st_name; /* index of symbol's name */ - unsigned char st_info; /* value for the symbol */ - unsigned char st_other; /* size of associated data */ - Elf64_Half st_shndx; /* type and binding attributes */ - Elf64_Addr st_value; /* visibility */ - Elf64_Xword st_size; /* index of related section */ + unsigned char st_info; /* type and binding attributes */ + unsigned char st_other; /* visibility */ + Elf64_Half st_shndx; /* index of related section */ + Elf64_Addr st_value; /* value for the symbol */ + Elf64_Xword st_size; /* size of associated data */ } Elf64_Sym; #define ELF32_ST_BIND(I) ((I) >> 4) diff --git a/elfcopy/archive.c b/elfcopy/archive.c index a4f8017989ba..4735f02296e3 100644 --- a/elfcopy/archive.c +++ b/elfcopy/archive.c @@ -40,7 +40,7 @@ #include "elfcopy.h" -ELFTC_VCSID("$Id: archive.c 2370 2011-12-29 12:48:12Z jkoshy $"); +ELFTC_VCSID("$Id: archive.c 3102 2014-10-29 21:09:01Z jkoshy $"); #define _ARMAG_LEN 8 /* length of ar magic string */ #define _ARHDR_LEN 60 /* length of ar header */ @@ -350,12 +350,11 @@ ac_detect_ar(int ifd) r = -1; if ((a = archive_read_new()) == NULL) return (0); - archive_read_support_compression_none(a); archive_read_support_format_ar(a); if (archive_read_open_fd(a, ifd, 10240) == ARCHIVE_OK) r = archive_read_next_header(a, &entry); archive_read_close(a); - archive_read_finish(a); + archive_read_free(a); return (r == ARCHIVE_OK); } @@ -386,7 +385,6 @@ ac_read_objs(struct elfcopy *ecp, int ifd) err(EXIT_FAILURE, "lseek failed"); if ((a = archive_read_new()) == NULL) errx(EXIT_FAILURE, "%s", archive_error_string(a)); - archive_read_support_compression_none(a); archive_read_support_format_ar(a); AC(archive_read_open_fd(a, ifd, 10240)); for(;;) { @@ -435,7 +433,7 @@ ac_read_objs(struct elfcopy *ecp, int ifd) } } AC(archive_read_close(a)); - ACV(archive_read_finish(a)); + ACV(archive_read_free(a)); } static void @@ -449,7 +447,6 @@ ac_write_objs(struct elfcopy *ecp, int ofd) if ((a = archive_write_new()) == NULL) errx(EXIT_FAILURE, "%s", archive_error_string(a)); archive_write_set_format_ar_svr4(a); - archive_write_set_compression_none(a); AC(archive_write_open_fd(a, ofd)); /* Write the archive symbol table, even if it's empty. */ @@ -491,7 +488,7 @@ ac_write_objs(struct elfcopy *ecp, int ofd) } AC(archive_write_close(a)); - ACV(archive_write_finish(a)); + ACV(archive_write_free(a)); } static void diff --git a/elfcopy/main.c b/elfcopy/main.c index 3689f355fecd..0ba4e6864c86 100644 --- a/elfcopy/main.c +++ b/elfcopy/main.c @@ -40,7 +40,7 @@ #include "elfcopy.h" -ELFTC_VCSID("$Id: main.c 2970 2013-12-01 15:22:12Z kaiwang27 $"); +ELFTC_VCSID("$Id: main.c 3111 2014-12-20 08:33:01Z kaiwang27 $"); enum options { @@ -1109,7 +1109,8 @@ strip_main(struct elfcopy *ecp, int argc, char **argv) if (ecp->strip == 0 && ((ecp->flags & DISCARD_LOCAL) == 0) && - ((ecp->flags & DISCARD_LLABEL) == 0)) + ((ecp->flags & DISCARD_LLABEL) == 0) && + lookup_symop_list(ecp, NULL, SYMOP_STRIP) == NULL) ecp->strip = STRIP_ALL; if (optind == argc) strip_usage(); diff --git a/elfcopy/sections.c b/elfcopy/sections.c index d01659a935ee..c503666c8948 100644 --- a/elfcopy/sections.c +++ b/elfcopy/sections.c @@ -35,7 +35,7 @@ #include "elfcopy.h" -ELFTC_VCSID("$Id: sections.c 2358 2011-12-19 18:22:32Z kaiwang27 $"); +ELFTC_VCSID("$Id: sections.c 3126 2014-12-21 08:03:31Z kaiwang27 $"); static void add_gnu_debuglink(struct elfcopy *ecp); static uint32_t calc_crc32(const char *p, size_t len, uint32_t crc); @@ -372,6 +372,14 @@ create_scn(struct elfcopy *ecp) is_remove_reloc_sec(ecp, ish.sh_info)) continue; + /* + * Section groups should be removed if symbol table will + * be removed. (section group's signature stored in symbol + * table) + */ + if (ish.sh_type == SHT_GROUP && ecp->strip == STRIP_ALL) + continue; + /* Get section flags set by user. */ sec_flags = get_section_flags(ecp, name); @@ -762,8 +770,8 @@ resync_sections(struct elfcopy *ecp) s->off = roundup(off, s->align); } else { if (s->loadable) - warnx("moving loadable section," - "is this intentional?"); + warnx("moving loadable section %s, " + "is this intentional?", s->name); s->off = roundup(off, s->align); } @@ -1139,12 +1147,6 @@ add_to_shstrtab(struct elfcopy *ecp, const char *name) struct section *s; s = ecp->shstrtab; - if (s->buf == NULL) { - insert_to_strtab(s, ""); - insert_to_strtab(s, ".symtab"); - insert_to_strtab(s, ".strtab"); - insert_to_strtab(s, ".shstrtab"); - } insert_to_strtab(s, name); } @@ -1206,6 +1208,11 @@ init_shstrtab(struct elfcopy *ecp) s->loadable = 0; s->type = SHT_STRTAB; s->vma = 0; + + insert_to_strtab(s, ""); + insert_to_strtab(s, ".symtab"); + insert_to_strtab(s, ".strtab"); + insert_to_strtab(s, ".shstrtab"); } void diff --git a/elfcopy/segments.c b/elfcopy/segments.c index c54cbfcbb07a..e48ad127bfd0 100644 --- a/elfcopy/segments.c +++ b/elfcopy/segments.c @@ -34,7 +34,7 @@ #include "elfcopy.h" -ELFTC_VCSID("$Id: segments.c 2542 2012-08-12 16:14:15Z kaiwang27 $"); +ELFTC_VCSID("$Id: segments.c 3113 2014-12-20 08:33:29Z kaiwang27 $"); static void insert_to_inseg_list(struct segment *seg, struct section *sec); @@ -72,13 +72,15 @@ 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) + if (s->off < seg->off || (s->vma < seg->addr && !s->pseudo)) continue; if (s->off + s->sz > seg->off + seg->fsz && s->type != SHT_NOBITS) continue; if (s->off + s->sz > seg->off + seg->msz) continue; + if (s->vma + s->sz > seg->addr + seg->msz) + continue; insert_to_inseg_list(seg, s); if (seg->type == PT_LOAD) @@ -96,7 +98,7 @@ adjust_addr(struct elfcopy *ecp) struct section *s, *s0; struct segment *seg; struct sec_action *sac; - uint64_t dl, lma, old_vma, start, end; + uint64_t dl, lma, start, end; int found, i; /* @@ -113,8 +115,6 @@ adjust_addr(struct elfcopy *ecp) s->lma += ecp->change_addr; if (!s->pseudo) { - old_vma = s->vma; - /* Apply global VMA adjustment. */ if (ecp->change_addr != 0) s->vma += ecp->change_addr; @@ -438,7 +438,7 @@ copy_phdr(struct elfcopy *ecp) seg->fsz = seg->msz = 0; for (i = 0; i < seg->nsec; i++) { s = seg->v_sec[i]; - seg->msz = s->off + s->sz - seg->off; + seg->msz = s->vma + s->sz - seg->addr; if (s->type != SHT_NOBITS) seg->fsz = seg->msz; } diff --git a/elfcopy/symbols.c b/elfcopy/symbols.c index f2a722736c83..573a18f25e79 100644 --- a/elfcopy/symbols.c +++ b/elfcopy/symbols.c @@ -34,7 +34,7 @@ #include "elfcopy.h" -ELFTC_VCSID("$Id: symbols.c 2971 2013-12-01 15:22:21Z kaiwang27 $"); +ELFTC_VCSID("$Id: symbols.c 3019 2014-04-17 14:53:40Z jkoshy $"); /* Symbol table buffer structure. */ struct symbuf { @@ -300,7 +300,7 @@ generate_symbols(struct elfcopy *ecp) GElf_Sym sym; Elf_Data* id; Elf_Scn *is; - size_t ishstrndx, namelen, ndx, nsyms, sc, symndx; + size_t ishstrndx, namelen, ndx, sc, symndx; int ec, elferr, i; if (elf_getshstrndx(ecp->ein, &ishstrndx) == 0) @@ -320,7 +320,6 @@ generate_symbols(struct elfcopy *ecp) st_buf->lcap = 64; st_buf->lsz = 1; /* '\0' at start. */ st_buf->gsz = 0; - nsyms = 0; ecp->symtab->sz = 0; ecp->strtab->sz = 0; diff --git a/libdwarf/Makefile b/libdwarf/Makefile index 81b5657a2f72..d0a5443e6fb9 100644 --- a/libdwarf/Makefile +++ b/libdwarf/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile 2937 2013-04-27 04:48:23Z jkoshy $ +# $Id: Makefile 3097 2014-09-02 22:10:18Z kaiwang27 $ TOP= ${.CURDIR}/.. @@ -42,6 +42,7 @@ SRCS= \ dwarf_pubtypes.c \ dwarf_ranges.c \ dwarf_reloc.c \ + dwarf_sections.c \ dwarf_seterror.c \ dwarf_str.c \ dwarf_types.c \ @@ -115,6 +116,7 @@ MAN= dwarf.3 \ dwarf_add_weakname.3 \ dwarf_attr.3 \ dwarf_attrlist.3 \ + dwarf_attroffset.3 \ dwarf_attrval_signed.3 \ dwarf_child.3 \ dwarf_dealloc.3 \ @@ -154,6 +156,7 @@ MAN= dwarf.3 \ dwarf_get_cie_info.3 \ dwarf_get_cie_of_fde.3 \ dwarf_get_cu_die_offset.3 \ + dwarf_get_die_infotypes_flag.3 \ dwarf_get_elf.3 \ dwarf_get_fde_at_pc.3 \ dwarf_get_fde_info_for_all_regs.3 \ @@ -175,6 +178,7 @@ MAN= dwarf.3 \ dwarf_get_relocation_info.3 \ dwarf_get_relocation_info_count.3 \ dwarf_get_section_bytes.3 \ + dwarf_get_section_max_offsets.3 \ dwarf_get_str.3 \ dwarf_get_types.3 \ dwarf_get_vars.3 \ @@ -192,6 +196,7 @@ MAN= dwarf.3 \ dwarf_new_expr.3 \ dwarf_new_fde.3 \ dwarf_next_cu_header.3 \ + dwarf_next_types_section.3 \ dwarf_object_init.3 \ dwarf_producer_init.3 \ dwarf_producer_set_isa.3 \ @@ -220,7 +225,9 @@ MLINKS+= \ dwarf_attrval_signed.3 dwarf_attrval_string.3 \ dwarf_attrval_signed.3 dwarf_attrval_unsigned.3 \ dwarf_child.3 dwarf_offdie.3 \ + dwarf_child.3 dwarf_offdie_b.3 \ dwarf_child.3 dwarf_siblingof.3 \ + dwarf_child.3 dwarf_siblingof_b.3 \ dwarf_dealloc.3 dwarf_fde_cie_list_dealloc.3 \ dwarf_dealloc.3 dwarf_funcs_dealloc.3 \ dwarf_dealloc.3 dwarf_globals_dealloc.3 \ @@ -234,6 +241,7 @@ MLINKS+= \ dwarf_dieoffset.3 dwarf_die_CU_offset.3 \ dwarf_dieoffset.3 dwarf_die_CU_offset_range.3 \ dwarf_dieoffset.3 dwarf_get_cu_die_offset_given_cu_header_offset.3 \ + dwarf_dieoffset.3 dwarf_get_cu_die_offset_given_cu_header_offset_b.3 \ dwarf_finish.3 dwarf_object_finish.3 \ dwarf_formref.3 dwarf_global_formref.3 \ dwarf_formudata.3 dwarf_formsdata.3 \ @@ -273,6 +281,7 @@ MLINKS+= \ dwarf_get_pubtypes.3 dwarf_pubtype_name_offsets.3 \ dwarf_get_pubtypes.3 dwarf_pubtypename.3 \ dwarf_get_ranges.3 dwarf_get_ranges_a.3 \ + dwarf_get_section_max_offsets.3 dwarf_get_section_max_offsets_b.3 \ dwarf_get_types.3 dwarf_type_die_offset.3 \ dwarf_get_types.3 dwarf_type_cu_offset.3 \ dwarf_get_types.3 dwarf_type_name_offsets.3 \ @@ -291,6 +300,7 @@ MLINKS+= \ dwarf_highpc.3 dwarf_bitoffset.3 \ dwarf_highpc.3 dwarf_bitsize.3 \ dwarf_highpc.3 dwarf_bytesize.3 \ + dwarf_highpc.3 dwarf_highpc_b.3 \ dwarf_highpc.3 dwarf_lowpc.3 \ dwarf_highpc.3 dwarf_srclang.3 \ dwarf_lineno.3 dwarf_lineaddr.3 \ @@ -302,6 +312,9 @@ MLINKS+= \ dwarf_lineno.3 dwarf_line_srcfileno.3 \ dwarf_loclist.3 dwarf_loclist_n.3 \ dwarf_loclist_from_expr.3 dwarf_loclist_from_expr_a.3 \ + dwarf_loclist_from_expr.3 dwarf_loclist_from_expr_b.3 \ + dwarf_next_cu_header.3 dwarf_next_cu_header_b.3 \ + dwarf_next_cu_header.3 dwarf_next_cu_header_c.3 \ dwarf_producer_init.3 dwarf_producer_init_b.3 \ dwarf_seterrarg.3 dwarf_seterrhand.3 \ dwarf_set_frame_cfa_value.3 dwarf_set_frame_rule_initial_value.3 \ diff --git a/libdwarf/Version.map b/libdwarf/Version.map index 6e6548bd9732..669f70e44dac 100644 --- a/libdwarf/Version.map +++ b/libdwarf/Version.map @@ -1,4 +1,4 @@ -/* $Id: Version.map 2576 2012-09-13 09:16:11Z jkoshy $ */ +/* $Id: Version.map 3085 2014-09-02 22:08:23Z kaiwang27 $ */ R1.0 { global: @@ -39,6 +39,7 @@ global: dwarf_arrayorder; dwarf_attr; dwarf_attrlist; + dwarf_attroffset; dwarf_attrval_flag; dwarf_attrval_signed; dwarf_attrval_string; @@ -116,6 +117,8 @@ global: dwarf_get_cie_of_fde; dwarf_get_cu_die_offset; dwarf_get_cu_die_offset_given_cu_header_offset; + dwarf_get_cu_die_offset_given_cu_header_offset_b; + dwarf_get_die_infotypes_flag; dwarf_get_elf; dwarf_get_fde_at_pc; dwarf_get_fde_info_for_all_regs3; @@ -139,6 +142,8 @@ global: dwarf_get_relocation_info; dwarf_get_relocation_info_count; dwarf_get_section_bytes; + dwarf_get_section_max_offsets; + dwarf_get_section_max_offsets_b; dwarf_get_str; dwarf_get_types; dwarf_get_vars; @@ -152,6 +157,7 @@ global: dwarf_hasattr; dwarf_hasform; dwarf_highpc; + dwarf_highpc_b; dwarf_init; dwarf_line_srcfileno; dwarf_lineaddr; @@ -166,6 +172,7 @@ global: dwarf_loclist; dwarf_loclist_from_expr; dwarf_loclist_from_expr_a; + dwarf_loclist_from_expr_b; dwarf_loclist_n; dwarf_lowpc; dwarf_new_die; @@ -173,9 +180,12 @@ global: dwarf_new_fde; dwarf_next_cu_header; dwarf_next_cu_header_b; + dwarf_next_cu_header_c; + dwarf_next_types_section; dwarf_object_finish; dwarf_object_init; dwarf_offdie; + dwarf_offdie_b; dwarf_producer_finish; dwarf_producer_init; dwarf_producer_init_b; @@ -196,6 +206,7 @@ global: dwarf_seterrarg; dwarf_seterrhand; dwarf_siblingof; + dwarf_siblingof_b; dwarf_srcfiles; dwarf_srclang; dwarf_srclines; diff --git a/libdwarf/_libdwarf.h b/libdwarf/_libdwarf.h index 23f60e8ee267..d2e74c15687a 100644 --- a/libdwarf/_libdwarf.h +++ b/libdwarf/_libdwarf.h @@ -1,6 +1,6 @@ /*- * Copyright (c) 2007 John Birrell (jb@freebsd.org) - * Copyright (c) 2009-2011 Kai Wang + * Copyright (c) 2009-2014 Kai Wang * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -24,7 +24,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: _libdwarf.h 2075 2011-10-27 03:47:28Z jkoshy $ + * $Id: _libdwarf.h 3106 2014-12-19 16:00:58Z kaiwang27 $ */ #ifndef __LIBDWARF_H_ @@ -89,6 +89,7 @@ extern struct _libdwarf_globals _libdwarf; goto gen_fail; \ } while(0) +typedef struct _Dwarf_CU *Dwarf_CU; struct _Dwarf_AttrDef { uint64_t ad_attrib; /* DW_AT_XXX */ @@ -147,14 +148,6 @@ struct _Dwarf_Die { STAILQ_ENTRY(_Dwarf_Die) die_pro_next; /* Next die in pro-die list. */ }; -struct _Dwarf_Loclist { - Dwarf_Locdesc **ll_ldlist; /* Array of Locdesc pointer. */ - int ll_ldlen; /* Number of Locdesc. */ - Dwarf_Unsigned ll_offset; /* Offset in .debug_loc section. */ - Dwarf_Unsigned ll_length; /* Length (in bytes) of the loclist. */ - TAILQ_ENTRY(_Dwarf_Loclist) ll_next; /* Next loclist in list. */ -}; - struct _Dwarf_P_Expr_Entry { Dwarf_Loc ee_loc; /* Location expression. */ Dwarf_Unsigned ee_sym; /* Optional related reloc sym index. */ @@ -265,6 +258,8 @@ struct _Dwarf_Cie { Dwarf_Half cie_version; /* CIE version. */ uint8_t *cie_augment; /* CIE augmentation (UTF-8). */ Dwarf_Unsigned cie_ehdata; /* Optional EH Data. */ + uint8_t cie_addrsize; /* Address size. (DWARF4) */ + uint8_t cie_segmentsize; /* Segment size. (DWARF4) */ Dwarf_Unsigned cie_caf; /* Code alignment factor. */ Dwarf_Signed cie_daf; /* Data alignment factor. */ Dwarf_Unsigned cie_ra; /* Return address register. */ @@ -333,11 +328,14 @@ struct _Dwarf_CU { uint64_t cu_lineno_offset; /* Offset into .debug_lineno. */ uint8_t cu_pointer_size;/* Number of bytes in pointer. */ uint8_t cu_dwarf_size; /* CU section dwarf size. */ + Dwarf_Sig8 cu_type_sig; /* Type unit's signature. */ + uint64_t cu_type_offset; /* Type unit's type offset. */ Dwarf_Off cu_next_offset; /* Offset to the next CU. */ uint64_t cu_1st_offset; /* First DIE offset. */ int cu_pass2; /* Two pass DIE traverse. */ Dwarf_LineInfo cu_lineinfo; /* Ptr to Dwarf_LineInfo. */ Dwarf_Abbrev cu_abbrev_hash; /* Abbrev hash table. */ + Dwarf_Bool cu_is_info; /* Compilation/type unit flag. */ STAILQ_ENTRY(_Dwarf_CU) cu_next; /* Next compilation unit. */ }; @@ -399,17 +397,21 @@ struct _Dwarf_Debug { Dwarf_Section *dbg_section; /* Dwarf section list. */ Dwarf_Section *dbg_info_sec; /* Pointer to info section. */ Dwarf_Off dbg_info_off; /* Current info section offset. */ + Dwarf_Section *dbg_types_sec; /* Pointer to type section. */ + Dwarf_Off dbg_types_off; /* Current types section offset. */ Dwarf_Unsigned dbg_seccnt; /* Total number of dwarf sections. */ int dbg_mode; /* Access mode. */ int dbg_pointer_size; /* Object address size. */ int dbg_offset_size; /* DWARF offset size. */ int dbg_info_loaded; /* Flag indicating all CU loaded. */ + int dbg_types_loaded; /* Flag indicating all TU loaded. */ Dwarf_Half dbg_machine; /* ELF machine architecture. */ Dwarf_Handler dbg_errhand; /* Error handler. */ Dwarf_Ptr dbg_errarg; /* Argument to the error handler. */ STAILQ_HEAD(, _Dwarf_CU) dbg_cu;/* List of compilation units. */ + STAILQ_HEAD(, _Dwarf_CU) dbg_tu;/* List of type units. */ Dwarf_CU dbg_cu_current; /* Ptr to the current CU. */ - TAILQ_HEAD(, _Dwarf_Loclist) dbg_loclist; /* List of location list. */ + Dwarf_CU dbg_tu_current; /* Ptr to the current TU. */ Dwarf_NameSec dbg_globals; /* Ptr to pubnames lookup section. */ Dwarf_NameSec dbg_pubtypes; /* Ptr to pubtypes lookup section. */ Dwarf_NameSec dbg_weaks; /* Ptr to weaknames lookup section. */ @@ -532,13 +534,15 @@ int _dwarf_elf_get_section_info(void *, Dwarf_Half, Dwarf_Obj_Access_Section *, int *); void _dwarf_expr_cleanup(Dwarf_P_Debug); int _dwarf_expr_into_block(Dwarf_P_Expr, Dwarf_Error *); +Dwarf_Section *_dwarf_find_next_types_section(Dwarf_Debug, Dwarf_Section *); Dwarf_Section *_dwarf_find_section(Dwarf_Debug, const char *); void _dwarf_frame_cleanup(Dwarf_Debug); int _dwarf_frame_fde_add_inst(Dwarf_P_Fde, Dwarf_Small, Dwarf_Unsigned, Dwarf_Unsigned, Dwarf_Error *); int _dwarf_frame_gen(Dwarf_P_Debug, Dwarf_Error *); -int _dwarf_frame_get_fop(Dwarf_Debug, uint8_t *, Dwarf_Unsigned, - Dwarf_Frame_Op **, Dwarf_Signed *, Dwarf_Error *); +int _dwarf_frame_get_fop(Dwarf_Debug, uint8_t, uint8_t *, + Dwarf_Unsigned, Dwarf_Frame_Op **, Dwarf_Signed *, + Dwarf_Error *); int _dwarf_frame_get_internal_table(Dwarf_Fde, Dwarf_Addr, Dwarf_Regtable3 **, Dwarf_Addr *, Dwarf_Error *); int _dwarf_frame_interal_table_init(Dwarf_Debug, Dwarf_Error *); @@ -553,9 +557,12 @@ Dwarf_Unsigned _dwarf_get_reloc_type(Dwarf_P_Debug, int); int _dwarf_get_reloc_size(Dwarf_Debug, Dwarf_Unsigned); void _dwarf_info_cleanup(Dwarf_Debug); int _dwarf_info_first_cu(Dwarf_Debug, Dwarf_Error *); +int _dwarf_info_first_tu(Dwarf_Debug, Dwarf_Error *); int _dwarf_info_gen(Dwarf_P_Debug, Dwarf_Error *); -int _dwarf_info_load(Dwarf_Debug, int, Dwarf_Error *); +int _dwarf_info_load(Dwarf_Debug, Dwarf_Bool, Dwarf_Bool, + Dwarf_Error *); int _dwarf_info_next_cu(Dwarf_Debug, Dwarf_Error *); +int _dwarf_info_next_tu(Dwarf_Debug, Dwarf_Error *); void _dwarf_info_pro_cleanup(Dwarf_P_Debug); int _dwarf_init(Dwarf_Debug, Dwarf_Unsigned, Dwarf_Handler, Dwarf_Ptr, Dwarf_Error *); @@ -563,20 +570,19 @@ int _dwarf_lineno_gen(Dwarf_P_Debug, Dwarf_Error *); int _dwarf_lineno_init(Dwarf_Die, uint64_t, Dwarf_Error *); void _dwarf_lineno_cleanup(Dwarf_LineInfo); void _dwarf_lineno_pro_cleanup(Dwarf_P_Debug); -int _dwarf_loc_fill_locdesc(Dwarf_Debug, Dwarf_Locdesc *, uint8_t *, - uint64_t, uint8_t, Dwarf_Error *); +int _dwarf_loc_fill_locdesc(Dwarf_Debug, Dwarf_Locdesc *, + uint8_t *, uint64_t, uint8_t, uint8_t, uint8_t, + Dwarf_Error *); int _dwarf_loc_fill_locexpr(Dwarf_Debug, Dwarf_Locdesc **, - uint8_t *, uint64_t, uint8_t, Dwarf_Error *); + uint8_t *, uint64_t, uint8_t, uint8_t, uint8_t, + Dwarf_Error *); int _dwarf_loc_add(Dwarf_Die, Dwarf_Attribute, Dwarf_Error *); int _dwarf_loc_expr_add_atom(Dwarf_Debug, uint8_t *, uint8_t *, Dwarf_Small, Dwarf_Unsigned, Dwarf_Unsigned, int *, Dwarf_Error *); int _dwarf_loclist_find(Dwarf_Debug, Dwarf_CU, uint64_t, - Dwarf_Loclist *, Dwarf_Error *); -void _dwarf_loclist_cleanup(Dwarf_Debug); -void _dwarf_loclist_free(Dwarf_Loclist); -int _dwarf_loclist_add(Dwarf_Debug, Dwarf_CU, uint64_t, - Dwarf_Loclist *, Dwarf_Error *); + Dwarf_Locdesc ***, Dwarf_Signed *, Dwarf_Unsigned *, + Dwarf_Error *); void _dwarf_macinfo_cleanup(Dwarf_Debug); int _dwarf_macinfo_gen(Dwarf_P_Debug, Dwarf_Error *); int _dwarf_macinfo_init(Dwarf_Debug, Dwarf_Error *); @@ -633,6 +639,7 @@ void _dwarf_strtab_cleanup(Dwarf_Debug); int _dwarf_strtab_gen(Dwarf_P_Debug, Dwarf_Error *); char *_dwarf_strtab_get_table(Dwarf_Debug); int _dwarf_strtab_init(Dwarf_Debug, Dwarf_Error *); +void _dwarf_type_unit_cleanup(Dwarf_Debug); void _dwarf_write_block(void *, uint64_t *, uint8_t *, uint64_t); int _dwarf_write_block_alloc(uint8_t **, uint64_t *, uint64_t *, uint8_t *, uint64_t, Dwarf_Error *); diff --git a/libdwarf/dwarf.3 b/libdwarf/dwarf.3 index b32299cd1a11..5363034c45ae 100644 --- a/libdwarf/dwarf.3 +++ b/libdwarf/dwarf.3 @@ -21,9 +21,9 @@ .\" out of the use of this software, even if advised of the possibility of .\" such damage. .\" -.\" $Id: dwarf.3 2075 2011-10-27 03:47:28Z jkoshy $ +.\" $Id: dwarf.3 3130 2014-12-21 20:06:29Z jkoshy $ .\" -.Dd September 17, 2011 +.Dd December 21, 2014 .Os .Dt DWARF 3 .Sh NAME @@ -217,6 +217,8 @@ attribute. Retrieve an attribute descriptor. .It Fn dwarf_attrlist Retrieve attribute descriptors for a debugging information entry. +.It Fn dwarf_attroffset +Retrieve the section-relative offset of an attribute descriptor. .It Fn dwarf_attrval_flag Retrieve a .Dv DW_AT_FORM_flag @@ -309,10 +311,17 @@ Retrieve range information from an FDE descriptor. .El .It Compilation Units .Bl -tag -compact -.It Fn dwarf_get_cu_die_offset_given_cu_header_offset +.It Xo +.Fn dwarf_get_cu_die_offset_given_cu_header_offset , +.Fn dwarf_get_cu_die_offset_given_cu_header_offset_b +.Xc Retrieve the offset of the debugging information entry for a -compilation unit. -.It Fn dwarf_next_cu_header , Fn dwarf_next_cu_header_b +compilation or type unit. +.It Xo +.Fn dwarf_next_cu_header , +.Fn dwarf_next_cu_header_b , +.Fn dwarf_next_cu_header_c +.Xc Step through compilation units in a debug context. .El .It Debugging Information Entries @@ -329,13 +338,15 @@ Returns the attribute for a debugging information entry. .It Fn dwarf_dieoffset Retrieves the offset for a debugging information entry. -.It Fn dwarf_highpc +.It Fn dwarf_get_die_infotypes_flag +Indicate the originating section for a debugging information entry. +.It Fn dwarf_highpc , Fn dwarf_highpc_b Return the highest PC value for a debugging information entry. .It Fn dwarf_lowpc Return the lowest PC value for a debugging information entry. -.It Fn dwarf_offdie +.It Fn dwarf_offdie , Fn dwarf_offdie_b Retrieve a debugging information entry given an offset. -.It Fn dwarf_siblingof +.It Fn dwarf_siblingof , Fn dwarf_siblingof_b Retrieve the sibling descriptor for a debugging information entry. .It Fn dwarf_srclang Retrive the source language attribute for a debugging information @@ -416,7 +427,11 @@ Return line number information for a compilation unit. Retrieve a location list entry. .It Fn dwarf_loclist , Fn dwarf_loclist_n Retrieve location expressions. -.It Fn dwarf_loclist_from_expr , Fn dwarf_loclist_from_expr_a +.It Xo +.Fn dwarf_loclist_from_expr , +.Fn dwarf_loclist_from_expr_a , +.Fn dwarf_loclist_from_expr_b +.Xc Translate a location expression into a location descriptor. .El .It Error Handling @@ -513,6 +528,10 @@ and .Bl -tag -compact .It Fn dwarf_get_pubtypes , Fn dwarf_get_types Retrieve descriptors for user-defined types. +.It Fn dwarf_next_types_section +Step through +.Dq \&.debug_types +sections in a debug context. .It Fn dwarf_pubtype_cu_offset , Fn dwarf_type_cu_offset Return the offset for the compilation unit for a type. .It Fn dwarf_pubtype_die_offset , Fn dwarf_type_die_offset @@ -699,9 +718,16 @@ addition to the per-debug context handlers supported by the SGI/GNU API, see the subsection .Sx Error Handling above. +.El +.Ss Extensions +The following APIs are extensions specific to this implementation: +.Bl -bullet -compact .It -The following API is an extension: -.Fn dwarf_producer_set_isa . +.Fn dwarf_attroffset +.It +.Fn dwarf_next_types_section +.It +.Fn dwarf_producer_set_isa .El .Sh SEE ALSO .Xr elf 3 diff --git a/libdwarf/dwarf.h b/libdwarf/dwarf.h index b1a3e4ec9670..c79da96dbb47 100644 --- a/libdwarf/dwarf.h +++ b/libdwarf/dwarf.h @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: dwarf.h 2075 2011-10-27 03:47:28Z jkoshy $ + * $Id: dwarf.h 3052 2014-05-26 20:36:24Z kaiwang27 $ */ #ifndef _DWARF_H_ @@ -93,6 +93,19 @@ #define DW_TAG_lo_user 0x4080 #define DW_TAG_hi_user 0xffff +/* GNU extensions. */ +#define DW_TAG_format_label 0x4101 +#define DW_TAG_function_template 0x4102 +#define DW_TAG_class_template 0x4103 +#define DW_TAG_GNU_BINCL 0x4104 +#define DW_TAG_GNU_EINCL 0x4105 +#define DW_TAG_GNU_template_template_parameter 0x4106 +#define DW_TAG_GNU_template_template_param 0x4106 +#define DW_TAG_GNU_template_parameter_pack 0x4107 +#define DW_TAG_GNU_formal_parameter_pack 0x4108 +#define DW_TAG_GNU_call_site 0x4109 +#define DW_TAG_GNU_call_site_parameter 0x410a + #define DW_CHILDREN_no 0x00 #define DW_CHILDREN_yes 0x01 @@ -195,6 +208,32 @@ #define DW_AT_lo_user 0x2000 #define DW_AT_hi_user 0x3fff +/* GNU extensions. */ +#define DW_AT_sf_names 0x2101 +#define DW_AT_src_info 0x2102 +#define DW_AT_mac_info 0x2103 +#define DW_AT_src_coords 0x2104 +#define DW_AT_body_begin 0x2105 +#define DW_AT_body_end 0x2106 +#define DW_AT_GNU_vector 0x2107 +#define DW_AT_GNU_guarded_by 0x2108 +#define DW_AT_GNU_pt_guarded_by 0x2109 +#define DW_AT_GNU_guarded 0x210a +#define DW_AT_GNU_pt_guarded 0x210b +#define DW_AT_GNU_locks_excluded 0x210c +#define DW_AT_GNU_exclusive_locks_required 0x210d +#define DW_AT_GNU_shared_locks_required 0x210e +#define DW_AT_GNU_odr_signature 0x210f +#define DW_AT_GNU_template_name 0x2110 +#define DW_AT_GNU_call_site_value 0x2111 +#define DW_AT_GNU_call_site_data_value 0x2112 +#define DW_AT_GNU_call_site_target 0x2113 +#define DW_AT_GNU_call_site_target_clobbered 0x2114 +#define DW_AT_GNU_tail_call 0x2115 +#define DW_AT_GNU_all_tail_call_sites 0x2116 +#define DW_AT_GNU_all_call_sites 0x2117 +#define DW_AT_GNU_all_source_call_sites 0x2118 + #define DW_FORM_addr 0x01 #define DW_FORM_block2 0x03 #define DW_FORM_block4 0x04 @@ -220,6 +259,8 @@ #define DW_FORM_exprloc 0x18 #define DW_FORM_flag_present 0x19 #define DW_FORM_ref_sig8 0x20 +#define DW_FORM_GNU_ref_alt 0x1f20 +#define DW_FORM_GNU_strp_alt 0x1f21 #define DW_OP_addr 0x03 #define DW_OP_deref 0x06 @@ -376,9 +417,23 @@ #define DW_OP_implicit_value 0x9e #define DW_OP_stack_value 0x9f #define DW_OP_lo_user 0xe0 -#define DW_OP_GNU_push_tls_address 0xe0 #define DW_OP_hi_user 0xff +/* GNU extensions. */ +#define DW_OP_GNU_push_tls_address 0xe0 +#define DW_OP_GNU_uninit 0xf0 +#define DW_OP_GNU_encoded_addr 0xf1 +#define DW_OP_GNU_implicit_pointer 0xf2 +#define DW_OP_GNU_entry_value 0xf3 +#define DW_OP_GNU_const_type 0xf4 +#define DW_OP_GNU_regval_type 0xf5 +#define DW_OP_GNU_deref_type 0xf6 +#define DW_OP_GNU_convert 0xf7 +#define DW_OP_GNU_reinterpret 0xf9 +#define DW_OP_GNU_parameter_ref 0xfa +#define DW_OP_GNU_addr_index 0xfb +#define DW_OP_GNU_const_index 0xfc + #define DW_ATE_address 0x1 #define DW_ATE_boolean 0x2 #define DW_ATE_complex_float 0x3 diff --git a/libdwarf/dwarf_attr.3 b/libdwarf/dwarf_attr.3 index b1e30017a89a..9ba367be5f69 100644 --- a/libdwarf/dwarf_attr.3 +++ b/libdwarf/dwarf_attr.3 @@ -22,7 +22,7 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $Id: dwarf_attr.3 2072 2011-10-27 03:26:49Z jkoshy $ +.\" $Id: dwarf_attr.3 3093 2014-09-02 22:09:40Z kaiwang27 $ .\" .Dd April 8, 2010 .Os @@ -113,6 +113,7 @@ in argument .Sh SEE ALSO .Xr dwarf 3 , .Xr dwarf_attrlist 3 , +.Xr dwarf_attroffset 3 , .Xr dwarf_hasattr 3 , .Xr dwarf_hasform 3 , .Xr dwarf_whatattr 3 , diff --git a/libdwarf/dwarf_attr.c b/libdwarf/dwarf_attr.c index ce40294c6b12..a081d7b93a8f 100644 --- a/libdwarf/dwarf_attr.c +++ b/libdwarf/dwarf_attr.c @@ -27,7 +27,7 @@ #include "_libdwarf.h" -ELFTC_VCSID("$Id: dwarf_attr.c 2072 2011-10-27 03:26:49Z jkoshy $"); +ELFTC_VCSID("$Id: dwarf_attr.c 3064 2014-06-06 19:35:55Z kaiwang27 $"); int dwarf_attr(Dwarf_Die die, Dwarf_Half attr, Dwarf_Attribute *atp, @@ -113,6 +113,23 @@ dwarf_hasattr(Dwarf_Die die, Dwarf_Half attr, Dwarf_Bool *ret_bool, return (DW_DLV_OK); } +int +dwarf_attroffset(Dwarf_Attribute at, Dwarf_Off *ret_off, Dwarf_Error *error) +{ + Dwarf_Debug dbg; + + dbg = at != NULL ? at->at_die->die_dbg : NULL; + + if (at == NULL || ret_off == NULL) { + DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT); + return (DW_DLV_ERROR); + } + + *ret_off = at->at_offset; + + return (DW_DLV_OK); +} + int dwarf_lowpc(Dwarf_Die die, Dwarf_Addr *ret_lowpc, Dwarf_Error *error) { @@ -138,9 +155,18 @@ dwarf_lowpc(Dwarf_Die die, Dwarf_Addr *ret_lowpc, Dwarf_Error *error) int dwarf_highpc(Dwarf_Die die, Dwarf_Addr *ret_highpc, Dwarf_Error *error) +{ + + return (dwarf_highpc_b(die, ret_highpc, NULL, NULL, error)); +} + +int +dwarf_highpc_b(Dwarf_Die die, Dwarf_Addr *ret_highpc, Dwarf_Half *ret_form, + enum Dwarf_Form_Class *ret_class, Dwarf_Error *error) { Dwarf_Attribute at; Dwarf_Debug dbg; + Dwarf_CU cu; dbg = die != NULL ? die->die_dbg : NULL; @@ -156,6 +182,17 @@ dwarf_highpc(Dwarf_Die die, Dwarf_Addr *ret_highpc, Dwarf_Error *error) *ret_highpc = at->u[0].u64; + if (ret_form != NULL) { + *ret_form = at->at_form; + } + + if (ret_class != NULL) { + cu = die->die_cu; + *ret_class = dwarf_get_form_class(cu->cu_version, + DW_AT_high_pc, cu->cu_length_size == 4 ? 4 : 8, + at->at_form); + } + return (DW_DLV_OK); } diff --git a/libdwarf/dwarf_attroffset.3 b/libdwarf/dwarf_attroffset.3 new file mode 100644 index 000000000000..af24cebab8e9 --- /dev/null +++ b/libdwarf/dwarf_attroffset.3 @@ -0,0 +1,86 @@ +.\" Copyright (c) 2014 Kai Wang +.\" 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: dwarf_attroffset.3 3115 2014-12-20 18:26:46Z jkoshy $ +.\" +.Dd December 20, 2014 +.Os +.Dt DWARF_ATTROFFSET 3 +.Sh NAME +.Nm dwarf_attroffset +.Nd retrieve the section-relative offset of an attribute descriptor +.Sh LIBRARY +.Lb libdwarf +.Sh SYNOPSIS +.In libdwarf.h +.Ft int +.Fo dwarf_attroffset +.Fa "Dwarf_Attribute at" +.Fa "Dwarf_Off *ret_off" +.Fa "Dwarf_Error *err" +.Fc +.Sh DESCRIPTION +Function +.Fn dwarf_attroffset +retrieves the section-relative offset of the attribute descriptor +referenced by argument +.Ar at . +.Pp +Argument +.Ar ret_off +should point to a location that is to hold the returned +section-relative offset. +If argument +.Ar err +is non-NULL, it is used to return an error descriptor in case of an +error. +.Sh RETURN VALUES +On success, function +.Fn dwarf_attroffset +returns +.Dv DW_DLV_OK . +.Pp +In case of an error, it returns +.Dv DW_DLV_ERROR +and sets argument +.Ar err . +.Sh COMPATIBILITY +This function is an extension to the +.Xr DWARF 3 +API. +.Sh ERRORS +The +.Fn dwarf_attroffset +function may fail with the following errors: +.Bl -tag -width ".Bq Er DW_DLE_ARGUMENT" +.It Bq Er DW_DLE_ARGUMENT +Either of the arguments +.Ar at +or +.Ar ret_off +was NULL. +.El +.Sh SEE ALSO +.Xr dwarf 3 , +.Xr dwarf_attr 3 diff --git a/libdwarf/dwarf_attrval.c b/libdwarf/dwarf_attrval.c index 0f17016ad810..3bddae9eceff 100644 --- a/libdwarf/dwarf_attrval.c +++ b/libdwarf/dwarf_attrval.c @@ -26,7 +26,7 @@ #include "_libdwarf.h" -ELFTC_VCSID("$Id: dwarf_attrval.c 2072 2011-10-27 03:26:49Z jkoshy $"); +ELFTC_VCSID("$Id: dwarf_attrval.c 2977 2014-01-21 20:13:31Z kaiwang27 $"); int dwarf_attrval_flag(Dwarf_Die die, Dwarf_Half attr, Dwarf_Bool *valp, Dwarf_Error *err) @@ -50,6 +50,7 @@ dwarf_attrval_flag(Dwarf_Die die, Dwarf_Half attr, Dwarf_Bool *valp, Dwarf_Error switch (at->at_form) { case DW_FORM_flag: + case DW_FORM_flag_present: *valp = (Dwarf_Bool) (!!at->u[0].u64); break; default: diff --git a/libdwarf/dwarf_attrval_signed.3 b/libdwarf/dwarf_attrval_signed.3 index 9646990fc2de..93d4ae0596ed 100644 --- a/libdwarf/dwarf_attrval_signed.3 +++ b/libdwarf/dwarf_attrval_signed.3 @@ -22,9 +22,9 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $Id: dwarf_attrval_signed.3 2072 2011-10-27 03:26:49Z jkoshy $ +.\" $Id: dwarf_attrval_signed.3 2980 2014-01-21 20:15:54Z kaiwang27 $ .\" -.Dd January 29, 2011 +.Dd January 18, 2014 .Os .Dt DWARF_ATTRVAL_SIGNED 3 .Sh NAME @@ -84,13 +84,28 @@ Function .Fn dwarf_attrval_flag sets the location pointed to by argument .Ar ret -to 1 if the attribute named by argument +to either 0 or 1. If the form of the attribute named by argument .Ar attr -has a non-zero value, or to 0 otherwise. -The form of the attribute named by argument +is +.Dv DW_FORM_flag , +function +.Fn dwarf_attrval_flag +sets the location pointed to by argument +.Ar ret +to 1 if the attribute has a non-zero value, or to 0 otherwise. +If the form of the attribute named by argument .Ar attr -must be -.Dv DW_FORM_flag . +is +.Dv DW_FORM_flag_present , +function +.Fn dwarf_attrval_flag +unconditionally sets the location pointed to by argument +.Ar ret +to 1. +The form of the attribute must be one of +.Dv DW_FORM_flag +or +.Dv DW_FORM_flag_present . .Pp Function .Fn dwarf_attrval_signed @@ -122,7 +137,7 @@ attribute named by argument The form of the attribute must be one of .Dv DW_FORM_string or -.Dv DW_FORM_strp . +.Dv DW_FORM_strp . .Pp Function .Fn dwarf_attrval_unsigned diff --git a/libdwarf/dwarf_child.3 b/libdwarf/dwarf_child.3 index 57549c01c66e..1e32e58d4451 100644 --- a/libdwarf/dwarf_child.3 +++ b/libdwarf/dwarf_child.3 @@ -1,4 +1,4 @@ -.\" Copyright (c) 2010 Kai Wang +.\" Copyright (c) 2010,2014 Kai Wang .\" All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without @@ -22,15 +22,17 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $Id: dwarf_child.3 2122 2011-11-09 15:35:14Z jkoshy $ +.\" $Id: dwarf_child.3 3127 2014-12-21 19:09:19Z jkoshy $ .\" -.Dd November 9, 2011 +.Dd December 21, 2014 .Os .Dt DWARF_CHILD 3 .Sh NAME .Nm dwarf_child , +.Nm dwarf_offdie , +.Nm dwarf_offdie_b , .Nm dwarf_siblingof , -.Nm dwarf_offdie +.Nm dwarf_siblingof_b .Nd retrieve DWARF Debugging Information Entry descriptors .Sh LIBRARY .Lb libdwarf @@ -39,6 +41,21 @@ .Ft int .Fn dwarf_child "Dwarf_Die die" "Dwarf_Die *ret_die" "Dwarf_Error *err" .Ft int +.Fo dwarf_offdie +.Fa "Dwarf_Debug dbg" +.Fa "Dwarf_Off offset" +.Fa "Dwarf_Die *ret_die" +.Fa "Dwarf_Error *err" +.Fc +.Ft int +.Fo dwarf_offdie_b +.Fa "Dwarf_Debug dbg" +.Fa "Dwarf_Off offset" +.Fa "Dwarf_Bool is_info" +.Fa "Dwarf_Die *ret_die" +.Fa "Dwarf_Error *err" +.Fc +.Ft int .Fo dwarf_siblingof .Fa "Dwarf_Debug dbg" .Fa "Dwarf_Die die" @@ -46,10 +63,11 @@ .Fa "Dwarf_Error *err" .Fc .Ft int -.Fo dwarf_offdie +.Fo dwarf_siblingof_b .Fa "Dwarf_Debug dbg" -.Fa "Dwarf_Off offset" +.Fa "Dwarf_Die die" .Fa "Dwarf_Die *ret_die" +.Fa "Dwarf_Bool is_info" .Fa "Dwarf_Error *err" .Fc .Sh DESCRIPTION @@ -92,6 +110,34 @@ may be used together to traverse the tree of debugging information entry descriptors for a compilation unit. .Pp Function +.Fn dwarf_siblingof_b +is identical to the function +.Fn dwarf_siblingof +except that it can retrieve the sibling descriptor from either the +current compilation unit or type unit. +If argument +.Ar is_info +is non-zero, the function behaves identically to function +.Fn dwarf_siblingof . +If argument +.Ar is_info +is zero, the descriptor referred by argument +.Ar die +should be associated with a debugging information entry in the +type unit. +The function will store the sibling of the descriptor in the location +pointed to by argument +.Ar ret_die . +If argument +.Ar is_info +is zero and argument +.Ar die +is +.Dv NULL , +the first debugging information entry descriptor for the +current type unit will be returned. +.Pp +Function .Fn dwarf_offdie retrieves the debugging information entry descriptor at global offset .Ar offset @@ -101,6 +147,31 @@ section of the object associated with argument .Ar dbg . The returned descriptor is written to the location pointed to by argument .Ar ret_die . +.Pp +Function +.Fn dwarf_offdie_b +is identical to the function +.Fn dwarf_offdie +except that it can retrieve the debugging information entry descriptor at +global offset +.Ar offset +from either of the +.Dq .debug_info +and +.Dq .debug_types +sections of the object associated with argument +.Ar dbg . +If argument +.Ar is_info +is non-zero, the function will retrieve the debugging information +entry from the +.Dq .debug_info +section, otherwise the function will retrieve the debugging +information entry from the +.Dq .debug_types +section. +The returned descriptor is written to the location pointed to by argument +.Ar ret_die . .Ss Memory Management The memory area used for the .Vt Dwarf_Die @@ -128,14 +199,18 @@ argument if it is not NULL. .It Bq Er DW_DLV_NO_ENTRY For functions -.Fn dwarf_child +.Fn dwarf_child , +.Fn dwarf_siblingof and -.Fn dwarf_siblingof , +.Fn dwarf_siblingof_b , the descriptor denoted by argument .Ar die did not have a child or sibling. -For function -.Fn dwarf_offdie , +.Pp +For functions +.Fn dwarf_offdie +and +.Fn dwarf_offdie_b , there was no debugging information entry at the offset specified by argument .Ar offset . @@ -199,4 +274,5 @@ do { .Sh SEE ALSO .Xr dwarf 3 , .Xr dwarf_errmsg 3 , +.Xr dwarf_get_die_infotypes_flag.3 , .Xr dwarf_next_cu_header 3 diff --git a/libdwarf/dwarf_cu.c b/libdwarf/dwarf_cu.c index c203dc2f1fc7..d103488d1098 100644 --- a/libdwarf/dwarf_cu.c +++ b/libdwarf/dwarf_cu.c @@ -1,5 +1,6 @@ /*- * Copyright (c) 2007 John Birrell (jb@freebsd.org) + * Copyright (c) 2014 Kai Wang * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -26,14 +27,15 @@ #include "_libdwarf.h" -ELFTC_VCSID("$Id: dwarf_cu.c 2072 2011-10-27 03:26:49Z jkoshy $"); +ELFTC_VCSID("$Id: dwarf_cu.c 3041 2014-05-18 15:11:03Z kaiwang27 $"); int -dwarf_next_cu_header_b(Dwarf_Debug dbg, Dwarf_Unsigned *cu_length, - Dwarf_Half *cu_version, Dwarf_Off *cu_abbrev_offset, - Dwarf_Half *cu_pointer_size, Dwarf_Half *cu_offset_size, - Dwarf_Half *cu_extension_size, Dwarf_Unsigned *cu_next_offset, - Dwarf_Error *error) +dwarf_next_cu_header_c(Dwarf_Debug dbg, Dwarf_Bool is_info, + Dwarf_Unsigned *cu_length, Dwarf_Half *cu_version, + Dwarf_Off *cu_abbrev_offset, Dwarf_Half *cu_pointer_size, + Dwarf_Half *cu_offset_size, Dwarf_Half *cu_extension_size, + Dwarf_Sig8 *type_signature, Dwarf_Unsigned *type_offset, + Dwarf_Unsigned *cu_next_offset, Dwarf_Error *error) { Dwarf_CU cu; int ret; @@ -43,10 +45,17 @@ dwarf_next_cu_header_b(Dwarf_Debug dbg, Dwarf_Unsigned *cu_length, return (DW_DLV_ERROR); } - if (dbg->dbg_cu_current == NULL) - ret = _dwarf_info_first_cu(dbg, error); - else - ret = _dwarf_info_next_cu(dbg, error); + if (is_info) { + if (dbg->dbg_cu_current == NULL) + ret = _dwarf_info_first_cu(dbg, error); + else + ret = _dwarf_info_next_cu(dbg, error); + } else { + if (dbg->dbg_tu_current == NULL) + ret = _dwarf_info_first_tu(dbg, error); + else + ret = _dwarf_info_next_tu(dbg, error); + } if (ret == DW_DLE_NO_ENTRY) { DWARF_SET_ERROR(dbg, error, DW_DLE_NO_ENTRY); @@ -54,11 +63,19 @@ dwarf_next_cu_header_b(Dwarf_Debug dbg, Dwarf_Unsigned *cu_length, } else if (ret != DW_DLE_NONE) return (DW_DLV_ERROR); - if (dbg->dbg_cu_current == NULL) { - DWARF_SET_ERROR(dbg, error, DW_DLE_NO_ENTRY); - return (DW_DLV_NO_ENTRY); + if (is_info) { + if (dbg->dbg_cu_current == NULL) { + DWARF_SET_ERROR(dbg, error, DW_DLE_NO_ENTRY); + return (DW_DLV_NO_ENTRY); + } + cu = dbg->dbg_cu_current; + } else { + if (dbg->dbg_tu_current == NULL) { + DWARF_SET_ERROR(dbg, error, DW_DLE_NO_ENTRY); + return (DW_DLV_NO_ENTRY); + } + cu = dbg->dbg_tu_current; } - cu = dbg->dbg_cu_current; if (cu_length) *cu_length = cu->cu_length; @@ -81,11 +98,32 @@ dwarf_next_cu_header_b(Dwarf_Debug dbg, Dwarf_Unsigned *cu_length, *cu_extension_size = 4; } if (cu_next_offset) - *cu_next_offset = dbg->dbg_cu_current->cu_next_offset; + *cu_next_offset = cu->cu_next_offset; + + if (!is_info) { + if (type_signature) + *type_signature = cu->cu_type_sig; + if (type_offset) + *type_offset = cu->cu_type_offset; + } return (DW_DLV_OK); } + +int +dwarf_next_cu_header_b(Dwarf_Debug dbg, Dwarf_Unsigned *cu_length, + Dwarf_Half *cu_version, Dwarf_Off *cu_abbrev_offset, + Dwarf_Half *cu_pointer_size, Dwarf_Half *cu_offset_size, + Dwarf_Half *cu_extension_size, Dwarf_Unsigned *cu_next_offset, + Dwarf_Error *error) +{ + + return (dwarf_next_cu_header_c(dbg, 1, cu_length, cu_version, + cu_abbrev_offset, cu_pointer_size, cu_offset_size, + cu_extension_size, NULL, NULL, cu_next_offset, error)); +} + int dwarf_next_cu_header(Dwarf_Debug dbg, Dwarf_Unsigned *cu_length, Dwarf_Half *cu_version, Dwarf_Off *cu_abbrev_offset, @@ -97,3 +135,27 @@ dwarf_next_cu_header(Dwarf_Debug dbg, Dwarf_Unsigned *cu_length, cu_abbrev_offset, cu_pointer_size, NULL, NULL, cu_next_offset, error)); } + +int +dwarf_next_types_section(Dwarf_Debug dbg, Dwarf_Error *error) +{ + + /* Free resource allocated for current .debug_types section. */ + _dwarf_type_unit_cleanup(dbg); + dbg->dbg_types_loaded = 0; + dbg->dbg_types_off = 0; + + /* Reset type unit pointer. */ + dbg->dbg_tu_current = NULL; + + /* Search for the next .debug_types section. */ + dbg->dbg_types_sec = _dwarf_find_next_types_section(dbg, + dbg->dbg_types_sec); + + if (dbg->dbg_types_sec == NULL) { + DWARF_SET_ERROR(dbg, error, DW_DLE_NO_ENTRY); + return (DW_DLV_NO_ENTRY); + } + + return (DW_DLV_OK); +} diff --git a/libdwarf/dwarf_die.c b/libdwarf/dwarf_die.c index b2b38403005f..de6351ac608f 100644 --- a/libdwarf/dwarf_die.c +++ b/libdwarf/dwarf_die.c @@ -1,6 +1,6 @@ /*- * Copyright (c) 2007 John Birrell (jb@freebsd.org) - * Copyright (c) 2009,2011 Kai Wang + * Copyright (c) 2009,2011,2014 Kai Wang * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -27,12 +27,13 @@ #include "_libdwarf.h" -ELFTC_VCSID("$Id: dwarf_die.c 2073 2011-10-27 03:30:47Z jkoshy $"); +ELFTC_VCSID("$Id: dwarf_die.c 3039 2014-05-18 15:10:56Z kaiwang27 $"); int dwarf_child(Dwarf_Die die, Dwarf_Die *ret_die, Dwarf_Error *error) { Dwarf_Debug dbg; + Dwarf_Section *ds; Dwarf_CU cu; int ret; @@ -44,13 +45,13 @@ dwarf_child(Dwarf_Die die, Dwarf_Die *ret_die, Dwarf_Error *error) } if (die->die_ab->ab_children == DW_CHILDREN_no) - return (DW_DLE_NO_ENTRY); + return (DW_DLV_NO_ENTRY); dbg = die->die_dbg; cu = die->die_cu; - ret = _dwarf_die_parse(die->die_dbg, dbg->dbg_info_sec, cu, - cu->cu_dwarf_size, die->die_next_off, cu->cu_next_offset, - ret_die, 0, error); + ds = cu->cu_is_info ? dbg->dbg_info_sec : dbg->dbg_types_sec; + ret = _dwarf_die_parse(die->die_dbg, ds, cu, cu->cu_dwarf_size, + die->die_next_off, cu->cu_next_offset, ret_die, 0, error); if (ret == DW_DLE_NO_ENTRY) { DWARF_SET_ERROR(dbg, error, DW_DLE_NO_ENTRY); @@ -62,11 +63,12 @@ dwarf_child(Dwarf_Die die, Dwarf_Die *ret_die, Dwarf_Error *error) } int -dwarf_siblingof(Dwarf_Debug dbg, Dwarf_Die die, Dwarf_Die *ret_die, - Dwarf_Error *error) +dwarf_siblingof_b(Dwarf_Debug dbg, Dwarf_Die die, Dwarf_Die *ret_die, + Dwarf_Bool is_info, Dwarf_Error *error) { Dwarf_CU cu; Dwarf_Attribute at; + Dwarf_Section *ds; uint64_t offset; int ret, search_sibling; @@ -75,15 +77,27 @@ dwarf_siblingof(Dwarf_Debug dbg, Dwarf_Die die, Dwarf_Die *ret_die, return (DW_DLV_ERROR); } - if ((cu = dbg->dbg_cu_current) == NULL) { + ds = is_info ? dbg->dbg_info_sec : dbg->dbg_types_sec; + cu = is_info ? dbg->dbg_cu_current : dbg->dbg_tu_current; + + if (cu == NULL) { DWARF_SET_ERROR(dbg, error, DW_DLE_DIE_NO_CU_CONTEXT); return (DW_DLV_ERROR); } /* Application requests the first DIE in this CU. */ if (die == NULL) - return (dwarf_offdie(dbg, cu->cu_1st_offset, ret_die, - error)); + return (dwarf_offdie_b(dbg, cu->cu_1st_offset, is_info, + ret_die, error)); + + /* + * Check if the `is_info' flag matches the debug section the + * DIE belongs to. + */ + if (is_info != die->die_cu->cu_is_info) { + DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT); + return (DW_DLV_ERROR); + } /* * If the DIE doesn't have any children, its sibling sits next @@ -108,9 +122,8 @@ dwarf_siblingof(Dwarf_Debug dbg, Dwarf_Die die, Dwarf_Die *ret_die, } } - ret = _dwarf_die_parse(die->die_dbg, dbg->dbg_info_sec, cu, - cu->cu_dwarf_size, offset, cu->cu_next_offset, ret_die, - search_sibling, error); + ret = _dwarf_die_parse(die->die_dbg, ds, cu, cu->cu_dwarf_size, offset, + cu->cu_next_offset, ret_die, search_sibling, error); if (ret == DW_DLE_NO_ENTRY) { DWARF_SET_ERROR(dbg, error, DW_DLE_NO_ENTRY); @@ -121,21 +134,31 @@ dwarf_siblingof(Dwarf_Debug dbg, Dwarf_Die die, Dwarf_Die *ret_die, return (DW_DLV_OK); } + +int +dwarf_siblingof(Dwarf_Debug dbg, Dwarf_Die die, Dwarf_Die *ret_die, + Dwarf_Error *error) +{ + + return (dwarf_siblingof_b(dbg, die, ret_die, 1, error)); +} + static int -_dwarf_search_die_within_cu(Dwarf_Debug dbg, Dwarf_CU cu, Dwarf_Off offset, - Dwarf_Die *ret_die, Dwarf_Error *error) +_dwarf_search_die_within_cu(Dwarf_Debug dbg, Dwarf_Section *s, Dwarf_CU cu, + Dwarf_Off offset, Dwarf_Die *ret_die, Dwarf_Error *error) { assert(dbg != NULL && cu != NULL && ret_die != NULL); - return (_dwarf_die_parse(dbg, dbg->dbg_info_sec, cu, cu->cu_dwarf_size, + return (_dwarf_die_parse(dbg, s, cu, cu->cu_dwarf_size, offset, cu->cu_next_offset, ret_die, 0, error)); } int -dwarf_offdie(Dwarf_Debug dbg, Dwarf_Off offset, Dwarf_Die *ret_die, - Dwarf_Error *error) +dwarf_offdie_b(Dwarf_Debug dbg, Dwarf_Off offset, Dwarf_Bool is_info, + Dwarf_Die *ret_die, Dwarf_Error *error) { + Dwarf_Section *ds; Dwarf_CU cu; int ret; @@ -144,11 +167,13 @@ dwarf_offdie(Dwarf_Debug dbg, Dwarf_Off offset, Dwarf_Die *ret_die, return (DW_DLV_ERROR); } + ds = is_info ? dbg->dbg_info_sec : dbg->dbg_types_sec; + cu = is_info ? dbg->dbg_cu_current : dbg->dbg_tu_current; + /* First search the current CU. */ - if (dbg->dbg_cu_current != NULL) { - cu = dbg->dbg_cu_current; + if (cu != NULL) { if (offset > cu->cu_offset && offset < cu->cu_next_offset) { - ret = _dwarf_search_die_within_cu(dbg, cu, offset, + ret = _dwarf_search_die_within_cu(dbg, ds, cu, offset, ret_die, error); if (ret == DW_DLE_NO_ENTRY) { DWARF_SET_ERROR(dbg, error, DW_DLE_NO_ENTRY); @@ -160,27 +185,52 @@ dwarf_offdie(Dwarf_Debug dbg, Dwarf_Off offset, Dwarf_Die *ret_die, } /* Search other CUs. */ - ret = _dwarf_info_load(dbg, 1, error); + ret = _dwarf_info_load(dbg, 1, is_info, error); if (ret != DW_DLE_NONE) return (DW_DLV_ERROR); - STAILQ_FOREACH(cu, &dbg->dbg_cu, cu_next) { - if (offset < cu->cu_offset || offset > cu->cu_next_offset) - continue; - ret = _dwarf_search_die_within_cu(dbg, cu, offset, - ret_die, error); - if (ret == DW_DLE_NO_ENTRY) { - DWARF_SET_ERROR(dbg, error, DW_DLE_NO_ENTRY); - return (DW_DLV_NO_ENTRY); - } else if (ret != DW_DLE_NONE) - return (DW_DLV_ERROR); - return (DW_DLV_OK); + if (is_info) { + STAILQ_FOREACH(cu, &dbg->dbg_cu, cu_next) { + if (offset < cu->cu_offset || + offset > cu->cu_next_offset) + continue; + ret = _dwarf_search_die_within_cu(dbg, ds, cu, offset, + ret_die, error); + if (ret == DW_DLE_NO_ENTRY) { + DWARF_SET_ERROR(dbg, error, DW_DLE_NO_ENTRY); + return (DW_DLV_NO_ENTRY); + } else if (ret != DW_DLE_NONE) + return (DW_DLV_ERROR); + return (DW_DLV_OK); + } + } else { + STAILQ_FOREACH(cu, &dbg->dbg_tu, cu_next) { + if (offset < cu->cu_offset || + offset > cu->cu_next_offset) + continue; + ret = _dwarf_search_die_within_cu(dbg, ds, cu, offset, + ret_die, error); + if (ret == DW_DLE_NO_ENTRY) { + DWARF_SET_ERROR(dbg, error, DW_DLE_NO_ENTRY); + return (DW_DLV_NO_ENTRY); + } else if (ret != DW_DLE_NONE) + return (DW_DLV_ERROR); + return (DW_DLV_OK); + } } DWARF_SET_ERROR(dbg, error, DW_DLE_NO_ENTRY); return (DW_DLV_NO_ENTRY); } +int +dwarf_offdie(Dwarf_Debug dbg, Dwarf_Off offset, Dwarf_Die *ret_die, + Dwarf_Error *error) +{ + + return (dwarf_offdie_b(dbg, offset, 1, ret_die, error)); +} + int dwarf_tag(Dwarf_Die die, Dwarf_Half *tag, Dwarf_Error *error) { @@ -293,9 +343,9 @@ dwarf_die_abbrev_code(Dwarf_Die die) } int -dwarf_get_cu_die_offset_given_cu_header_offset(Dwarf_Debug dbg, - Dwarf_Off in_cu_header_offset, Dwarf_Off *out_cu_die_offset, - Dwarf_Error *error) +dwarf_get_cu_die_offset_given_cu_header_offset_b(Dwarf_Debug dbg, + Dwarf_Off in_cu_header_offset, Dwarf_Bool is_info, + Dwarf_Off *out_cu_die_offset, Dwarf_Error *error) { Dwarf_CU cu; @@ -304,10 +354,19 @@ dwarf_get_cu_die_offset_given_cu_header_offset(Dwarf_Debug dbg, return (DW_DLV_ERROR); } - STAILQ_FOREACH(cu, &dbg->dbg_cu, cu_next) { - if (cu->cu_offset == in_cu_header_offset) { - *out_cu_die_offset = cu->cu_1st_offset; - break; + if (is_info) { + STAILQ_FOREACH(cu, &dbg->dbg_cu, cu_next) { + if (cu->cu_offset == in_cu_header_offset) { + *out_cu_die_offset = cu->cu_1st_offset; + break; + } + } + } else { + STAILQ_FOREACH(cu, &dbg->dbg_tu, cu_next) { + if (cu->cu_offset == in_cu_header_offset) { + *out_cu_die_offset = cu->cu_1st_offset; + break; + } } } @@ -319,6 +378,16 @@ dwarf_get_cu_die_offset_given_cu_header_offset(Dwarf_Debug dbg, return (DW_DLV_OK); } +int +dwarf_get_cu_die_offset_given_cu_header_offset(Dwarf_Debug dbg, + Dwarf_Off in_cu_header_offset, Dwarf_Off *out_cu_die_offset, + Dwarf_Error *error) +{ + + return (dwarf_get_cu_die_offset_given_cu_header_offset_b(dbg, + in_cu_header_offset, 1, out_cu_die_offset, error)); +} + int dwarf_get_address_size(Dwarf_Debug dbg, Dwarf_Half *addr_size, Dwarf_Error *error) @@ -333,3 +402,12 @@ dwarf_get_address_size(Dwarf_Debug dbg, Dwarf_Half *addr_size, return (DW_DLV_OK); } + +Dwarf_Bool +dwarf_get_die_infotypes_flag(Dwarf_Die die) +{ + + assert(die != NULL); + + return (die->die_cu->cu_is_info); +} diff --git a/libdwarf/dwarf_dieoffset.3 b/libdwarf/dwarf_dieoffset.3 index 545bf2699c4d..00b0e71b8389 100644 --- a/libdwarf/dwarf_dieoffset.3 +++ b/libdwarf/dwarf_dieoffset.3 @@ -1,4 +1,4 @@ -.\" Copyright (c) 2010 Kai Wang +.\" Copyright (c) 2010,2014 Kai Wang .\" All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without @@ -22,16 +22,17 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $Id: dwarf_dieoffset.3 2073 2011-10-27 03:30:47Z jkoshy $ +.\" $Id: dwarf_dieoffset.3 3129 2014-12-21 20:06:26Z jkoshy $ .\" -.Dd April 17, 2010 +.Dd December 21, 2014 .Os .Dt DWARF_DIEOFFSET 3 .Sh NAME .Nm dwarf_die_CU_offset , .Nm dwarf_die_CU_offset_range , .Nm dwarf_dieoffset , -.Nm dwarf_get_cu_die_offset_given_cu_header_offset +.Nm dwarf_get_cu_die_offset_given_cu_header_offset , +.Nm dwarf_get_cu_die_offset_given_cu_header_offset_b .Nd return offsets of DWARF debugging information entries .Sh LIBRARY .Lb libdwarf @@ -63,6 +64,14 @@ .Fa "Dwarf_Off *out_cu_die_offset" .Fa "Dwarf_Error *err" .Fc +.Ft int +.Fo dwarf_get_cu_die_offset_given_cu_header_offset_b +.Fa "Dwarf_Debug dbg" +.Fa "Dwarf_Off in_cu_header_offset" +.Fa "Dwarf_Bool is_info" +.Fa "Dwarf_Off *out_cu_die_offset" +.Fa "Dwarf_Error *err" +.Fc .Sh DESCRIPTION These functions are used to retrieve offsets for DWARF debugging information entries. @@ -114,7 +123,7 @@ an error. .Pp Function .Fn dwarf_get_cu_die_offset_given_cu_header_offset -returns the offset for the debugging information entry for a +returns the offset for the first debugging information entry for a compilation unit, given an offset to the header of the compilation unit. Argument @@ -131,8 +140,30 @@ If argument .Ar err is non-NULL, it will be used to return an error descriptor in case of an error. +.Pp +Function +.Fn dwarf_get_cu_die_offset_given_cu_header_offset_b +behaves identically to the function +.Fn dwarf_get_cu_die_offset_given_cu_header_offset +when the argument +.Ar is_info +is non-zero. +When the argument +.Ar is_info +is zero, function +.Fn dwarf_get_cu_die_offset_given_cu_header_offset_b +returns the offset for the first debugging information entry for a +type unit, given an offset to the header of the type unit in argument +.Ar in_cu_header_offset . +Argument +.Ar out_cu_die_offset +points to a location that will hold the returned offset. +If the argument +.Ar err +is non-NULL, it will be used to return an error descriptor in case of +an error. .Sh RETURN VALUES -On success, these functions returns +On success, these functions return .Dv DW_DLV_OK . In case of an error, these functions return .Dv DW_DLV_ERROR @@ -141,11 +172,13 @@ and set argument .Pp Function .Fn dwarf_get_cu_die_offset_given_cu_header_offset +and +.Fn dwarf_get_cu_die_offset_given_cu_header_offset_b returns .Dv DW_DLV_NO_ENTRY and sets argument .Ar err -if there is no compilation unit located at the +if there is no compilation or type unit located at the offset specified in argument .Ar in_cu_header_offset . .Sh ERRORS @@ -169,4 +202,5 @@ specified an unknown offset. .Sh SEE ALSO .Xr dwarf 3 , .Xr dwarf_next_cu_header 3 , -.Xr dwarf_offdie 3 +.Xr dwarf_offdie 3 , +.Xr dwarf_offdie_b 3 diff --git a/libdwarf/dwarf_dump.c b/libdwarf/dwarf_dump.c index 9b5d1f767e1a..3219fa4c0c6c 100644 --- a/libdwarf/dwarf_dump.c +++ b/libdwarf/dwarf_dump.c @@ -27,7 +27,7 @@ #include "_libdwarf.h" -ELFTC_VCSID("$Id: dwarf_dump.c 2073 2011-10-27 03:30:47Z jkoshy $"); +ELFTC_VCSID("$Id: dwarf_dump.c 3052 2014-05-26 20:36:24Z kaiwang27 $"); int dwarf_get_ACCESS_name(unsigned access, const char **s) @@ -250,6 +250,54 @@ dwarf_get_AT_name(unsigned attr, const char **s) *s = "DW_AT_visibility"; break; case DW_AT_vtable_elem_location: *s = "DW_AT_vtable_elem_location"; break; + case DW_AT_sf_names: + *s = "DW_AT_sf_names"; break; + case DW_AT_src_info: + *s = "DW_AT_src_info"; break; + case DW_AT_mac_info: + *s = "DW_AT_mac_info"; break; + case DW_AT_src_coords: + *s = "DW_AT_src_coords"; break; + case DW_AT_body_begin: + *s = "DW_AT_body_begin"; break; + case DW_AT_body_end: + *s = "DW_AT_body_end"; break; + case DW_AT_GNU_vector: + *s = "DW_AT_GNU_vector"; break; + case DW_AT_GNU_guarded_by: + *s = "DW_AT_GNU_guarded_by"; break; + case DW_AT_GNU_pt_guarded_by: + *s = "DW_AT_GNU_pt_guarded_by"; break; + case DW_AT_GNU_guarded: + *s = "DW_AT_GNU_guarded"; break; + case DW_AT_GNU_pt_guarded: + *s = "DW_AT_GNU_pt_guarded"; break; + case DW_AT_GNU_locks_excluded: + *s = "DW_AT_GNU_locks_excluded"; break; + case DW_AT_GNU_exclusive_locks_required: + *s = "DW_AT_GNU_exclusive_locks_required"; break; + case DW_AT_GNU_shared_locks_required: + *s = "DW_AT_GNU_shared_locks_required"; break; + case DW_AT_GNU_odr_signature: + *s = "DW_AT_GNU_odr_signature"; break; + case DW_AT_GNU_template_name: + *s = "DW_AT_GNU_template_name"; break; + case DW_AT_GNU_call_site_value: + *s = "DW_AT_GNU_call_site_value"; break; + case DW_AT_GNU_call_site_data_value: + *s = "DW_AT_GNU_call_site_data_value"; break; + case DW_AT_GNU_call_site_target: + *s = "DW_AT_GNU_call_site_target"; break; + case DW_AT_GNU_call_site_target_clobbered: + *s = "DW_AT_GNU_call_site_target_clobbered"; break; + case DW_AT_GNU_tail_call: + *s = "DW_AT_GNU_tail_call"; break; + case DW_AT_GNU_all_tail_call_sites: + *s = "DW_AT_GNU_all_tail_call_sites"; break; + case DW_AT_GNU_all_call_sites: + *s = "DW_AT_GNU_all_call_sites"; break; + case DW_AT_GNU_all_source_call_sites: + *s = "DW_AT_GNU_all_source_call_sites"; break; default: return (DW_DLV_NO_ENTRY); } @@ -1094,6 +1142,30 @@ dwarf_get_OP_name(unsigned op, const char **s) *s = "DW_OP_stack_value"; break; case DW_OP_GNU_push_tls_address: *s = "DW_OP_GNU_push_tls_address"; break; + case DW_OP_GNU_uninit: + *s = "DW_OP_GNU_uninit"; break; + case DW_OP_GNU_encoded_addr: + *s = "DW_OP_GNU_encoded_addr"; break; + case DW_OP_GNU_implicit_pointer: + *s = "DW_OP_GNU_implicit_pointer"; break; + case DW_OP_GNU_entry_value: + *s = "DW_OP_GNU_entry_value"; break; + case DW_OP_GNU_const_type: + *s = "DW_OP_GNU_const_type"; break; + case DW_OP_GNU_regval_type: + *s = "DW_OP_GNU_regval_type"; break; + case DW_OP_GNU_deref_type: + *s = "DW_OP_GNU_deref_type"; break; + case DW_OP_GNU_convert: + *s = "DW_OP_GNU_convert"; break; + case DW_OP_GNU_reinterpret: + *s = "DW_OP_GNU_reinterpret"; break; + case DW_OP_GNU_parameter_ref: + *s = "DW_OP_GNU_parameter_ref"; break; + case DW_OP_GNU_addr_index: + *s = "DW_OP_GNU_addr_index"; break; + case DW_OP_GNU_const_index: + *s = "DW_OP_GNU_const_index"; break; default: return (DW_DLV_NO_ENTRY); } @@ -1244,6 +1316,26 @@ dwarf_get_TAG_name(unsigned tag, const char **s) *s = "DW_TAG_volatile_type"; break; case DW_TAG_with_stmt: *s = "DW_TAG_with_stmt"; break; + case DW_TAG_format_label: + *s = "DW_TAG_format_label"; break; + case DW_TAG_function_template: + *s = "DW_TAG_function_template"; break; + case DW_TAG_class_template: + *s = "DW_TAG_class_template"; break; + case DW_TAG_GNU_BINCL: + *s = "DW_TAG_GNU_BINCL"; break; + case DW_TAG_GNU_EINCL: + *s = "DW_TAG_GNU_EINCL"; break; + case DW_TAG_GNU_template_template_param: + *s = "DW_TAG_GNU_template_template_param"; break; + case DW_TAG_GNU_template_parameter_pack: + *s = "DW_TAG_GNU_template_parameter_pack"; break; + case DW_TAG_GNU_formal_parameter_pack: + *s = "DW_TAG_GNU_formal_parameter_pack"; break; + case DW_TAG_GNU_call_site: + *s = "DW_TAG_GNU_call_site"; break; + case DW_TAG_GNU_call_site_parameter: + *s = "DW_TAG_GNU_call_site_parameter"; break; default: return (DW_DLV_NO_ENTRY); } diff --git a/libdwarf/dwarf_errmsg.c b/libdwarf/dwarf_errmsg.c index 86afa28457bd..e300893a61c1 100644 --- a/libdwarf/dwarf_errmsg.c +++ b/libdwarf/dwarf_errmsg.c @@ -26,9 +26,9 @@ #include "_libdwarf.h" -ELFTC_VCSID("$Id: dwarf_errmsg.c 2576 2012-09-13 09:16:11Z jkoshy $"); +ELFTC_VCSID("$Id: dwarf_errmsg.c 2975 2014-01-21 20:08:04Z kaiwang27 $"); -const char *_libdwarf_errors[] = { +static const char *_libdwarf_errors[] = { #define DEFINE_ERROR(N,S) [DW_DLE_##N] = S DEFINE_ERROR(NONE, "No Error"), DEFINE_ERROR(ERROR, "An error"), diff --git a/libdwarf/dwarf_frame.c b/libdwarf/dwarf_frame.c index 5ccbbc4aead7..442f232cf092 100644 --- a/libdwarf/dwarf_frame.c +++ b/libdwarf/dwarf_frame.c @@ -26,7 +26,7 @@ #include "_libdwarf.h" -ELFTC_VCSID("$Id: dwarf_frame.c 2073 2011-10-27 03:30:47Z jkoshy $"); +ELFTC_VCSID("$Id: dwarf_frame.c 3106 2014-12-19 16:00:58Z kaiwang27 $"); int dwarf_get_fde_list(Dwarf_Debug dbg, Dwarf_Cie **cie_list, @@ -539,8 +539,8 @@ dwarf_expand_frame_instructions(Dwarf_Cie cie, Dwarf_Ptr instruction, return (DW_DLV_ERROR); } - ret = _dwarf_frame_get_fop(dbg, instruction, len, ret_oplist, ret_opcnt, - error); + ret = _dwarf_frame_get_fop(dbg, cie->cie_addrsize, instruction, len, + ret_oplist, ret_opcnt, error); if (ret != DW_DLE_NONE) return (DW_DLV_ERROR); diff --git a/libdwarf/dwarf_get_die_infotypes_flag.3 b/libdwarf/dwarf_get_die_infotypes_flag.3 new file mode 100644 index 000000000000..4f5a19ace367 --- /dev/null +++ b/libdwarf/dwarf_get_die_infotypes_flag.3 @@ -0,0 +1,73 @@ +.\" Copyright (c) 2014 Kai Wang +.\" 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: dwarf_get_die_infotypes_flag.3 3118 2014-12-20 20:30:06Z jkoshy $ +.\" +.Dd December 20, 2014 +.Os +.Dt DWARF_GET_DIE_INFOTYPES_FLAG 3 +.Sh NAME +.Nm dwarf_get_die_infotypes_flag +.Nd indicate the originating DWARF section for a DIE +.Sh LIBRARY +.Lb libdwarf +.Sh SYNOPSIS +.In libdwarf.h +.Ft Dwarf_Bool +.Fo dwarf_get_die_infotypes_flag +.Fa "Dwarf_Die die" +.Fc +.Sh DESCRIPTION +Function +.Fn dwarf_get_die_infotypes_flag +returns a flag indicating the originating DWARF section for the +debugging information entry referenced by argument +.Ar die . +.Pp +Argument +.Ar die +should reference a valid debugging information entry descriptor. +.Sh RETURN VALUES +Function +.Fn dwarf_get_die_infotypes_flag +returns a non-zero value if argument +.Ar die +originates in the +.Dq .debug_info +section. +.Pp +It returns zero if argument +.Ar die +originates in the +.Dq .debug_types +section. +.Sh ERRORS +Function +.Fn dwarf_get_die_infotypes_flag +always succeeds. +.Sh SEE ALSO +.Xr dwarf 3 , +.Xr dwarf_next_cu_header_c 3 , +.Xr dwarf_offdie_b 3 , +.Xr dwarf_siblingof_b 3 diff --git a/libdwarf/dwarf_get_section_max_offsets.3 b/libdwarf/dwarf_get_section_max_offsets.3 new file mode 100644 index 000000000000..6f79341cd367 --- /dev/null +++ b/libdwarf/dwarf_get_section_max_offsets.3 @@ -0,0 +1,116 @@ +.\" Copyright (c) 2014 Kai Wang +.\" 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: dwarf_get_section_max_offsets.3 3098 2014-09-02 22:18:29Z kaiwang27 $ +.\" +.Dd July 27, 2014 +.Os +.Dt DWARF_GET_SECTION_MAX_OFFSETS +.Sh NAME +.Nm dwarf_get_section_max_offsets , +.Nm dwarf_get_section_max_offsets_b +.Nd return the size of DWARF sections +.Sh LIBRARY +.Lb libdwarf +.Sh SYNOPSIS +.In libdwarf.h +.Ft int +.Fo dwarf_get_section_max_offsets +.Fa "Dwarf_Debug dbg" +.Fa "Dwarf_Unsigned *debug_info" +.Fa "Dwarf_Unsigned *debug_abbrev" +.Fa "Dwarf_Unsigned *debug_line" +.Fa "Dwarf_Unsigned *debug_loc" +.Fa "Dwarf_Unsigned *debug_aranges" +.Fa "Dwarf_Unsigned *debug_macinfo" +.Fa "Dwarf_Unsigned *debug_pubnames" +.Fa "Dwarf_Unsigned *debug_str" +.Fa "Dwarf_Unsigned *debug_frame" +.Fa "Dwarf_Unsigned *debug_ranges" +.Fa "Dwarf_Unsigned *debug_pubtypes" +.Fc +.Ft int +.Fo dwarf_get_section_max_offsets_b +.Fa "Dwarf_Debug dbg" +.Fa "Dwarf_Unsigned *debug_info" +.Fa "Dwarf_Unsigned *debug_abbrev" +.Fa "Dwarf_Unsigned *debug_line" +.Fa "Dwarf_Unsigned *debug_loc" +.Fa "Dwarf_Unsigned *debug_aranges" +.Fa "Dwarf_Unsigned *debug_macinfo" +.Fa "Dwarf_Unsigned *debug_pubnames" +.Fa "Dwarf_Unsigned *debug_str" +.Fa "Dwarf_Unsigned *debug_frame" +.Fa "Dwarf_Unsigned *debug_ranges" +.Fa "Dwarf_Unsigned *debug_pubtypes" +.Fa "Dwarf_Unsigned *debug_types" +.Fc +.Sh DESCRIPTION +Function +.Fn dwarf_get_section_max_offsets_b +retrieves the sizes of the DWARF sections in a DWARF debug context. +Argument +.Ar dbg +should reference a DWARF debug context allocated using +.Xr dwarf_init 3 . +The function stores the size of each DWARF section to the location +pointed to by the argument corresponding to the section name. +If a DWARF section does not exist, the location pointed to by the +argument corresponding to that section will be set to zero. +.Pp +A value of NULL may be used for any of the arguments +.Ar debug_info , +.Ar debug_abbrev , +.Ar debug_line , +.Ar debug_loc , +.Ar debug_aranges , +.Ar debug_macinfo , +.Ar debug_pubnames , +.Ar debug_str , +.Ar debug_frame , +.Ar debug_ranges , +.Ar debug_pubtypes +and +.Ar debug_types +if the caller is not interested in the respective section size. +.Pp +Function +.Fn dwarf_get_section_max_offsets +is identical to function +.Fn dwarf_get_section_max_offsets_b +except that it does not provide argument +.Ar debug_types , +thus it can not retrieve the size of the +.Dq \&.debug_types +section. +.Sh RETURN VALUES +On success, these functions return +.Dv DW_DLV_OK . +If argument +.Ar dbg +is NULL, they return +.Dv DW_DLV_ERROR . +.Sh SEE ALSO +.Xr dwarf 3 , +.Xr dwarf_init 3 diff --git a/libdwarf/dwarf_highpc.3 b/libdwarf/dwarf_highpc.3 index 998a3b6ad650..4d31f5c8d1a2 100644 --- a/libdwarf/dwarf_highpc.3 +++ b/libdwarf/dwarf_highpc.3 @@ -1,4 +1,4 @@ -.\" Copyright (c) 2010 Kai Wang +.\" Copyright (c) 2010,2014 Kai Wang .\" All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without @@ -22,9 +22,9 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $Id: dwarf_highpc.3 2073 2011-10-27 03:30:47Z jkoshy $ +.\" $Id: dwarf_highpc.3 3092 2014-09-02 22:09:30Z kaiwang27 $ .\" -.Dd April 7, 2010 +.Dd July 22, 2014 .Os .Dt DWARF_HIGHPC 3 .Sh NAME @@ -33,6 +33,7 @@ .Nm dwarf_bitsize , .Nm dwarf_bytesize , .Nm dwarf_highpc , +.Nm dwarf_highpc_b , .Nm dwarf_lowpc , .Nm dwarf_srclang .Nd retrieve the value of a DWARF attribute @@ -71,6 +72,14 @@ .Fa "Dwarf_Error *err" .Fc .Ft int +.Fo dwarf_highpc_b +.Fa "Dwarf_Die die" +.Fa "Dwarf_Addr *ret_highpc" +.Fa "Dwarf_Half *ret_form" +.Fa "enum Dwarf_Form_Class *ret_class" +.Fa "Dwarf_Error *err" +.Fc +.Ft int .Fo dwarf_lowpc .Fa "Dwarf_Die die" .Fa "Dwarf_Addr *ret_lowpc" @@ -114,6 +123,10 @@ attribute value. Retrieve the .Dv DW_AT_high_pc attribute value. +.It Fn dwarf_highpc_b +Retrieve the +.Dv DW_AT_high_pc +attribute value. .It Fn dwarf_lowpc Retrieve the .Dv DW_AT_low_pc @@ -123,6 +136,23 @@ Retrieve the .Dv DW_AT_language attribute value. .El +.Pp +Function +.Fn dwarf_highpc_b +is an enhanced version of function +.Fn dwarf_highpc . +It sets the location specified by argument +.Ar ret_form +to the form code of the attribute +.Dv DW_AT_high_pc , +and sets the location specified by argument +.Ar ret_class +to the class of that form. +A value of NULL may be used for either of the arguments +.Ar ret_form +or +.Ar ret_class +if the caller is not interested in the respective value. .Sh RETURN VALUES These functions return .Dv DW_DLV_OK on success. @@ -159,4 +189,5 @@ had no requested attribute. .Xr dwarf 3 , .Xr dwarf_attr 3 , .Xr dwarf_attrlist 3 , -.Xr dwarf_hasattr 3 +.Xr dwarf_hasattr 3 , +.Xr dwarf_get_form_class 3 diff --git a/libdwarf/dwarf_lineno.c b/libdwarf/dwarf_lineno.c index d0c24b176b71..cbcc9aeaa69d 100644 --- a/libdwarf/dwarf_lineno.c +++ b/libdwarf/dwarf_lineno.c @@ -26,7 +26,7 @@ #include "_libdwarf.h" -ELFTC_VCSID("$Id: dwarf_lineno.c 2074 2011-10-27 03:34:33Z jkoshy $"); +ELFTC_VCSID("$Id: dwarf_lineno.c 2983 2014-02-09 00:24:31Z kaiwang27 $"); int dwarf_srclines(Dwarf_Die die, Dwarf_Line **linebuf, Dwarf_Signed *linecount, @@ -75,8 +75,8 @@ dwarf_srclines(Dwarf_Die die, Dwarf_Line **linebuf, Dwarf_Signed *linecount, return (DW_DLV_OK); } - if ((li->li_lnarray = malloc(*linecount * - sizeof(struct _Dwarf_Line))) == NULL) { + if ((li->li_lnarray = malloc(*linecount * sizeof(Dwarf_Line))) == + NULL) { DWARF_SET_ERROR(dbg, error, DW_DLE_MEMORY); return (DW_DLV_ERROR); } diff --git a/libdwarf/dwarf_loclist.c b/libdwarf/dwarf_loclist.c index cf6fa9dc9f8e..e780a87128e5 100644 --- a/libdwarf/dwarf_loclist.c +++ b/libdwarf/dwarf_loclist.c @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2009 Kai Wang + * Copyright (c) 2009,2014 Kai Wang * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -26,13 +26,37 @@ #include "_libdwarf.h" -ELFTC_VCSID("$Id: dwarf_loclist.c 2074 2011-10-27 03:34:33Z jkoshy $"); +ELFTC_VCSID("$Id: dwarf_loclist.c 3066 2014-06-06 19:36:06Z kaiwang27 $"); + +static int +copy_locdesc(Dwarf_Debug dbg, Dwarf_Locdesc *dst, Dwarf_Locdesc *src, + Dwarf_Error *error) +{ + + assert(src != NULL && dst != NULL); + + dst->ld_lopc = src->ld_lopc; + dst->ld_hipc = src->ld_hipc; + dst->ld_cents = src->ld_cents; + + if (dst->ld_cents > 0) { + dst->ld_s = calloc(dst->ld_cents, sizeof(Dwarf_Loc)); + if (dst->ld_s == NULL) { + DWARF_SET_ERROR(dbg, error, DW_DLE_MEMORY); + return (DW_DLE_MEMORY); + } + memcpy(dst->ld_s, src->ld_s, src->ld_cents * + sizeof(Dwarf_Loc)); + } else + dst->ld_s = NULL; + + return (DW_DLE_NONE); +} int dwarf_loclist_n(Dwarf_Attribute at, Dwarf_Locdesc ***llbuf, Dwarf_Signed *listlen, Dwarf_Error *error) { - Dwarf_Loclist ll; Dwarf_Debug dbg; int ret; @@ -56,27 +80,54 @@ dwarf_loclist_n(Dwarf_Attribute at, Dwarf_Locdesc ***llbuf, switch (at->at_form) { case DW_FORM_data4: case DW_FORM_data8: - ret = _dwarf_loclist_find(at->at_die->die_dbg, - at->at_die->die_cu, at->u[0].u64, &ll, error); + /* + * DW_FORM_data[48] can not be used as section offset + * since DWARF4. For DWARF[23], the application needs + * to determine if DW_FORM_data[48] is representing + * a constant or a section offset. + */ + if (at->at_die->die_cu->cu_version >= 4) { + DWARF_SET_ERROR(dbg, error, DW_DLE_NO_ENTRY); + return (DW_DLV_NO_ENTRY); + } + /* FALLTHROUGH */ + case DW_FORM_sec_offset: + ret = _dwarf_loclist_find(dbg, at->at_die->die_cu, + at->u[0].u64, llbuf, listlen, NULL, error); if (ret == DW_DLE_NO_ENTRY) { DWARF_SET_ERROR(dbg, error, ret); return (DW_DLV_NO_ENTRY); } if (ret != DW_DLE_NONE) return (DW_DLV_ERROR); - *llbuf = ll->ll_ldlist; - *listlen = ll->ll_ldlen; return (DW_DLV_OK); case DW_FORM_block: case DW_FORM_block1: case DW_FORM_block2: case DW_FORM_block4: + case DW_FORM_exprloc: if (at->at_ld == NULL) { ret = _dwarf_loc_add(at->at_die, at, error); if (ret != DW_DLE_NONE) return (DW_DLV_ERROR); } - *llbuf = &at->at_ld; + *llbuf = calloc(1, sizeof(Dwarf_Locdesc *)); + if (*llbuf == NULL) { + DWARF_SET_ERROR(dbg, error, DW_DLE_MEMORY); + return (DW_DLV_ERROR); + } + (*llbuf)[0] = calloc(1, sizeof(Dwarf_Locdesc)); + if ((*llbuf)[0] == NULL) { + free(*llbuf); + DWARF_SET_ERROR(dbg, error, DW_DLE_MEMORY); + return (DW_DLV_ERROR); + } + if (copy_locdesc(dbg, (*llbuf)[0], at->at_ld, error) != + DW_DLE_NONE) { + free((*llbuf)[0]); + free(*llbuf); + return (DW_DLV_ERROR); + } *listlen = 1; return (DW_DLV_OK); default: @@ -95,62 +146,27 @@ int dwarf_loclist(Dwarf_Attribute at, Dwarf_Locdesc **llbuf, Dwarf_Signed *listlen, Dwarf_Error *error) { - Dwarf_Loclist ll; - Dwarf_Debug dbg; - int ret; + Dwarf_Locdesc **_llbuf; + int i, ret; - dbg = at != NULL ? at->at_die->die_dbg : NULL; + ret = dwarf_loclist_n(at, &_llbuf, listlen, error); + if (ret != DW_DLV_OK) + return (ret); - if (at == NULL || llbuf == NULL || listlen == NULL) { - DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT); - return (DW_DLV_ERROR); + /* Only return the first location description of the list. */ + *llbuf = _llbuf[0]; + + /* Free the rest of the list. */ + for (i = 1; i < *listlen; i++) { + if (_llbuf[i]->ld_s) + free(_llbuf[i]->ld_s); + free(_llbuf[i]); } + free(_llbuf); - switch (at->at_attrib) { - case DW_AT_location: - case DW_AT_string_length: - case DW_AT_return_addr: - case DW_AT_data_member_location: - case DW_AT_frame_base: - case DW_AT_segment: - case DW_AT_static_link: - case DW_AT_use_location: - case DW_AT_vtable_elem_location: - switch (at->at_form) { - case DW_FORM_data4: - case DW_FORM_data8: - ret = _dwarf_loclist_find(at->at_die->die_dbg, - at->at_die->die_cu, at->u[0].u64, &ll, error); - if (ret == DW_DLE_NO_ENTRY) { - DWARF_SET_ERROR(dbg, error, DW_DLV_NO_ENTRY); - return (DW_DLV_NO_ENTRY); - } - if (ret != DW_DLE_NONE) - return (DW_DLV_ERROR); - *llbuf = ll->ll_ldlist[0]; - *listlen = 1; - return (DW_DLV_OK); - case DW_FORM_block: - case DW_FORM_block1: - case DW_FORM_block2: - case DW_FORM_block4: - if (at->at_ld == NULL) { - ret = _dwarf_loc_add(at->at_die, at, error); - if (ret != DW_DLE_NONE) - return (DW_DLV_ERROR); - } - *llbuf = at->at_ld; - *listlen = 1; - return (DW_DLV_OK); - default: - DWARF_SET_ERROR(dbg, error, DW_DLE_ATTR_FORM_BAD); - return (DW_DLV_ERROR); - } - default: - /* Wrong attr supplied. */ - DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT); - return (DW_DLV_ERROR); - } + *listlen = 1; + + return (DW_DLV_OK); } int @@ -159,19 +175,25 @@ dwarf_get_loclist_entry(Dwarf_Debug dbg, Dwarf_Unsigned offset, Dwarf_Unsigned *entry_len, Dwarf_Unsigned *next_entry, Dwarf_Error *error) { - Dwarf_Loclist ll, next_ll; - Dwarf_Locdesc *ld; + Dwarf_Locdesc *ld, **llbuf; Dwarf_Section *ds; + Dwarf_Signed listlen; int i, ret; + /* + * Note that this API sometimes will not work correctly because + * it assumes that all units have the same pointer size and offset + * size. + */ + if (dbg == NULL || hipc == NULL || lopc == NULL || data == NULL || entry_len == NULL || next_entry == NULL) { DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT); return (DW_DLV_ERROR); } - ret = _dwarf_loclist_find(dbg, STAILQ_FIRST(&dbg->dbg_cu), offset, &ll, - error); + ret = _dwarf_loclist_find(dbg, STAILQ_FIRST(&dbg->dbg_cu), offset, + &llbuf, &listlen, entry_len, error); if (ret == DW_DLE_NO_ENTRY) { DWARF_SET_ERROR(dbg, error, DW_DLV_NO_ENTRY); return (DW_DLV_NO_ENTRY); @@ -179,8 +201,8 @@ dwarf_get_loclist_entry(Dwarf_Debug dbg, Dwarf_Unsigned offset, return (DW_DLV_ERROR); *hipc = *lopc = 0; - for (i = 0; i < ll->ll_ldlen; i++) { - ld = ll->ll_ldlist[i]; + for (i = 0; i < listlen; i++) { + ld = llbuf[i]; if (i == 0) { *hipc = ld->ld_hipc; *lopc = ld->ld_lopc; @@ -194,14 +216,8 @@ dwarf_get_loclist_entry(Dwarf_Debug dbg, Dwarf_Unsigned offset, ds = _dwarf_find_section(dbg, ".debug_loc"); assert(ds != NULL); - *data = (uint8_t *) ds->ds_data + ll->ll_offset; - *entry_len = ll->ll_length; - - next_ll = TAILQ_NEXT(ll, ll_next); - if (next_ll != NULL) - *next_entry = next_ll->ll_offset; - else - *next_entry = ds->ds_size; + *data = (uint8_t *) ds->ds_data + offset; + *next_entry = offset + *entry_len; return (DW_DLV_OK); } @@ -211,30 +227,49 @@ dwarf_loclist_from_expr(Dwarf_Debug dbg, Dwarf_Ptr bytes_in, Dwarf_Unsigned bytes_len, Dwarf_Locdesc **llbuf, Dwarf_Signed *listlen, Dwarf_Error *error) { - Dwarf_Locdesc *ld; - int ret; - if (dbg == NULL || bytes_in == NULL || bytes_len == 0 || - llbuf == NULL || listlen == NULL) { - DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT); - return (DW_DLV_ERROR); - } - - ret = _dwarf_loc_fill_locexpr(dbg, &ld, bytes_in, bytes_len, - dbg->dbg_pointer_size, error); - if (ret != DW_DLE_NONE) - return (DW_DLV_ERROR); - - *llbuf = ld; - *listlen = 1; - - return (DW_DLV_OK); + return (dwarf_loclist_from_expr_a(dbg, bytes_in, bytes_len, + dbg->dbg_pointer_size, llbuf, listlen, error)); } int dwarf_loclist_from_expr_a(Dwarf_Debug dbg, Dwarf_Ptr bytes_in, Dwarf_Unsigned bytes_len, Dwarf_Half addr_size, Dwarf_Locdesc **llbuf, Dwarf_Signed *listlen, Dwarf_Error *error) +{ + Dwarf_Half offset_size; + Dwarf_Small version; + + /* + * Obtain offset size and DWARF version from the current + * Compilation Unit or Type Unit. These values are needed + * for correctly parsing DW_OP_GNU_implicit_pointer operator. + * + * Note that dwarf_loclist_from_expr_b() should be used instead + * if the application knows correct values for offset size + * and DWARF version. + */ + if (dbg->dbg_cu_current) { + offset_size = dbg->dbg_cu_current->cu_length_size == 4 ? 4 : 8; + version = dbg->dbg_cu_current->cu_version; + } else if (dbg->dbg_tu_current) { + offset_size = dbg->dbg_tu_current->cu_length_size == 4 ? 4 : 8; + version = dbg->dbg_tu_current->cu_version; + } else { + /* Default values if no CU/TU context. */ + offset_size = 4; + version = 2; /* DWARF2 */ + } + + return (dwarf_loclist_from_expr_b(dbg, bytes_in, bytes_len, addr_size, + offset_size, version, llbuf, listlen, error)); +} + +int +dwarf_loclist_from_expr_b(Dwarf_Debug dbg, Dwarf_Ptr bytes_in, + Dwarf_Unsigned bytes_len, Dwarf_Half addr_size, Dwarf_Half offset_size, + Dwarf_Small version, Dwarf_Locdesc **llbuf, Dwarf_Signed *listlen, + Dwarf_Error *error) { Dwarf_Locdesc *ld; int ret; @@ -250,8 +285,13 @@ dwarf_loclist_from_expr_a(Dwarf_Debug dbg, Dwarf_Ptr bytes_in, return (DW_DLV_ERROR); } + if (offset_size != 4 && offset_size != 8) { + DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT); + return (DW_DLV_ERROR); + } + ret = _dwarf_loc_fill_locexpr(dbg, &ld, bytes_in, bytes_len, addr_size, - error); + offset_size, version, error); if (ret != DW_DLE_NONE) return (DW_DLV_ERROR); diff --git a/libdwarf/dwarf_loclist_from_expr.3 b/libdwarf/dwarf_loclist_from_expr.3 index d317f7e28004..d0eb88c464d2 100644 --- a/libdwarf/dwarf_loclist_from_expr.3 +++ b/libdwarf/dwarf_loclist_from_expr.3 @@ -1,4 +1,4 @@ -.\" Copyright (c) 2011 Kai Wang +.\" Copyright (c) 2011,2014 Kai Wang .\" All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without @@ -22,14 +22,15 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $Id: dwarf_loclist_from_expr.3 2074 2011-10-27 03:34:33Z jkoshy $ +.\" $Id: dwarf_loclist_from_expr.3 3129 2014-12-21 20:06:26Z jkoshy $ .\" -.Dd July 6, 2011 +.Dd December 21, 2014 .Os .Dt DWARF_LOCLIST_FROM_EXPR 3 .Sh NAME .Nm dwarf_loclist_from_expr , -.Nm dwarf_loclist_from_expr_a +.Nm dwarf_loclist_from_expr_a , +.Nm dwarf_loclist_from_expr_b .Nd translate DWARF location expression bytes .Sh LIBRARY .Lb libdwarf @@ -54,6 +55,18 @@ .Fa "Dwarf_Signed *listlen" .Fa "Dwarf_Error *err" .Fc +.Ft int +.Fo dwarf_loclist_from_expr_b +.Fa "Dwarf_Debug dbg" +.Fa "Dwarf_Ptr bytes_in" +.Fa "Dwarf_Unsigned bytes_len" +.Fa "Dwarf_Half addr_size" +.Fa "Dwarf_Half offset_size" +.Fa "Dwarf_Small version" +.Fa "Dwarf_Locdesc **llbuf" +.Fa "Dwarf_Signed *listlen" +.Fa "Dwarf_Error *error" +.Fc .Sh DESCRIPTION Function .Fn dwarf_loclist_from_expr @@ -104,6 +117,21 @@ except that it requires one additional argument .Ar addr_size , which specifies the address size to use when translating the location expression bytes. +.Pp +Function +.Fn dwarf_loclist_from_expr_b +is identical to function +.Fn dwarf_loclist_from_expr_a +except that it requires two additional arguments for translating the +location expression bytes. +Argument +.Ar offset_size +specifies the offset size, and argument +.Ar version +specifies the DWARF version. +These values are required to correctly translate the +.Dv DW_OP_GNU_implicit_pointer +opcode. .Ss Memory Management The memory area used for the descriptor returned in argument .Ar llbuf diff --git a/libdwarf/dwarf_next_cu_header.3 b/libdwarf/dwarf_next_cu_header.3 index 5be00b8ec4ee..f172322daa48 100644 --- a/libdwarf/dwarf_next_cu_header.3 +++ b/libdwarf/dwarf_next_cu_header.3 @@ -1,4 +1,4 @@ -.\" Copyright (c) 2010 Kai Wang +.\" Copyright (c) 2010,2014 Kai Wang .\" All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without @@ -22,14 +22,15 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $Id: dwarf_next_cu_header.3 2074 2011-10-27 03:34:33Z jkoshy $ +.\" $Id: dwarf_next_cu_header.3 3128 2014-12-21 20:06:22Z jkoshy $ .\" -.Dd July 24, 2010 +.Dd December 21, 2014 .Os .Dt DWARF_NEXT_CU_HEADER 3 .Sh NAME .Nm dwarf_next_cu_header , -.Nm dwarf_next_cu_header_b +.Nm dwarf_next_cu_header_b , +.Nm dwarf_next_cu_header_c .Nd step through compilation units in a DWARF debug context .Sh LIBRARY .Lb libdwarf @@ -57,33 +58,71 @@ .Fa "Dwarf_Unsigned *cu_next_offset" .Fa "Dwarf_Error *err" .Fc +.Ft int +.Fo dwarf_next_cu_header_c +.Fa "Dwarf_Debug dbg" +.Fa "Dwarf_Bool is_info" +.Fa "Dwarf_Unsigned *cu_length" +.Fa "Dwarf_Half *cu_version" +.Fa "Dwarf_Off *cu_abbrev_offset" +.Fa "Dwarf_Half *cu_pointer_size" +.Fa "Dwarf_Half *cu_offset_size" +.Fa "Dwarf_Half *cu_extension_size" +.Fa "Dwarf_Sig8 *type_signature" +.Fa "Dwarf_Unsigned *type_offset" +.Fa "Dwarf_Unsigned *cu_next_offset" +.Fa "Dwarf_Error *err" +.Fc .Sh DESCRIPTION -These functions are used to step through compilation unit contexts +These functions are used to step through compilation or type units associated with a DWARF debug context, optionally returning information about the unit. .Pp Function -.Fn dwarf_next_cu_header_b +.Fn dwarf_next_cu_header_c is the API recommended for new application code. +Function +.Fn dwarf_next_cu_header +and +.Fn dwarf_next_cu_header_b +can only operate on compilation units associated with the +.Dq \&.debug_info +section. +They are less general than function +.Fn dwarf_next_cu_header_c , +and are deprecated for use by new application code. +.Pp Argument .Ar dbg should reference a DWARF debug context allocated using .Xr dwarf_init 3 . +If argument +.Ar is_info +is set to 1, +the function returns information for compilation units found in the +.Dq \&.debug_info +section. +If argument +.Ar is_info +is set to 0, +the function returns information for type units found in the +.Dq \&.debug_types +sections. Argument .Ar cu_length should point to a location that will be set to the -length of the compilation unit. +length of the compilation or type unit. Argument .Ar cu_version should point to a location that will be set to the -version number for the compilation unit. +version number for the compilation or type unit. Argument .Ar cu_abbrev_offset should point to a location that will be set to the starting offset (in the .Dq .debug_abbrev section) of the set of debugging information entry abbreviations -associated with this compilation unit. +associated with this compilation or type unit. Argument .Ar cu_pointer_size should point to a location that will be set to the @@ -92,7 +131,7 @@ underlying object being debugged. Argument .Ar cu_offset_size should point to a location that will be set to the -size in bytes for a DWARF offset in the compilation unit. +size in bytes for a DWARF offset in the compilation or type unit. Argument .Ar cu_extension_size is only needed for processing MIPS/IRIX objects that use @@ -100,10 +139,26 @@ a non-standard DWARF format. It should point to a location that will be set to 4 for normal objects and to 0 for non-standard ones. Argument +.Ar type_signature +and +.Ar type_offset +is only needed for processing type units. +Argument +.Ar type_signature +should point to a location that will be set to the 64-bit unique signature +of the type described in the type unit. +Argument +.Ar type_offset +should point to a location that will be set to the offset of the debugging +information entry that describes the type. +Argument .Ar cu_next_offset should point to a location that will be set to the offset of the next compilation unit header in the .Dq \&.debug_info +section, +or the offset of the next type unit header in the +.Dq \&.debug_types section. Argument .Ar err @@ -111,42 +166,23 @@ should point to a location that will hold an error descriptor in case of an error. .Pp Function +.Fn dwarf_next_cu_header_b +is identical to function +.Fn dwarf_next_cu_header_c +except that it does not provide arguments +.Ar is_info , +.Ar type_signature +and +.Ar type_offset . +.Pp +Function .Fn dwarf_next_cu_header -is less general than -.Fn dwarf_next_cu_header_b , -and is deprecated for use by new application code. -Argument -.Ar dbg -should reference a DWARF debug context allocated using -.Xr dwarf_init 3 . -Argument -.Ar cu_length -should point to a location that will be set to the -length of the compilation unit. -Argument -.Ar cu_version -should point to a location that will be set to the -version number for the compilation unit. -Argument -.Ar cu_abbrev_offset -should point to a location that will be set to the -starting offset in the -.Dq .debug_abbrev -section of the set of debugging information entry abbreviations -associated with this compilation unit. -Argument -.Ar cu_pointer_size -should point to a location that will be set to the -size of an address in bytes for the machine architecture of the -underlying debugging object. -Argument -.Ar cu_next_offset -should point to a location that will be set to the -offset of the next compilation unit. -Argument -.Ar err -should point to a location that will hold an error descriptor in case -of an error. +is identical to function +.Fn dwarf_next_cu_header_b +except that it does not provide arguments +.Ar cu_offset_size +and +.Ar cu_extension_size . .Pp A value of NULL may be used for any of the arguments .Ar cu_length , @@ -155,30 +191,79 @@ A value of NULL may be used for any of the arguments .Ar cu_pointer_size , .Ar cu_offset_size , .Ar cu_extension_size , +.Ar type_signature , +.Ar type_offset , .Ar cu_next_offset and .Ar err if the caller is not interested in the respective value. .Ss Iterating Through Compilation Units in a Debug Context .Pp -The first call to functions -.Fn dwarf_next_cu_header_b -and -.Fn dwarf_next_cu_header -for a given debug context will return information about the first -compilation unit in the debug context. -Subsequent calls to these functions will iterate through the remaining -compilation units in the debug context. -On stepping past the last compilation unit in the debug context, -functions -.Fn dwarf_next_cu_header -and -.Fn dwarf_next_cu_header_b -return +The first call to function +.Fn dwarf_next_cu_header_c +for a given debug context with argument +.Ar is_info +set to 1 will return information about the first +compilation unit in the +.Dq \&.debug_info +section. +Subsequent calls to the function will iterate through the remaining +compilation units in the section. +On stepping past the last compilation unit in the section, +function +.Fn dwarf_next_cu_header_c +returns .Dv DW_DLV_NO_ENTRY -and reset their internal state. -The next call to these functions will restart from the first compilation -unit in the debug context. +and resets its internal state. +The next call to the function will restart from the first compilation +unit in the section. +.Ss Iterating Through Type Units in a Debug Context +When a DWARF debug context is allocated using +.Xr dwarf_init 3 , +an internal pointer assoicated with the context will point to the +fisrt +.Dq \&.debug_types +section found in the debug object. +The first call to function +.Fn dwarf_next_cu_header_c +for the debug context with argument +.Ar is_info +set to 0 will return information about the first +type unit in that +.Dq \&.debug_types +section. +Subsequent calls to the function will iterate through the remaining +type units in the section. +On stepping past the last type unit in the debug context, +function +.Fn dwarf_next_cu_header_c +returns +.Dv DW_DLV_NO_ENTRY +and resets its internal state. +The next call to the function will restart from the first type +unit in the +.Dq \&.debug_types +section. +.Pp +If the debug object contains multiple +.Dq \&.debug_types +sections, the function +.Fn dwarf_next_types_section +can be called to move the internal pointer to the next +.Dq \&.debug_types +section. +As a result, subsequent calls of the function +.Fn dwarf_next_cu_header_c +will operate on the new +.Dq \&.debug_types +section. +Function +.Fn dwarf_next_types_section +returns +.Dv DW_DLV_NO_ENTRY +when there are no more +.Dq \&.debug_types +sections left in the debug object. .Sh RETURN VALUES On success, these functions return .Dv DW_DLV_OK . @@ -200,4 +285,5 @@ was NULL. .Xr dwarf 3 , .Xr dwarf_get_cu_die_offset_given_cu_header_offset 3 , .Xr dwarf_init 3 , +.Xr dwarf_next_types_section 3 , .Xr dwarf_siblingof 3 diff --git a/libdwarf/dwarf_next_types_section.3 b/libdwarf/dwarf_next_types_section.3 new file mode 100644 index 000000000000..98ff70d82668 --- /dev/null +++ b/libdwarf/dwarf_next_types_section.3 @@ -0,0 +1,134 @@ +.\" Copyright (c) 2014 Kai Wang +.\" 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: dwarf_next_types_section.3 3116 2014-12-20 18:26:55Z jkoshy $ +.\" +.Dd December 20, 2014 +.Os +.Dt DWARF_NEXT_TYPES_SECTION 3 +.Sh NAME +.Nm dwarf_next_types_section +.Nd step through .debug_types sections in a debug context +.Sh LIBRARY +.Lb libdwarf +.Sh SYNOPSIS +.In libdwarf.h +.Ft int +.Fo dwarf_next_types_section +.Fa "Dwarf_Debug dbg" +.Fa "Dwarf_Error *err" +.Fc +.Sh DESCRIPTION +Function +.Fn dwarf_next_types_section +steps through the +.Dq \&.debug_types +sections found in a debug context. +.Pp +Argument +.Ar dbg +should reference a DWARF debug context allocated using +.Xr dwarf_init 3 . +Argument +.Ar err +should point to a location that will hold an error descriptor in case +of an error. +.Pp +When a DWARF debug context is allocated using +.Xr dwarf_init 3 , +an internal pointer associated with the context will point to the +first +.Dq \&.debug_types +section present in the debug object. +When the application calls function +.Fn dwarf_next_types_section , +this internal pointer will move to the next +.Dq \&.debug_types +section present. +On stepping past the last +.Dq \&.debug_types +section left in the debug context, function +.Fn dwarf_next_types_section +returns +.Dv DW_DLV_NO_ENTRY . +The next call to the function will restart from the first +.Dq \&.debug_types +section in the debug context. +.Pp +Application code should call function +.Xr dwarf_next_cu_header_c 3 +to iterate though the type units associated with the current +.Dq \&.debug_types +section. +.Sh RETURN VALUES +On success, function +.Fn dwarf_next_types_section +returns +.Dv DW_DLV_OK . +.Pp +In case of an error, it returns +.Dv DW_DLV_ERROR +and sets argument +.Ar err . +When there are no more +.Dq \&.debug_types +sections left to traverse, it returns +.Dv DW_DLV_NO_ENTRY . +.Sh COMPATIBILITY +This function is an extension to the +.Xr DWARF 3 +API. +.Sh ERRORS +The +.Fn dwarf_next_types_section +function may fail with the following errors: +.Bl -tag -width ".Bq Er DW_DLE_ARGUMENT" +.It Bq Er DW_DLE_ARGUMENT +Argument +.Va dbg +was NULL. +.El +.Sh EXAMPLES +To iterate though every type unit in all the +.Dq \&.debug_types +sections found in a debug context: +.Bd -literal -offset indent +Dwarf_Debug dbg; +Dwarf_Sig8 sig8; +Dwarf_Unsigned typeoff; +Dwarf_Error de; + +\&... allocate dbg using dwarf_init() etc ... + +do { + while ((ret = dwarf_next_cu_header_c(dbg, 0, NULL, NULL, NULL, + NULL, NULL, NULL, &sig8, &typeoff, NULL, &de)) == DW_DLV_OK) { + /* Access DIEs etc ... */ + } +} while (dwarf_next_types_section(dbg, &de) == DW_DLV_OK); +.Ed +.Sh SEE ALSO +.Xr dwarf 3 , +.Xr dwarf_init 3 , +.Xr dwarf_next_cu_header_c 3 diff --git a/libdwarf/dwarf_ranges.c b/libdwarf/dwarf_ranges.c index 9ad60832350d..2e01da553f7e 100644 --- a/libdwarf/dwarf_ranges.c +++ b/libdwarf/dwarf_ranges.c @@ -26,7 +26,7 @@ #include "_libdwarf.h" -ELFTC_VCSID("$Id: dwarf_ranges.c 2075 2011-10-27 03:47:28Z jkoshy $"); +ELFTC_VCSID("$Id: dwarf_ranges.c 3029 2014-04-21 23:26:02Z kaiwang27 $"); static int _dwarf_get_ranges(Dwarf_Debug dbg, Dwarf_CU cu, Dwarf_Off off, @@ -63,7 +63,7 @@ dwarf_get_ranges(Dwarf_Debug dbg, Dwarf_Off offset, Dwarf_Ranges **ranges, } if (!dbg->dbg_info_loaded) { - if (_dwarf_info_load(dbg, 1, error) != DW_DLE_NONE) + if (_dwarf_info_load(dbg, 1, 1, error) != DW_DLE_NONE) return (DW_DLV_ERROR); } diff --git a/libdwarf/dwarf_sections.c b/libdwarf/dwarf_sections.c new file mode 100644 index 000000000000..d3c1379378fe --- /dev/null +++ b/libdwarf/dwarf_sections.c @@ -0,0 +1,111 @@ +/*- + * Copyright (c) 2014 Kai Wang + * 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. + */ + +#include "_libdwarf.h" + +ELFTC_VCSID("$Id: dwarf_sections.c 3036 2014-05-05 19:19:31Z kaiwang27 $"); + +#define SET(N, V) \ + do { \ + if ((N) != NULL) \ + *(N) = (V); \ + } while (0) + +int +dwarf_get_section_max_offsets_b(Dwarf_Debug dbg, Dwarf_Unsigned *debug_info, + Dwarf_Unsigned *debug_abbrev, Dwarf_Unsigned *debug_line, + Dwarf_Unsigned *debug_loc, Dwarf_Unsigned *debug_aranges, + Dwarf_Unsigned *debug_macinfo, Dwarf_Unsigned *debug_pubnames, + Dwarf_Unsigned *debug_str, Dwarf_Unsigned *debug_frame, + Dwarf_Unsigned *debug_ranges, Dwarf_Unsigned *debug_pubtypes, + Dwarf_Unsigned *debug_types) +{ + const char *n; + Dwarf_Unsigned sz; + int i; + + if (dbg == NULL) + return (DW_DLV_ERROR); + + SET(debug_info, 0); + SET(debug_abbrev, 0); + SET(debug_line, 0); + SET(debug_loc, 0); + SET(debug_aranges, 0); + SET(debug_macinfo, 0); + SET(debug_pubnames, 0); + SET(debug_str, 0); + SET(debug_frame, 0); + SET(debug_ranges, 0); + SET(debug_pubtypes, 0); + SET(debug_types, 0); + + for (i = 0; (Dwarf_Unsigned) i < dbg->dbg_seccnt; i++) { + n = dbg->dbg_section[i].ds_name; + sz = dbg->dbg_section[i].ds_size; + if (!strcmp(n, ".debug_info")) + SET(debug_info, sz); + else if (!strcmp(n, ".debug_abbrev")) + SET(debug_abbrev, sz); + else if (!strcmp(n, ".debug_line")) + SET(debug_line, sz); + else if (!strcmp(n, ".debug_loc")) + SET(debug_loc, sz); + else if (!strcmp(n, ".debug_aranges")) + SET(debug_aranges, sz); + else if (!strcmp(n, ".debug_macinfo")) + SET(debug_macinfo, sz); + else if (!strcmp(n, ".debug_pubnames")) + SET(debug_pubnames, sz); + else if (!strcmp(n, ".debug_str")) + SET(debug_str, sz); + else if (!strcmp(n, ".debug_frame")) + SET(debug_frame, sz); + else if (!strcmp(n, ".debug_ranges")) + SET(debug_ranges, sz); + else if (!strcmp(n, ".debug_pubtypes")) + SET(debug_pubtypes, sz); + else if (!strcmp(n, ".debug_types")) + SET(debug_types, sz); + } + + return (DW_DLV_OK); +} + +int +dwarf_get_section_max_offsets(Dwarf_Debug dbg, Dwarf_Unsigned *debug_info, + Dwarf_Unsigned *debug_abbrev, Dwarf_Unsigned *debug_line, + Dwarf_Unsigned *debug_loc, Dwarf_Unsigned *debug_aranges, + Dwarf_Unsigned *debug_macinfo, Dwarf_Unsigned *debug_pubnames, + Dwarf_Unsigned *debug_str, Dwarf_Unsigned *debug_frame, + Dwarf_Unsigned *debug_ranges, Dwarf_Unsigned *debug_pubtypes) +{ + + return (dwarf_get_section_max_offsets(dbg, debug_info, debug_abbrev, + debug_line, debug_loc, debug_aranges, debug_macinfo, + debug_pubnames, debug_str, debug_frame, debug_ranges, + debug_pubtypes)); +} diff --git a/libdwarf/libdwarf.h b/libdwarf/libdwarf.h index 105a0e7d96d2..9a4a89984769 100644 --- a/libdwarf/libdwarf.h +++ b/libdwarf/libdwarf.h @@ -1,6 +1,6 @@ /*- * Copyright (c) 2007 John Birrell (jb@freebsd.org) - * Copyright (c) 2009-2011 Kai Wang + * Copyright (c) 2009-2011,2014 Kai Wang * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -24,7 +24,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: libdwarf.h 2576 2012-09-13 09:16:11Z jkoshy $ + * $Id: libdwarf.h 3064 2014-06-06 19:35:55Z kaiwang27 $ */ #ifndef _LIBDWARF_H_ @@ -47,7 +47,6 @@ typedef struct _Dwarf_ArangeSet *Dwarf_ArangeSet; typedef struct _Dwarf_Attribute *Dwarf_Attribute; typedef struct _Dwarf_Attribute *Dwarf_P_Attribute; typedef struct _Dwarf_AttrDef *Dwarf_AttrDef; -typedef struct _Dwarf_CU *Dwarf_CU; typedef struct _Dwarf_Cie *Dwarf_Cie; typedef struct _Dwarf_Cie *Dwarf_P_Cie; typedef struct _Dwarf_Debug *Dwarf_Debug; @@ -60,7 +59,6 @@ typedef struct _Dwarf_FrameSec *Dwarf_FrameSec; typedef struct _Dwarf_Line *Dwarf_Line; typedef struct _Dwarf_LineFile *Dwarf_LineFile; typedef struct _Dwarf_LineInfo *Dwarf_LineInfo; -typedef struct _Dwarf_Loclist *Dwarf_Loclist; typedef struct _Dwarf_MacroSet *Dwarf_MacroSet; typedef struct _Dwarf_NamePair *Dwarf_NamePair; typedef struct _Dwarf_NamePair *Dwarf_Func; @@ -519,6 +517,7 @@ int dwarf_attr(Dwarf_Die, Dwarf_Half, Dwarf_Attribute *, Dwarf_Error *); int dwarf_attrlist(Dwarf_Die, Dwarf_Attribute **, Dwarf_Signed *, Dwarf_Error *); +int dwarf_attroffset(Dwarf_Attribute, Dwarf_Off *, Dwarf_Error *); int dwarf_attrval_flag(Dwarf_Die, Dwarf_Half, Dwarf_Bool *, Dwarf_Error *); int dwarf_attrval_signed(Dwarf_Die, Dwarf_Half, Dwarf_Signed *, @@ -626,6 +625,9 @@ int dwarf_get_cu_die_offset(Dwarf_Arange, Dwarf_Off *, Dwarf_Error *); int dwarf_get_cu_die_offset_given_cu_header_offset(Dwarf_Debug, Dwarf_Off, Dwarf_Off *, Dwarf_Error *); +int dwarf_get_cu_die_offset_given_cu_header_offset_b(Dwarf_Debug, + Dwarf_Off, Dwarf_Bool, Dwarf_Off *, Dwarf_Error *); +Dwarf_Bool dwarf_get_die_infotypes_flag(Dwarf_Die); int dwarf_get_elf(Dwarf_Debug, Elf **, Dwarf_Error *); int dwarf_get_fde_at_pc(Dwarf_Fde *, Dwarf_Addr, Dwarf_Fde *, Dwarf_Addr *, Dwarf_Addr *, Dwarf_Error *); @@ -678,6 +680,16 @@ int dwarf_get_relocation_info_count(Dwarf_P_Debug, Dwarf_Unsigned *, int *, Dwarf_Error *); Dwarf_Ptr dwarf_get_section_bytes(Dwarf_P_Debug, Dwarf_Signed, Dwarf_Signed *, Dwarf_Unsigned *, Dwarf_Error *); +int dwarf_get_section_max_offsets(Dwarf_Debug, Dwarf_Unsigned *, + Dwarf_Unsigned *, Dwarf_Unsigned *, Dwarf_Unsigned *, + Dwarf_Unsigned *, Dwarf_Unsigned *, Dwarf_Unsigned *, + Dwarf_Unsigned *, Dwarf_Unsigned *, Dwarf_Unsigned *, + Dwarf_Unsigned *); +int dwarf_get_section_max_offsets_b(Dwarf_Debug, Dwarf_Unsigned *, + Dwarf_Unsigned *, Dwarf_Unsigned *, Dwarf_Unsigned *, + Dwarf_Unsigned *, Dwarf_Unsigned *, Dwarf_Unsigned *, + Dwarf_Unsigned *, Dwarf_Unsigned *, Dwarf_Unsigned *, + Dwarf_Unsigned *, Dwarf_Unsigned *); int dwarf_get_str(Dwarf_Debug, Dwarf_Off, char **, Dwarf_Signed *, Dwarf_Error *); int dwarf_get_types(Dwarf_Debug, Dwarf_Type **, Dwarf_Signed *, @@ -700,6 +712,8 @@ int dwarf_hasattr(Dwarf_Die, Dwarf_Half, Dwarf_Bool *, int dwarf_hasform(Dwarf_Attribute, Dwarf_Half, Dwarf_Bool *, Dwarf_Error *); int dwarf_highpc(Dwarf_Die, Dwarf_Addr *, Dwarf_Error *); +int dwarf_highpc_b(Dwarf_Die, Dwarf_Addr *, Dwarf_Half *, + enum Dwarf_Form_Class *, Dwarf_Error *); int dwarf_init(int, int, Dwarf_Handler, Dwarf_Ptr, Dwarf_Debug *, Dwarf_Error *); int dwarf_line_srcfileno(Dwarf_Line, Dwarf_Unsigned *, @@ -722,6 +736,10 @@ int dwarf_loclist_from_expr(Dwarf_Debug, Dwarf_Ptr, Dwarf_Unsigned, int dwarf_loclist_from_expr_a(Dwarf_Debug, Dwarf_Ptr, Dwarf_Unsigned, Dwarf_Half, Dwarf_Locdesc **, Dwarf_Signed *, Dwarf_Error *); +int dwarf_loclist_from_expr_b(Dwarf_Debug, Dwarf_Ptr, + Dwarf_Unsigned, Dwarf_Half, Dwarf_Half, + Dwarf_Small, Dwarf_Locdesc **, Dwarf_Signed *, + Dwarf_Error *); int dwarf_loclist_n(Dwarf_Attribute, Dwarf_Locdesc ***, Dwarf_Signed *, Dwarf_Error *); int dwarf_lowpc(Dwarf_Die, Dwarf_Addr *, Dwarf_Error *); @@ -735,11 +753,18 @@ int dwarf_next_cu_header(Dwarf_Debug, Dwarf_Unsigned *, int dwarf_next_cu_header_b(Dwarf_Debug, Dwarf_Unsigned *, Dwarf_Half *, Dwarf_Off *, Dwarf_Half *, Dwarf_Half *, Dwarf_Half *, Dwarf_Unsigned *, Dwarf_Error *); +int dwarf_next_cu_header_c(Dwarf_Debug, Dwarf_Bool, + Dwarf_Unsigned *, Dwarf_Half *, Dwarf_Off *, Dwarf_Half *, + Dwarf_Half *, Dwarf_Half *, Dwarf_Sig8 *, Dwarf_Unsigned *, + Dwarf_Unsigned *, Dwarf_Error *); +int dwarf_next_types_section(Dwarf_Debug, Dwarf_Error *); int dwarf_object_finish(Dwarf_Debug, Dwarf_Error *); int dwarf_object_init(Dwarf_Obj_Access_Interface *, Dwarf_Handler, Dwarf_Ptr, Dwarf_Debug *, Dwarf_Error *); int dwarf_offdie(Dwarf_Debug, Dwarf_Off, Dwarf_Die *, Dwarf_Error *); +int dwarf_offdie_b(Dwarf_Debug, Dwarf_Off, Dwarf_Bool, Dwarf_Die *, + Dwarf_Error *); Dwarf_Unsigned dwarf_producer_finish(Dwarf_P_Debug, Dwarf_Error *); Dwarf_P_Debug dwarf_producer_init(Dwarf_Unsigned, Dwarf_Callback_Func, Dwarf_Handler, Dwarf_Ptr, Dwarf_Error *); @@ -765,6 +790,8 @@ int dwarf_set_reloc_application(int); Dwarf_Ptr dwarf_seterrarg(Dwarf_Debug, Dwarf_Ptr); Dwarf_Handler dwarf_seterrhand(Dwarf_Debug, Dwarf_Handler); int dwarf_siblingof(Dwarf_Debug, Dwarf_Die, Dwarf_Die *, Dwarf_Error *); +int dwarf_siblingof_b(Dwarf_Debug, Dwarf_Die, Dwarf_Die *, Dwarf_Bool, + Dwarf_Error *); int dwarf_srcfiles(Dwarf_Die, char ***, Dwarf_Signed *, Dwarf_Error *); int dwarf_srclang(Dwarf_Die, Dwarf_Unsigned *, Dwarf_Error *); int dwarf_srclines(Dwarf_Die, Dwarf_Line **, Dwarf_Signed *, diff --git a/libdwarf/libdwarf_arange.c b/libdwarf/libdwarf_arange.c index 75434f6ae20b..eefb63ba6b10 100644 --- a/libdwarf/libdwarf_arange.c +++ b/libdwarf/libdwarf_arange.c @@ -26,7 +26,7 @@ #include "_libdwarf.h" -ELFTC_VCSID("$Id: libdwarf_arange.c 2070 2011-10-27 03:05:32Z jkoshy $"); +ELFTC_VCSID("$Id: libdwarf_arange.c 3029 2014-04-21 23:26:02Z kaiwang27 $"); void _dwarf_arange_cleanup(Dwarf_Debug dbg) @@ -67,7 +67,7 @@ _dwarf_arange_init(Dwarf_Debug dbg, Dwarf_Error *error) return (DW_DLE_NONE); if (!dbg->dbg_info_loaded) { - ret = _dwarf_info_load(dbg, 1, error); + ret = _dwarf_info_load(dbg, 1, 1, error); if (ret != DW_DLE_NONE) return (ret); } @@ -137,8 +137,8 @@ _dwarf_arange_init(Dwarf_Debug dbg, Dwarf_Error *error) /* Build arange array. */ if (dbg->dbg_arange_cnt > 0) { - if ((dbg->dbg_arange_array = malloc(dbg->dbg_arange_cnt * - sizeof(struct _Dwarf_Arange))) == NULL) { + if ((dbg->dbg_arange_array = malloc(dbg->dbg_arange_cnt * + sizeof(Dwarf_Arange))) == NULL) { DWARF_SET_ERROR(dbg, error, DW_DLE_MEMORY); ret = DW_DLE_MEMORY; goto fail_cleanup; diff --git a/libdwarf/libdwarf_attr.c b/libdwarf/libdwarf_attr.c index a7fb71cd1f24..dfbbc484c352 100644 --- a/libdwarf/libdwarf_attr.c +++ b/libdwarf/libdwarf_attr.c @@ -27,7 +27,7 @@ #include "_libdwarf.h" -ELFTC_VCSID("$Id: libdwarf_attr.c 2966 2013-09-21 14:40:14Z kaiwang27 $"); +ELFTC_VCSID("$Id: libdwarf_attr.c 3064 2014-06-06 19:35:55Z kaiwang27 $"); int _dwarf_attr_alloc(Dwarf_Die die, Dwarf_Attribute *atp, Dwarf_Error *error) @@ -106,6 +106,7 @@ _dwarf_attr_init(Dwarf_Debug dbg, Dwarf_Section *ds, uint64_t *offsetp, ret = DW_DLE_NONE; memset(&atref, 0, sizeof(atref)); atref.at_die = die; + atref.at_offset = *offsetp; atref.at_attrib = ad->ad_attrib; atref.at_form = indirect ? form : ad->ad_form; atref.at_indirect = indirect; @@ -162,7 +163,7 @@ _dwarf_attr_init(Dwarf_Debug dbg, Dwarf_Section *ds, uint64_t *offsetp, if (cu->cu_version == 2) atref.u[0].u64 = dbg->read(ds->ds_data, offsetp, cu->cu_pointer_size); - else if (cu->cu_version == 3) + else atref.u[0].u64 = dbg->read(ds->ds_data, offsetp, dwarf_size); break; diff --git a/libdwarf/libdwarf_die.c b/libdwarf/libdwarf_die.c index 4572875ed0d7..b7796d3cb6b0 100644 --- a/libdwarf/libdwarf_die.c +++ b/libdwarf/libdwarf_die.c @@ -27,7 +27,7 @@ #include "_libdwarf.h" -ELFTC_VCSID("$Id: libdwarf_die.c 2948 2013-05-30 21:25:52Z kaiwang27 $"); +ELFTC_VCSID("$Id: libdwarf_die.c 3039 2014-05-18 15:10:56Z kaiwang27 $"); int _dwarf_die_alloc(Dwarf_Debug dbg, Dwarf_Die *ret_die, Dwarf_Error *error) @@ -81,6 +81,7 @@ Dwarf_Die _dwarf_die_find(Dwarf_Die die, Dwarf_Unsigned off) { Dwarf_Debug dbg; + Dwarf_Section *ds; Dwarf_CU cu; Dwarf_Die die1; Dwarf_Error de; @@ -88,9 +89,10 @@ _dwarf_die_find(Dwarf_Die die, Dwarf_Unsigned off) cu = die->die_cu; dbg = die->die_dbg; + ds = cu->cu_is_info ? dbg->dbg_info_sec : dbg->dbg_types_sec; - ret = _dwarf_die_parse(dbg, dbg->dbg_info_sec, cu, cu->cu_dwarf_size, - off, cu->cu_next_offset, &die1, 0, &de); + ret = _dwarf_die_parse(dbg, ds, cu, cu->cu_dwarf_size, off, + cu->cu_next_offset, &die1, 0, &de); if (ret == DW_DLE_NONE) return (die1); diff --git a/libdwarf/libdwarf_frame.c b/libdwarf/libdwarf_frame.c index 375d64f5f66f..dd331379a4fd 100644 --- a/libdwarf/libdwarf_frame.c +++ b/libdwarf/libdwarf_frame.c @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2009-2011 Kai Wang + * Copyright (c) 2009-2011,2014 Kai Wang * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -26,7 +26,7 @@ #include "_libdwarf.h" -ELFTC_VCSID("$Id: libdwarf_frame.c 2529 2012-07-29 23:31:12Z kaiwang27 $"); +ELFTC_VCSID("$Id: libdwarf_frame.c 3106 2014-12-19 16:00:58Z kaiwang27 $"); static int _dwarf_frame_find_cie(Dwarf_FrameSec fs, Dwarf_Unsigned offset, @@ -49,8 +49,9 @@ _dwarf_frame_find_cie(Dwarf_FrameSec fs, Dwarf_Unsigned offset, } static int -_dwarf_frame_read_lsb_encoded(Dwarf_Debug dbg, uint64_t *val, uint8_t *data, - uint64_t *offsetp, uint8_t encode, Dwarf_Addr pc, Dwarf_Error *error) +_dwarf_frame_read_lsb_encoded(Dwarf_Debug dbg, Dwarf_Cie cie, uint64_t *val, + uint8_t *data, uint64_t *offsetp, uint8_t encode, Dwarf_Addr pc, + Dwarf_Error *error) { uint8_t application; @@ -62,7 +63,7 @@ _dwarf_frame_read_lsb_encoded(Dwarf_Debug dbg, uint64_t *val, uint8_t *data, switch (encode) { case DW_EH_PE_absptr: - *val = dbg->read(data, offsetp, dbg->dbg_pointer_size); + *val = dbg->read(data, offsetp, cie->cie_addrsize); break; case DW_EH_PE_uleb128: *val = _dwarf_read_uleb128(data, offsetp); @@ -149,7 +150,7 @@ _dwarf_frame_parse_lsb_cie_augment(Dwarf_Debug dbg, Dwarf_Cie cie, /* Skip two augments in augment data. */ encode = *augdata_p++; offset = 0; - ret = _dwarf_frame_read_lsb_encoded(dbg, &val, + ret = _dwarf_frame_read_lsb_encoded(dbg, cie, &val, augdata_p, &offset, encode, 0, error); if (ret != DW_DLE_NONE) return (ret); @@ -233,6 +234,18 @@ _dwarf_frame_add_cie(Dwarf_Debug dbg, Dwarf_FrameSec fs, Dwarf_Section *ds, cie->cie_ehdata = dbg->read(ds->ds_data, off, dbg->dbg_pointer_size); + /* DWARF4 added "address_size" and "segment_size". */ + if (cie->cie_version == 4) { + cie->cie_addrsize = dbg->read(ds->ds_data, off, 1); + cie->cie_segmentsize = dbg->read(ds->ds_data, off, 1); + } else { + /* + * Otherwise (DWARF[23]) we just set CIE addrsize to the + * debug context pointer size. + */ + cie->cie_addrsize = dbg->dbg_pointer_size; + } + cie->cie_caf = _dwarf_read_uleb128(ds->ds_data, off); cie->cie_daf = _dwarf_read_sleb128(ds->ds_data, off); @@ -345,8 +358,9 @@ _dwarf_frame_add_fde(Dwarf_Debug dbg, Dwarf_FrameSec fs, Dwarf_Section *ds, * The FDE PC start/range for .eh_frame is encoded according * to the LSB spec's extension to DWARF2. */ - ret = _dwarf_frame_read_lsb_encoded(dbg, &val, ds->ds_data, - off, cie->cie_fde_encode, ds->ds_addr + *off, error); + ret = _dwarf_frame_read_lsb_encoded(dbg, cie, &val, + ds->ds_data, off, cie->cie_fde_encode, ds->ds_addr + *off, + error); if (ret != DW_DLE_NONE) return (ret); fde->fde_initloc = val; @@ -354,16 +368,16 @@ _dwarf_frame_add_fde(Dwarf_Debug dbg, Dwarf_FrameSec fs, Dwarf_Section *ds, * FDE PC range should not be relative value to anything. * So pass 0 for pc value. */ - ret = _dwarf_frame_read_lsb_encoded(dbg, &val, ds->ds_data, - off, cie->cie_fde_encode, 0, error); + ret = _dwarf_frame_read_lsb_encoded(dbg, cie, &val, + ds->ds_data, off, cie->cie_fde_encode, 0, error); if (ret != DW_DLE_NONE) return (ret); fde->fde_adrange = val; } else { fde->fde_initloc = dbg->read(ds->ds_data, off, - dbg->dbg_pointer_size); + cie->cie_addrsize); fde->fde_adrange = dbg->read(ds->ds_data, off, - dbg->dbg_pointer_size); + cie->cie_addrsize); } /* Optional FDE augmentation data for .eh_frame section. (ignored) */ @@ -530,9 +544,9 @@ fail_cleanup: } static int -_dwarf_frame_run_inst(Dwarf_Debug dbg, Dwarf_Regtable3 *rt, uint8_t *insts, - Dwarf_Unsigned len, Dwarf_Unsigned caf, Dwarf_Signed daf, Dwarf_Addr pc, - Dwarf_Addr pc_req, Dwarf_Addr *row_pc, Dwarf_Error *error) +_dwarf_frame_run_inst(Dwarf_Debug dbg, Dwarf_Regtable3 *rt, uint8_t addr_size, + uint8_t *insts, Dwarf_Unsigned len, Dwarf_Unsigned caf, Dwarf_Signed daf, + Dwarf_Addr pc, Dwarf_Addr pc_req, Dwarf_Addr *row_pc, Dwarf_Error *error) { Dwarf_Regtable3 *init_rt, *saved_rt; uint8_t *p, *pe; @@ -632,7 +646,7 @@ _dwarf_frame_run_inst(Dwarf_Debug dbg, Dwarf_Regtable3 *rt, uint8_t *insts, switch (low6) { case DW_CFA_set_loc: - pc = dbg->decode(&p, dbg->dbg_pointer_size); + pc = dbg->decode(&p, addr_size); #ifdef FRAME_DEBUG printf("DW_CFA_set_loc(pc=%#jx)\n", pc); #endif @@ -898,14 +912,13 @@ program_done: } static int -_dwarf_frame_convert_inst(Dwarf_Debug dbg, uint8_t *insts, Dwarf_Unsigned len, - Dwarf_Unsigned *count, Dwarf_Frame_Op *fop, Dwarf_Frame_Op3 *fop3, - Dwarf_Error *error) +_dwarf_frame_convert_inst(Dwarf_Debug dbg, uint8_t addr_size, uint8_t *insts, + Dwarf_Unsigned len, Dwarf_Unsigned *count, Dwarf_Frame_Op *fop, + Dwarf_Frame_Op3 *fop3, Dwarf_Error *error) { uint8_t *p, *pe; uint8_t high2, low6; uint64_t reg, reg2, uoff, soff, blen; - int ret; #define SET_BASE_OP(x) \ do { \ @@ -970,7 +983,6 @@ _dwarf_frame_convert_inst(Dwarf_Debug dbg, uint8_t *insts, Dwarf_Unsigned len, } \ } while(0) - ret = DW_DLE_NONE; *count = 0; p = insts; @@ -1020,7 +1032,7 @@ _dwarf_frame_convert_inst(Dwarf_Debug dbg, uint8_t *insts, Dwarf_Unsigned len, switch (low6) { case DW_CFA_set_loc: - uoff = dbg->decode(&p, dbg->dbg_pointer_size); + uoff = dbg->decode(&p, addr_size); SET_OFFSET(uoff); break; case DW_CFA_advance_loc1: @@ -1103,15 +1115,16 @@ _dwarf_frame_convert_inst(Dwarf_Debug dbg, uint8_t *insts, Dwarf_Unsigned len, } int -_dwarf_frame_get_fop(Dwarf_Debug dbg, uint8_t *insts, Dwarf_Unsigned len, - Dwarf_Frame_Op **ret_oplist, Dwarf_Signed *ret_opcnt, Dwarf_Error *error) +_dwarf_frame_get_fop(Dwarf_Debug dbg, uint8_t addr_size, uint8_t *insts, + Dwarf_Unsigned len, Dwarf_Frame_Op **ret_oplist, Dwarf_Signed *ret_opcnt, + Dwarf_Error *error) { Dwarf_Frame_Op *oplist; Dwarf_Unsigned count; int ret; - ret = _dwarf_frame_convert_inst(dbg, insts, len, &count, NULL, NULL, - error); + ret = _dwarf_frame_convert_inst(dbg, addr_size, insts, len, &count, + NULL, NULL, error); if (ret != DW_DLE_NONE) return (ret); @@ -1120,8 +1133,8 @@ _dwarf_frame_get_fop(Dwarf_Debug dbg, uint8_t *insts, Dwarf_Unsigned len, return (DW_DLE_MEMORY); } - ret = _dwarf_frame_convert_inst(dbg, insts, len, &count, oplist, NULL, - error); + ret = _dwarf_frame_convert_inst(dbg, addr_size, insts, len, &count, + oplist, NULL, error); if (ret != DW_DLE_NONE) { free(oplist); return (ret); @@ -1201,17 +1214,17 @@ _dwarf_frame_get_internal_table(Dwarf_Fde fde, Dwarf_Addr pc_req, /* Run initial instructions in CIE. */ cie = fde->fde_cie; assert(cie != NULL); - ret = _dwarf_frame_run_inst(dbg, rt, cie->cie_initinst, - cie->cie_instlen, cie->cie_caf, cie->cie_daf, 0, ~0ULL, - &row_pc, error); + ret = _dwarf_frame_run_inst(dbg, rt, cie->cie_addrsize, + cie->cie_initinst, cie->cie_instlen, cie->cie_caf, cie->cie_daf, 0, + ~0ULL, &row_pc, error); if (ret != DW_DLE_NONE) return (ret); /* Run instructions in FDE. */ if (pc_req >= fde->fde_initloc) { - ret = _dwarf_frame_run_inst(dbg, rt, fde->fde_inst, - fde->fde_instlen, cie->cie_caf, cie->cie_daf, - fde->fde_initloc, pc_req, &row_pc, error); + ret = _dwarf_frame_run_inst(dbg, rt, cie->cie_addrsize, + fde->fde_inst, fde->fde_instlen, cie->cie_caf, + cie->cie_daf, fde->fde_initloc, pc_req, &row_pc, error); if (ret != DW_DLE_NONE) return (ret); } diff --git a/libdwarf/libdwarf_info.c b/libdwarf/libdwarf_info.c index dc82b7ddfde8..261bee6d933e 100644 --- a/libdwarf/libdwarf_info.c +++ b/libdwarf/libdwarf_info.c @@ -1,6 +1,6 @@ /*- * Copyright (c) 2007 John Birrell (jb@freebsd.org) - * Copyright (c) 2010,2011 Kai Wang + * Copyright (c) 2010,2011,2014 Kai Wang * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -27,7 +27,7 @@ #include "_libdwarf.h" -ELFTC_VCSID("$Id: libdwarf_info.c 2942 2013-05-04 23:03:54Z kaiwang27 $"); +ELFTC_VCSID("$Id: libdwarf_info.c 3041 2014-05-18 15:11:03Z kaiwang27 $"); int _dwarf_info_first_cu(Dwarf_Debug dbg, Dwarf_Error *error) @@ -46,7 +46,7 @@ _dwarf_info_first_cu(Dwarf_Debug dbg, Dwarf_Error *error) return (DW_DLE_NO_ENTRY); dbg->dbg_info_off = 0; - ret = _dwarf_info_load(dbg, 0, error); + ret = _dwarf_info_load(dbg, 0, 1, error); if (ret != DW_DLE_NONE) return (ret); @@ -55,6 +55,32 @@ _dwarf_info_first_cu(Dwarf_Debug dbg, Dwarf_Error *error) return (DW_DLE_NONE); } +int +_dwarf_info_first_tu(Dwarf_Debug dbg, Dwarf_Error *error) +{ + Dwarf_CU tu; + int ret; + + assert(dbg->dbg_tu_current == NULL); + tu = STAILQ_FIRST(&dbg->dbg_tu); + if (tu != NULL) { + dbg->dbg_tu_current = tu; + return (DW_DLE_NONE); + } + + if (dbg->dbg_types_loaded) + return (DW_DLE_NO_ENTRY); + + dbg->dbg_types_off = 0; + ret = _dwarf_info_load(dbg, 0, 0, error); + if (ret != DW_DLE_NONE) + return (ret); + + dbg->dbg_tu_current = STAILQ_FIRST(&dbg->dbg_tu); + + return (DW_DLE_NONE); +} + int _dwarf_info_next_cu(Dwarf_Debug dbg, Dwarf_Error *error) { @@ -73,7 +99,7 @@ _dwarf_info_next_cu(Dwarf_Debug dbg, Dwarf_Error *error) return (DW_DLE_NO_ENTRY); } - ret = _dwarf_info_load(dbg, 0, error); + ret = _dwarf_info_load(dbg, 0, 1, error); if (ret != DW_DLE_NONE) return (ret); @@ -83,7 +109,35 @@ _dwarf_info_next_cu(Dwarf_Debug dbg, Dwarf_Error *error) } int -_dwarf_info_load(Dwarf_Debug dbg, int load_all, Dwarf_Error *error) +_dwarf_info_next_tu(Dwarf_Debug dbg, Dwarf_Error *error) +{ + Dwarf_CU cu; + int ret; + + assert(dbg->dbg_tu_current != NULL); + cu = STAILQ_NEXT(dbg->dbg_tu_current, cu_next); + if (cu != NULL) { + dbg->dbg_tu_current = cu; + return (DW_DLE_NONE); + } + + if (dbg->dbg_types_loaded) { + dbg->dbg_tu_current = NULL; + return (DW_DLE_NO_ENTRY); + } + + ret = _dwarf_info_load(dbg, 0, 0, error); + if (ret != DW_DLE_NONE) + return (ret); + + dbg->dbg_tu_current = STAILQ_NEXT(dbg->dbg_tu_current, cu_next); + + return (DW_DLE_NONE); +} + +int +_dwarf_info_load(Dwarf_Debug dbg, Dwarf_Bool load_all, Dwarf_Bool is_info, + Dwarf_Error *error) { Dwarf_CU cu; Dwarf_Section *ds; @@ -93,12 +147,22 @@ _dwarf_info_load(Dwarf_Debug dbg, int load_all, Dwarf_Error *error) uint64_t offset; ret = DW_DLE_NONE; - if (dbg->dbg_info_loaded) - return (DW_DLE_NONE); - offset = dbg->dbg_info_off; - ds = dbg->dbg_info_sec; - assert(ds != NULL); + if (is_info) { + if (dbg->dbg_info_loaded) + return (ret); + offset = dbg->dbg_info_off; + ds = dbg->dbg_info_sec; + assert(ds != NULL); + } else { + if (dbg->dbg_types_loaded) + return (ret); + offset = dbg->dbg_types_off; + ds = dbg->dbg_types_sec; + if (ds == NULL) + return (DW_DLE_NO_ENTRY); + } + while (offset < ds->ds_size) { if ((cu = calloc(1, sizeof(struct _Dwarf_CU))) == NULL) { DWARF_SET_ERROR(dbg, error, DW_DLE_MEMORY); @@ -106,6 +170,7 @@ _dwarf_info_load(Dwarf_Debug dbg, int load_all, Dwarf_Error *error) } cu->cu_dbg = dbg; + cu->cu_is_info = is_info; cu->cu_offset = offset; length = dbg->read(ds->ds_data, &offset, 4); @@ -129,7 +194,10 @@ _dwarf_info_load(Dwarf_Debug dbg, int load_all, Dwarf_Error *error) /* Compute the offset to the next compilation unit: */ next_offset = offset + length; - dbg->dbg_info_off = next_offset; + if (is_info) + dbg->dbg_info_off = next_offset; + else + dbg->dbg_types_off = next_offset; /* Initialise the compilation unit. */ cu->cu_length = length; @@ -141,8 +209,20 @@ _dwarf_info_load(Dwarf_Debug dbg, int load_all, Dwarf_Error *error) cu->cu_pointer_size = dbg->read(ds->ds_data, &offset, 1); cu->cu_next_offset = next_offset; + /* .debug_types extra fields. */ + if (!is_info) { + memcpy(cu->cu_type_sig.signature, + (char *) ds->ds_data + offset, 8); + offset += 8; + cu->cu_type_offset = dbg->read(ds->ds_data, &offset, + dwarf_size); + } + /* Add the compilation unit to the list. */ - STAILQ_INSERT_TAIL(&dbg->dbg_cu, cu, cu_next); + if (is_info) + STAILQ_INSERT_TAIL(&dbg->dbg_cu, cu, cu_next); + else + STAILQ_INSERT_TAIL(&dbg->dbg_tu, cu, cu_next); if (cu->cu_version < 2 || cu->cu_version > 4) { DWARF_SET_ERROR(dbg, error, DW_DLE_VERSION_STAMP_ERROR); @@ -158,8 +238,13 @@ _dwarf_info_load(Dwarf_Debug dbg, int load_all, Dwarf_Error *error) break; } - if ((Dwarf_Unsigned) dbg->dbg_info_off >= ds->ds_size) - dbg->dbg_info_loaded = 1; + if (is_info) { + if ((Dwarf_Unsigned) dbg->dbg_info_off >= ds->ds_size) + dbg->dbg_info_loaded = 1; + } else { + if ((Dwarf_Unsigned) dbg->dbg_types_off >= ds->ds_size) + dbg->dbg_types_loaded = 1; + } return (ret); } @@ -180,6 +265,22 @@ _dwarf_info_cleanup(Dwarf_Debug dbg) } free(cu); } + + _dwarf_type_unit_cleanup(dbg); +} + +void +_dwarf_type_unit_cleanup(Dwarf_Debug dbg) +{ + Dwarf_CU cu, tcu; + + assert(dbg != NULL && dbg->dbg_mode == DW_DLC_READ); + + STAILQ_FOREACH_SAFE(cu, &dbg->dbg_tu, cu_next, tcu) { + STAILQ_REMOVE(&dbg->dbg_tu, cu, _Dwarf_CU, cu_next); + _dwarf_abbrev_cleanup(cu); + free(cu); + } } int diff --git a/libdwarf/libdwarf_init.c b/libdwarf/libdwarf_init.c index 71d596699d58..8e3fbbe5db36 100644 --- a/libdwarf/libdwarf_init.c +++ b/libdwarf/libdwarf_init.c @@ -26,7 +26,7 @@ #include "_libdwarf.h" -ELFTC_VCSID("$Id: libdwarf_init.c 2948 2013-05-30 21:25:52Z kaiwang27 $"); +ELFTC_VCSID("$Id: libdwarf_init.c 3061 2014-06-02 00:42:41Z kaiwang27 $"); static int _dwarf_consumer_init(Dwarf_Debug dbg, Dwarf_Error *error) @@ -69,7 +69,8 @@ _dwarf_consumer_init(Dwarf_Debug dbg, Dwarf_Error *error) dbg->dbg_seccnt = cnt; - if ((dbg->dbg_section = calloc(cnt, sizeof(Dwarf_Section))) == NULL) { + if ((dbg->dbg_section = calloc(cnt + 1, sizeof(Dwarf_Section))) == + NULL) { DWARF_SET_ERROR(dbg, error, DW_DLE_MEMORY); return (DW_DLE_MEMORY); } @@ -90,6 +91,7 @@ _dwarf_consumer_init(Dwarf_Debug dbg, Dwarf_Error *error) return (ret); } } + dbg->dbg_section[cnt].ds_name = NULL; if (_dwarf_find_section(dbg, ".debug_abbrev") == NULL || ((dbg->dbg_info_sec = _dwarf_find_section(dbg, ".debug_info")) == @@ -98,6 +100,9 @@ _dwarf_consumer_init(Dwarf_Debug dbg, Dwarf_Error *error) return (DW_DLE_DEBUG_INFO_NULL); } + /* Try to find the optional DWARF4 .debug_types section. */ + dbg->dbg_types_sec = _dwarf_find_next_types_section(dbg, NULL); + /* Initialise call frame API related parameters. */ _dwarf_frame_params_init(dbg); @@ -210,10 +215,10 @@ _dwarf_init(Dwarf_Debug dbg, Dwarf_Unsigned pro_flags, Dwarf_Handler errhand, dbg->dbg_errarg = errarg; STAILQ_INIT(&dbg->dbg_cu); + STAILQ_INIT(&dbg->dbg_tu); STAILQ_INIT(&dbg->dbg_rllist); STAILQ_INIT(&dbg->dbg_aslist); STAILQ_INIT(&dbg->dbg_mslist); - TAILQ_INIT(&dbg->dbg_loclist); if (dbg->dbg_mode == DW_DLC_READ || dbg->dbg_mode == DW_DLC_RDWR) { ret = _dwarf_consumer_init(dbg, error); @@ -270,7 +275,6 @@ _dwarf_consumer_deinit(Dwarf_Debug dbg) assert(dbg != NULL && dbg->dbg_mode == DW_DLC_READ); _dwarf_info_cleanup(dbg); - _dwarf_loclist_cleanup(dbg); _dwarf_ranges_cleanup(dbg); _dwarf_frame_cleanup(dbg); _dwarf_arange_cleanup(dbg); diff --git a/libdwarf/libdwarf_lineno.c b/libdwarf/libdwarf_lineno.c index 8bb3c85f3dee..63627f736f7f 100644 --- a/libdwarf/libdwarf_lineno.c +++ b/libdwarf/libdwarf_lineno.c @@ -26,7 +26,7 @@ #include "_libdwarf.h" -ELFTC_VCSID("$Id: libdwarf_lineno.c 2972 2013-12-23 06:46:04Z kaiwang27 $"); +ELFTC_VCSID("$Id: libdwarf_lineno.c 3100 2014-10-25 20:34:29Z jkoshy $"); static int _dwarf_lineno_add_file(Dwarf_LineInfo li, uint8_t **p, const char *compdir, @@ -87,9 +87,8 @@ _dwarf_lineno_run_program(Dwarf_CU cu, Dwarf_LineInfo li, uint8_t *p, { Dwarf_Debug dbg; Dwarf_Line ln, tln; - uint64_t address, file, line, column, isa, opsize; + uint64_t address, file, line, column, opsize; int is_stmt, basic_block, end_sequence; - int prologue_end, epilogue_begin; int ret; #define RESET_REGISTERS \ @@ -101,8 +100,6 @@ _dwarf_lineno_run_program(Dwarf_CU cu, Dwarf_LineInfo li, uint8_t *p, is_stmt = li->li_defstmt; \ basic_block = 0; \ end_sequence = 0; \ - prologue_end = 0; \ - epilogue_begin = 0; \ } while(0) #define APPEND_ROW \ @@ -181,8 +178,6 @@ _dwarf_lineno_run_program(Dwarf_CU cu, Dwarf_LineInfo li, uint8_t *p, case DW_LNS_copy: APPEND_ROW; basic_block = 0; - prologue_end = 0; - epilogue_begin = 0; break; case DW_LNS_advance_pc: address += _dwarf_decode_uleb128(&p) * @@ -210,13 +205,11 @@ _dwarf_lineno_run_program(Dwarf_CU cu, Dwarf_LineInfo li, uint8_t *p, address += dbg->decode(&p, 2); break; case DW_LNS_set_prologue_end: - prologue_end = 1; break; case DW_LNS_set_epilogue_begin: - epilogue_begin = 1; break; case DW_LNS_set_isa: - isa = _dwarf_decode_uleb128(&p); + (void) _dwarf_decode_uleb128(&p); break; default: /* Unrecognized extened opcodes. What to do? */ @@ -233,8 +226,6 @@ _dwarf_lineno_run_program(Dwarf_CU cu, Dwarf_LineInfo li, uint8_t *p, address += ADDRESS(*p); APPEND_ROW; basic_block = 0; - prologue_end = 0; - epilogue_begin = 0; p++; } } @@ -482,7 +473,7 @@ _dwarf_lineno_gen_program(Dwarf_P_Debug dbg, Dwarf_P_Section ds, Dwarf_Unsigned address, file, line, spc; Dwarf_Unsigned addr0, maddr; Dwarf_Signed line0, column; - int is_stmt, basic_block, end_sequence; + int is_stmt, basic_block; int need_copy; int ret; @@ -494,7 +485,6 @@ _dwarf_lineno_gen_program(Dwarf_P_Debug dbg, Dwarf_P_Section ds, column = 0; \ is_stmt = li->li_defstmt; \ basic_block = 0; \ - end_sequence = 0; \ } while(0) li = dbg->dbgp_lineinfo; diff --git a/libdwarf/libdwarf_loc.c b/libdwarf/libdwarf_loc.c index ea366fb0768e..c2d3f5cc6662 100644 --- a/libdwarf/libdwarf_loc.c +++ b/libdwarf/libdwarf_loc.c @@ -1,5 +1,6 @@ /*- * Copyright (c) 2007 John Birrell (jb@freebsd.org) + * Copyright (c) 2014 Kai Wang * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -26,7 +27,7 @@ #include "_libdwarf.h" -ELFTC_VCSID("$Id: libdwarf_loc.c 2070 2011-10-27 03:05:32Z jkoshy $"); +ELFTC_VCSID("$Id: libdwarf_loc.c 3070 2014-06-23 03:08:33Z kaiwang27 $"); /* * Given an array of bytes of length 'len' representing a @@ -38,12 +39,12 @@ ELFTC_VCSID("$Id: libdwarf_loc.c 2070 2011-10-27 03:05:32Z jkoshy $"); */ static int _dwarf_loc_fill_loc(Dwarf_Debug dbg, Dwarf_Locdesc *lbuf, uint8_t pointer_size, - uint8_t *p, int len) + uint8_t offset_size, uint8_t version, uint8_t *p, int len) { int count; uint64_t operand1; uint64_t operand2; - uint8_t *ps, *pe; + uint8_t *ps, *pe, s; count = 0; ps = p; @@ -165,37 +166,49 @@ _dwarf_loc_fill_loc(Dwarf_Debug dbg, Dwarf_Locdesc *lbuf, uint8_t pointer_size, case DW_OP_ne: case DW_OP_nop: + case DW_OP_push_object_address: case DW_OP_form_tls_address: case DW_OP_call_frame_cfa: case DW_OP_stack_value: case DW_OP_GNU_push_tls_address: + case DW_OP_GNU_uninit: break; /* Operations with 1-byte operands. */ case DW_OP_const1u: - case DW_OP_const1s: case DW_OP_pick: case DW_OP_deref_size: case DW_OP_xderef_size: operand1 = *p++; break; + case DW_OP_const1s: + operand1 = (int8_t) *p++; + break; + /* Operations with 2-byte operands. */ case DW_OP_call2: case DW_OP_const2u: - case DW_OP_const2s: case DW_OP_bra: case DW_OP_skip: operand1 = dbg->decode(&p, 2); break; + case DW_OP_const2s: + operand1 = (int16_t) dbg->decode(&p, 2); + break; + /* Operations with 4-byte operands. */ case DW_OP_call4: case DW_OP_const4u: - case DW_OP_const4s: + case DW_OP_GNU_parameter_ref: operand1 = dbg->decode(&p, 4); break; + case DW_OP_const4s: + operand1 = (int32_t) dbg->decode(&p, 4); + break; + /* Operations with 8-byte operands. */ case DW_OP_const8u: case DW_OP_const8s: @@ -207,6 +220,9 @@ _dwarf_loc_fill_loc(Dwarf_Debug dbg, Dwarf_Locdesc *lbuf, uint8_t pointer_size, case DW_OP_plus_uconst: case DW_OP_regx: case DW_OP_piece: + case DW_OP_GNU_deref_type: + case DW_OP_GNU_convert: + case DW_OP_GNU_reinterpret: operand1 = _dwarf_decode_uleb128(&p); break; @@ -252,6 +268,7 @@ _dwarf_loc_fill_loc(Dwarf_Debug dbg, Dwarf_Locdesc *lbuf, uint8_t pointer_size, * Oeration with two unsigned LEB128 operands. */ case DW_OP_bit_piece: + case DW_OP_GNU_regval_type: operand1 = _dwarf_decode_uleb128(&p); operand2 = _dwarf_decode_uleb128(&p); break; @@ -267,10 +284,14 @@ _dwarf_loc_fill_loc(Dwarf_Debug dbg, Dwarf_Locdesc *lbuf, uint8_t pointer_size, /* * Operation with an unsigned LEB128 operand - * followed by a block. Store a pointer to the - * block in the operand2. + * representing the size of a block, followed + * by the block content. + * + * Store the size of the block in the operand1 + * and a pointer to the block in the operand2. */ case DW_OP_implicit_value: + case DW_OP_GNU_entry_value: operand1 = _dwarf_decode_uleb128(&p); operand2 = (Dwarf_Unsigned) (uintptr_t) p; p += operand1; @@ -278,25 +299,59 @@ _dwarf_loc_fill_loc(Dwarf_Debug dbg, Dwarf_Locdesc *lbuf, uint8_t pointer_size, /* Target address size operand. */ case DW_OP_addr: + case DW_OP_GNU_addr_index: + case DW_OP_GNU_const_index: operand1 = dbg->decode(&p, pointer_size); break; - /* - * XXX Opcode DW_OP_call_ref has an operand with size - * "dwarf_size". Here we use dbg->dbg_offset_size - * as "dwarf_size" to be compatible with SGI libdwarf. - * However note that dbg->dbg_offset_size is just - * a "guess" value so the parsing result of - * DW_OP_call_ref might not be correct at all. XXX - */ + /* Offset size operand. */ case DW_OP_call_ref: - operand1 = dbg->decode(&p, dbg->dbg_offset_size); + operand1 = dbg->decode(&p, offset_size); + break; + + /* + * The first byte is address byte length, followed by + * the address value. If the length is 0, the address + * size is the same as target pointer size. + */ + case DW_OP_GNU_encoded_addr: + s = *p++; + if (s == 0) + s = pointer_size; + operand1 = dbg->decode(&p, s); + break; + + /* + * Operand1: DIE offset (size depending on DWARF version) + * DWARF2: pointer size + * DWARF{3,4}: offset size + * + * Operand2: SLEB128 + */ + case DW_OP_GNU_implicit_pointer: + if (version == 2) + operand1 = dbg->decode(&p, pointer_size); + else + operand1 = dbg->decode(&p, offset_size); + operand2 = _dwarf_decode_sleb128(&p); + break; + + /* + * Operand1: DIE offset (ULEB128) + * Operand2: pointer to a block. The block's first byte + * is its size. + */ + case DW_OP_GNU_const_type: + operand1 = _dwarf_decode_uleb128(&p); + operand2 = (Dwarf_Unsigned) (uintptr_t) p; + s = *p++; + p += s; break; /* All other operations cause an error. */ default: count = -1; - break; + goto done; } if (lbuf != NULL) { @@ -307,6 +362,7 @@ _dwarf_loc_fill_loc(Dwarf_Debug dbg, Dwarf_Locdesc *lbuf, uint8_t pointer_size, count++; } +done: return (count); } @@ -561,7 +617,8 @@ _dwarf_loc_expr_add_atom(Dwarf_Debug dbg, uint8_t *out, uint8_t *end, int _dwarf_loc_fill_locdesc(Dwarf_Debug dbg, Dwarf_Locdesc *llbuf, uint8_t *in, - uint64_t in_len, uint8_t pointer_size, Dwarf_Error *error) + uint64_t in_len, uint8_t pointer_size, uint8_t offset_size, + uint8_t version, Dwarf_Error *error) { int num; @@ -570,8 +627,8 @@ _dwarf_loc_fill_locdesc(Dwarf_Debug dbg, Dwarf_Locdesc *llbuf, uint8_t *in, assert(in_len > 0); /* Compute the number of locations. */ - if ((num = _dwarf_loc_fill_loc(dbg, NULL, pointer_size, in, in_len)) < - 0) { + if ((num = _dwarf_loc_fill_loc(dbg, NULL, pointer_size, offset_size, + version, in, in_len)) < 0) { DWARF_SET_ERROR(dbg, error, DW_DLE_LOC_EXPR_BAD); return (DW_DLE_LOC_EXPR_BAD); } @@ -585,14 +642,16 @@ _dwarf_loc_fill_locdesc(Dwarf_Debug dbg, Dwarf_Locdesc *llbuf, uint8_t *in, return (DW_DLE_MEMORY); } - (void) _dwarf_loc_fill_loc(dbg, llbuf, pointer_size, in, in_len); + (void) _dwarf_loc_fill_loc(dbg, llbuf, pointer_size, offset_size, + version, in, in_len); return (DW_DLE_NONE); } int _dwarf_loc_fill_locexpr(Dwarf_Debug dbg, Dwarf_Locdesc **ret_llbuf, uint8_t *in, - uint64_t in_len, uint8_t pointer_size, Dwarf_Error *error) + uint64_t in_len, uint8_t pointer_size, uint8_t offset_size, + uint8_t version, Dwarf_Error *error) { Dwarf_Locdesc *llbuf; int ret; @@ -606,7 +665,7 @@ _dwarf_loc_fill_locexpr(Dwarf_Debug dbg, Dwarf_Locdesc **ret_llbuf, uint8_t *in, llbuf->ld_s = NULL; ret = _dwarf_loc_fill_locdesc(dbg, llbuf, in, in_len, pointer_size, - error); + offset_size, version, error); if (ret != DW_DLE_NONE) { free(llbuf); return (ret); @@ -635,7 +694,8 @@ _dwarf_loc_add(Dwarf_Die die, Dwarf_Attribute at, Dwarf_Error *error) assert(dbg != NULL); ret = _dwarf_loc_fill_locexpr(dbg, &at->at_ld, at->u[1].u8p, - at->u[0].u64, cu->cu_pointer_size, error); + at->u[0].u64, cu->cu_pointer_size, cu->cu_length_size == 4 ? 4 : 8, + cu->cu_version, error); return (ret); } diff --git a/libdwarf/libdwarf_loclist.c b/libdwarf/libdwarf_loclist.c index 8b599868d00d..bb3e39f6c899 100644 --- a/libdwarf/libdwarf_loclist.c +++ b/libdwarf/libdwarf_loclist.c @@ -26,11 +26,11 @@ #include "_libdwarf.h" -ELFTC_VCSID("$Id: libdwarf_loclist.c 2972 2013-12-23 06:46:04Z kaiwang27 $"); +ELFTC_VCSID("$Id: libdwarf_loclist.c 3061 2014-06-02 00:42:41Z kaiwang27 $"); static int _dwarf_loclist_add_locdesc(Dwarf_Debug dbg, Dwarf_CU cu, Dwarf_Section *ds, - uint64_t *off, Dwarf_Locdesc **ld, uint64_t *ldlen, + Dwarf_Unsigned *off, Dwarf_Locdesc **ld, Dwarf_Signed *ldlen, Dwarf_Unsigned *total_len, Dwarf_Error *error) { uint64_t start, end; @@ -75,6 +75,7 @@ _dwarf_loclist_add_locdesc(Dwarf_Debug dbg, Dwarf_CU cu, Dwarf_Section *ds, if (ld != NULL) { ret = _dwarf_loc_fill_locdesc(dbg, ld[i], ds->ds_data + *off, len, cu->cu_pointer_size, + cu->cu_length_size == 4 ? 4 : 8, cu->cu_version, error); if (ret != DW_DLE_NONE) return (ret); @@ -91,134 +92,74 @@ _dwarf_loclist_add_locdesc(Dwarf_Debug dbg, Dwarf_CU cu, Dwarf_Section *ds, int _dwarf_loclist_find(Dwarf_Debug dbg, Dwarf_CU cu, uint64_t lloff, - Dwarf_Loclist *ret_ll, Dwarf_Error *error) -{ - Dwarf_Loclist ll; - int ret; - - assert(ret_ll != NULL); - ret = DW_DLE_NONE; - - TAILQ_FOREACH(ll, &dbg->dbg_loclist, ll_next) - if (ll->ll_offset == lloff) - break; - - if (ll == NULL) - ret = _dwarf_loclist_add(dbg, cu, lloff, ret_ll, error); - else - *ret_ll = ll; - - return (ret); -} - -int -_dwarf_loclist_add(Dwarf_Debug dbg, Dwarf_CU cu, uint64_t lloff, - Dwarf_Loclist *ret_ll, Dwarf_Error *error) + Dwarf_Locdesc ***ret_llbuf, Dwarf_Signed *listlen, + Dwarf_Unsigned *entry_len, Dwarf_Error *error) { + Dwarf_Locdesc **llbuf; Dwarf_Section *ds; - Dwarf_Loclist ll, tll; - uint64_t ldlen; + Dwarf_Signed ldlen; + Dwarf_Unsigned off; int i, ret; - ret = DW_DLE_NONE; - if ((ds = _dwarf_find_section(dbg, ".debug_loc")) == NULL) { DWARF_SET_ERROR(dbg, error, DW_DLE_NO_ENTRY); return (DW_DLE_NO_ENTRY); } - if ((ll = malloc(sizeof(struct _Dwarf_Loclist))) == NULL) { - DWARF_SET_ERROR(dbg, error, DW_DLE_MEMORY); - return (DW_DLE_MEMORY); + if (lloff >= ds->ds_size) { + DWARF_SET_ERROR(dbg, error, DW_DLE_NO_ENTRY); + return (DW_DLE_NO_ENTRY); } - ll->ll_offset = lloff; - /* Get the number of locdesc the first round. */ - ret = _dwarf_loclist_add_locdesc(dbg, cu, ds, &lloff, NULL, &ldlen, + off = lloff; + ret = _dwarf_loclist_add_locdesc(dbg, cu, ds, &off, NULL, &ldlen, NULL, error); if (ret != DW_DLE_NONE) - goto fail_cleanup; + return (ret); + + if (ldlen == 0) + return (DW_DLE_NO_ENTRY); /* * Dwarf_Locdesc list memory is allocated in this way (one more level * of indirect) to make the loclist API be compatible with SGI libdwarf. */ - ll->ll_ldlen = ldlen; - if (ldlen != 0) { - if ((ll->ll_ldlist = calloc(ldlen, sizeof(Dwarf_Locdesc *))) == - NULL) { + if ((llbuf = calloc(ldlen, sizeof(Dwarf_Locdesc *))) == NULL) { + DWARF_SET_ERROR(dbg, error, DW_DLE_MEMORY); + return (DW_DLE_MEMORY); + } + for (i = 0; i < ldlen; i++) { + if ((llbuf[i] = calloc(1, sizeof(Dwarf_Locdesc))) == NULL) { DWARF_SET_ERROR(dbg, error, DW_DLE_MEMORY); ret = DW_DLE_MEMORY; goto fail_cleanup; } - for (i = 0; (uint64_t) i < ldlen; i++) { - if ((ll->ll_ldlist[i] = - calloc(1, sizeof(Dwarf_Locdesc))) == NULL) { - DWARF_SET_ERROR(dbg, error, DW_DLE_MEMORY); - ret = DW_DLE_MEMORY; - goto fail_cleanup; - } - } - } else - ll->ll_ldlist = NULL; + } - lloff = ll->ll_offset; + off = lloff; /* Fill in locdesc. */ - ret = _dwarf_loclist_add_locdesc(dbg, cu, ds, &lloff, ll->ll_ldlist, - NULL, &ll->ll_length, error); + ret = _dwarf_loclist_add_locdesc(dbg, cu, ds, &off, llbuf, NULL, + entry_len, error); if (ret != DW_DLE_NONE) goto fail_cleanup; - /* Insert to the queue. Sort by offset. */ - TAILQ_FOREACH(tll, &dbg->dbg_loclist, ll_next) - if (tll->ll_offset > ll->ll_offset) { - TAILQ_INSERT_BEFORE(tll, ll, ll_next); - break; - } + *ret_llbuf = llbuf; + *listlen = ldlen; - if (tll == NULL) - TAILQ_INSERT_TAIL(&dbg->dbg_loclist, ll, ll_next); - - *ret_ll = ll; return (DW_DLE_NONE); fail_cleanup: - _dwarf_loclist_free(ll); + if (llbuf != NULL) { + for (i = 0; i < ldlen; i++) { + if (llbuf[i]->ld_s) + free(llbuf[i]->ld_s); + free(llbuf[i]); + } + free(llbuf); + } return (ret); } - -void -_dwarf_loclist_free(Dwarf_Loclist ll) -{ - int i; - - if (ll == NULL) - return; - - if (ll->ll_ldlist != NULL) { - for (i = 0; i < ll->ll_ldlen; i++) { - if (ll->ll_ldlist[i]->ld_s) - free(ll->ll_ldlist[i]->ld_s); - free(ll->ll_ldlist[i]); - } - free(ll->ll_ldlist); - } - free(ll); -} - -void -_dwarf_loclist_cleanup(Dwarf_Debug dbg) -{ - Dwarf_Loclist ll, tll; - - assert(dbg != NULL && dbg->dbg_mode == DW_DLC_READ); - - TAILQ_FOREACH_SAFE(ll, &dbg->dbg_loclist, ll_next, tll) { - TAILQ_REMOVE(&dbg->dbg_loclist, ll, ll_next); - _dwarf_loclist_free(ll); - } -} diff --git a/libdwarf/libdwarf_nametbl.c b/libdwarf/libdwarf_nametbl.c index 158aca34ad43..661b56f1c9c8 100644 --- a/libdwarf/libdwarf_nametbl.c +++ b/libdwarf/libdwarf_nametbl.c @@ -26,7 +26,7 @@ #include "_libdwarf.h" -ELFTC_VCSID("$Id: libdwarf_nametbl.c 2070 2011-10-27 03:05:32Z jkoshy $"); +ELFTC_VCSID("$Id: libdwarf_nametbl.c 3029 2014-04-21 23:26:02Z kaiwang27 $"); void _dwarf_nametbl_cleanup(Dwarf_NameSec *nsp) @@ -103,7 +103,7 @@ _dwarf_nametbl_init(Dwarf_Debug dbg, Dwarf_NameSec *namesec, Dwarf_Section *ds, nt->nt_cu_length = dbg->read(ds->ds_data, &offset, dwarf_size); if (!dbg->dbg_info_loaded) { - ret = _dwarf_info_load(dbg, 1, error); + ret = _dwarf_info_load(dbg, 1, 1, error); if (ret != DW_DLE_NONE) goto fail_cleanup; } diff --git a/libdwarf/libdwarf_sections.c b/libdwarf/libdwarf_sections.c index 3ac30b251e02..24d5db839e49 100644 --- a/libdwarf/libdwarf_sections.c +++ b/libdwarf/libdwarf_sections.c @@ -26,7 +26,7 @@ #include "_libdwarf.h" -ELFTC_VCSID("$Id: libdwarf_sections.c 2379 2012-01-05 02:08:20Z jkoshy $"); +ELFTC_VCSID("$Id: libdwarf_sections.c 3041 2014-05-18 15:11:03Z kaiwang27 $"); #define _SECTION_INIT_SIZE 128 @@ -212,7 +212,7 @@ _dwarf_find_section(Dwarf_Debug dbg, const char *name) Dwarf_Section *ds; Dwarf_Half i; - assert(name != NULL); + assert(dbg != NULL && name != NULL); for (i = 0; i < dbg->dbg_seccnt; i++) { ds = &dbg->dbg_section[i]; @@ -223,6 +223,27 @@ _dwarf_find_section(Dwarf_Debug dbg, const char *name) return (NULL); } +Dwarf_Section * +_dwarf_find_next_types_section(Dwarf_Debug dbg, Dwarf_Section *ds) +{ + + assert(dbg != NULL); + + if (ds == NULL) + return (_dwarf_find_section(dbg, ".debug_types")); + + assert(ds->ds_name != NULL); + + do { + ds++; + if (ds->ds_name != NULL && + !strcmp(ds->ds_name, ".debug_types")) + return (ds); + } while (ds->ds_name != NULL); + + return (NULL); +} + Dwarf_P_Section _dwarf_pro_find_section(Dwarf_P_Debug dbg, const char *name) { diff --git a/libelf/_libelf.h b/libelf/_libelf.h index fba2f97fd670..d5803a4e44ff 100644 --- a/libelf/_libelf.h +++ b/libelf/_libelf.h @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: _libelf.h 2365 2011-12-29 04:36:44Z jkoshy $ + * $Id: _libelf.h 3011 2014-03-23 03:32:42Z jkoshy $ */ #ifndef __LIBELF_H_ @@ -48,7 +48,7 @@ struct _libelf_globals { int libelf_error; int libelf_fillchar; unsigned int libelf_version; - char libelf_msg[LIBELF_MSG_SIZE]; + unsigned char libelf_msg[LIBELF_MSG_SIZE]; }; extern struct _libelf_globals _libelf; @@ -71,14 +71,14 @@ extern struct _libelf_globals _libelf; * Flags for library internal use. These use the upper 16 bits of the * `e_flags' field. */ -#define LIBELF_F_API_MASK 0x00FFFF /* Flags defined by the API. */ -#define LIBELF_F_AR_HEADER 0x010000 /* translated header available */ -#define LIBELF_F_AR_VARIANT_SVR4 0x020000 /* BSD style ar(1) archive */ -#define LIBELF_F_DATA_MALLOCED 0x040000 /* whether data was malloc'ed */ -#define LIBELF_F_RAWFILE_MALLOC 0x080000 /* whether e_rawfile was malloc'ed */ -#define LIBELF_F_RAWFILE_MMAP 0x100000 /* whether e_rawfile was mmap'ed */ -#define LIBELF_F_SHDRS_LOADED 0x200000 /* whether all shdrs were read in */ -#define LIBELF_F_SPECIAL_FILE 0x400000 /* non-regular file */ +#define LIBELF_F_API_MASK 0x00FFFFU /* Flags defined by the API. */ +#define LIBELF_F_AR_HEADER 0x010000U /* translated header available */ +#define LIBELF_F_AR_VARIANT_SVR4 0x020000U /* BSD style ar(1) archive */ +#define LIBELF_F_DATA_MALLOCED 0x040000U /* whether data was malloc'ed */ +#define LIBELF_F_RAWFILE_MALLOC 0x080000U /* whether e_rawfile was malloc'ed */ +#define LIBELF_F_RAWFILE_MMAP 0x100000U /* whether e_rawfile was mmap'ed */ +#define LIBELF_F_SHDRS_LOADED 0x200000U /* whether all shdrs were read in */ +#define LIBELF_F_SPECIAL_FILE 0x400000U /* non-regular file */ struct _Elf { int e_activations; /* activation count */ @@ -89,7 +89,7 @@ struct _Elf { unsigned int e_flags; /* ELF_F_* & LIBELF_F_* flags */ Elf_Kind e_kind; /* ELF_K_* */ Elf *e_parent; /* non-NULL for archive members */ - char *e_rawfile; /* uninterpreted bytes */ + unsigned char *e_rawfile; /* uninterpreted bytes */ size_t e_rawsize; /* size of uninterpreted bytes */ unsigned int e_version; /* file version */ @@ -99,16 +99,16 @@ struct _Elf { */ union { Elf_Arhdr *e_arhdr; /* translated header */ - char *e_rawhdr; /* untranslated header */ + unsigned char *e_rawhdr; /* untranslated header */ } e_hdr; union { struct { /* ar(1) archives */ off_t e_next; /* set by elf_rand()/elf_next() */ int e_nchildren; - char *e_rawstrtab; /* file name strings */ + unsigned char *e_rawstrtab; /* file name strings */ size_t e_rawstrtabsz; - char *e_rawsymtab; /* symbol table */ + unsigned char *e_rawsymtab; /* symbol table */ size_t e_rawsymtabsz; Elf_Arsym *e_symtab; size_t e_symtabsz; @@ -162,21 +162,31 @@ enum { ELF_TOMEMORY }; -#define LIBELF_COPY_U32(DST,SRC,NAME) do { \ - if ((SRC)->NAME > UINT_MAX) { \ - LIBELF_SET_ERROR(RANGE, 0); \ - return (0); \ - } \ - (DST)->NAME = (SRC)->NAME; \ + +/* + * The LIBELF_COPY macros are used to copy fields from a GElf_* + * structure to their 32-bit counterparts, while checking for out of + * range values. + * + * - LIBELF_COPY_U32 :: copy an unsigned 32 bit field. + * - LIBELF_COPY_S32 :: copy a signed 32 bit field. + */ + +#define LIBELF_COPY_U32(DST, SRC, NAME) do { \ + if ((SRC)->NAME > UINT32_MAX) { \ + LIBELF_SET_ERROR(RANGE, 0); \ + return (0); \ + } \ + (DST)->NAME = (SRC)->NAME & 0xFFFFFFFFU; \ } while (0) -#define LIBELF_COPY_S32(DST,SRC,NAME) do { \ - if ((SRC)->NAME > INT_MAX || \ - (SRC)->NAME < INT_MIN) { \ - LIBELF_SET_ERROR(RANGE, 0); \ - return (0); \ - } \ - (DST)->NAME = (SRC)->NAME; \ +#define LIBELF_COPY_S32(DST, SRC, NAME) do { \ + if ((SRC)->NAME > INT32_MAX || \ + (SRC)->NAME < INT32_MIN) { \ + LIBELF_SET_ERROR(RANGE, 0); \ + return (0); \ + } \ + (DST)->NAME = (int32_t) (SRC)->NAME; \ } while (0) @@ -191,22 +201,22 @@ Elf_Scn *_libelf_allocate_scn(Elf *_e, size_t _ndx); Elf_Arhdr *_libelf_ar_gethdr(Elf *_e); Elf *_libelf_ar_open(Elf *_e, int _reporterror); Elf *_libelf_ar_open_member(int _fd, Elf_Cmd _c, Elf *_ar); -int _libelf_ar_get_member(char *_s, size_t _sz, int _base, size_t *_ret); Elf_Arsym *_libelf_ar_process_bsd_symtab(Elf *_ar, size_t *_dst); Elf_Arsym *_libelf_ar_process_svr4_symtab(Elf *_ar, size_t *_dst); -unsigned long _libelf_checksum(Elf *_e, int _elfclass); +long _libelf_checksum(Elf *_e, int _elfclass); void *_libelf_ehdr(Elf *_e, int _elfclass, int _allocate); -int _libelf_falign(Elf_Type _t, int _elfclass); +unsigned int _libelf_falign(Elf_Type _t, int _elfclass); size_t _libelf_fsize(Elf_Type _t, int _elfclass, unsigned int _version, size_t count); int (*_libelf_get_translator(Elf_Type _t, int _direction, int _elfclass)) - (char *_dst, size_t dsz, char *_src, size_t _cnt, int _byteswap); + (unsigned char *_dst, size_t dsz, unsigned char *_src, + size_t _cnt, int _byteswap); void *_libelf_getphdr(Elf *_e, int _elfclass); void *_libelf_getshdr(Elf_Scn *_scn, int _elfclass); void _libelf_init_elf(Elf *_e, Elf_Kind _kind); int _libelf_load_section_headers(Elf *e, void *ehdr); -int _libelf_malign(Elf_Type _t, int _elfclass); -Elf *_libelf_memory(char *_image, size_t _sz, int _reporterror); +unsigned int _libelf_malign(Elf_Type _t, int _elfclass); +Elf *_libelf_memory(unsigned char *_image, size_t _sz, int _reporterror); size_t _libelf_msize(Elf_Type _t, int _elfclass, unsigned int _version); void *_libelf_newphdr(Elf *_e, int _elfclass, size_t _count); Elf *_libelf_open_object(int _fd, Elf_Cmd _c, int _reporterror); diff --git a/libelf/_libelf_ar.h b/libelf/_libelf_ar.h index d6b15a7501ef..45a7e16be863 100644 --- a/libelf/_libelf_ar.h +++ b/libelf/_libelf_ar.h @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: _libelf_ar.h 2032 2011-10-23 09:07:00Z jkoshy $ + * $Id: _libelf_ar.h 3013 2014-03-23 06:16:59Z jkoshy $ */ #ifndef __LIBELF_AR_H_ @@ -42,15 +42,16 @@ (sizeof(LIBELF_AR_BSD_EXTENDED_NAME_PREFIX) - 1) #define IS_EXTENDED_BSD_NAME(NAME) \ - (strncmp((NAME), LIBELF_AR_BSD_EXTENDED_NAME_PREFIX, \ + (strncmp((const char *) (NAME), \ + LIBELF_AR_BSD_EXTENDED_NAME_PREFIX, \ LIBELF_AR_BSD_EXTENDED_NAME_PREFIX_SIZE) == 0) -char *_libelf_ar_get_string(const char *_buf, size_t _sz, int _rawname, - int _svr4names); +unsigned char *_libelf_ar_get_string(const char *_buf, size_t _sz, + unsigned int _rawname, int _svr4names); char *_libelf_ar_get_raw_name(const struct ar_hdr *_arh); char *_libelf_ar_get_translated_name(const struct ar_hdr *_arh, Elf *_ar); -int _libelf_ar_get_number(const char *_buf, size_t _sz, int _base, - size_t *_ret); +int _libelf_ar_get_number(const char *_buf, size_t _sz, + unsigned int _base, size_t *_ret); #endif /* __LIBELF_AR_H_ */ diff --git a/libelf/elf.3 b/libelf/elf.3 index 462e72854177..97677eb205d6 100644 --- a/libelf/elf.3 +++ b/libelf/elf.3 @@ -21,9 +21,9 @@ .\" out of the use of this software, even if advised of the possibility of .\" such damage. .\" -.\" $Id: elf.3 2885 2013-01-11 02:11:28Z jkoshy $ +.\" $Id: elf.3 3082 2014-07-28 09:13:33Z jkoshy $ .\" -.Dd August 14, 2011 +.Dd July 28, 2014 .Os .Dt ELF 3 .Sh NAME @@ -367,6 +367,11 @@ section entries. .Xc .It Dv SHT_DYNSYM Ta Dv ELF_T_SYM Ta Symbols for dynamic linking. .It Dv SHT_FINI_ARRAY Ta Dv ELF_T_ADDR Ta Termination function pointers. +.It Dv SHT_GNU_HASH Ta Dv ELF_T_GNUHASH Ta GNU hash sections. +.It Dv SHT_GNU_LIBLIST Ta Dv ELF_T_WORD Ta List of libraries to be pre-linked. +.It Dv SHT_GNU_verdef Ta Dv ELF_T_VDEF Ta Symbol version definitions. +.It Dv SHT_GNU_verneed Ta Dv ELF_T_VNEED Ta Symbol versioning requirements. +.It Dv SHT_GNU_versym Ta Dv ELF_T_HALF Ta Version symbols. .It Dv SHT_GROUP Ta Dv ELF_T_WORD Ta Section group marker. .It Dv SHT_HASH Ta Dv ELF_T_HASH Ta Symbol hashes. .It Dv SHT_INIT_ARRAY Ta Dv ELF_T_ADDR Ta Initialization function pointers. @@ -383,12 +388,31 @@ See .It Dv SHT_STRTAB Ta Dv ELF_T_BYTE Ta String tables. .It Dv SHT_SYMTAB Ta Dv ELF_T_SYM Ta Symbol tables. .It Dv SHT_SYMTAB_SHNDX Ta Dv ELF_T_WORD Ta Used with extended section numbering. -.It Dv SHT_GNU_verdef Ta Dv ELF_T_VDEF Ta Symbol version definitions. -.It Dv SHT_GNU_verneed Ta Dv ELF_T_VNEED Ta Symbol versioning requirements. -.It Dv SHT_GNU_versym Ta Dv ELF_T_HALF Ta Version symbols. +.It Dv SHT_SUNW_dof Ta Dv ELF_T_BYTE Ta Xo +Used by +.Xr dtrace 1 . +.Xc .It Dv SHT_SUNW_move Ta Dv ELF_T_MOVE Ta ELF move records. .It Dv SHT_SUNW_syminfo Ta Dv ELF_T_SYMINFO Ta Additional symbol flags. +.It Dv SHT_SUNW_verdef Ta Dv ELF_T_VDEF Ta Xo +Same as +.Dv SHT_GNU_verdef . +.Xc +.It Dv SHT_SUNW_verneed Ta Dv ELF_T_VNEED Ta Xo +Same as +.Dv SHT_GNU_verneed . +.Xc +.It Dv SHT_SUNW_versym Ta Dv ELF_T_HALF Ta Xo +Same as +.Dv SHT_GNU_versym . +.Xc .El +.Pp +Section types in the range +.Ns [ Dv SHT_LOOS , +.Dv SHT_HIUSER ] +are otherwise considered to be of type +.Dv ELF_T_BYTE . .TE .Ss Functional Grouping This section contains a brief overview of the available functionality diff --git a/libelf/elf_data.c b/libelf/elf_data.c index 06a3577dc5dd..9960b77bea27 100644 --- a/libelf/elf_data.c +++ b/libelf/elf_data.c @@ -31,7 +31,7 @@ #include "_libelf.h" -ELFTC_VCSID("$Id: elf_data.c 2921 2013-03-04 16:19:22Z jkoshy $"); +ELFTC_VCSID("$Id: elf_data.c 3009 2014-03-23 01:49:59Z jkoshy $"); Elf_Data * elf_getdata(Elf_Scn *s, Elf_Data *ed) @@ -39,10 +39,11 @@ elf_getdata(Elf_Scn *s, Elf_Data *ed) Elf *e; unsigned int sh_type; int elfclass, elftype; - size_t fsz, msz, count; + size_t count, fsz, msz; struct _Libelf_Data *d; uint64_t sh_align, sh_offset, sh_size; - int (*xlate)(char *_d, size_t _dsz, char *_s, size_t _c, int _swap); + int (*xlate)(unsigned char *_d, size_t _dsz, unsigned char *_s, + size_t _c, int _swap); d = (struct _Libelf_Data *) ed; @@ -108,11 +109,23 @@ elf_getdata(Elf_Scn *s, Elf_Data *ed) return (NULL); } - count = sh_size / fsz; + if (sh_size / fsz > SIZE_MAX) { + LIBELF_SET_ERROR(RANGE, 0); + return (NULL); + } + + count = (size_t) (sh_size / fsz); msz = _libelf_msize(elftype, elfclass, e->e_version); + if (count > 0 && msz > SIZE_MAX / count) { + LIBELF_SET_ERROR(RANGE, 0); + return (NULL); + } + assert(msz > 0); + assert(count <= SIZE_MAX); + assert(msz * count <= SIZE_MAX); if ((d = _libelf_allocate_data(s)) == NULL) return (NULL); @@ -129,7 +142,7 @@ elf_getdata(Elf_Scn *s, Elf_Data *ed) return (&d->d_data); } - if ((d->d_data.d_buf = malloc(msz*count)) == NULL) { + if ((d->d_data.d_buf = malloc(msz * count)) == NULL) { (void) _libelf_release_data(d); LIBELF_SET_ERROR(RESOURCE, 0); return (NULL); @@ -138,7 +151,7 @@ elf_getdata(Elf_Scn *s, Elf_Data *ed) d->d_flags |= LIBELF_F_DATA_MALLOCED; xlate = _libelf_get_translator(elftype, ELF_TOMEMORY, elfclass); - if (!(*xlate)(d->d_data.d_buf, d->d_data.d_size, + if (!(*xlate)(d->d_data.d_buf, (size_t) d->d_data.d_size, e->e_rawfile + sh_offset, count, e->e_byteorder != LIBELF_PRIVATE(byteorder))) { _libelf_release_data(d); diff --git a/libelf/elf_errmsg.c b/libelf/elf_errmsg.c index adcaa74b29ba..409862cc1557 100644 --- a/libelf/elf_errmsg.c +++ b/libelf/elf_errmsg.c @@ -32,13 +32,13 @@ #include "_libelf.h" -ELFTC_VCSID("$Id: elf_errmsg.c 2225 2011-11-26 18:55:54Z jkoshy $"); +ELFTC_VCSID("$Id: elf_errmsg.c 3012 2014-03-23 03:41:38Z jkoshy $"); /* * Retrieve a human readable translation for an error message. */ -const char *_libelf_errors[] = { +static const char *_libelf_errors[] = { #define DEFINE_ERROR(N,S) [ELF_E_##N] = S DEFINE_ERROR(NONE, "No Error"), DEFINE_ERROR(ARCHIVE, "Malformed ar(1) archive"), @@ -76,7 +76,7 @@ elf_errmsg(int error) if (error < ELF_E_NONE || error >= ELF_E_NUM) return _libelf_errors[ELF_E_NUM]; if (oserr) { - (void) snprintf(LIBELF_PRIVATE(msg), + (void) snprintf((char *) LIBELF_PRIVATE(msg), sizeof(LIBELF_PRIVATE(msg)), "%s: %s", _libelf_errors[error], strerror(oserr)); return (const char *)&LIBELF_PRIVATE(msg); diff --git a/libelf/elf_flag.c b/libelf/elf_flag.c index ab9d24a0ecea..89af3160da6a 100644 --- a/libelf/elf_flag.c +++ b/libelf/elf_flag.c @@ -30,7 +30,7 @@ #include "_libelf.h" -ELFTC_VCSID("$Id: elf_flag.c 2272 2011-12-03 17:07:31Z jkoshy $"); +ELFTC_VCSID("$Id: elf_flag.c 2988 2014-03-17 08:51:49Z jkoshy $"); unsigned int elf_flagarhdr(Elf_Arhdr *a, Elf_Cmd c, unsigned int flags) @@ -111,7 +111,7 @@ elf_flagehdr(Elf *e, Elf_Cmd c, unsigned int flags) unsigned int elf_flagelf(Elf *e, Elf_Cmd c, unsigned int flags) { - int r; + unsigned int r; if (e == NULL) return (0); @@ -173,7 +173,7 @@ elf_flagphdr(Elf *e, Elf_Cmd c, unsigned int flags) unsigned int elf_flagscn(Elf_Scn *s, Elf_Cmd c, unsigned int flags) { - int r; + unsigned int r; if (s == NULL) return (0); diff --git a/libelf/elf_memory.c b/libelf/elf_memory.c index 9c4755d0f59b..d70f6e094912 100644 --- a/libelf/elf_memory.c +++ b/libelf/elf_memory.c @@ -28,7 +28,7 @@ #include "_libelf.h" -ELFTC_VCSID("$Id: elf_memory.c 2368 2011-12-29 06:34:28Z jkoshy $"); +ELFTC_VCSID("$Id: elf_memory.c 3013 2014-03-23 06:16:59Z jkoshy $"); Elf * elf_memory(char *image, size_t sz) @@ -43,5 +43,5 @@ elf_memory(char *image, size_t sz) return (NULL); } - return (_libelf_memory(image, sz, 1)); + return (_libelf_memory((unsigned char *) image, sz, 1)); } diff --git a/libelf/elf_next.c b/libelf/elf_next.c index 605a593dd9e3..7da8ba6fe857 100644 --- a/libelf/elf_next.c +++ b/libelf/elf_next.c @@ -32,7 +32,7 @@ #include "_libelf.h" -ELFTC_VCSID("$Id: elf_next.c 2225 2011-11-26 18:55:54Z jkoshy $"); +ELFTC_VCSID("$Id: elf_next.c 2989 2014-03-17 09:56:46Z jkoshy $"); Elf_Cmd elf_next(Elf *e) @@ -48,13 +48,17 @@ elf_next(Elf *e) return (ELF_C_NULL); } - assert (parent->e_kind == ELF_K_AR); - assert (parent->e_cmd == ELF_C_READ); + assert(parent->e_kind == ELF_K_AR); + assert(parent->e_cmd == ELF_C_READ); assert(e->e_rawfile > parent->e_rawfile); - next = e->e_rawfile - parent->e_rawfile + e->e_rawsize; + next = e->e_rawfile - parent->e_rawfile + (off_t) e->e_rawsize; next = (next + 1) & ~1; /* round up to an even boundary */ + /* + * Setup the 'e_next' field of the archive descriptor for the + * next call to 'elf_begin()'. + */ parent->e_u.e_ar.e_next = (next >= (off_t) parent->e_rawsize) ? (off_t) 0 : next; diff --git a/libelf/elf_open.c b/libelf/elf_open.c index b039431571fb..5aad459f4002 100644 --- a/libelf/elf_open.c +++ b/libelf/elf_open.c @@ -63,5 +63,5 @@ elf_openmemory(char *image, size_t sz) return (NULL); } - return (_libelf_memory(image, sz, 0)); + return (_libelf_memory((unsigned char *) image, sz, 0)); } diff --git a/libelf/elf_rand.c b/libelf/elf_rand.c index f48f01745802..8c36ff809702 100644 --- a/libelf/elf_rand.c +++ b/libelf/elf_rand.c @@ -31,7 +31,7 @@ #include "_libelf.h" -ELFTC_VCSID("$Id: elf_rand.c 2225 2011-11-26 18:55:54Z jkoshy $"); +ELFTC_VCSID("$Id: elf_rand.c 2991 2014-03-17 09:57:04Z jkoshy $"); off_t elf_rand(Elf *ar, off_t offset) @@ -40,7 +40,7 @@ elf_rand(Elf *ar, off_t offset) if (ar == NULL || ar->e_kind != ELF_K_AR || (offset & 1) || offset < SARMAG || - offset + sizeof(struct ar_hdr) >= ar->e_rawsize) { + (size_t) offset + sizeof(struct ar_hdr) >= ar->e_rawsize) { LIBELF_SET_ERROR(ARGUMENT, 0); return 0; } diff --git a/libelf/elf_rawfile.c b/libelf/elf_rawfile.c index 76cfd7fa3435..a5b5b3ed5f7f 100644 --- a/libelf/elf_rawfile.c +++ b/libelf/elf_rawfile.c @@ -30,13 +30,13 @@ #include "_libelf.h" -ELFTC_VCSID("$Id: elf_rawfile.c 2225 2011-11-26 18:55:54Z jkoshy $"); +ELFTC_VCSID("$Id: elf_rawfile.c 3013 2014-03-23 06:16:59Z jkoshy $"); char * elf_rawfile(Elf *e, size_t *sz) { - char *ptr; size_t size; + unsigned char *ptr; size = e ? e->e_rawsize : 0; ptr = NULL; @@ -49,5 +49,5 @@ elf_rawfile(Elf *e, size_t *sz) if (sz) *sz = size; - return (ptr); + return ((char *) ptr); } diff --git a/libelf/elf_scn.c b/libelf/elf_scn.c index 357fbb33d847..f80711579d59 100644 --- a/libelf/elf_scn.c +++ b/libelf/elf_scn.c @@ -36,7 +36,7 @@ #include "_libelf.h" -ELFTC_VCSID("$Id: elf_scn.c 2225 2011-11-26 18:55:54Z jkoshy $"); +ELFTC_VCSID("$Id: elf_scn.c 3013 2014-03-23 06:16:59Z jkoshy $"); /* * Load an ELF section table and create a list of Elf_Scn structures. @@ -44,14 +44,15 @@ ELFTC_VCSID("$Id: elf_scn.c 2225 2011-11-26 18:55:54Z jkoshy $"); int _libelf_load_section_headers(Elf *e, void *ehdr) { - int ec, swapbytes; - size_t fsz, i, shnum; + Elf_Scn *scn; uint64_t shoff; - char *src; Elf32_Ehdr *eh32; Elf64_Ehdr *eh64; - Elf_Scn *scn; - int (*xlator)(char *_d, size_t _dsz, char *_s, size_t _c, int _swap); + int ec, swapbytes; + unsigned char *src; + size_t fsz, i, shnum; + int (*xlator)(unsigned char *_d, size_t _dsz, unsigned char *_s, + size_t _c, int _swap); assert(e != NULL); assert(ehdr != NULL); @@ -104,8 +105,8 @@ _libelf_load_section_headers(Elf *e, void *ehdr) if ((scn = _libelf_allocate_scn(e, i)) == NULL) return (0); - (*xlator)((char *) &scn->s_shdr, sizeof(scn->s_shdr), src, - (size_t) 1, swapbytes); + (*xlator)((unsigned char *) &scn->s_shdr, sizeof(scn->s_shdr), + src, (size_t) 1, swapbytes); if (ec == ELFCLASS32) { scn->s_offset = scn->s_rawoff = diff --git a/libelf/elf_strptr.c b/libelf/elf_strptr.c index c79970dc8907..e2a6b2899f58 100644 --- a/libelf/elf_strptr.c +++ b/libelf/elf_strptr.c @@ -31,7 +31,7 @@ #include "_libelf.h" -ELFTC_VCSID("$Id: elf_strptr.c 2271 2011-12-03 17:06:35Z jkoshy $"); +ELFTC_VCSID("$Id: elf_strptr.c 2990 2014-03-17 09:56:58Z jkoshy $"); /* * Convert an ELF section#,offset pair to a string pointer. @@ -42,8 +42,8 @@ elf_strptr(Elf *e, size_t scndx, size_t offset) { Elf_Scn *s; Elf_Data *d; - size_t alignment, count; GElf_Shdr shdr; + uint64_t alignment, count; if (e == NULL || e->e_kind != ELF_K_ELF) { LIBELF_SET_ERROR(ARGUMENT, 0); @@ -90,7 +90,7 @@ elf_strptr(Elf *e, size_t scndx, size_t offset) * account 'holes' in coverage of the section introduced * by alignment requirements. */ - count = (size_t) 0; /* cumulative count of bytes seen */ + count = (uint64_t) 0; /* cumulative count of bytes seen */ while ((d = elf_getdata(s, d)) != NULL && count <= offset) { if (d->d_buf == NULL || d->d_size == 0) diff --git a/libelf/elf_update.c b/libelf/elf_update.c index b589233c8e4a..70a7c2e21e25 100644 --- a/libelf/elf_update.c +++ b/libelf/elf_update.c @@ -41,7 +41,7 @@ #include #endif -ELFTC_VCSID("$Id: elf_update.c 2931 2013-03-23 11:41:07Z jkoshy $"); +ELFTC_VCSID("$Id: elf_update.c 3013 2014-03-23 06:16:59Z jkoshy $"); /* * Layout strategy: @@ -110,14 +110,13 @@ SLIST_HEAD(_Elf_Extent_List, _Elf_Extent); static int _libelf_compute_section_extents(Elf *e, Elf_Scn *s, off_t rc) { - int ec; Elf_Data *d; size_t fsz, msz; + int ec, elftype; uint32_t sh_type; uint64_t d_align; Elf32_Shdr *shdr32; Elf64_Shdr *shdr64; - unsigned int elftype; struct _Libelf_Data *ld; uint64_t scn_size, scn_alignment; uint64_t sh_align, sh_entsize, sh_offset, sh_size; @@ -253,7 +252,7 @@ _libelf_compute_section_extents(Elf *e, Elf_Scn *s, off_t rc) scn_size = roundup2(scn_size, d->d_align); d->d_off = scn_size; fsz = _libelf_fsize(d->d_type, ec, d->d_version, - d->d_size / msz); + (size_t) d->d_size / msz); scn_size += fsz; } @@ -307,7 +306,7 @@ computeoffset: * Compute the new offset for the section based on * the section's alignment needs. */ - sh_offset = roundup(rc, sh_align); + sh_offset = roundup((uint64_t) rc, sh_align); /* * Update the section header. @@ -471,7 +470,7 @@ _libelf_resync_sections(Elf *e, off_t rc, struct _Elf_Extent_List *extents) return ((off_t) -1); if ((size_t) rc < s->s_offset + s->s_size) - rc = s->s_offset + s->s_size; + rc = (off_t) (s->s_offset + s->s_size); } return (rc); @@ -529,17 +528,22 @@ _libelf_resync_elf(Elf *e, struct _Elf_Extent_List *extents) if (ec == ELFCLASS32) { eh_byteorder = eh32->e_ident[EI_DATA]; eh_class = eh32->e_ident[EI_CLASS]; - phoff = (uint64_t) eh32->e_phoff; - shoff = (uint64_t) eh32->e_shoff; + phoff = (off_t) eh32->e_phoff; + shoff = (off_t) eh32->e_shoff; eh_version = eh32->e_version; } else { eh_byteorder = eh64->e_ident[EI_DATA]; eh_class = eh64->e_ident[EI_CLASS]; - phoff = eh64->e_phoff; - shoff = eh64->e_shoff; + phoff = (off_t) eh64->e_phoff; + shoff = (off_t) eh64->e_shoff; eh_version = eh64->e_version; } + if (phoff < 0 || shoff < 0) { + LIBELF_SET_ERROR(HEADER, 0); + return ((off_t) -1); + } + if (eh_version == EV_NONE) eh_version = EV_CURRENT; @@ -564,18 +568,20 @@ _libelf_resync_elf(Elf *e, struct _Elf_Extent_List *extents) e->e_byteorder = eh_byteorder; #define INITIALIZE_EHDR(E,EC,V) do { \ + unsigned int _version = (unsigned int) (V); \ (E)->e_ident[EI_MAG0] = ELFMAG0; \ (E)->e_ident[EI_MAG1] = ELFMAG1; \ (E)->e_ident[EI_MAG2] = ELFMAG2; \ (E)->e_ident[EI_MAG3] = ELFMAG3; \ - (E)->e_ident[EI_CLASS] = (EC); \ - (E)->e_ident[EI_VERSION] = (V); \ - (E)->e_ehsize = _libelf_fsize(ELF_T_EHDR, (EC), (V), \ - (size_t) 1); \ - (E)->e_phentsize = (phnum == 0) ? 0 : _libelf_fsize( \ - ELF_T_PHDR, (EC), (V), (size_t) 1); \ - (E)->e_shentsize = _libelf_fsize(ELF_T_SHDR, (EC), (V), \ - (size_t) 1); \ + (E)->e_ident[EI_CLASS] = (unsigned char) (EC); \ + (E)->e_ident[EI_VERSION] = (_version & 0xFFU); \ + (E)->e_ehsize = (uint16_t) _libelf_fsize(ELF_T_EHDR, \ + (EC), _version, (size_t) 1); \ + (E)->e_phentsize = (uint16_t) ((phnum == 0) ? 0 : \ + _libelf_fsize(ELF_T_PHDR, (EC), _version, \ + (size_t) 1)); \ + (E)->e_shentsize = (uint16_t) _libelf_fsize(ELF_T_SHDR, \ + (EC), _version, (size_t) 1); \ } while (0) if (ec == ELFCLASS32) @@ -585,9 +591,10 @@ _libelf_resync_elf(Elf *e, struct _Elf_Extent_List *extents) (void) elf_flagehdr(e, ELF_C_SET, ELF_F_DIRTY); - rc += _libelf_fsize(ELF_T_EHDR, ec, eh_version, (size_t) 1); + rc += (off_t) _libelf_fsize(ELF_T_EHDR, ec, eh_version, (size_t) 1); - if (!_libelf_insert_extent(extents, ELF_EXTENT_EHDR, 0, rc, ehdr)) + if (!_libelf_insert_extent(extents, ELF_EXTENT_EHDR, 0, (uint64_t) rc, + ehdr)) return ((off_t) -1); /* @@ -608,20 +615,20 @@ _libelf_resync_elf(Elf *e, struct _Elf_Extent_List *extents) return ((off_t) -1); } - if (phoff % align) { + if (phoff % (off_t) align) { LIBELF_SET_ERROR(LAYOUT, 0); return ((off_t) -1); } } else - phoff = roundup(rc, align); + phoff = roundup(rc, (off_t) align); - rc = phoff + fsz; + rc = phoff + (off_t) fsz; phdr = _libelf_getphdr(e, ec); - if (!_libelf_insert_extent(extents, ELF_EXTENT_PHDR, phoff, - fsz, phdr)) + if (!_libelf_insert_extent(extents, ELF_EXTENT_PHDR, + (uint64_t) phoff, fsz, phdr)) return ((off_t) -1); } else phoff = 0; @@ -656,18 +663,18 @@ _libelf_resync_elf(Elf *e, struct _Elf_Extent_List *extents) align = _libelf_falign(ELF_T_SHDR, ec); if (e->e_flags & ELF_F_LAYOUT) { - if (shoff % align) { + if (shoff % (off_t) align) { LIBELF_SET_ERROR(LAYOUT, 0); return ((off_t) -1); } } else - shoff = roundup(rc, align); + shoff = roundup(rc, (off_t) align); - if (shoff + fsz > (size_t) rc) - rc = shoff + fsz; + if (shoff + (off_t) fsz > rc) + rc = shoff + (off_t) fsz; - if (!_libelf_insert_extent(extents, ELF_EXTENT_SHDR, shoff, - fsz, NULL)) + if (!_libelf_insert_extent(extents, ELF_EXTENT_SHDR, + (uint64_t) shoff, fsz, NULL)) return ((off_t) -1); } else shoff = 0; @@ -700,22 +707,23 @@ _libelf_resync_elf(Elf *e, struct _Elf_Extent_List *extents) * Write out the contents of an ELF section. */ -static size_t -_libelf_write_scn(Elf *e, char *nf, struct _Elf_Extent *ex) +static off_t +_libelf_write_scn(Elf *e, unsigned char *nf, struct _Elf_Extent *ex) { int ec; + off_t rc; Elf_Scn *s; int elftype; Elf_Data *d, dst; uint32_t sh_type; struct _Libelf_Data *ld; uint64_t sh_off, sh_size; - size_t fsz, msz, nobjects, rc; + size_t fsz, msz, nobjects; assert(ex->ex_type == ELF_EXTENT_SECTION); s = ex->ex_desc; - rc = ex->ex_start; + rc = (off_t) ex->ex_start; if ((ec = e->e_class) == ELFCLASS32) { sh_type = s->s_shdr.s_shdr32.sh_type; @@ -756,18 +764,20 @@ _libelf_write_scn(Elf *e, char *nf, struct _Elf_Extent *ex) if ((uint64_t) rc < sh_off + d->d_off) (void) memset(nf + rc, - LIBELF_PRIVATE(fillchar), sh_off + - d->d_off - rc); - rc = sh_off + d->d_off; + LIBELF_PRIVATE(fillchar), + (size_t) (sh_off + d->d_off - + (uint64_t) rc)); + rc = (off_t) (sh_off + d->d_off); assert(d->d_buf != NULL); assert(d->d_type == ELF_T_BYTE); assert(d->d_version == e->e_version); (void) memcpy(nf + rc, - e->e_rawfile + s->s_rawoff + d->d_off, d->d_size); + e->e_rawfile + s->s_rawoff + d->d_off, + (size_t) d->d_size); - rc += d->d_size; + rc += (off_t) d->d_size; } return (rc); @@ -789,15 +799,16 @@ _libelf_write_scn(Elf *e, char *nf, struct _Elf_Extent *ex) if ((uint64_t) rc < sh_off + d->d_off) (void) memset(nf + rc, - LIBELF_PRIVATE(fillchar), sh_off + d->d_off - rc); + LIBELF_PRIVATE(fillchar), + (size_t) (sh_off + d->d_off - (uint64_t) rc)); - rc = sh_off + d->d_off; + rc = (off_t) (sh_off + d->d_off); assert(d->d_buf != NULL); assert(d->d_version == e->e_version); assert(d->d_size % msz == 0); - nobjects = d->d_size / msz; + nobjects = (size_t) (d->d_size / msz); fsz = _libelf_fsize(d->d_type, ec, e->e_version, nobjects); @@ -808,10 +819,10 @@ _libelf_write_scn(Elf *e, char *nf, struct _Elf_Extent *ex) NULL) return ((off_t) -1); - rc += fsz; + rc += (off_t) fsz; } - return ((off_t) rc); + return (rc); } /* @@ -819,7 +830,7 @@ _libelf_write_scn(Elf *e, char *nf, struct _Elf_Extent *ex) */ static off_t -_libelf_write_ehdr(Elf *e, char *nf, struct _Elf_Extent *ex) +_libelf_write_ehdr(Elf *e, unsigned char *nf, struct _Elf_Extent *ex) { int ec; void *ehdr; @@ -860,7 +871,7 @@ _libelf_write_ehdr(Elf *e, char *nf, struct _Elf_Extent *ex) */ static off_t -_libelf_write_phdr(Elf *e, char *nf, struct _Elf_Extent *ex) +_libelf_write_phdr(Elf *e, unsigned char *nf, struct _Elf_Extent *ex) { int ec; void *ehdr; @@ -909,7 +920,7 @@ _libelf_write_phdr(Elf *e, char *nf, struct _Elf_Extent *ex) NULL) return ((off_t) -1); - return (phoff + fsz); + return ((off_t) (phoff + fsz)); } /* @@ -917,7 +928,7 @@ _libelf_write_phdr(Elf *e, char *nf, struct _Elf_Extent *ex) */ static off_t -_libelf_write_shdr(Elf *e, char *nf, struct _Elf_Extent *ex) +_libelf_write_shdr(Elf *e, unsigned char *nf, struct _Elf_Extent *ex) { int ec; void *ehdr; @@ -969,7 +980,7 @@ _libelf_write_shdr(Elf *e, char *nf, struct _Elf_Extent *ex) return ((off_t) -1); } - return (ex->ex_start + nscn * fsz); + return ((off_t) (ex->ex_start + nscn * fsz)); } /* @@ -993,9 +1004,9 @@ static off_t _libelf_write_elf(Elf *e, off_t newsize, struct _Elf_Extent_List *extents) { off_t nrc, rc; - char *newfile; Elf_Scn *scn, *tscn; struct _Elf_Extent *ex; + unsigned char *newfile; assert(e->e_kind == ELF_K_ELF); assert(e->e_cmd == ELF_C_RDWR || e->e_cmd == ELF_C_WRITE); @@ -1012,7 +1023,7 @@ _libelf_write_elf(Elf *e, off_t newsize, struct _Elf_Extent_List *extents) /* Fill inter-extent gaps. */ if (ex->ex_start > (size_t) rc) (void) memset(newfile + rc, LIBELF_PRIVATE(fillchar), - ex->ex_start - rc); + (size_t) (ex->ex_start - (uint64_t) rc)); switch (ex->ex_type) { case ELF_EXTENT_EHDR: @@ -1103,7 +1114,7 @@ _libelf_write_elf(Elf *e, off_t newsize, struct _Elf_Extent_List *extents) #endif /* ELFTC_HAVE_MMAP */ /* Record the new size of the file. */ - e->e_rawsize = newsize; + e->e_rawsize = (size_t) newsize; } else { /* File opened in ELF_C_WRITE mode. */ assert(e->e_rawfile == NULL); diff --git a/libelf/gelf_cap.c b/libelf/gelf_cap.c index a1c1417be1fa..9925d1bd214f 100644 --- a/libelf/gelf_cap.c +++ b/libelf/gelf_cap.c @@ -32,7 +32,7 @@ #include "_libelf.h" -ELFTC_VCSID("$Id: gelf_cap.c 2272 2011-12-03 17:07:31Z jkoshy $"); +ELFTC_VCSID("$Id: gelf_cap.c 2995 2014-03-18 02:16:31Z jkoshy $"); GElf_Cap * gelf_getcap(Elf_Data *ed, int ndx, GElf_Cap *dst) @@ -72,7 +72,7 @@ gelf_getcap(Elf_Data *ed, int ndx, GElf_Cap *dst) assert(msz > 0); - if (msz * ndx >= d->d_data.d_size) { + if (msz * (size_t) ndx >= d->d_data.d_size) { LIBELF_SET_ERROR(ARGUMENT, 0); return (NULL); } @@ -131,7 +131,7 @@ gelf_update_cap(Elf_Data *ed, int ndx, GElf_Cap *gc) msz = _libelf_msize(ELF_T_CAP, ec, e->e_version); assert(msz > 0); - if (msz * ndx >= d->d_data.d_size) { + if (msz * (size_t) ndx >= d->d_data.d_size) { LIBELF_SET_ERROR(ARGUMENT, 0); return (0); } diff --git a/libelf/gelf_dyn.c b/libelf/gelf_dyn.c index 263102603397..4e09afd12ce2 100644 --- a/libelf/gelf_dyn.c +++ b/libelf/gelf_dyn.c @@ -32,7 +32,7 @@ #include "_libelf.h" -ELFTC_VCSID("$Id: gelf_dyn.c 2272 2011-12-03 17:07:31Z jkoshy $"); +ELFTC_VCSID("$Id: gelf_dyn.c 2998 2014-03-18 17:19:00Z jkoshy $"); GElf_Dyn * gelf_getdyn(Elf_Data *ed, int ndx, GElf_Dyn *dst) @@ -71,8 +71,9 @@ gelf_getdyn(Elf_Data *ed, int ndx, GElf_Dyn *dst) msz = _libelf_msize(ELF_T_DYN, ec, e->e_version); assert(msz > 0); + assert(ndx >= 0); - if (msz * ndx >= d->d_data.d_size) { + if (msz * (size_t) ndx >= d->d_data.d_size) { LIBELF_SET_ERROR(ARGUMENT, 0); return (NULL); } @@ -128,9 +129,11 @@ gelf_update_dyn(Elf_Data *ed, int ndx, GElf_Dyn *ds) } msz = _libelf_msize(ELF_T_DYN, ec, e->e_version); - assert(msz > 0); - if (msz * ndx >= d->d_data.d_size) { + assert(msz > 0); + assert(ndx >= 0); + + if (msz * (size_t) ndx >= d->d_data.d_size) { LIBELF_SET_ERROR(ARGUMENT, 0); return (0); } diff --git a/libelf/gelf_move.c b/libelf/gelf_move.c index d9e8993deee4..2b734eba53b8 100644 --- a/libelf/gelf_move.c +++ b/libelf/gelf_move.c @@ -32,7 +32,7 @@ #include "_libelf.h" -ELFTC_VCSID("$Id: gelf_move.c 2272 2011-12-03 17:07:31Z jkoshy $"); +ELFTC_VCSID("$Id: gelf_move.c 2998 2014-03-18 17:19:00Z jkoshy $"); GElf_Move * gelf_getmove(Elf_Data *ed, int ndx, GElf_Move *dst) @@ -71,8 +71,9 @@ gelf_getmove(Elf_Data *ed, int ndx, GElf_Move *dst) msz = _libelf_msize(ELF_T_MOVE, ec, e->e_version); assert(msz > 0); + assert(ndx >= 0); - if (msz * ndx >= d->d_data.d_size) { + if (msz * (size_t) ndx >= d->d_data.d_size) { LIBELF_SET_ERROR(ARGUMENT, 0); return (NULL); } @@ -131,9 +132,11 @@ gelf_update_move(Elf_Data *ed, int ndx, GElf_Move *gm) } msz = _libelf_msize(ELF_T_MOVE, ec, e->e_version); - assert(msz > 0); - if (msz * ndx >= d->d_data.d_size) { + assert(msz > 0); + assert(ndx >= 0); + + if (msz * (size_t) ndx >= d->d_data.d_size) { LIBELF_SET_ERROR(ARGUMENT, 0); return (0); } diff --git a/libelf/gelf_rel.c b/libelf/gelf_rel.c index eb057177d4cc..3b798c042201 100644 --- a/libelf/gelf_rel.c +++ b/libelf/gelf_rel.c @@ -32,7 +32,7 @@ #include "_libelf.h" -ELFTC_VCSID("$Id: gelf_rel.c 2272 2011-12-03 17:07:31Z jkoshy $"); +ELFTC_VCSID("$Id: gelf_rel.c 2998 2014-03-18 17:19:00Z jkoshy $"); GElf_Rel * gelf_getrel(Elf_Data *ed, int ndx, GElf_Rel *dst) @@ -71,8 +71,9 @@ gelf_getrel(Elf_Data *ed, int ndx, GElf_Rel *dst) msz = _libelf_msize(ELF_T_REL, ec, e->e_version); assert(msz > 0); + assert(ndx >= 0); - if (msz * ndx >= d->d_data.d_size) { + if (msz * (size_t) ndx >= d->d_data.d_size) { LIBELF_SET_ERROR(ARGUMENT, 0); return (NULL); } @@ -130,9 +131,11 @@ gelf_update_rel(Elf_Data *ed, int ndx, GElf_Rel *dr) } msz = _libelf_msize(ELF_T_REL, ec, e->e_version); - assert(msz > 0); - if (msz * ndx >= d->d_data.d_size) { + assert(msz > 0); + assert(ndx >= 0); + + if (msz * (size_t) ndx >= d->d_data.d_size) { LIBELF_SET_ERROR(ARGUMENT, 0); return (0); } @@ -147,8 +150,9 @@ gelf_update_rel(Elf_Data *ed, int ndx, GElf_Rel *dr) LIBELF_SET_ERROR(RANGE, 0); return (0); } - rel32->r_info = ELF32_R_INFO(ELF64_R_SYM(dr->r_info), - ELF64_R_TYPE(dr->r_info)); + rel32->r_info = ELF32_R_INFO( + (Elf32_Word) ELF64_R_SYM(dr->r_info), + (Elf32_Word) ELF64_R_TYPE(dr->r_info)); } else { rel64 = (Elf64_Rel *) d->d_data.d_buf + ndx; diff --git a/libelf/gelf_rela.c b/libelf/gelf_rela.c index cb61bdc2e2df..ed289a674d1f 100644 --- a/libelf/gelf_rela.c +++ b/libelf/gelf_rela.c @@ -32,7 +32,7 @@ #include "_libelf.h" -ELFTC_VCSID("$Id: gelf_rela.c 2272 2011-12-03 17:07:31Z jkoshy $"); +ELFTC_VCSID("$Id: gelf_rela.c 2998 2014-03-18 17:19:00Z jkoshy $"); GElf_Rela * gelf_getrela(Elf_Data *ed, int ndx, GElf_Rela *dst) @@ -71,8 +71,9 @@ gelf_getrela(Elf_Data *ed, int ndx, GElf_Rela *dst) msz = _libelf_msize(ELF_T_RELA, ec, e->e_version); assert(msz > 0); + assert(ndx >= 0); - if (msz * ndx >= d->d_data.d_size) { + if (msz * (size_t) ndx >= d->d_data.d_size) { LIBELF_SET_ERROR(ARGUMENT, 0); return (NULL); } @@ -131,9 +132,11 @@ gelf_update_rela(Elf_Data *ed, int ndx, GElf_Rela *dr) } msz = _libelf_msize(ELF_T_RELA, ec, e->e_version); - assert(msz > 0); - if (msz * ndx >= d->d_data.d_size) { + assert(msz > 0); + assert(ndx >= 0); + + if (msz * (size_t) ndx >= d->d_data.d_size) { LIBELF_SET_ERROR(ARGUMENT, 0); return (0); } @@ -148,8 +151,9 @@ gelf_update_rela(Elf_Data *ed, int ndx, GElf_Rela *dr) LIBELF_SET_ERROR(RANGE, 0); return (0); } - rela32->r_info = ELF32_R_INFO(ELF64_R_SYM(dr->r_info), - ELF64_R_TYPE(dr->r_info)); + rela32->r_info = ELF32_R_INFO( + (Elf32_Word) ELF64_R_SYM(dr->r_info), + (Elf32_Word) ELF64_R_TYPE(dr->r_info)); LIBELF_COPY_S32(rela32, dr, r_addend); } else { diff --git a/libelf/gelf_sym.c b/libelf/gelf_sym.c index 4a490d9ee079..e32a1869cea7 100644 --- a/libelf/gelf_sym.c +++ b/libelf/gelf_sym.c @@ -32,7 +32,7 @@ #include "_libelf.h" -ELFTC_VCSID("$Id: gelf_sym.c 2272 2011-12-03 17:07:31Z jkoshy $"); +ELFTC_VCSID("$Id: gelf_sym.c 2999 2014-03-18 17:19:06Z jkoshy $"); GElf_Sym * gelf_getsym(Elf_Data *ed, int ndx, GElf_Sym *dst) @@ -71,25 +71,23 @@ gelf_getsym(Elf_Data *ed, int ndx, GElf_Sym *dst) msz = _libelf_msize(ELF_T_SYM, ec, e->e_version); assert(msz > 0); + assert(ndx >= 0); - if (msz * ndx >= d->d_data.d_size) { + if (msz * (size_t) ndx >= d->d_data.d_size) { LIBELF_SET_ERROR(ARGUMENT, 0); return (NULL); } if (ec == ELFCLASS32) { - sym32 = (Elf32_Sym *) d->d_data.d_buf + ndx; dst->st_name = sym32->st_name; dst->st_value = (Elf64_Addr) sym32->st_value; dst->st_size = (Elf64_Xword) sym32->st_size; - dst->st_info = ELF64_ST_INFO(ELF32_ST_BIND(sym32->st_info), - ELF32_ST_TYPE(sym32->st_info)); + dst->st_info = sym32->st_info; dst->st_other = sym32->st_other; dst->st_shndx = sym32->st_shndx; } else { - sym64 = (Elf64_Sym *) d->d_data.d_buf + ndx; *dst = *sym64; @@ -133,9 +131,11 @@ gelf_update_sym(Elf_Data *ed, int ndx, GElf_Sym *gs) } msz = _libelf_msize(ELF_T_SYM, ec, e->e_version); - assert(msz > 0); - if (msz * ndx >= d->d_data.d_size) { + assert(msz > 0); + assert(ndx >= 0); + + if (msz * (size_t) ndx >= d->d_data.d_size) { LIBELF_SET_ERROR(ARGUMENT, 0); return (0); } diff --git a/libelf/gelf_syminfo.c b/libelf/gelf_syminfo.c index bb2063d9a2d4..e54258292aa1 100644 --- a/libelf/gelf_syminfo.c +++ b/libelf/gelf_syminfo.c @@ -31,7 +31,7 @@ #include "_libelf.h" -ELFTC_VCSID("$Id: gelf_syminfo.c 2272 2011-12-03 17:07:31Z jkoshy $"); +ELFTC_VCSID("$Id: gelf_syminfo.c 2998 2014-03-18 17:19:00Z jkoshy $"); GElf_Syminfo * gelf_getsyminfo(Elf_Data *ed, int ndx, GElf_Syminfo *dst) @@ -70,8 +70,9 @@ gelf_getsyminfo(Elf_Data *ed, int ndx, GElf_Syminfo *dst) msz = _libelf_msize(ELF_T_SYMINFO, ec, e->e_version); assert(msz > 0); + assert(ndx >= 0); - if (msz * ndx >= d->d_data.d_size) { + if (msz * (size_t) ndx >= d->d_data.d_size) { LIBELF_SET_ERROR(ARGUMENT, 0); return (NULL); } @@ -128,9 +129,11 @@ gelf_update_syminfo(Elf_Data *ed, int ndx, GElf_Syminfo *gs) } msz = _libelf_msize(ELF_T_SYMINFO, ec, e->e_version); - assert(msz > 0); - if (msz * ndx >= d->d_data.d_size) { + assert(msz > 0); + assert(ndx >= 0); + + if (msz * (size_t) ndx >= d->d_data.d_size) { LIBELF_SET_ERROR(ARGUMENT, 0); return (0); } diff --git a/libelf/gelf_symshndx.c b/libelf/gelf_symshndx.c index 9cf3b7578183..69fabe55ce03 100644 --- a/libelf/gelf_symshndx.c +++ b/libelf/gelf_symshndx.c @@ -31,7 +31,7 @@ #include "_libelf.h" -ELFTC_VCSID("$Id: gelf_symshndx.c 2283 2011-12-04 04:07:24Z jkoshy $"); +ELFTC_VCSID("$Id: gelf_symshndx.c 2998 2014-03-18 17:19:00Z jkoshy $"); GElf_Sym * gelf_getsymshndx(Elf_Data *d, Elf_Data *id, int ndx, GElf_Sym *dst, @@ -74,8 +74,9 @@ gelf_getsymshndx(Elf_Data *d, Elf_Data *id, int ndx, GElf_Sym *dst, msz = _libelf_msize(ELF_T_WORD, ec, e->e_version); assert(msz > 0); + assert(ndx >= 0); - if (msz * ndx >= id->d_size) { + if (msz * (size_t) ndx >= id->d_size) { LIBELF_SET_ERROR(ARGUMENT, 0); return (NULL); } @@ -123,9 +124,11 @@ gelf_update_symshndx(Elf_Data *d, Elf_Data *id, int ndx, GElf_Sym *gs, } msz = _libelf_msize(ELF_T_WORD, ec, e->e_version); - assert(msz > 0); - if (msz * ndx >= id->d_size) { + assert(msz > 0); + assert(ndx >= 0); + + if (msz * (size_t) ndx >= id->d_size) { LIBELF_SET_ERROR(ARGUMENT, 0); return (0); } diff --git a/libelf/libelf.h b/libelf/libelf.h index d3219d7ce251..41e7224956fc 100644 --- a/libelf/libelf.h +++ b/libelf/libelf.h @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: libelf.h 2366 2011-12-29 06:12:14Z jkoshy $ + * $Id: libelf.h 2988 2014-03-17 08:51:49Z jkoshy $ */ #ifndef _LIBELF_H_ @@ -129,7 +129,7 @@ typedef struct { /* * Members that are not part of the public API. */ - int ar_flags; + unsigned int ar_flags; } Elf_Arhdr; /* diff --git a/libelf/libelf_align.c b/libelf/libelf_align.c index 9550c5bd49ea..817fd1588565 100644 --- a/libelf/libelf_align.c +++ b/libelf/libelf_align.c @@ -32,11 +32,11 @@ #include "_libelf.h" -ELFTC_VCSID("$Id: libelf_align.c 2225 2011-11-26 18:55:54Z jkoshy $"); +ELFTC_VCSID("$Id: libelf_align.c 3006 2014-03-22 08:10:07Z jkoshy $"); struct align { - int a32; - int a64; + unsigned int a32; + unsigned int a64; }; #ifdef __GNUC__ @@ -87,7 +87,7 @@ static struct align malign[ELF_T_NUM] = { [ELF_T_GNUHASH] = MALIGN_WORD() }; -int +unsigned int _libelf_malign(Elf_Type t, int elfclass) { if (t >= ELF_T_NUM || (int) t < 0) @@ -126,7 +126,7 @@ static struct align falign[ELF_T_NUM] = { [ELF_T_GNUHASH] = FALIGN(4,8) }; -int +unsigned int _libelf_falign(Elf_Type t, int elfclass) { if (t >= ELF_T_NUM || (int) t < 0) diff --git a/libelf/libelf_ar.c b/libelf/libelf_ar.c index c990d6dc971a..0830dd6fc069 100644 --- a/libelf/libelf_ar.c +++ b/libelf/libelf_ar.c @@ -35,7 +35,7 @@ #include "_libelf.h" #include "_libelf_ar.h" -ELFTC_VCSID("$Id: libelf_ar.c 2225 2011-11-26 18:55:54Z jkoshy $"); +ELFTC_VCSID("$Id: libelf_ar.c 3013 2014-03-23 06:16:59Z jkoshy $"); #define LIBELF_NALLOC_SIZE 16 @@ -110,8 +110,8 @@ Elf_Arhdr * _libelf_ar_gethdr(Elf *e) { Elf *parent; - char *namelen; Elf_Arhdr *eh; + char *namelen; size_t n, nlen; struct ar_hdr *arh; @@ -192,7 +192,7 @@ _libelf_ar_gethdr(Elf *e) } e->e_flags &= ~LIBELF_F_AR_HEADER; - e->e_hdr.e_rawhdr = (char *) arh; + e->e_hdr.e_rawhdr = (unsigned char *) arh; return (NULL); } @@ -201,10 +201,10 @@ Elf * _libelf_ar_open_member(int fd, Elf_Cmd c, Elf *elf) { Elf *e; - char *member, *namelen; - size_t nsz, sz; off_t next; + size_t nsz, sz; struct ar_hdr *arh; + char *member, *namelen; assert(elf->e_kind == ELF_K_AR); @@ -249,12 +249,12 @@ _libelf_ar_open_member(int fd, Elf_Cmd c, Elf *elf) member = (char *) (arh + 1); - if ((e = elf_memory((char *) member, sz)) == NULL) + if ((e = elf_memory(member, sz)) == NULL) return (NULL); e->e_fd = fd; e->e_cmd = c; - e->e_hdr.e_rawhdr = (char *) arh; + e->e_hdr.e_rawhdr = (unsigned char *) arh; elf->e_u.e_ar.e_nchildren++; e->e_parent = elf; @@ -274,9 +274,10 @@ _libelf_ar_open_member(int fd, Elf_Cmd c, Elf *elf) */ /* - * A helper macro to read in a 'long' value from the archive. We use - * memcpy() since the source pointer may be misaligned with respect to - * the natural alignment for a C 'long'. + * A helper macro to read in a 'long' value from the archive. + * + * We use memcpy() since the source pointer may be misaligned with + * respect to the natural alignment for a C 'long'. */ #define GET_LONG(P, V)do { \ memcpy(&(V), (P), sizeof(long)); \ @@ -287,9 +288,10 @@ Elf_Arsym * _libelf_ar_process_bsd_symtab(Elf *e, size_t *count) { Elf_Arsym *symtab, *sym; + unsigned int n, nentries; unsigned char *end, *p, *p0, *s, *s0; - const unsigned int entrysize = 2 * sizeof(long); - long arraysize, fileoffset, n, nentries, stroffset, strtabsize; + const size_t entrysize = 2 * sizeof(long); + long arraysize, fileoffset, stroffset, strtabsize; assert(e != NULL); assert(count != NULL); @@ -313,7 +315,8 @@ _libelf_ar_process_bsd_symtab(Elf *e, size_t *count) */ GET_LONG(p, arraysize); - if (p0 + arraysize >= end || (arraysize % entrysize != 0)) + if (arraysize < 0 || p0 + arraysize >= end || + ((size_t) arraysize % entrysize != 0)) goto symtaberror; /* @@ -323,10 +326,10 @@ _libelf_ar_process_bsd_symtab(Elf *e, size_t *count) GET_LONG(s, strtabsize); s0 = s; /* Start of string table. */ - if (s0 + strtabsize > end) + if (strtabsize < 0 || s0 + strtabsize > end) goto symtaberror; - nentries = arraysize / entrysize; + nentries = (size_t) arraysize / entrysize; /* * Allocate space for the returned Elf_Arsym array. @@ -341,12 +344,16 @@ _libelf_ar_process_bsd_symtab(Elf *e, size_t *count) GET_LONG(p, stroffset); GET_LONG(p, fileoffset); + if (stroffset < 0 || fileoffset < 0 || + (size_t) fileoffset >= e->e_rawsize) + goto symtaberror; + s = s0 + stroffset; if (s >= end) goto symtaberror; - sym->as_off = fileoffset; + sym->as_off = (off_t) fileoffset; sym->as_hash = elf_hash((char *) s); sym->as_name = (char *) s; } @@ -393,7 +400,8 @@ symtaberror: Elf_Arsym * _libelf_ar_process_svr4_symtab(Elf *e, size_t *count) { - size_t n, nentries, off; + uint32_t off; + size_t n, nentries; Elf_Arsym *symtab, *sym; unsigned char *p, *s, *end; @@ -424,15 +432,14 @@ _libelf_ar_process_svr4_symtab(Elf *e, size_t *count) s = p + (nentries * INTSZ); /* start of the string table. */ for (n = nentries, sym = symtab; n > 0; n--) { - if (s >= end) goto symtaberror; - off = 0; - GET_WORD(p, off); + if (off >= e->e_rawsize) + goto symtaberror; - sym->as_off = off; + sym->as_off = (off_t) off; sym->as_hash = elf_hash((char *) s); sym->as_name = (char *) s; diff --git a/libelf/libelf_ar_util.c b/libelf/libelf_ar_util.c index 958fbbf49022..7e6ec4068f69 100644 --- a/libelf/libelf_ar_util.c +++ b/libelf/libelf_ar_util.c @@ -34,21 +34,23 @@ #include "_libelf.h" #include "_libelf_ar.h" -ELFTC_VCSID("$Id: libelf_ar_util.c 2365 2011-12-29 04:36:44Z jkoshy $"); +ELFTC_VCSID("$Id: libelf_ar_util.c 3013 2014-03-23 06:16:59Z jkoshy $"); /* * Convert a string bounded by `start' and `start+sz' (exclusive) to a * number in the specified base. */ int -_libelf_ar_get_number(const char *s, size_t sz, int base, size_t *ret) +_libelf_ar_get_number(const char *src, size_t sz, unsigned int base, + size_t *ret) { - int c, v; size_t r; - const char *e; + unsigned int c, v; + const unsigned char *e, *s; assert(base <= 10); + s = (const unsigned char *) src; e = s + sz; /* skip leading blanks */ @@ -79,17 +81,18 @@ _libelf_ar_get_number(const char *s, size_t sz, int base, size_t *ret) char * _libelf_ar_get_translated_name(const struct ar_hdr *arh, Elf *ar) { - char c, *s; + char *s; + unsigned char c; size_t len, offset; - const char *buf, *p, *q, *r; + const unsigned char *buf, *p, *q, *r; const size_t bufsize = sizeof(arh->ar_name); assert(arh != NULL); assert(ar->e_kind == ELF_K_AR); - assert((const char *) arh >= ar->e_rawfile && - (const char *) arh < ar->e_rawfile + ar->e_rawsize); + assert((const unsigned char *) arh >= ar->e_rawfile && + (const unsigned char *) arh < ar->e_rawfile + ar->e_rawsize); - buf = arh->ar_name; + buf = (const unsigned char *) arh->ar_name; /* * Check for extended naming. @@ -104,8 +107,8 @@ _libelf_ar_get_translated_name(const struct ar_hdr *arh, Elf *ar) * the archive string table where the actual name * resides. */ - if (_libelf_ar_get_number(buf + 1, bufsize - 1, 10, - &offset) == 0) { + if (_libelf_ar_get_number((const char *) (buf + 1), + bufsize - 1, 10, &offset) == 0) { LIBELF_SET_ERROR(ARCHIVE, 0); return (NULL); } @@ -120,21 +123,21 @@ _libelf_ar_get_translated_name(const struct ar_hdr *arh, Elf *ar) for (; p < r && *p != '/'; p++) ; - len = p - q + 1; /* space for the trailing NUL */ + len = (size_t) (p - q + 1); /* space for the trailing NUL */ if ((s = malloc(len)) == NULL) { LIBELF_SET_ERROR(RESOURCE, 0); return (NULL); } - (void) strncpy(s, q, len - 1); + (void) strncpy(s, (const char *) q, len - 1); s[len - 1] = '\0'; return (s); } else if (IS_EXTENDED_BSD_NAME(buf)) { r = buf + LIBELF_AR_BSD_EXTENDED_NAME_PREFIX_SIZE; - if (_libelf_ar_get_number(r, bufsize - + if (_libelf_ar_get_number((const char *) r, bufsize - LIBELF_AR_BSD_EXTENDED_NAME_PREFIX_SIZE, 10, &len) == 0) { LIBELF_SET_ERROR(ARCHIVE, 0); @@ -153,9 +156,9 @@ _libelf_ar_get_translated_name(const struct ar_hdr *arh, Elf *ar) /* * The file name follows the archive header. */ - q = (const char *) (arh + 1); + q = (const unsigned char *) (arh + 1); - (void) strncpy(s, q, len); + (void) strncpy(s, (const char *) q, len); s[len] = '\0'; return (s); @@ -183,10 +186,10 @@ _libelf_ar_get_translated_name(const struct ar_hdr *arh, Elf *ar) q--; } - len = q - buf + 2; /* Add space for a trailing NUL. */ + len = (size_t) (q - buf + 2); /* Space for a trailing NUL. */ } else { /* The buffer only had blanks. */ - buf = ""; + buf = (const unsigned char *) ""; len = 1; } @@ -195,7 +198,7 @@ _libelf_ar_get_translated_name(const struct ar_hdr *arh, Elf *ar) return (NULL); } - (void) strncpy(s, buf, len - 1); + (void) strncpy(s, (const char *) buf, len - 1); s[len - 1] = '\0'; return (s); @@ -229,8 +232,8 @@ _libelf_ar_open(Elf *e, int reporterror) { size_t sz; int scanahead; - char *s, *end; struct ar_hdr arh; + unsigned char *s, *end; _libelf_init_elf(e, ELF_K_AR); @@ -264,7 +267,7 @@ _libelf_ar_open(Elf *e, int reporterror) (void) memcpy(&(ARH), (S), sizeof((ARH))); \ if ((ARH).ar_fmag[0] != '`' || (ARH).ar_fmag[1] != '\n') \ goto error; \ - if (_libelf_ar_get_number((ARH).ar_size, \ + if (_libelf_ar_get_number((char *) (ARH).ar_size, \ sizeof((ARH).ar_size), 10, &(SZ)) == 0) \ goto error; \ } while (0) diff --git a/libelf/libelf_checksum.c b/libelf/libelf_checksum.c index 8f84aa4d0f05..f05f9a936404 100644 --- a/libelf/libelf_checksum.c +++ b/libelf/libelf_checksum.c @@ -30,7 +30,7 @@ #include "_libelf.h" -ELFTC_VCSID("$Id: libelf_checksum.c 2225 2011-11-26 18:55:54Z jkoshy $"); +ELFTC_VCSID("$Id: libelf_checksum.c 3003 2014-03-22 07:43:10Z jkoshy $"); static unsigned long _libelf_sum(unsigned long c, const unsigned char *s, size_t size) @@ -44,7 +44,7 @@ _libelf_sum(unsigned long c, const unsigned char *s, size_t size) return (c); } -unsigned long +long _libelf_checksum(Elf *e, int elfclass) { size_t shn; @@ -90,11 +90,11 @@ _libelf_checksum(Elf *e, int elfclass) d = NULL; while ((d = elf_rawdata(scn, d)) != NULL) checksum = _libelf_sum(checksum, - (unsigned char *) d->d_buf, d->d_size); + (unsigned char *) d->d_buf, (size_t) d->d_size); } /* * Return a 16-bit checksum compatible with Solaris. */ - return (((checksum >> 16) & 0xFFFFUL) + (checksum & 0xFFFFUL)); + return (long) (((checksum >> 16) & 0xFFFFUL) + (checksum & 0xFFFFUL)); } diff --git a/libelf/libelf_convert.m4 b/libelf/libelf_convert.m4 index 0e0e4fd8ff35..fc9cf394a24d 100644 --- a/libelf/libelf_convert.m4 +++ b/libelf/libelf_convert.m4 @@ -32,7 +32,7 @@ #include "_libelf.h" -ELFTC_VCSID("$Id: libelf_convert.m4 2361 2011-12-28 12:03:05Z jkoshy $"); +ELFTC_VCSID("$Id: libelf_convert.m4 3009 2014-03-23 01:49:59Z jkoshy $"); /* WARNING: GENERATED FROM __file__. */ @@ -143,8 +143,8 @@ define(`SIZEDEP_OFF', 1) # Generates a pair of conversion functions. define(`MAKEPRIMFUNCS',` static int -_libelf_cvt_$1$4_tof(char *dst, size_t dsz, char *src, size_t count, - int byteswap) +_libelf_cvt_$1$4_tof(unsigned char *dst, size_t dsz, unsigned char *src, + size_t count, int byteswap) { Elf$3_$2 t, *s = (Elf$3_$2 *) (uintptr_t) src; size_t c; @@ -166,8 +166,8 @@ _libelf_cvt_$1$4_tof(char *dst, size_t dsz, char *src, size_t count, } static int -_libelf_cvt_$1$4_tom(char *dst, size_t dsz, char *src, size_t count, - int byteswap) +_libelf_cvt_$1$4_tom(unsigned char *dst, size_t dsz, unsigned char *src, + size_t count, int byteswap) { Elf$3_$2 t, *d = (Elf$3_$2 *) (uintptr_t) dst; size_t c; @@ -267,8 +267,8 @@ define(`READ_STRUCT', # `$3': ELF class specifier, one of [`', `32', `64'] define(`MAKECOMPFUNCS', `ifdef(`NOFUNC_'$1$3,`',` static int -_libelf_cvt_$1$3_tof(char *dst, size_t dsz, char *src, size_t count, - int byteswap) +_libelf_cvt_$1$3_tof(unsigned char *dst, size_t dsz, unsigned char *src, + size_t count, int byteswap) { Elf$3_$2 t, *s; size_t c; @@ -288,16 +288,16 @@ _libelf_cvt_$1$3_tof(char *dst, size_t dsz, char *src, size_t count, } static int -_libelf_cvt_$1$3_tom(char *dst, size_t dsz, char *src, size_t count, - int byteswap) +_libelf_cvt_$1$3_tom(unsigned char *dst, size_t dsz, unsigned char *src, + size_t count, int byteswap) { - Elf$3_$2 t, *d; - char *s,*s0; + Elf$3_$2 t, *d; + unsigned char *s,*s0; size_t fsz; fsz = elf$3_fsize(ELF_T_$1, (size_t) 1, EV_CURRENT); d = ((Elf$3_$2 *) (uintptr_t) dst) + (count - 1); - s0 = (char *) src + (count - 1) * fsz; + s0 = src + (count - 1) * fsz; if (dsz < count * sizeof(Elf$3_$2)) return (0); @@ -398,8 +398,8 @@ define(`MAKE_VERSION_CONVERTERS', # conversion function. define(`MAKE_VERSION_CONVERTER',` static int -_libelf_cvt_$1$5_tof(char *dst, size_t dsz, char *src, size_t count, - int byteswap) +_libelf_cvt_$1$5_tof(unsigned char *dst, size_t dsz, unsigned char *src, + size_t count, int byteswap) { Elf$5_$2 t; Elf$5_$3 a; @@ -407,12 +407,12 @@ _libelf_cvt_$1$5_tof(char *dst, size_t dsz, char *src, size_t count, const size_t auxfsz = FSZ(Elf$5_$3_DEF); const size_t vermsz = sizeof(Elf$5_$2); const size_t auxmsz = sizeof(Elf$5_$3); - char * const dstend = dst + dsz; - char * const srcend = src + count; - char *dtmp, *dstaux, *srcaux; + unsigned char * const dstend = dst + dsz; + unsigned char * const srcend = src + count; + unsigned char *dtmp, *dstaux, *srcaux; Elf$5_Word aux, anext, cnt, vnext; - for (dtmp = dst, vnext = ~0; + for (dtmp = dst, vnext = ~0U; vnext != 0 && dtmp + verfsz <= dstend && src + vermsz <= srcend; dtmp += vnext, src += vnext) { @@ -434,7 +434,7 @@ _libelf_cvt_$1$5_tof(char *dst, size_t dsz, char *src, size_t count, return (0); /* Process AUX entries. */ - for (anext = ~0, dstaux = dtmp + aux, srcaux = src + aux; + for (anext = ~0U, dstaux = dtmp + aux, srcaux = src + aux; cnt != 0 && anext != 0 && dstaux + auxfsz <= dstend && srcaux + auxmsz <= srcend; dstaux += anext, srcaux += anext, cnt--) { @@ -462,8 +462,8 @@ _libelf_cvt_$1$5_tof(char *dst, size_t dsz, char *src, size_t count, } static int -_libelf_cvt_$1$5_tom(char *dst, size_t dsz, char *src, size_t count, - int byteswap) +_libelf_cvt_$1$5_tom(unsigned char *dst, size_t dsz, unsigned char *src, + size_t count, int byteswap) { Elf$5_$2 t, *dp; Elf$5_$3 a, *ap; @@ -471,12 +471,12 @@ _libelf_cvt_$1$5_tom(char *dst, size_t dsz, char *src, size_t count, const size_t auxfsz = FSZ(Elf$5_$3_DEF); const size_t vermsz = sizeof(Elf$5_$2); const size_t auxmsz = sizeof(Elf$5_$3); - char * const dstend = dst + dsz; - char * const srcend = src + count; - char *dstaux, *s, *srcaux, *stmp; + unsigned char * const dstend = dst + dsz; + unsigned char * const srcend = src + count; + unsigned char *dstaux, *s, *srcaux, *stmp; Elf$5_Word aux, anext, cnt, vnext; - for (stmp = src, vnext = ~0; + for (stmp = src, vnext = ~0U; vnext != 0 && stmp + verfsz <= srcend && dst + vermsz <= dstend; stmp += vnext, dst += vnext) { @@ -498,7 +498,7 @@ _libelf_cvt_$1$5_tom(char *dst, size_t dsz, char *src, size_t count, return (0); /* Process AUX entries. */ - for (anext = ~0, dstaux = dst + aux, srcaux = stmp + aux; + for (anext = ~0U, dstaux = dst + aux, srcaux = stmp + aux; cnt != 0 && anext != 0 && dstaux + auxmsz <= dstend && srcaux + auxfsz <= srcend; dstaux += anext, srcaux += anext, cnt--) { @@ -536,22 +536,23 @@ divert(0) #define SWAP_IDENT(X) do { (void) (X); } while (0) #define SWAP_HALF(X) do { \ uint16_t _x = (uint16_t) (X); \ - uint16_t _t = _x & 0xFF; \ - _t <<= 8; _x >>= 8; _t |= _x & 0xFF; \ - (X) = _t; \ + uint32_t _t = _x & 0xFFU; \ + _t <<= 8U; _x >>= 8U; _t |= _x & 0xFFU; \ + (X) = (uint16_t) _t; \ } while (0) -#define SWAP_WORD(X) do { \ +#define _SWAP_WORD(X, T) do { \ uint32_t _x = (uint32_t) (X); \ uint32_t _t = _x & 0xFF; \ _t <<= 8; _x >>= 8; _t |= _x & 0xFF; \ _t <<= 8; _x >>= 8; _t |= _x & 0xFF; \ _t <<= 8; _x >>= 8; _t |= _x & 0xFF; \ - (X) = _t; \ + (X) = (T) _t; \ } while (0) -#define SWAP_ADDR32(X) SWAP_WORD(X) -#define SWAP_OFF32(X) SWAP_WORD(X) -#define SWAP_SWORD(X) SWAP_WORD(X) -#define SWAP_WORD64(X) do { \ +#define SWAP_ADDR32(X) _SWAP_WORD(X, Elf32_Addr) +#define SWAP_OFF32(X) _SWAP_WORD(X, Elf32_Off) +#define SWAP_SWORD(X) _SWAP_WORD(X, Elf32_Sword) +#define SWAP_WORD(X) _SWAP_WORD(X, Elf32_Word) +#define _SWAP_WORD64(X, T) do { \ uint64_t _x = (uint64_t) (X); \ uint64_t _t = _x & 0xFF; \ _t <<= 8; _x >>= 8; _t |= _x & 0xFF; \ @@ -561,13 +562,13 @@ divert(0) _t <<= 8; _x >>= 8; _t |= _x & 0xFF; \ _t <<= 8; _x >>= 8; _t |= _x & 0xFF; \ _t <<= 8; _x >>= 8; _t |= _x & 0xFF; \ - (X) = _t; \ + (X) = (T) _t; \ } while (0) -#define SWAP_ADDR64(X) SWAP_WORD64(X) -#define SWAP_LWORD(X) SWAP_WORD64(X) -#define SWAP_OFF64(X) SWAP_WORD64(X) -#define SWAP_SXWORD(X) SWAP_WORD64(X) -#define SWAP_XWORD(X) SWAP_WORD64(X) +#define SWAP_ADDR64(X) _SWAP_WORD64(X, Elf64_Addr) +#define SWAP_LWORD(X) _SWAP_WORD64(X, Elf64_Lword) +#define SWAP_OFF64(X) _SWAP_WORD64(X, Elf64_Off) +#define SWAP_SXWORD(X) _SWAP_WORD64(X, Elf64_Sxword) +#define SWAP_XWORD(X) _SWAP_WORD64(X, Elf64_Xword) /* * C macros to write out various integral values. @@ -578,22 +579,22 @@ divert(0) * - The destination pointer is incremented after the write. */ #define WRITE_BYTE(P,X) do { \ - char *const _p = (char *) (P); \ - _p[0] = (char) (X); \ + unsigned char *const _p = (unsigned char *) (P); \ + _p[0] = (unsigned char) (X); \ (P) = _p + 1; \ } while (0) #define WRITE_HALF(P,X) do { \ uint16_t _t = (X); \ - char *const _p = (char *) (P); \ - const char *const _q = (char *) &_t; \ + unsigned char *const _p = (unsigned char *) (P); \ + const unsigned char *const _q = (unsigned char *) &_t; \ _p[0] = _q[0]; \ _p[1] = _q[1]; \ (P) = _p + 2; \ } while (0) -#define WRITE_WORD(P,X) do { \ - uint32_t _t = (X); \ - char *const _p = (char *) (P); \ - const char *const _q = (char *) &_t; \ +#define WRITE_WORD(P,X) do { \ + uint32_t _t = (uint32_t) (X); \ + unsigned char *const _p = (unsigned char *) (P); \ + const unsigned char *const _q = (unsigned char *) &_t; \ _p[0] = _q[0]; \ _p[1] = _q[1]; \ _p[2] = _q[2]; \ @@ -604,9 +605,9 @@ divert(0) #define WRITE_OFF32(P,X) WRITE_WORD(P,X) #define WRITE_SWORD(P,X) WRITE_WORD(P,X) #define WRITE_WORD64(P,X) do { \ - uint64_t _t = (X); \ - char *const _p = (char *) (P); \ - const char *const _q = (char *) &_t; \ + uint64_t _t = (uint64_t) (X); \ + unsigned char *const _p = (unsigned char *) (P); \ + const unsigned char *const _q = (unsigned char *) &_t; \ _p[0] = _q[0]; \ _p[1] = _q[1]; \ _p[2] = _q[2]; \ @@ -637,41 +638,42 @@ divert(0) */ #define READ_BYTE(P,X) do { \ - const char *const _p = \ - (const char *) (P); \ + const unsigned char *const _p = \ + (const unsigned char *) (P); \ (X) = _p[0]; \ (P) = (P) + 1; \ } while (0) #define READ_HALF(P,X) do { \ uint16_t _t; \ - char *const _q = (char *) &_t; \ - const char *const _p = \ - (const char *) (P); \ + unsigned char *const _q = (unsigned char *) &_t; \ + const unsigned char *const _p = \ + (const unsigned char *) (P); \ _q[0] = _p[0]; \ _q[1] = _p[1]; \ (P) = (P) + 2; \ (X) = _t; \ } while (0) -#define READ_WORD(P,X) do { \ +#define _READ_WORD(P,X,T) do { \ uint32_t _t; \ - char *const _q = (char *) &_t; \ - const char *const _p = \ - (const char *) (P); \ + unsigned char *const _q = (unsigned char *) &_t; \ + const unsigned char *const _p = \ + (const unsigned char *) (P); \ _q[0] = _p[0]; \ _q[1] = _p[1]; \ _q[2] = _p[2]; \ _q[3] = _p[3]; \ (P) = (P) + 4; \ - (X) = _t; \ + (X) = (T) _t; \ } while (0) -#define READ_ADDR32(P,X) READ_WORD(P,X) -#define READ_OFF32(P,X) READ_WORD(P,X) -#define READ_SWORD(P,X) READ_WORD(P,X) -#define READ_WORD64(P,X) do { \ +#define READ_ADDR32(P,X) _READ_WORD(P, X, Elf32_Addr) +#define READ_OFF32(P,X) _READ_WORD(P, X, Elf32_Off) +#define READ_SWORD(P,X) _READ_WORD(P, X, Elf32_Sword) +#define READ_WORD(P,X) _READ_WORD(P, X, Elf32_Word) +#define _READ_WORD64(P,X,T) do { \ uint64_t _t; \ - char *const _q = (char *) &_t; \ - const char *const _p = \ - (const char *) (P); \ + unsigned char *const _q = (unsigned char *) &_t; \ + const unsigned char *const _p = \ + (const unsigned char *) (P); \ _q[0] = _p[0]; \ _q[1] = _p[1]; \ _q[2] = _p[2]; \ @@ -681,13 +683,13 @@ divert(0) _q[6] = _p[6]; \ _q[7] = _p[7]; \ (P) = (P) + 8; \ - (X) = _t; \ + (X) = (T) _t; \ } while (0) -#define READ_ADDR64(P,X) READ_WORD64(P,X) -#define READ_LWORD(P,X) READ_WORD64(P,X) -#define READ_OFF64(P,X) READ_WORD64(P,X) -#define READ_SXWORD(P,X) READ_WORD64(P,X) -#define READ_XWORD(P,X) READ_WORD64(P,X) +#define READ_ADDR64(P,X) _READ_WORD64(P, X, Elf64_Addr) +#define READ_LWORD(P,X) _READ_WORD64(P, X, Elf64_Lword) +#define READ_OFF64(P,X) _READ_WORD64(P, X, Elf64_Off) +#define READ_SXWORD(P,X) _READ_WORD64(P, X, Elf64_Sxword) +#define READ_XWORD(P,X) _READ_WORD64(P, X, Elf64_Xword) #define READ_IDENT(P,X) do { \ (void) memcpy((X), (P), sizeof((X))); \ (P) = (P) + EI_NIDENT; \ @@ -707,8 +709,8 @@ MAKE_VERSION_CONVERTERS(VNEED,Verneed,Vernaux,vn) */ static int -_libelf_cvt_BYTE_tox(char *dst, size_t dsz, char *src, size_t count, - int byteswap) +_libelf_cvt_BYTE_tox(unsigned char *dst, size_t dsz, unsigned char *src, + size_t count, int byteswap) { (void) byteswap; if (dsz < count) @@ -732,24 +734,24 @@ _libelf_cvt_BYTE_tox(char *dst, size_t dsz, char *src, size_t count, */ static int -_libelf_cvt_GNUHASH32_tom(char *dst, size_t dsz, char *src, size_t srcsz, - int byteswap) +_libelf_cvt_GNUHASH32_tom(unsigned char *dst, size_t dsz, unsigned char *src, + size_t srcsz, int byteswap) { return (_libelf_cvt_WORD_tom(dst, dsz, src, srcsz / sizeof(uint32_t), byteswap)); } static int -_libelf_cvt_GNUHASH32_tof(char *dst, size_t dsz, char *src, size_t srcsz, - int byteswap) +_libelf_cvt_GNUHASH32_tof(unsigned char *dst, size_t dsz, unsigned char *src, + size_t srcsz, int byteswap) { return (_libelf_cvt_WORD_tof(dst, dsz, src, srcsz / sizeof(uint32_t), byteswap)); } static int -_libelf_cvt_GNUHASH64_tom(char *dst, size_t dsz, char *src, size_t srcsz, - int byteswap) +_libelf_cvt_GNUHASH64_tom(unsigned char *dst, size_t dsz, unsigned char *src, + size_t srcsz, int byteswap) { size_t sz; uint64_t t64, *bloom64; @@ -834,8 +836,8 @@ _libelf_cvt_GNUHASH64_tom(char *dst, size_t dsz, char *src, size_t srcsz, } static int -_libelf_cvt_GNUHASH64_tof(char *dst, size_t dsz, char *src, size_t srcsz, - int byteswap) +_libelf_cvt_GNUHASH64_tof(unsigned char *dst, size_t dsz, unsigned char *src, + size_t srcsz, int byteswap) { uint32_t *s32; size_t sz, hdrsz; @@ -921,8 +923,8 @@ _libelf_cvt_GNUHASH64_tof(char *dst, size_t dsz, char *src, size_t srcsz, * The destination buffer needs to be at least `count' bytes in size. */ static int -_libelf_cvt_NOTE_tom(char *dst, size_t dsz, char *src, size_t count, - int byteswap) +_libelf_cvt_NOTE_tom(unsigned char *dst, size_t dsz, unsigned char *src, + size_t count, int byteswap) { uint32_t namesz, descsz, type; Elf_Note *en; @@ -962,8 +964,8 @@ _libelf_cvt_NOTE_tom(char *dst, size_t dsz, char *src, size_t count, dst += sizeof(Elf_Note); count -= hdrsz; - ROUNDUP2(namesz, 4); - ROUNDUP2(descsz, 4); + ROUNDUP2(namesz, 4U); + ROUNDUP2(descsz, 4U); sz = namesz + descsz; @@ -983,8 +985,8 @@ _libelf_cvt_NOTE_tom(char *dst, size_t dsz, char *src, size_t count, } static int -_libelf_cvt_NOTE_tof(char *dst, size_t dsz, char *src, size_t count, - int byteswap) +_libelf_cvt_NOTE_tof(unsigned char *dst, size_t dsz, unsigned char *src, + size_t count, int byteswap) { uint32_t namesz, descsz, type; Elf_Note *en; @@ -1015,8 +1017,8 @@ _libelf_cvt_NOTE_tof(char *dst, size_t dsz, char *src, size_t count, src += sizeof(Elf_Note); - ROUNDUP2(namesz, 4); - ROUNDUP2(descsz, 4); + ROUNDUP2(namesz, 4U); + ROUNDUP2(descsz, 4U); sz = namesz + descsz; @@ -1034,14 +1036,14 @@ _libelf_cvt_NOTE_tof(char *dst, size_t dsz, char *src, size_t count, } struct converters { - int (*tof32)(char *dst, size_t dsz, char *src, size_t cnt, - int byteswap); - int (*tom32)(char *dst, size_t dsz, char *src, size_t cnt, - int byteswap); - int (*tof64)(char *dst, size_t dsz, char *src, size_t cnt, - int byteswap); - int (*tom64)(char *dst, size_t dsz, char *src, size_t cnt, - int byteswap); + int (*tof32)(unsigned char *dst, size_t dsz, unsigned char *src, + size_t cnt, int byteswap); + int (*tom32)(unsigned char *dst, size_t dsz, unsigned char *src, + size_t cnt, int byteswap); + int (*tof64)(unsigned char *dst, size_t dsz, unsigned char *src, + size_t cnt, int byteswap); + int (*tom64)(unsigned char *dst, size_t dsz, unsigned char *src, + size_t cnt, int byteswap); }; @@ -1070,7 +1072,8 @@ CONVERTER_NAMES(ELF_TYPE_LIST) }; int (*_libelf_get_translator(Elf_Type t, int direction, int elfclass)) - (char *_dst, size_t dsz, char *_src, size_t _cnt, int _byteswap) + (unsigned char *_dst, size_t dsz, unsigned char *_src, size_t _cnt, + int _byteswap) { assert(elfclass == ELFCLASS32 || elfclass == ELFCLASS64); assert(direction == ELF_TOFILE || direction == ELF_TOMEMORY); diff --git a/libelf/libelf_data.c b/libelf/libelf_data.c index 809002f71e78..f078c36ab755 100644 --- a/libelf/libelf_data.c +++ b/libelf/libelf_data.c @@ -30,11 +30,14 @@ #include "_libelf.h" -ELFTC_VCSID("$Id: libelf_data.c 2225 2011-11-26 18:55:54Z jkoshy $"); +ELFTC_VCSID("$Id: libelf_data.c 3080 2014-07-28 08:46:17Z jkoshy $"); int _libelf_xlate_shtype(uint32_t sht) { + /* + * Look for known section types. + */ switch (sht) { case SHT_DYNAMIC: return (ELF_T_DYN); @@ -83,6 +86,18 @@ _libelf_xlate_shtype(uint32_t sht) case SHT_SUNW_versym: /* == SHT_GNU_versym */ return (ELF_T_HALF); default: + /* + * Values in the range [SHT_LOOS..SHT_HIUSER] (i.e., + * OS, processor and user-defined section types) are + * legal, but since we do not know anything more about + * their semantics, we return a type of ELF_T_BYTE. + */ + if (sht >= SHT_LOOS && sht <= SHT_HIUSER) + return (ELF_T_BYTE); + + /* + * Other values are unsupported. + */ return (-1); } } diff --git a/libelf/libelf_ehdr.c b/libelf/libelf_ehdr.c index 363a0a834b9f..d59f61f2ba1e 100644 --- a/libelf/libelf_ehdr.c +++ b/libelf/libelf_ehdr.c @@ -33,7 +33,7 @@ #include "_libelf.h" -ELFTC_VCSID("$Id: libelf_ehdr.c 2225 2011-11-26 18:55:54Z jkoshy $"); +ELFTC_VCSID("$Id: libelf_ehdr.c 3009 2014-03-23 01:49:59Z jkoshy $"); /* * Retrieve counts for sections, phdrs and the section string table index @@ -45,7 +45,8 @@ _libelf_load_extended(Elf *e, int ec, uint64_t shoff, uint16_t phnum, { Elf_Scn *scn; size_t fsz; - int (*xlator)(char *_d, size_t _dsz, char *_s, size_t _c, int _swap); + int (*xlator)(unsigned char *_d, size_t _dsz, unsigned char *_s, + size_t _c, int _swap); uint32_t shtype; assert(STAILQ_EMPTY(&e->e_u.e_elf.e_scn)); @@ -62,8 +63,8 @@ _libelf_load_extended(Elf *e, int ec, uint64_t shoff, uint16_t phnum, return (0); xlator = _libelf_get_translator(ELF_T_SHDR, ELF_TOMEMORY, ec); - (*xlator)((char *) &scn->s_shdr, sizeof(scn->s_shdr), - e->e_rawfile + shoff, (size_t) 1, + (*xlator)((unsigned char *) &scn->s_shdr, sizeof(scn->s_shdr), + (unsigned char *) e->e_rawfile + shoff, (size_t) 1, e->e_byteorder != LIBELF_PRIVATE(byteorder)); #define GET_SHDR_MEMBER(M) ((ec == ELFCLASS32) ? scn->s_shdr.s_shdr32.M : \ @@ -74,7 +75,7 @@ _libelf_load_extended(Elf *e, int ec, uint64_t shoff, uint16_t phnum, return (0); } - e->e_u.e_elf.e_nscn = GET_SHDR_MEMBER(sh_size); + e->e_u.e_elf.e_nscn = (size_t) GET_SHDR_MEMBER(sh_size); e->e_u.e_elf.e_nphdr = (phnum != PN_XNUM) ? phnum : GET_SHDR_MEMBER(sh_info); e->e_u.e_elf.e_strndx = (strndx != SHN_XINDEX) ? strndx : @@ -92,7 +93,7 @@ _libelf_load_extended(Elf *e, int ec, uint64_t shoff, uint16_t phnum, eh->e_ident[EI_MAG3] = ELFMAG3; \ eh->e_ident[EI_CLASS] = ELFCLASS##SZ; \ eh->e_ident[EI_DATA] = ELFDATANONE; \ - eh->e_ident[EI_VERSION] = LIBELF_PRIVATE(version); \ + eh->e_ident[EI_VERSION] = LIBELF_PRIVATE(version) & 0xFFU; \ eh->e_machine = EM_NONE; \ eh->e_type = ELF_K_NONE; \ eh->e_version = LIBELF_PRIVATE(version); \ @@ -105,7 +106,8 @@ _libelf_ehdr(Elf *e, int ec, int allocate) size_t fsz, msz; uint16_t phnum, shnum, strndx; uint64_t shoff; - int (*xlator)(char *_d, size_t _dsz, char *_s, size_t _c, int _swap); + int (*xlator)(unsigned char *_d, size_t _dsz, unsigned char *_s, + size_t _c, int _swap); assert(ec == ELFCLASS32 || ec == ELFCLASS64); @@ -167,7 +169,7 @@ _libelf_ehdr(Elf *e, int ec, int allocate) return (ehdr); xlator = _libelf_get_translator(ELF_T_EHDR, ELF_TOMEMORY, ec); - (*xlator)(ehdr, msz, e->e_rawfile, (size_t) 1, + (*xlator)((unsigned char*) ehdr, msz, e->e_rawfile, (size_t) 1, e->e_byteorder != LIBELF_PRIVATE(byteorder)); /* diff --git a/libelf/libelf_extended.c b/libelf/libelf_extended.c index 5343696548d4..f1a77d17efba 100644 --- a/libelf/libelf_extended.c +++ b/libelf/libelf_extended.c @@ -31,7 +31,7 @@ #include "_libelf.h" -ELFTC_VCSID("$Id: libelf_extended.c 2225 2011-11-26 18:55:54Z jkoshy $"); +ELFTC_VCSID("$Id: libelf_extended.c 3005 2014-03-22 07:43:25Z jkoshy $"); /* * Retrieve section #0, allocating a new section if needed. @@ -69,9 +69,9 @@ _libelf_setshnum(Elf *e, void *eh, int ec, size_t shnum) } if (ec == ELFCLASS32) - ((Elf32_Ehdr *) eh)->e_shnum = shnum; + ((Elf32_Ehdr *) eh)->e_shnum = shnum & 0xFFFFU; else - ((Elf64_Ehdr *) eh)->e_shnum = shnum; + ((Elf64_Ehdr *) eh)->e_shnum = shnum & 0xFFFFU; return (1); @@ -99,9 +99,9 @@ _libelf_setshstrndx(Elf *e, void *eh, int ec, size_t shstrndx) } if (ec == ELFCLASS32) - ((Elf32_Ehdr *) eh)->e_shstrndx = shstrndx; + ((Elf32_Ehdr *) eh)->e_shstrndx = shstrndx & 0xFFFFU; else - ((Elf64_Ehdr *) eh)->e_shstrndx = shstrndx; + ((Elf64_Ehdr *) eh)->e_shstrndx = shstrndx & 0xFFFFU; return (1); } @@ -128,9 +128,9 @@ _libelf_setphnum(Elf *e, void *eh, int ec, size_t phnum) } if (ec == ELFCLASS32) - ((Elf32_Ehdr *) eh)->e_phnum = phnum; + ((Elf32_Ehdr *) eh)->e_phnum = phnum & 0xFFFFU; else - ((Elf64_Ehdr *) eh)->e_phnum = phnum; + ((Elf64_Ehdr *) eh)->e_phnum = phnum & 0xFFFFU; return (1); } diff --git a/libelf/libelf_memory.c b/libelf/libelf_memory.c index 892e909b079c..cb8e8f20438a 100644 --- a/libelf/libelf_memory.c +++ b/libelf/libelf_memory.c @@ -31,7 +31,7 @@ #include "_libelf.h" -ELFTC_VCSID("$Id: libelf_memory.c 2368 2011-12-29 06:34:28Z jkoshy $"); +ELFTC_VCSID("$Id: libelf_memory.c 3013 2014-03-23 06:16:59Z jkoshy $"); /* * Create an ELF descriptor for a memory image, optionally reporting @@ -39,7 +39,7 @@ ELFTC_VCSID("$Id: libelf_memory.c 2368 2011-12-29 06:34:28Z jkoshy $"); */ Elf * -_libelf_memory(char *image, size_t sz, int reporterror) +_libelf_memory(unsigned char *image, size_t sz, int reporterror) { Elf *e; int e_class; @@ -89,7 +89,7 @@ _libelf_memory(char *image, size_t sz, int reporterror) e->e_version = e_version; } } else if (sz >= SARMAG && - strncmp(image, ARMAG, (size_t) SARMAG) == 0) + strncmp((const char *) image, ARMAG, (size_t) SARMAG) == 0) return (_libelf_ar_open(e, reporterror)); return (e); diff --git a/libelf/libelf_open.c b/libelf/libelf_open.c index 6d93c73a0312..7ec33952dfe1 100644 --- a/libelf/libelf_open.c +++ b/libelf/libelf_open.c @@ -39,7 +39,7 @@ #include #endif -ELFTC_VCSID("$Id: libelf_open.c 2932 2013-03-30 01:26:04Z jkoshy $"); +ELFTC_VCSID("$Id: libelf_open.c 3007 2014-03-22 08:10:14Z jkoshy $"); #define _LIBELF_INITSIZE (64*1024) @@ -73,11 +73,11 @@ _libelf_read_special_file(int fd, size_t *fsz) } do { - readsz = bufsz - datasz; + assert(bufsz - datasz > 0); t = buf + datasz; - if ((readsz = read(fd, t, readsz)) <= 0) + if ((readsz = read(fd, t, bufsz - datasz)) <= 0) break; - datasz += readsz; + datasz += (size_t) readsz; } while (datasz < bufsz); } while (readsz > 0); diff --git a/libelf/libelf_phdr.c b/libelf/libelf_phdr.c index f2eb697fbc04..f44c3cd7e44e 100644 --- a/libelf/libelf_phdr.c +++ b/libelf/libelf_phdr.c @@ -33,7 +33,7 @@ #include "_libelf.h" -ELFTC_VCSID("$Id: libelf_phdr.c 2931 2013-03-23 11:41:07Z jkoshy $"); +ELFTC_VCSID("$Id: libelf_phdr.c 3009 2014-03-23 01:49:59Z jkoshy $"); void * _libelf_getphdr(Elf *e, int ec) @@ -44,7 +44,8 @@ _libelf_getphdr(Elf *e, int ec) Elf32_Ehdr *eh32; Elf64_Ehdr *eh64; void *ehdr, *phdr; - int (*xlator)(char *_d, size_t _dsz, char *_s, size_t _c, int _swap); + int (*xlator)(unsigned char *_d, size_t _dsz, unsigned char *_s, + size_t _c, int _swap); assert(ec == ELFCLASS32 || ec == ELFCLASS64); diff --git a/libelf/libelf_xlate.c b/libelf/libelf_xlate.c index eda6df8c2260..4cc6a452e4dd 100644 --- a/libelf/libelf_xlate.c +++ b/libelf/libelf_xlate.c @@ -31,7 +31,7 @@ #include "_libelf.h" -ELFTC_VCSID("$Id: libelf_xlate.c 2225 2011-11-26 18:55:54Z jkoshy $"); +ELFTC_VCSID("$Id: libelf_xlate.c 3007 2014-03-22 08:10:14Z jkoshy $"); /* * Translate to/from the file representation of ELF objects. @@ -99,10 +99,10 @@ _libelf_xlate(Elf_Data *dst, const Elf_Data *src, unsigned int encoding, * buffer. */ if (direction == ELF_TOMEMORY) { - cnt = src->d_size / fsz; + cnt = (size_t) src->d_size / fsz; dsz = cnt * msz; } else { - cnt = src->d_size / msz; + cnt = (size_t) src->d_size / msz; dsz = cnt * fsz; } @@ -112,9 +112,9 @@ _libelf_xlate(Elf_Data *dst, const Elf_Data *src, unsigned int encoding, } sb = (uintptr_t) src->d_buf; - se = sb + src->d_size; + se = sb + (size_t) src->d_size; db = (uintptr_t) dst->d_buf; - de = db + dst->d_size; + de = db + (size_t) dst->d_size; /* * Check for overlapping buffers. Note that db == sb is diff --git a/libelftc/elftc_copyfile.c b/libelftc/elftc_copyfile.c index 0bacaf45e769..7df1678e702d 100644 --- a/libelftc/elftc_copyfile.c +++ b/libelftc/elftc_copyfile.c @@ -37,7 +37,7 @@ #include #endif -ELFTC_VCSID("$Id: elftc_copyfile.c 2318 2011-12-11 10:54:27Z jkoshy $"); +ELFTC_VCSID("$Id: elftc_copyfile.c 2981 2014-02-01 02:41:13Z jkoshy $"); /* * Copy the contents referenced by 'ifd' to 'ofd'. Returns 0 on @@ -79,11 +79,13 @@ elftc_copyfile(int ifd, int ofd) * If mmap() is not available, or if the mmap() operation * failed, allocate a buffer, and read in input data. */ - if (buf == NULL) { + if (buf_mmapped == false) { if ((buf = malloc(sb.st_size)) == NULL) return (-1); - if (read(ifd, buf, sb.st_size) != sb.st_size) + if (read(ifd, buf, sb.st_size) != sb.st_size) { + free(buf); return (-1); + } } /* diff --git a/libelftc/elftc_demangle.c b/libelftc/elftc_demangle.c index c55564e3df63..9639d630c6e8 100644 --- a/libelftc/elftc_demangle.c +++ b/libelftc/elftc_demangle.c @@ -29,14 +29,13 @@ #include #include #include -#include #include #include #include #include "_libelftc.h" -ELFTC_VCSID("$Id: elftc_demangle.c 2065 2011-10-26 15:24:47Z jkoshy $"); +ELFTC_VCSID("$Id: elftc_demangle.c 3030 2014-05-01 06:30:48Z kaiwang27 $"); static int is_mangled(const char *s, int style) diff --git a/libelftc/libelftc.h b/libelftc/libelftc.h index aa6b0b6ffe1e..85e4feb3a710 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 2863 2013-01-06 03:18:32Z jkoshy $ + * $Id: libelftc.h 3031 2014-05-01 17:45:41Z jkoshy $ */ #ifndef _LIBELFTC_H_ @@ -34,6 +34,9 @@ #include +/* + * Types meant to be opaque to the consumers of these APIs. + */ typedef struct _Elftc_Bfd_Target Elftc_Bfd_Target; typedef struct _Elftc_String_Table Elftc_String_Table; diff --git a/libelftc/libelftc_dem_gnu3.c b/libelftc/libelftc_dem_gnu3.c index bd54f549ddb8..05a6302816c9 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 2179 2011-11-18 03:05:47Z jkoshy $"); +ELFTC_VCSID("$Id: libelftc_dem_gnu3.c 3123 2014-12-21 05:46:19Z kaiwang27 $"); /** * @file cpp_demangle.c @@ -156,7 +156,7 @@ static int vector_type_qualifier_init(struct vector_type_qualifier *); static int vector_type_qualifier_push(struct vector_type_qualifier *, enum type_qualifier); -int cpp_demangle_gnu3_push_head; +static int cpp_demangle_gnu3_push_head; /** * @brief Decode the input string by IA-64 C++ ABI style. diff --git a/mk/elftoolchain.lib.mk b/mk/elftoolchain.lib.mk index fab71507cb2c..f62dfc0ffdcc 100644 --- a/mk/elftoolchain.lib.mk +++ b/mk/elftoolchain.lib.mk @@ -1,5 +1,5 @@ # -# $Id: elftoolchain.lib.mk 2796 2012-12-19 12:44:09Z jkoshy $ +# $Id: elftoolchain.lib.mk 3026 2014-04-18 16:20:30Z jkoshy $ # .if !defined(TOP) @@ -11,7 +11,10 @@ .include # Support a 'clobber' target. -clobber: clean .PHONY +clobber: clean os-specific-clobber .PHONY + +# Remove '.depend' files on a "make clean". +CLEANFILES+= .depend # Adjust CFLAGS CFLAGS+= -I. # OBJDIR diff --git a/mk/elftoolchain.os.mk b/mk/elftoolchain.os.mk index 31d37959f6bb..ab7c227dfeee 100644 --- a/mk/elftoolchain.os.mk +++ b/mk/elftoolchain.os.mk @@ -1,5 +1,5 @@ # -# $Id: elftoolchain.os.mk 2068 2011-10-26 15:49:07Z jkoshy $ +# $Id: elftoolchain.os.mk 2985 2014-03-06 03:24:35Z jkoshy $ # # OS specific build instructions @@ -19,4 +19,8 @@ OS_HOST != uname -s .include "${.CURDIR}/os.${OS_HOST}.mk" .endif +# Supply an OS-specific "clobber" rule, if one was not specified. +.if !target(os-specific-clobber) +os-specific-clobber: .PHONY +.endif .endif diff --git a/mk/elftoolchain.prog.mk b/mk/elftoolchain.prog.mk index 8d822cdf58ea..f19902a9a830 100644 --- a/mk/elftoolchain.prog.mk +++ b/mk/elftoolchain.prog.mk @@ -1,7 +1,7 @@ # # Rules for building programs. # -# $Id: elftoolchain.prog.mk 2796 2012-12-19 12:44:09Z jkoshy $ +# $Id: elftoolchain.prog.mk 2985 2014-03-06 03:24:35Z jkoshy $ .if !defined(TOP) .error Make variable \"TOP\" has not been defined. @@ -76,7 +76,7 @@ ${_L:R}.o: ${_Y:R}.h .include "${TOP}/mk/elftoolchain.m4.mk" # Support a 'clobber' target. -clobber: clean .PHONY +clobber: clean os-specific-clobber .PHONY .if defined(DEBUG) CFLAGS:= ${CFLAGS:N-O*} -g diff --git a/mk/elftoolchain.subdir.mk b/mk/elftoolchain.subdir.mk index c41878d2f5c6..fa3c60e07187 100644 --- a/mk/elftoolchain.subdir.mk +++ b/mk/elftoolchain.subdir.mk @@ -1,6 +1,6 @@ # # Rules for recursing into directories -# $Id: elftoolchain.subdir.mk 2292 2011-12-04 08:09:17Z jkoshy $ +# $Id: elftoolchain.subdir.mk 3023 2014-04-17 18:06:06Z jkoshy $ # Pass down 'test' as a valid target. @@ -12,8 +12,8 @@ clobber test:: _SUBDIR SUBDIR_TARGETS+= clobber test .elif ${OS_HOST} == OpenBSD clobber test:: _SUBDIRUSE -.else # NetBSD -TARGETS+= clobber test +.else # NetBSD, pmake on Linux +TARGETS+= cleandepend clobber test .endif .include diff --git a/mk/elftoolchain.tetbase.mk b/mk/elftoolchain.tetbase.mk new file mode 100644 index 000000000000..6eeebc1da722 --- /dev/null +++ b/mk/elftoolchain.tetbase.mk @@ -0,0 +1,46 @@ +# $Id$ + +# Convenience rules for the top level directory containing a TET-based test +# suite. + +.if !defined(TOP) +.error Make variable \"TOP\" has not been defined. +.endif + +.include "${TOP}/mk/elftoolchain.tetvars.mk" + +.MAIN: all +.PHONY: clobber execute tccbuild tccclean test + + +# Set up the environment for invoking "tcc", based on the target +# specified. + +.if !defined(TET_EXECUTE) +TET_EXECUTE= ${.OBJDIR} +.endif + +.if make(tccbuild) +TET_OPTIONS+= -b +.endif + +.if make(tccclean) +TET_OPTIONS+= -c +.endif + +.if make(execute) || make(test) +TET_OPTIONS+= -e +.endif + +execute tccbuild tccclean test: + TET_ROOT=${TET_ROOT} TET_EXECUTE=${TET_EXECUTE} \ + TET_SUITE_ROOT=${.CURDIR} ${TET_ROOT}/bin/tcc ${TET_OPTIONS} . + +clobber: clean + rm -rf ${TET_RESULTS_DIR} ${TET_TMP_DIR} + +# Ensure that a 'make test' does not recurse further into the test suite's +# directory hierarchy. +.if !make(test) +.include "${TOP}/mk/elftoolchain.subdir.mk" +.endif diff --git a/mk/os.Linux.mk b/mk/os.Linux.mk index 553c3e14bc32..a8208c8a846f 100644 --- a/mk/os.Linux.mk +++ b/mk/os.Linux.mk @@ -1,6 +1,14 @@ -# $Id: os.Linux.mk 2569 2012-09-04 16:34:04Z jkoshy $ +# $Id: os.Linux.mk 3103 2014-11-02 10:07:01Z jkoshy $ # -# Build recipes for Debian GNU/Linux based operating systems. +# Build recipes for GNU/Linux based operating systems. + +OS_DISTRIBUTION != lsb_release -s -i || echo unknown +OS_DISTRIBUTION_VERSION != lsb_release -s -r || echo unknown + +.if ${OS_DISTRIBUTION} == "unknown" || \ + ${OS_DISTRIBUTION_VERSION} == "unknown" +.error ERROR: Unknown host OS distribution. +.endif MKDOC?= yes # Build documentation. MKLINT?= no diff --git a/mk/os.NetBSD.mk b/mk/os.NetBSD.mk index 99d6b9953e72..6ebd1c193e1f 100644 --- a/mk/os.NetBSD.mk +++ b/mk/os.NetBSD.mk @@ -1,4 +1,4 @@ -# $Id: os.NetBSD.mk 2569 2012-09-04 16:34:04Z jkoshy $ +# $Id: os.NetBSD.mk 2986 2014-03-06 03:29:12Z jkoshy $ # # Build recipes for NetBSD. @@ -11,3 +11,11 @@ MKNOWEB?= no # Build literate programs. # Literate programming utility. NOWEB?= /usr/pkgsrc/bin/noweb + +# NetBSD's 'clean' target does not remove 'cat[0-9]' and 'html[0-9]' +# files generate from manual page sources. Augment the 'clobber' +# target to remove these. +os-specific-clobber: .PHONY +.for f in cat html + rm -f ${MANPAGES:@M@${M:R}.$f${M:E}@} +.endfor diff --git a/nm/nm.c b/nm/nm.c index 6c10e0dbf586..9afe0baa9b63 100644 --- a/nm/nm.c +++ b/nm/nm.c @@ -48,7 +48,7 @@ #include "_elftc.h" -ELFTC_VCSID("$Id: nm.c 2484 2012-04-07 15:52:05Z kaiwang27 $"); +ELFTC_VCSID("$Id: nm.c 3124 2014-12-21 05:46:28Z kaiwang27 $"); /* symbol information list */ STAILQ_HEAD(sym_head, sym_entry); @@ -65,7 +65,7 @@ typedef void (*fn_sym_print)(const GElf_Sym *); typedef int (*fn_filter)(char, const GElf_Sym *, const char *); /* output filter list */ -SLIST_HEAD(filter_head, filter_entry) nm_out_filter = +static SLIST_HEAD(filter_head, filter_entry) nm_out_filter = SLIST_HEAD_INITIALIZER(nm_out_filter); struct filter_entry { diff --git a/readelf/readelf.1 b/readelf/readelf.1 index 9a6efe58fab0..8419d95fbce8 100644 --- a/readelf/readelf.1 +++ b/readelf/readelf.1 @@ -22,7 +22,7 @@ .\" (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: readelf.1 2577 2012-09-13 16:07:04Z jkoshy $ +.\" $Id: readelf.1 3059 2014-06-02 00:42:32Z kaiwang27 $ .\" .Dd September 13, 2012 .Os @@ -139,7 +139,7 @@ option names: .It p Ta pubnames Ta Show global names. .It r Ta aranges|ranges Ta Show address range information. .It s Ta str Ta Show the debug string table. -.It F Ta Ta Show frame information, displaying register rules. +.It F Ta frames-interp Ta Show frame information, displaying register rules. .It L Ta decodedline Ta Show line information in decoded form. .It R Ta Ranges Ta Show range lists. .El diff --git a/readelf/readelf.c b/readelf/readelf.c index 779a7ba9e875..16159ad09ea9 100644 --- a/readelf/readelf.c +++ b/readelf/readelf.c @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2009,2010 Kai Wang + * Copyright (c) 2009-2014 Kai Wang * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -46,7 +46,7 @@ #include "_elftc.h" -ELFTC_VCSID("$Id: readelf.c 2946 2013-05-26 08:00:11Z kaiwang27 $"); +ELFTC_VCSID("$Id: readelf.c 3110 2014-12-20 08:32:46Z kaiwang27 $"); /* * readelf(1) options. @@ -145,6 +145,9 @@ struct readelf { Elf *elf; /* underlying ELF descriptor. */ Elf *ar; /* archive ELF descriptor. */ Dwarf_Debug dbg; /* DWARF handle. */ + Dwarf_Half cu_psize; /* DWARF CU pointer size. */ + Dwarf_Half cu_osize; /* DWARF CU offset size. */ + Dwarf_Half cu_ver; /* DWARF CU version. */ GElf_Ehdr ehdr; /* ELF header. */ int ec; /* ELF class. */ size_t shnum; /* #sections. */ @@ -254,6 +257,30 @@ static void dump_arm_attributes(struct readelf *re, uint8_t *p, uint8_t *pe); static void dump_attributes(struct readelf *re); static uint8_t *dump_compatibility_tag(uint8_t *p); static void dump_dwarf(struct readelf *re); +static void dump_dwarf_abbrev(struct readelf *re); +static void dump_dwarf_aranges(struct readelf *re); +static void dump_dwarf_block(struct readelf *re, uint8_t *b, + Dwarf_Unsigned len); +static void dump_dwarf_die(struct readelf *re, Dwarf_Die die, int level); +static void dump_dwarf_frame(struct readelf *re, int alt); +static void dump_dwarf_frame_inst(struct readelf *re, Dwarf_Cie cie, + uint8_t *insts, Dwarf_Unsigned len, Dwarf_Unsigned caf, Dwarf_Signed daf, + Dwarf_Addr pc, Dwarf_Debug dbg); +static int dump_dwarf_frame_regtable(struct readelf *re, Dwarf_Fde fde, + Dwarf_Addr pc, Dwarf_Unsigned func_len, Dwarf_Half cie_ra); +static void dump_dwarf_frame_section(struct readelf *re, struct section *s, + int alt); +static void dump_dwarf_info(struct readelf *re, Dwarf_Bool is_info); +static void dump_dwarf_macinfo(struct readelf *re); +static void dump_dwarf_line(struct readelf *re); +static void dump_dwarf_line_decoded(struct readelf *re); +static void dump_dwarf_loc(struct readelf *re, Dwarf_Loc *lr); +static void dump_dwarf_loclist(struct readelf *re); +static void dump_dwarf_pubnames(struct readelf *re); +static void dump_dwarf_ranges(struct readelf *re); +static void dump_dwarf_ranges_foreach(struct readelf *re, Dwarf_Die die, + Dwarf_Addr base); +static void dump_dwarf_str(struct readelf *re); static void dump_eflags(struct readelf *re, uint64_t e_flags); static void dump_elf(struct readelf *re); static void dump_dyn_val(struct readelf *re, GElf_Dyn *dyn, uint32_t stab); @@ -282,8 +309,12 @@ static void dump_ver(struct readelf *re); static void dump_verdef(struct readelf *re, int dump); static void dump_verneed(struct readelf *re, int dump); static void dump_versym(struct readelf *re); -static struct dumpop *find_dumpop(struct readelf *re, size_t si, const char *sn, - int op, int t); +static const char *dwarf_reg(unsigned int mach, unsigned int reg); +static const char *dwarf_regname(struct readelf *re, unsigned int num); +static struct dumpop *find_dumpop(struct readelf *re, size_t si, + const char *sn, int op, int t); +static char *get_regoff_str(struct readelf *re, Dwarf_Half reg, + Dwarf_Addr off); static const char *get_string(struct readelf *re, int strtab, size_t off); static const char *get_symbol_name(struct readelf *re, int symtab, int i); static uint64_t get_symbol_value(struct readelf *re, int symtab, int i); @@ -298,8 +329,12 @@ static const char *ppc_abi_vector(uint64_t vec); static const char *r_type(unsigned int mach, unsigned int type); static void readelf_usage(void); static void readelf_version(void); +static void search_loclist_at(struct readelf *re, Dwarf_Die die, + Dwarf_Unsigned lowpc); static void search_ver(struct readelf *re); static const char *section_type(unsigned int mach, unsigned int stype); +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 stype); @@ -487,6 +522,7 @@ elf_machine(unsigned int mach) case EM_SEP: return "Sharp embedded microprocessor"; case EM_ARCA: return "Arca RISC Microprocessor"; case EM_UNICORE: return "Microprocessor series from PKU-Unity Ltd"; + case EM_AARCH64: return "AArch64"; default: snprintf(s_mach, sizeof(s_mach), "", mach); return (s_mach); @@ -1041,6 +1077,67 @@ r_type(unsigned int mach, unsigned int type) case 37: return "R_386_TLS_TPOFF32"; default: return ""; } + 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 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 1031: return "R_AARCH64_TLSDESC"; + default: return ""; + } case EM_ARM: switch(type) { case 0: return "R_ARM_NONE"; @@ -2185,6 +2282,124 @@ ppc_abi_vector(uint64_t vec) } } +static const char * +dwarf_reg(unsigned int mach, unsigned int reg) +{ + + switch (mach) { + case EM_386: + switch (reg) { + case 0: return "eax"; + case 1: return "ecx"; + case 2: return "edx"; + case 3: return "ebx"; + case 4: return "esp"; + case 5: return "ebp"; + case 6: return "esi"; + case 7: return "edi"; + case 8: return "eip"; + case 9: return "eflags"; + case 11: return "st0"; + case 12: return "st1"; + case 13: return "st2"; + case 14: return "st3"; + case 15: return "st4"; + case 16: return "st5"; + case 17: return "st6"; + case 18: return "st7"; + case 21: return "xmm0"; + case 22: return "xmm1"; + case 23: return "xmm2"; + case 24: return "xmm3"; + case 25: return "xmm4"; + case 26: return "xmm5"; + case 27: return "xmm6"; + case 28: return "xmm7"; + case 29: return "mm0"; + case 30: return "mm1"; + case 31: return "mm2"; + case 32: return "mm3"; + case 33: return "mm4"; + case 34: return "mm5"; + case 35: return "mm6"; + case 36: return "mm7"; + case 37: return "fcw"; + case 38: return "fsw"; + case 39: return "mxcsr"; + case 40: return "es"; + case 41: return "cs"; + case 42: return "ss"; + case 43: return "ds"; + case 44: return "fs"; + case 45: return "gs"; + case 48: return "tr"; + case 49: return "ldtr"; + default: return (NULL); + } + case EM_X86_64: + switch (reg) { + case 0: return "rax"; + case 1: return "rdx"; + case 2: return "rcx"; + case 3: return "rbx"; + case 4: return "rsi"; + case 5: return "rdi"; + case 6: return "rbp"; + case 7: return "rsp"; + case 16: return "rip"; + case 17: return "xmm0"; + case 18: return "xmm1"; + case 19: return "xmm2"; + case 20: return "xmm3"; + case 21: return "xmm4"; + case 22: return "xmm5"; + case 23: return "xmm6"; + case 24: return "xmm7"; + case 25: return "xmm8"; + case 26: return "xmm9"; + case 27: return "xmm10"; + case 28: return "xmm11"; + case 29: return "xmm12"; + case 30: return "xmm13"; + case 31: return "xmm14"; + case 32: return "xmm15"; + case 33: return "st0"; + case 34: return "st1"; + case 35: return "st2"; + case 36: return "st3"; + case 37: return "st4"; + case 38: return "st5"; + case 39: return "st6"; + case 40: return "st7"; + case 41: return "mm0"; + case 42: return "mm1"; + case 43: return "mm2"; + case 44: return "mm3"; + case 45: return "mm4"; + case 46: return "mm5"; + case 47: return "mm6"; + case 48: return "mm7"; + case 49: return "rflags"; + case 50: return "es"; + case 51: return "cs"; + case 52: return "ss"; + case 53: return "ds"; + case 54: return "fs"; + case 55: return "gs"; + case 58: return "fs.base"; + case 59: return "gs.base"; + case 62: return "tr"; + case 63: return "ldtr"; + case 64: return "mxcsr"; + case 65: return "fcw"; + case 66: return "fsw"; + default: return (NULL); + } + default: + return (NULL); + } +} + static void dump_ehdr(struct readelf *re) { @@ -3220,7 +3435,7 @@ dump_gnu_hash(struct readelf *re, struct section *s) Elf_Data *d; uint32_t *buf; uint32_t *bucket, *chain; - uint32_t nbucket, nchain, symndx, maskwords, shift2; + uint32_t nbucket, nchain, symndx, maskwords; uint32_t *bl, *c, maxl, total; int elferr, dynsymcount, i, j; @@ -3240,7 +3455,6 @@ dump_gnu_hash(struct readelf *re, struct section *s) nbucket = buf[0]; symndx = buf[1]; maskwords = buf[2]; - shift2 = buf[3]; buf += 4; ds = &re->sl[s->link]; dynsymcount = ds->sz / ds->entsize; @@ -4165,6 +4379,20 @@ dump_arch_specific_info(struct readelf *re) } } +static const char * +dwarf_regname(struct readelf *re, unsigned int num) +{ + static char rx[32]; + const char *rn; + + if ((rn = dwarf_reg(re->ehdr.e_machine, num)) != NULL) + return (rn); + + snprintf(rx, sizeof(rx), "r%u", num); + + return (rx); +} + static void dump_dwarf_line(struct readelf *re) { @@ -4180,9 +4408,7 @@ dump_dwarf_line(struct readelf *re) int64_t sdelta; uint8_t *p, *pe; int8_t lbase; - int is_stmt, basic_block, end_sequence; - int prologue_end, epilogue_begin; - int i, dwarf_size, elferr, ret; + int i, is_stmt, dwarf_size, elferr, ret; printf("\nDump of debug contents of section .debug_line:\n"); @@ -4298,10 +4524,6 @@ dump_dwarf_line(struct readelf *re) line = 1; \ column = 0; \ is_stmt = defstmt; \ - basic_block = 0; \ - end_sequence = 0; \ - prologue_end = 0; \ - epilogue_begin = 0; \ } while(0) #define LINE(x) (lbase + (((x) - opbase) % lrange)) @@ -4326,7 +4548,6 @@ dump_dwarf_line(struct readelf *re) switch (*p) { case DW_LNE_end_sequence: p++; - end_sequence = 1; RESET_REGISTERS; printf("End of Sequence\n"); break; @@ -4357,9 +4578,6 @@ dump_dwarf_line(struct readelf *re) */ switch(*p++) { case DW_LNS_copy: - basic_block = 0; - prologue_end = 0; - epilogue_begin = 0; printf(" Copy\n"); break; case DW_LNS_advance_pc: @@ -4392,7 +4610,6 @@ dump_dwarf_line(struct readelf *re) printf(" Set is_stmt to %d\n", is_stmt); break; case DW_LNS_set_basic_block: - basic_block = 1; printf(" Set basic block flag\n"); break; case DW_LNS_const_add_pc: @@ -4411,11 +4628,9 @@ dump_dwarf_line(struct readelf *re) (uintmax_t) address); break; case DW_LNS_set_prologue_end: - prologue_end = 1; printf(" Set prologue end flag\n"); break; case DW_LNS_set_epilogue_begin: - epilogue_begin = 1; printf(" Set epilogue begin flag\n"); break; case DW_LNS_set_isa: @@ -4435,9 +4650,6 @@ dump_dwarf_line(struct readelf *re) */ line += LINE(*p); address += ADDRESS(*p); - basic_block = 0; - prologue_end = 0; - epilogue_begin = 0; printf(" Special opcode %u: advance Address " "by %ju to %#jx and Line by %jd to %ju\n", *p - opbase, (uintmax_t) ADDRESS(*p), @@ -4514,18 +4726,21 @@ dump_dwarf_die(struct readelf *re, Dwarf_Die die, int level) { Dwarf_Attribute *attr_list; Dwarf_Die ret_die; - Dwarf_Off dieoff, cuoff, culen; - Dwarf_Unsigned ate, v_udata; + Dwarf_Off dieoff, cuoff, culen, attroff; + Dwarf_Unsigned ate, lang, v_udata, v_sig; Dwarf_Signed attr_count, v_sdata; Dwarf_Off v_off; Dwarf_Addr v_addr; Dwarf_Half tag, attr, form; Dwarf_Block *v_block; - Dwarf_Bool v_bool; + Dwarf_Bool v_bool, is_info; + Dwarf_Sig8 v_sig8; Dwarf_Error de; - const char *tag_str, *attr_str, *ate_str; + Dwarf_Ptr v_expr; + const char *tag_str, *attr_str, *ate_str, *lang_str; + char unk_tag[32], unk_attr[32]; char *v_str; - uint8_t *b; + uint8_t *b, *p; int i, j, abc, ret; if (dwarf_dieoffset(die, &dieoff, &de) != DW_DLV_OK) { @@ -4533,7 +4748,7 @@ dump_dwarf_die(struct readelf *re, Dwarf_Die die, int level) goto cont_search; } - printf("<%d><%jx>: ", level, (uintmax_t) dieoff); + printf(" <%d><%jx>: ", level, (uintmax_t) dieoff); if (dwarf_die_CU_offset_range(die, &cuoff, &culen, &de) != DW_DLV_OK) { warnx("dwarf_die_CU_offset_range failed: %s", @@ -4547,8 +4762,8 @@ dump_dwarf_die(struct readelf *re, Dwarf_Die die, int level) goto cont_search; } if (dwarf_get_TAG_name(tag, &tag_str) != DW_DLV_OK) { - warnx("dwarf_get_TAG_name failed"); - goto cont_search; + snprintf(unk_tag, sizeof(unk_tag), "[Unknown Tag: %#x]", tag); + tag_str = unk_tag; } printf("Abbrev Number: %d (%s)\n", abc, tag_str); @@ -4570,19 +4785,29 @@ dump_dwarf_die(struct readelf *re, Dwarf_Die die, int level) continue; } if (dwarf_get_AT_name(attr, &attr_str) != DW_DLV_OK) { - warnx("dwarf_get_AT_name failed"); - continue; + snprintf(unk_attr, sizeof(unk_attr), + "[Unknown AT: %#x]", attr); + attr_str = unk_attr; } - printf(" %-18s: ", attr_str); + if (dwarf_attroffset(attr_list[i], &attroff, &de) != + DW_DLV_OK) { + warnx("dwarf_attroffset failed: %s", dwarf_errmsg(de)); + attroff = 0; + } + printf(" <%jx> %-18s: ", (uintmax_t) attroff, attr_str); switch (form) { case DW_FORM_ref_addr: + case DW_FORM_sec_offset: if (dwarf_global_formref(attr_list[i], &v_off, &de) != DW_DLV_OK) { warnx("dwarf_global_formref failed: %s", dwarf_errmsg(de)); continue; } - printf("<%jx>", (uintmax_t) v_off); + if (form == DW_FORM_ref_addr) + printf("<0x%jx>", (uintmax_t) v_off); + else + printf("0x%jx", (uintmax_t) v_off); break; case DW_FORM_ref1: @@ -4597,7 +4822,7 @@ dump_dwarf_die(struct readelf *re, Dwarf_Die die, int level) continue; } v_off += cuoff; - printf("<%jx>", (uintmax_t) v_off); + printf("<0x%jx>", (uintmax_t) v_off); break; case DW_FORM_addr: @@ -4621,7 +4846,10 @@ dump_dwarf_die(struct readelf *re, Dwarf_Die die, int level) dwarf_errmsg(de)); continue; } - printf("%ju", (uintmax_t) v_udata); + if (attr == DW_AT_high_pc) + printf("0x%jx", (uintmax_t) v_udata); + else + printf("%ju", (uintmax_t) v_udata); break; case DW_FORM_sdata: @@ -4644,6 +4872,10 @@ dump_dwarf_die(struct readelf *re, Dwarf_Die die, int level) printf("%jd", (intmax_t) v_bool); break; + case DW_FORM_flag_present: + putchar('1'); + break; + case DW_FORM_string: case DW_FORM_strp: if (dwarf_formstring(attr_list[i], &v_str, &de) != @@ -4668,11 +4900,41 @@ dump_dwarf_die(struct readelf *re, Dwarf_Die die, int level) dwarf_errmsg(de)); continue; } - printf("%ju byte block:", v_block->bl_len); + printf("%ju byte block:", (uintmax_t) v_block->bl_len); b = v_block->bl_data; for (j = 0; (Dwarf_Unsigned) j < v_block->bl_len; j++) printf(" %x", b[j]); + printf("\t("); + dump_dwarf_block(re, v_block->bl_data, v_block->bl_len); + putchar(')'); break; + + case DW_FORM_exprloc: + if (dwarf_formexprloc(attr_list[i], &v_udata, &v_expr, + &de) != DW_DLV_OK) { + warnx("dwarf_formexprloc failed: %s", + dwarf_errmsg(de)); + continue; + } + printf("%ju byte block:", (uintmax_t) v_udata); + b = v_expr; + for (j = 0; (Dwarf_Unsigned) j < v_udata; j++) + printf(" %x", b[j]); + printf("\t("); + dump_dwarf_block(re, v_expr, v_udata); + putchar(')'); + break; + + case DW_FORM_ref_sig8: + if (dwarf_formsig8(attr_list[i], &v_sig8, &de) != + DW_DLV_OK) { + warnx("dwarf_formsig8 failed: %s", + dwarf_errmsg(de)); + continue; + } + p = (uint8_t *)(uintptr_t) &v_sig8.signature[0]; + v_sig = re->dw_decode(&p, 8); + printf("signature: 0x%jx", (uintmax_t) v_sig); } switch (attr) { case DW_AT_encoding: @@ -4680,9 +4942,38 @@ dump_dwarf_die(struct readelf *re, Dwarf_Die die, int level) DW_DLV_OK) break; if (dwarf_get_ATE_name(ate, &ate_str) != DW_DLV_OK) - break; + ate_str = "DW_ATE_UNKNOWN"; printf("\t(%s)", &ate_str[strlen("DW_ATE_")]); break; + + case DW_AT_language: + if (dwarf_attrval_unsigned(die, attr, &lang, &de) != + DW_DLV_OK) + break; + if (dwarf_get_LANG_name(lang, &lang_str) != DW_DLV_OK) + break; + printf("\t(%s)", &lang_str[strlen("DW_LANG_")]); + break; + + case DW_AT_location: + case DW_AT_string_length: + case DW_AT_return_addr: + case DW_AT_data_member_location: + case DW_AT_frame_base: + case DW_AT_segment: + case DW_AT_static_link: + case DW_AT_use_location: + case DW_AT_vtable_elem_location: + switch (form) { + case DW_FORM_data4: + case DW_FORM_data8: + case DW_FORM_sec_offset: + printf("\t(location list)"); + break; + default: + break; + } + default: break; } @@ -4699,7 +4990,8 @@ cont_search: dump_dwarf_die(re, ret_die, level + 1); /* Search sibling. */ - ret = dwarf_siblingof(re->dbg, die, &ret_die, &de); + is_info = dwarf_get_die_infotypes_flag(die); + ret = dwarf_siblingof_b(re->dbg, die, &ret_die, is_info, &de); if (ret == DW_DLV_ERROR) warnx("dwarf_siblingof: %s", dwarf_errmsg(de)); else if (ret == DW_DLV_OK) @@ -4709,73 +5001,108 @@ cont_search: } static void -dump_dwarf_info(struct readelf *re) +set_cu_context(struct readelf *re, Dwarf_Half psize, Dwarf_Half osize, + Dwarf_Half ver) +{ + + re->cu_psize = psize; + re->cu_osize = osize; + re->cu_ver = ver; +} + +static void +dump_dwarf_info(struct readelf *re, Dwarf_Bool is_info) { struct section *s; Dwarf_Die die; Dwarf_Error de; - Dwarf_Half tag, version, pointer_size; + Dwarf_Half tag, version, pointer_size, off_size; Dwarf_Off cu_offset, cu_length; Dwarf_Off aboff; - Elf_Data *d; - int i, elferr, ret; + Dwarf_Unsigned typeoff; + Dwarf_Sig8 sig8; + Dwarf_Unsigned sig; + uint8_t *p; + const char *sn; + int i, ret; - printf("\nDump of debug contents of section .debug_info:\n"); + sn = is_info ? ".debug_info" : ".debug_types"; s = NULL; for (i = 0; (size_t) i < re->shnum; i++) { s = &re->sl[i]; - if (s->name != NULL && !strcmp(s->name, ".debug_info")) + if (s->name != NULL && !strcmp(s->name, sn)) break; } if ((size_t) i >= re->shnum) return; - (void) elf_errno(); - if ((d = elf_getdata(s->scn, NULL)) == NULL) { - elferr = elf_errno(); - if (elferr != 0) - warnx("elf_getdata failed: %s", elf_errmsg(-1)); - return; - } - if (d->d_size <= 0) - return; + do { + printf("\nDump of debug contents of section %s:\n", sn); - while ((ret = dwarf_next_cu_header(re->dbg, NULL, &version, &aboff, - &pointer_size, NULL, &de)) == DW_DLV_OK) { - die = NULL; - while (dwarf_siblingof(re->dbg, die, &die, &de) == DW_DLV_OK) { - if (dwarf_tag(die, &tag, &de) != DW_DLV_OK) { - warnx("dwarf_tag failed: %s", - dwarf_errmsg(de)); - return; + while ((ret = dwarf_next_cu_header_c(re->dbg, is_info, NULL, + &version, &aboff, &pointer_size, &off_size, NULL, &sig8, + &typeoff, NULL, &de)) == DW_DLV_OK) { + set_cu_context(re, pointer_size, off_size, version); + die = NULL; + while (dwarf_siblingof_b(re->dbg, die, &die, is_info, + &de) == DW_DLV_OK) { + if (dwarf_tag(die, &tag, &de) != DW_DLV_OK) { + warnx("dwarf_tag failed: %s", + dwarf_errmsg(de)); + continue; + } + /* XXX: What about DW_TAG_partial_unit? */ + if ((is_info && tag == DW_TAG_compile_unit) || + (!is_info && tag == DW_TAG_type_unit)) + break; + } + if (die == NULL && is_info) { + warnx("could not find DW_TAG_compile_unit " + "die"); + continue; + } else if (die == NULL && !is_info) { + warnx("could not find DW_TAG_type_unit die"); + continue; } - /* XXX: What about DW_TAG_partial_unit? */ - if (tag == DW_TAG_compile_unit) - break; - } - if (die == NULL) { - warnx("could not find DW_TAG_compile_unit die"); - return; - } - if (dwarf_die_CU_offset_range(die, &cu_offset, &cu_length, - &de) != DW_DLV_OK) { - warnx("dwarf_die_CU_offset failed: %s", - dwarf_errmsg(de)); - continue; + if (dwarf_die_CU_offset_range(die, &cu_offset, + &cu_length, &de) != DW_DLV_OK) { + warnx("dwarf_die_CU_offset failed: %s", + dwarf_errmsg(de)); + continue; + } + + cu_length -= off_size == 4 ? 4 : 12; + + sig = 0; + if (!is_info) { + p = (uint8_t *)(uintptr_t) &sig8.signature[0]; + sig = re->dw_decode(&p, 8); + } + + printf("\n Type Unit @ offset 0x%jx:\n", + (uintmax_t) cu_offset); + printf(" Length:\t\t%#jx (%d-bit)\n", + (uintmax_t) cu_length, off_size == 4 ? 32 : 64); + printf(" Version:\t\t%u\n", version); + printf(" Abbrev Offset:\t0x%jx\n", + (uintmax_t) aboff); + printf(" Pointer Size:\t%u\n", pointer_size); + if (!is_info) { + printf(" Signature:\t\t0x%016jx\n", + (uintmax_t) sig); + printf(" Type Offset:\t0x%jx\n", + (uintmax_t) typeoff); + } + + dump_dwarf_die(re, die, 0); } - - printf(" Compilation Unit @ %jd:\n", (intmax_t) cu_offset); - printf(" Length:\t\t%jd\n", (intmax_t) cu_length); - printf(" Version:\t\t%u\n", version); - printf(" Abbrev Offset:\t%ju\n", (uintmax_t) aboff); - printf(" Pointer Size:\t%u\n", pointer_size); - - dump_dwarf_die(re, die, 0); - } - if (ret == DW_DLV_ERROR) - warnx("dwarf_next_cu_header: %s", dwarf_errmsg(de)); + if (ret == DW_DLV_ERROR) + warnx("dwarf_next_cu_header: %s", dwarf_errmsg(de)); + if (is_info) + break; + } while (dwarf_next_types_section(re->dbg, &de) == DW_DLV_OK); } static void @@ -4788,6 +5115,7 @@ dump_dwarf_abbrev(struct readelf *re) Dwarf_Half tag, attr; Dwarf_Error de; const char *tag_str, *attr_str, *form_str; + char unk_tag[32], unk_attr[32], unk_form[32]; int i, j, ret; printf("\nContents of section .debug_abbrev:\n\n"); @@ -4810,8 +5138,9 @@ dump_dwarf_abbrev(struct readelf *re) goto next_abbrev; } if (dwarf_get_TAG_name(tag, &tag_str) != DW_DLV_OK) { - warnx("dwarf_get_TAG_name failed"); - goto next_abbrev; + snprintf(unk_tag, sizeof(unk_tag), + "[Unknown Tag: %#x]", tag); + tag_str = unk_tag; } if (dwarf_get_abbrev_children_flag(ab, &flag, &de) != DW_DLV_OK) { @@ -4830,13 +5159,16 @@ dump_dwarf_abbrev(struct readelf *re) } if (dwarf_get_AT_name(attr, &attr_str) != DW_DLV_OK) { - warnx("dwarf_get_AT_name failed"); - continue; + snprintf(unk_attr, sizeof(unk_attr), + "[Unknown AT: %#x]", attr); + attr_str = unk_attr; } if (dwarf_get_FORM_name(form, &form_str) != DW_DLV_OK) { - warnx("dwarf_get_FORM_name failed"); - continue; + snprintf(unk_form, sizeof(unk_form), + "[Unknown Form: %#x]", + (Dwarf_Half) form); + form_str = unk_form; } printf(" %-18s %s\n", attr_str, form_str); } @@ -5132,6 +5464,7 @@ dump_dwarf_macinfo(struct readelf *re) Dwarf_Macro_Details *md; Dwarf_Error de; const char *mi_str; + char unk_mi[32]; int i; #define _MAX_MACINFO_ENTRY 65535 @@ -5147,9 +5480,9 @@ dump_dwarf_macinfo(struct readelf *re) break; if (dwarf_get_MACINFO_name(md[i].dmd_type, &mi_str) != DW_DLV_OK) { - warnx("dwarf_get_MACINFO_name failed: %s", - dwarf_errmsg(de)); - continue; + snprintf(unk_mi, sizeof(unk_mi), + "[Unknown MACINFO: %#x]", md[i].dmd_type); + mi_str = unk_mi; } printf(" %s", mi_str); switch (md[i].dmd_type) { @@ -5175,14 +5508,16 @@ dump_dwarf_macinfo(struct readelf *re) } static void -dump_dwarf_frame_inst(Dwarf_Cie cie, uint8_t *insts, Dwarf_Unsigned len, - Dwarf_Unsigned caf, Dwarf_Signed daf, Dwarf_Addr pc, Dwarf_Debug dbg) +dump_dwarf_frame_inst(struct readelf *re, Dwarf_Cie cie, uint8_t *insts, + Dwarf_Unsigned len, Dwarf_Unsigned caf, Dwarf_Signed daf, Dwarf_Addr pc, + Dwarf_Debug dbg) { Dwarf_Frame_Op *oplist; Dwarf_Signed opcnt, delta; Dwarf_Small op; Dwarf_Error de; const char *op_str; + char unk_op[32]; int i; if (dwarf_expand_frame_instructions(cie, insts, len, &oplist, @@ -5198,9 +5533,9 @@ dump_dwarf_frame_inst(Dwarf_Cie cie, uint8_t *insts, Dwarf_Unsigned len, else op = oplist[i].fp_extended_op; if (dwarf_get_CFA_name(op, &op_str) != DW_DLV_OK) { - warnx("dwarf_get_CFA_name failed: %s", - dwarf_errmsg(de)); - continue; + snprintf(unk_op, sizeof(unk_op), "[Unknown CFA: %#x]", + op); + op_str = unk_op; } printf(" %s", op_str); switch (op) { @@ -5214,11 +5549,13 @@ dump_dwarf_frame_inst(Dwarf_Cie cie, uint8_t *insts, Dwarf_Unsigned len, case DW_CFA_offset_extended: case DW_CFA_offset_extended_sf: delta = oplist[i].fp_offset * daf; - printf(": r%u at cfa%+jd", oplist[i].fp_register, + printf(": r%u (%s) at cfa%+jd", oplist[i].fp_register, + dwarf_regname(re, oplist[i].fp_register), (intmax_t) delta); break; case DW_CFA_restore: - printf(": r%u", oplist[i].fp_register); + printf(": r%u (%s)", oplist[i].fp_register, + dwarf_regname(re, oplist[i].fp_register)); break; case DW_CFA_set_loc: pc = oplist[i].fp_offset; @@ -5232,15 +5569,18 @@ dump_dwarf_frame_inst(Dwarf_Cie cie, uint8_t *insts, Dwarf_Unsigned len, (uintmax_t) pc); break; case DW_CFA_def_cfa: - printf(": r%u ofs %ju", oplist[i].fp_register, + printf(": r%u (%s) ofs %ju", oplist[i].fp_register, + dwarf_regname(re, oplist[i].fp_register), (uintmax_t) oplist[i].fp_offset); break; case DW_CFA_def_cfa_sf: - printf(": r%u ofs %jd", oplist[i].fp_register, + printf(": r%u (%s) ofs %jd", oplist[i].fp_register, + dwarf_regname(re, oplist[i].fp_register), (intmax_t) (oplist[i].fp_offset * daf)); break; case DW_CFA_def_cfa_register: - printf(": r%u", oplist[i].fp_register); + printf(": r%u (%s)", oplist[i].fp_register, + dwarf_regname(re, oplist[i].fp_register)); break; case DW_CFA_def_cfa_offset: printf(": %ju", (uintmax_t) oplist[i].fp_offset); @@ -5258,7 +5598,7 @@ dump_dwarf_frame_inst(Dwarf_Cie cie, uint8_t *insts, Dwarf_Unsigned len, } static char * -get_regoff_str(Dwarf_Half reg, Dwarf_Addr off) +get_regoff_str(struct readelf *re, Dwarf_Half reg, Dwarf_Addr off) { static char rs[16]; @@ -5267,19 +5607,19 @@ get_regoff_str(Dwarf_Half reg, Dwarf_Addr off) else if (reg == DW_FRAME_CFA_COL) snprintf(rs, sizeof(rs), "c%+jd", (intmax_t) off); else - snprintf(rs, sizeof(rs), "r%u%+jd", reg, (intmax_t) off); + snprintf(rs, sizeof(rs), "%s%+jd", dwarf_regname(re, reg), + (intmax_t) off); return (rs); } static int -dump_dwarf_frame_regtable(Dwarf_Fde fde, Dwarf_Addr pc, Dwarf_Unsigned func_len, - Dwarf_Half cie_ra) +dump_dwarf_frame_regtable(struct readelf *re, Dwarf_Fde fde, Dwarf_Addr pc, + Dwarf_Unsigned func_len, Dwarf_Half cie_ra) { Dwarf_Regtable rt; Dwarf_Addr row_pc, end_pc, pre_pc, cur_pc; Dwarf_Error de; - char rn[16]; char *vec; int i; @@ -5316,10 +5656,9 @@ dump_dwarf_frame_regtable(Dwarf_Fde fde, Dwarf_Addr pc, Dwarf_Unsigned func_len, if (BIT_ISSET(vec, i)) { if ((Dwarf_Half) i == cie_ra) printf("ra "); - else { - snprintf(rn, sizeof(rn), "r%d", i); - printf("%-5s", rn); - } + else + printf("%-5s", + dwarf_regname(re, (unsigned int) i)); } } putchar('\n'); @@ -5338,12 +5677,12 @@ dump_dwarf_frame_regtable(Dwarf_Fde fde, Dwarf_Addr pc, Dwarf_Unsigned func_len, continue; pre_pc = row_pc; printf("%08jx ", (uintmax_t) row_pc); - printf("%-8s ", get_regoff_str(RT(0).dw_regnum, + printf("%-8s ", get_regoff_str(re, RT(0).dw_regnum, RT(0).dw_offset)); for (i = 1; i < DW_REG_TABLE_SIZE; i++) { if (BIT_ISSET(vec, i)) { - printf("%-5s", get_regoff_str(RT(i).dw_regnum, - RT(i).dw_offset)); + printf("%-5s", get_regoff_str(re, + RT(i).dw_regnum, RT(i).dw_offset)); } } putchar('\n'); @@ -5447,7 +5786,7 @@ dump_dwarf_frame_section(struct readelf *re, struct section *s, int alt) printf(" Return address column:\t%ju\n", (uintmax_t) cie_ra); putchar('\n'); - dump_dwarf_frame_inst(cie, cie_inst, + dump_dwarf_frame_inst(re, cie, cie_inst, cie_instlen, cie_caf, cie_daf, 0, re->dbg); putchar('\n'); @@ -5460,7 +5799,7 @@ dump_dwarf_frame_section(struct readelf *re, struct section *s, int alt) (uintmax_t) cie_caf, (uintmax_t) cie_daf, (uintmax_t) cie_ra); - dump_dwarf_frame_regtable(fde, low_pc, 1, + dump_dwarf_frame_regtable(re, fde, low_pc, 1, cie_ra); putchar('\n'); } @@ -5472,10 +5811,10 @@ dump_dwarf_frame_section(struct readelf *re, struct section *s, int alt) cie_offset), (uintmax_t) low_pc, (uintmax_t) (low_pc + func_len)); if (!alt) - dump_dwarf_frame_inst(cie, fde_inst, fde_instlen, + dump_dwarf_frame_inst(re, cie, fde_inst, fde_instlen, cie_caf, cie_daf, low_pc, re->dbg); else - dump_dwarf_frame_regtable(fde, low_pc, func_len, + dump_dwarf_frame_regtable(re, fde, low_pc, func_len, cie_ra); putchar('\n'); } @@ -5558,6 +5897,9 @@ struct loc_at { Dwarf_Attribute la_at; Dwarf_Unsigned la_off; Dwarf_Unsigned la_lowpc; + Dwarf_Half la_cu_psize; + Dwarf_Half la_cu_osize; + Dwarf_Half la_cu_ver; TAILQ_ENTRY(loc_at) la_next; }; @@ -5569,12 +5911,16 @@ search_loclist_at(struct readelf *re, Dwarf_Die die, Dwarf_Unsigned lowpc) Dwarf_Attribute *attr_list; Dwarf_Die ret_die; Dwarf_Unsigned off; + Dwarf_Off ref; Dwarf_Signed attr_count; Dwarf_Half attr, form; + Dwarf_Bool is_info; Dwarf_Error de; struct loc_at *la, *nla; int i, ret; + is_info = dwarf_get_die_infotypes_flag(die); + if ((ret = dwarf_attrlist(die, &attr_list, &attr_count, &de)) != DW_DLV_OK) { if (ret == DW_DLV_ERROR) @@ -5600,12 +5946,24 @@ search_loclist_at(struct readelf *re, Dwarf_Die die, Dwarf_Unsigned lowpc) warnx("dwarf_whatform failed: %s", dwarf_errmsg(de)); continue; } - if (form != DW_FORM_data4 && form != DW_FORM_data8) + if (form == DW_FORM_data4 || form == DW_FORM_data8) { + if (dwarf_formudata(attr_list[i], &off, &de) != + DW_DLV_OK) { + warnx("dwarf_formudata failed: %s", + dwarf_errmsg(de)); + continue; + } + } else if (form == DW_FORM_sec_offset) { + if (dwarf_global_formref(attr_list[i], &ref, &de) != + DW_DLV_OK) { + warnx("dwarf_global_formref failed: %s", + dwarf_errmsg(de)); + continue; + } + off = ref; + } else continue; - if (dwarf_formudata(attr_list[i], &off, &de) != DW_DLV_OK) { - warnx("dwarf_formudata failed: %s", dwarf_errmsg(de)); - continue; - } + TAILQ_FOREACH(la, &lalist, la_next) { if (off == la->la_off) break; @@ -5615,6 +5973,9 @@ search_loclist_at(struct readelf *re, Dwarf_Die die, Dwarf_Unsigned lowpc) nla->la_at = attr_list[i]; nla->la_off = off; nla->la_lowpc = lowpc; + nla->la_cu_psize = re->cu_psize; + nla->la_cu_osize = re->cu_osize; + nla->la_cu_ver = re->cu_ver; TAILQ_INSERT_BEFORE(la, nla, la_next); break; } @@ -5625,6 +5986,9 @@ search_loclist_at(struct readelf *re, Dwarf_Die die, Dwarf_Unsigned lowpc) nla->la_at = attr_list[i]; nla->la_off = off; nla->la_lowpc = lowpc; + nla->la_cu_psize = re->cu_psize; + nla->la_cu_osize = re->cu_osize; + nla->la_cu_ver = re->cu_ver; TAILQ_INSERT_TAIL(&lalist, nla, la_next); } } @@ -5638,13 +6002,284 @@ cont_search: search_loclist_at(re, ret_die, lowpc); /* Search sibling. */ - ret = dwarf_siblingof(re->dbg, die, &ret_die, &de); + ret = dwarf_siblingof_b(re->dbg, die, &ret_die, is_info, &de); if (ret == DW_DLV_ERROR) warnx("dwarf_siblingof: %s", dwarf_errmsg(de)); else if (ret == DW_DLV_OK) search_loclist_at(re, ret_die, lowpc); } +static void +dump_dwarf_loc(struct readelf *re, Dwarf_Loc *lr) +{ + const char *op_str; + char unk_op[32]; + uint8_t *b, n; + int i; + + if (dwarf_get_OP_name(lr->lr_atom, &op_str) != + DW_DLV_OK) { + snprintf(unk_op, sizeof(unk_op), + "[Unknown OP: %#x]", lr->lr_atom); + op_str = unk_op; + } + + printf("%s", op_str); + + switch (lr->lr_atom) { + case DW_OP_reg0: + case DW_OP_reg1: + case DW_OP_reg2: + case DW_OP_reg3: + case DW_OP_reg4: + case DW_OP_reg5: + case DW_OP_reg6: + case DW_OP_reg7: + case DW_OP_reg8: + case DW_OP_reg9: + case DW_OP_reg10: + case DW_OP_reg11: + case DW_OP_reg12: + case DW_OP_reg13: + case DW_OP_reg14: + case DW_OP_reg15: + case DW_OP_reg16: + case DW_OP_reg17: + case DW_OP_reg18: + case DW_OP_reg19: + case DW_OP_reg20: + case DW_OP_reg21: + case DW_OP_reg22: + case DW_OP_reg23: + case DW_OP_reg24: + case DW_OP_reg25: + case DW_OP_reg26: + case DW_OP_reg27: + case DW_OP_reg28: + case DW_OP_reg29: + case DW_OP_reg30: + case DW_OP_reg31: + printf(" (%s)", dwarf_regname(re, lr->lr_atom - DW_OP_reg0)); + break; + + case DW_OP_deref: + case DW_OP_lit0: + case DW_OP_lit1: + case DW_OP_lit2: + case DW_OP_lit3: + case DW_OP_lit4: + case DW_OP_lit5: + case DW_OP_lit6: + case DW_OP_lit7: + case DW_OP_lit8: + case DW_OP_lit9: + case DW_OP_lit10: + case DW_OP_lit11: + case DW_OP_lit12: + case DW_OP_lit13: + case DW_OP_lit14: + case DW_OP_lit15: + case DW_OP_lit16: + case DW_OP_lit17: + case DW_OP_lit18: + case DW_OP_lit19: + case DW_OP_lit20: + case DW_OP_lit21: + case DW_OP_lit22: + case DW_OP_lit23: + case DW_OP_lit24: + case DW_OP_lit25: + case DW_OP_lit26: + case DW_OP_lit27: + case DW_OP_lit28: + case DW_OP_lit29: + case DW_OP_lit30: + case DW_OP_lit31: + case DW_OP_dup: + case DW_OP_drop: + case DW_OP_over: + case DW_OP_swap: + case DW_OP_rot: + case DW_OP_xderef: + case DW_OP_abs: + case DW_OP_and: + case DW_OP_div: + case DW_OP_minus: + case DW_OP_mod: + case DW_OP_mul: + case DW_OP_neg: + case DW_OP_not: + case DW_OP_or: + case DW_OP_plus: + case DW_OP_shl: + case DW_OP_shr: + case DW_OP_shra: + case DW_OP_xor: + case DW_OP_eq: + case DW_OP_ge: + case DW_OP_gt: + case DW_OP_le: + case DW_OP_lt: + case DW_OP_ne: + case DW_OP_nop: + case DW_OP_push_object_address: + case DW_OP_form_tls_address: + case DW_OP_call_frame_cfa: + case DW_OP_stack_value: + case DW_OP_GNU_push_tls_address: + case DW_OP_GNU_uninit: + break; + + case DW_OP_const1u: + case DW_OP_pick: + case DW_OP_deref_size: + case DW_OP_xderef_size: + case DW_OP_const2u: + case DW_OP_bra: + case DW_OP_skip: + case DW_OP_const4u: + case DW_OP_const8u: + case DW_OP_constu: + case DW_OP_plus_uconst: + case DW_OP_regx: + case DW_OP_piece: + printf(": %ju", (uintmax_t) + lr->lr_number); + break; + + case DW_OP_const1s: + case DW_OP_const2s: + case DW_OP_const4s: + case DW_OP_const8s: + case DW_OP_consts: + printf(": %jd", (intmax_t) + lr->lr_number); + break; + + case DW_OP_breg0: + case DW_OP_breg1: + case DW_OP_breg2: + case DW_OP_breg3: + case DW_OP_breg4: + case DW_OP_breg5: + case DW_OP_breg6: + case DW_OP_breg7: + case DW_OP_breg8: + case DW_OP_breg9: + case DW_OP_breg10: + case DW_OP_breg11: + case DW_OP_breg12: + case DW_OP_breg13: + case DW_OP_breg14: + case DW_OP_breg15: + case DW_OP_breg16: + case DW_OP_breg17: + case DW_OP_breg18: + case DW_OP_breg19: + case DW_OP_breg20: + case DW_OP_breg21: + case DW_OP_breg22: + case DW_OP_breg23: + case DW_OP_breg24: + case DW_OP_breg25: + case DW_OP_breg26: + case DW_OP_breg27: + case DW_OP_breg28: + case DW_OP_breg29: + case DW_OP_breg30: + case DW_OP_breg31: + printf(" (%s): %jd", + dwarf_regname(re, lr->lr_atom - DW_OP_breg0), + (intmax_t) lr->lr_number); + break; + + case DW_OP_fbreg: + printf(": %jd", (intmax_t) + lr->lr_number); + break; + + case DW_OP_bregx: + printf(": %ju (%s) %jd", + (uintmax_t) lr->lr_number, + dwarf_regname(re, (unsigned int) lr->lr_number), + (intmax_t) lr->lr_number2); + break; + + case DW_OP_addr: + case DW_OP_GNU_encoded_addr: + printf(": %#jx", (uintmax_t) + lr->lr_number); + break; + + case DW_OP_GNU_implicit_pointer: + printf(": <0x%jx> %jd", (uintmax_t) lr->lr_number, + (intmax_t) lr->lr_number2); + break; + + case DW_OP_implicit_value: + printf(": %ju byte block:", (uintmax_t) lr->lr_number); + b = (uint8_t *)(uintptr_t) lr->lr_number2; + for (i = 0; (Dwarf_Unsigned) i < lr->lr_number; i++) + printf(" %x", b[i]); + break; + + case DW_OP_GNU_entry_value: + printf(": ("); + dump_dwarf_block(re, (uint8_t *)(uintptr_t) lr->lr_number2, + lr->lr_number); + putchar(')'); + break; + + case DW_OP_GNU_const_type: + printf(": <0x%jx> ", (uintmax_t) lr->lr_number); + b = (uint8_t *)(uintptr_t) lr->lr_number2; + n = *b; + for (i = 1; (uint8_t) i < n; i++) + printf(" %x", b[i]); + break; + + case DW_OP_GNU_regval_type: + printf(": %ju (%s) <0x%jx>", (uintmax_t) lr->lr_number, + dwarf_regname(re, (unsigned int) lr->lr_number), + (uintmax_t) lr->lr_number2); + break; + + case DW_OP_GNU_convert: + case DW_OP_GNU_deref_type: + case DW_OP_GNU_parameter_ref: + case DW_OP_GNU_reinterpret: + printf(": <0x%jx>", (uintmax_t) lr->lr_number); + break; + + default: + break; + } +} + +static void +dump_dwarf_block(struct readelf *re, uint8_t *b, Dwarf_Unsigned len) +{ + Dwarf_Locdesc *llbuf; + Dwarf_Signed lcnt; + Dwarf_Error de; + int i; + + if (dwarf_loclist_from_expr_b(re->dbg, b, len, re->cu_psize, + re->cu_osize, re->cu_ver, &llbuf, &lcnt, &de) != DW_DLV_OK) { + warnx("dwarf_loclist_form_expr_b: %s", dwarf_errmsg(de)); + return; + } + + for (i = 0; (Dwarf_Half) i < llbuf->ld_cents; i++) { + dump_dwarf_loc(re, &llbuf->ld_s[i]); + if (i < llbuf->ld_cents - 1) + printf("; "); + } + + dwarf_dealloc(re->dbg, llbuf->ld_s, DW_DLA_LOC_BLOCK); + dwarf_dealloc(re->dbg, llbuf, DW_DLA_LOCDESC); +} + static void dump_dwarf_loclist(struct readelf *re) { @@ -5652,17 +6287,17 @@ dump_dwarf_loclist(struct readelf *re) Dwarf_Locdesc **llbuf; Dwarf_Unsigned lowpc; Dwarf_Signed lcnt; - Dwarf_Half tag; + Dwarf_Half tag, version, pointer_size, off_size; Dwarf_Error de; - Dwarf_Loc *lr; struct loc_at *la; - const char *op_str; int i, j, ret; printf("\nContents of section .debug_loc:\n"); - while ((ret = dwarf_next_cu_header(re->dbg, NULL, NULL, NULL, NULL, - NULL, &de)) == DW_DLV_OK) { + /* Search .debug_info section. */ + while ((ret = dwarf_next_cu_header_b(re->dbg, NULL, &version, NULL, + &pointer_size, &off_size, NULL, NULL, &de)) == DW_DLV_OK) { + set_cu_context(re, pointer_size, off_size, version); die = NULL; if (dwarf_siblingof(re->dbg, die, &die, &de) != DW_DLV_OK) continue; @@ -5673,8 +6308,8 @@ dump_dwarf_loclist(struct readelf *re) /* XXX: What about DW_TAG_partial_unit? */ lowpc = 0; if (tag == DW_TAG_compile_unit) { - if (dwarf_attrval_unsigned(die, DW_AT_low_pc, &lowpc, - &de) != DW_DLV_OK) + if (dwarf_attrval_unsigned(die, DW_AT_low_pc, + &lowpc, &de) != DW_DLV_OK) lowpc = 0; } @@ -5684,6 +6319,39 @@ dump_dwarf_loclist(struct readelf *re) if (ret == DW_DLV_ERROR) warnx("dwarf_next_cu_header: %s", dwarf_errmsg(de)); + /* Search .debug_types section. */ + do { + while ((ret = dwarf_next_cu_header_c(re->dbg, 0, NULL, + &version, NULL, &pointer_size, &off_size, NULL, NULL, + NULL, NULL, &de)) == DW_DLV_OK) { + set_cu_context(re, pointer_size, off_size, version); + die = NULL; + if (dwarf_siblingof(re->dbg, die, &die, &de) != + DW_DLV_OK) + continue; + if (dwarf_tag(die, &tag, &de) != DW_DLV_OK) { + warnx("dwarf_tag failed: %s", + dwarf_errmsg(de)); + continue; + } + + lowpc = 0; + if (tag == DW_TAG_type_unit) { + if (dwarf_attrval_unsigned(die, DW_AT_low_pc, + &lowpc, &de) != DW_DLV_OK) + lowpc = 0; + } + + /* + * Search attributes for reference to .debug_loc + * section. + */ + search_loclist_at(re, die, lowpc); + } + if (ret == DW_DLV_ERROR) + warnx("dwarf_next_cu_header: %s", dwarf_errmsg(de)); + } while (dwarf_next_types_section(re->dbg, &de) == DW_DLV_OK); + if (TAILQ_EMPTY(&lalist)) return; @@ -5695,6 +6363,8 @@ dump_dwarf_loclist(struct readelf *re) warnx("dwarf_loclist_n failed: %s", dwarf_errmsg(de)); continue; } + set_cu_context(re, la->la_cu_psize, la->la_cu_osize, + la->la_cu_ver); for (i = 0; i < lcnt; i++) { printf(" %8.8jx ", la->la_off); if (llbuf[i]->ld_lopc == 0 && llbuf[i]->ld_hipc == 0) { @@ -5710,184 +6380,9 @@ dump_dwarf_loclist(struct readelf *re) putchar('('); for (j = 0; (Dwarf_Half) j < llbuf[i]->ld_cents; j++) { - lr = &llbuf[i]->ld_s[j]; - if (dwarf_get_OP_name(lr->lr_atom, &op_str) != - DW_DLV_OK) { - warnx("dwarf_get_OP_name failed: %s", - dwarf_errmsg(de)); - continue; - } - - printf("%s", op_str); - - switch (lr->lr_atom) { - /* Operations with no operands. */ - case DW_OP_deref: - case DW_OP_reg0: - case DW_OP_reg1: - case DW_OP_reg2: - case DW_OP_reg3: - case DW_OP_reg4: - case DW_OP_reg5: - case DW_OP_reg6: - case DW_OP_reg7: - case DW_OP_reg8: - case DW_OP_reg9: - case DW_OP_reg10: - case DW_OP_reg11: - case DW_OP_reg12: - case DW_OP_reg13: - case DW_OP_reg14: - case DW_OP_reg15: - case DW_OP_reg16: - case DW_OP_reg17: - case DW_OP_reg18: - case DW_OP_reg19: - case DW_OP_reg20: - case DW_OP_reg21: - case DW_OP_reg22: - case DW_OP_reg23: - case DW_OP_reg24: - case DW_OP_reg25: - case DW_OP_reg26: - case DW_OP_reg27: - case DW_OP_reg28: - case DW_OP_reg29: - case DW_OP_reg30: - case DW_OP_reg31: - case DW_OP_lit0: - case DW_OP_lit1: - case DW_OP_lit2: - case DW_OP_lit3: - case DW_OP_lit4: - case DW_OP_lit5: - case DW_OP_lit6: - case DW_OP_lit7: - case DW_OP_lit8: - case DW_OP_lit9: - case DW_OP_lit10: - case DW_OP_lit11: - case DW_OP_lit12: - case DW_OP_lit13: - case DW_OP_lit14: - case DW_OP_lit15: - case DW_OP_lit16: - case DW_OP_lit17: - case DW_OP_lit18: - case DW_OP_lit19: - case DW_OP_lit20: - case DW_OP_lit21: - case DW_OP_lit22: - case DW_OP_lit23: - case DW_OP_lit24: - case DW_OP_lit25: - case DW_OP_lit26: - case DW_OP_lit27: - case DW_OP_lit28: - case DW_OP_lit29: - case DW_OP_lit30: - case DW_OP_lit31: - case DW_OP_dup: - case DW_OP_drop: - case DW_OP_over: - case DW_OP_swap: - case DW_OP_rot: - case DW_OP_xderef: - case DW_OP_abs: - case DW_OP_and: - case DW_OP_div: - case DW_OP_minus: - case DW_OP_mod: - case DW_OP_mul: - case DW_OP_neg: - case DW_OP_not: - case DW_OP_or: - case DW_OP_plus: - case DW_OP_shl: - case DW_OP_shr: - case DW_OP_shra: - case DW_OP_xor: - case DW_OP_eq: - case DW_OP_ge: - case DW_OP_gt: - case DW_OP_le: - case DW_OP_lt: - case DW_OP_ne: - case DW_OP_nop: - break; - - case DW_OP_const1u: - case DW_OP_const1s: - case DW_OP_pick: - case DW_OP_deref_size: - case DW_OP_xderef_size: - case DW_OP_const2u: - case DW_OP_const2s: - case DW_OP_bra: - case DW_OP_skip: - case DW_OP_const4u: - case DW_OP_const4s: - case DW_OP_const8u: - case DW_OP_const8s: - case DW_OP_constu: - case DW_OP_plus_uconst: - case DW_OP_regx: - case DW_OP_piece: - printf(": %ju", (uintmax_t) - lr->lr_number); - break; - - case DW_OP_consts: - case DW_OP_breg0: - case DW_OP_breg1: - case DW_OP_breg2: - case DW_OP_breg3: - case DW_OP_breg4: - case DW_OP_breg5: - case DW_OP_breg6: - case DW_OP_breg7: - case DW_OP_breg8: - case DW_OP_breg9: - case DW_OP_breg10: - case DW_OP_breg11: - case DW_OP_breg12: - case DW_OP_breg13: - case DW_OP_breg14: - case DW_OP_breg15: - case DW_OP_breg16: - case DW_OP_breg17: - case DW_OP_breg18: - case DW_OP_breg19: - case DW_OP_breg20: - case DW_OP_breg21: - case DW_OP_breg22: - case DW_OP_breg23: - case DW_OP_breg24: - case DW_OP_breg25: - case DW_OP_breg26: - case DW_OP_breg27: - case DW_OP_breg28: - case DW_OP_breg29: - case DW_OP_breg30: - case DW_OP_breg31: - case DW_OP_fbreg: - printf(": %jd", (intmax_t) - lr->lr_number); - break; - - case DW_OP_bregx: - printf(": %ju %jd", - (uintmax_t) lr->lr_number, - (intmax_t) lr->lr_number2); - break; - - case DW_OP_addr: - printf(": %#jx", (uintmax_t) - lr->lr_number); - break; - } + dump_dwarf_loc(re, &llbuf[i]->ld_s[j]); if (j < llbuf[i]->ld_cents - 1) - printf(", "); + printf("; "); } putchar(')'); @@ -5895,6 +6390,12 @@ dump_dwarf_loclist(struct readelf *re) printf(" (start == end)"); putchar('\n'); } + for (i = 0; i < lcnt; i++) { + dwarf_dealloc(re->dbg, llbuf[i]->ld_s, + DW_DLA_LOC_BLOCK); + dwarf_dealloc(re->dbg, llbuf[i], DW_DLA_LOCDESC); + } + dwarf_dealloc(re->dbg, llbuf, DW_DLA_LIST); } } @@ -6247,8 +6748,10 @@ dump_dwarf(struct readelf *re) dump_dwarf_line(re); if (re->dop & DW_LL) dump_dwarf_line_decoded(re); - if (re->dop & DW_I) - dump_dwarf_info(re); + if (re->dop & DW_I) { + dump_dwarf_info(re, 0); + dump_dwarf_info(re, 1); + } if (re->dop & DW_P) dump_dwarf_pubnames(re); if (re->dop & DW_R) @@ -6435,7 +6938,7 @@ static struct { {"Ranges", 'R', DW_RR}, {"macro", 'm', DW_M}, {"frames", 'f', DW_F}, - {"", 'F', DW_FF}, + {"frames-interp", 'F', DW_FF}, {"str", 's', DW_S}, {"loc", 'o', DW_O}, {NULL, 0, 0} diff --git a/strings/strings.c b/strings/strings.c index c936d5c5374f..5964f64f19d5 100644 --- a/strings/strings.c +++ b/strings/strings.c @@ -46,7 +46,7 @@ #include "_elftc.h" -ELFTC_VCSID("$Id: strings.c 2351 2011-12-19 11:20:37Z jkoshy $"); +ELFTC_VCSID("$Id: strings.c 3124 2014-12-21 05:46:28Z kaiwang27 $"); enum return_code { RETURN_OK, @@ -75,9 +75,9 @@ enum encoding_style { (encoding == ENCODING_8BIT && (c) > 127))) -int encoding_size, entire_file, min_len, show_filename, show_loc; -enum encoding_style encoding; -enum radix_style radix; +static int encoding_size, entire_file, min_len, show_filename, show_loc; +static enum encoding_style encoding; +static enum radix_style radix; static struct option strings_longopts[] = { { "all", no_argument, NULL, 'a'}, diff --git a/test/ar/Makefile b/test/ar/Makefile index a62db09d9320..d767a3934430 100644 --- a/test/ar/Makefile +++ b/test/ar/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile 2141 2011-11-10 15:03:40Z jkoshy $ +# $Id: Makefile 3025 2014-04-18 16:20:25Z jkoshy $ TOP= ../.. AR= ${TOP}/ar/ar @@ -17,4 +17,4 @@ clobber: clean SUBDIR= plugin -.include +.include "${TOP}/mk/elftoolchain.subdir.mk" diff --git a/test/ar/plugin/Makefile b/test/ar/plugin/Makefile index 58e00fd1b2de..36e33a35687c 100644 --- a/test/ar/plugin/Makefile +++ b/test/ar/plugin/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile 2080 2011-10-27 04:23:24Z jkoshy $ +# $Id: Makefile 3025 2014-04-18 16:20:25Z jkoshy $ PLUGINS= ardiff teraser @@ -9,7 +9,7 @@ ${PLUGINS}: ${MAKE} -f Makefile.${plugin} .endfor -clean depend: +clean cleandepend depend: .for plugin in ${PLUGINS} ${MAKE} -f Makefile.${plugin} ${.TARGET} .endfor diff --git a/test/ar/plugin/Makefile.ardiff b/test/ar/plugin/Makefile.ardiff index 1558cfe6065c..ec702c2ae585 100644 --- a/test/ar/plugin/Makefile.ardiff +++ b/test/ar/plugin/Makefile.ardiff @@ -1,9 +1,7 @@ -# $Id: Makefile.ardiff 2096 2011-11-01 04:42:04Z jkoshy $ +# $Id: Makefile.ardiff 3120 2014-12-21 05:45:51Z kaiwang27 $ TOP= ../../.. -.include "${TOP}/mk/elftoolchain.os.mk" - PROG= ardiff NOMAN= noman diff --git a/test/ar/plugin/ardiff.c b/test/ar/plugin/ardiff.c index e54f6a9f6cdc..907d1ea80da9 100644 --- a/test/ar/plugin/ardiff.c +++ b/test/ar/plugin/ardiff.c @@ -12,7 +12,7 @@ * By default, it compares nothing and consider the test "not ok" * iff it encounters errors while reading archive. * - * $Id: ardiff.c 2142 2011-11-10 15:29:59Z jkoshy $ + * $Id: ardiff.c 3102 2014-10-29 21:09:01Z jkoshy $ */ #include @@ -93,9 +93,8 @@ main(int argc, char **argv) /* Open file 1 */ a1 = archive_read_new(); - archive_read_support_compression_none(a1); archive_read_support_format_ar(a1); - if (archive_read_open_file(a1, argv[0], + if (archive_read_open_filename(a1, argv[0], 1024*10)) { warnx("%s", archive_error_string(a1)); filediff(tc, "archive open failed", NULL); @@ -103,9 +102,8 @@ main(int argc, char **argv) /* Open file 2 */ a2 = archive_read_new(); - archive_read_support_compression_none(a2); archive_read_support_format_ar(a2); - if (archive_read_open_file(a2, argv[1], + if (archive_read_open_filename(a2, argv[1], 1024*10)) { warnx("%s", archive_error_string(a2)); filediff(tc, "archive open failed", NULL); @@ -233,10 +231,11 @@ static void incct(const char *pathname) { FILE *fp; - char buf[10], *_buf; + char buf[10]; if ((fp = fopen(pathname, "r")) != NULL) { - _buf = fgets(buf, 10, fp); + if (fgets(buf, 10, fp) != buf) + perror("fgets"); snprintf(buf, 10, "%d\n", atoi(buf) + 1); fclose(fp); } diff --git a/test/ar/plugin/teraser.c b/test/ar/plugin/teraser.c index 59d587f7f048..d16752e7cefb 100644 --- a/test/ar/plugin/teraser.c +++ b/test/ar/plugin/teraser.c @@ -2,7 +2,7 @@ * make it easy to `diff'. (option -e) * 2. Check the sanity of timestamp. (option -c) * - * $Id: teraser.c 2142 2011-11-10 15:29:59Z jkoshy $ + * $Id: teraser.c 3102 2014-10-29 21:09:01Z jkoshy $ */ #include @@ -28,7 +28,7 @@ main(int argc, char **argv) char opt; char checktime; char erasetime; - char buf[TSLEN + 1], *_buf; + char buf[TSLEN + 1]; char *tc; int fd; int ts; @@ -85,7 +85,8 @@ main(int argc, char **argv) if (ts <= now && ts >= now - TDELAY) { fprintf(stderr, "%s - timestamp ok\n", tc); if ((ps = fopen(PASSED, "r")) != NULL) { - _buf = fgets(buf, TSLEN, ps); + if (fgets(buf, TSLEN, ps) != buf) + perror("fgets"); snprintf(buf, TSLEN, "%d\n", atoi(buf) + 1); fclose(ps); @@ -98,7 +99,8 @@ main(int argc, char **argv) fprintf(stderr, "%s - timestamp not ok\n", tc); } if ((ct = fopen(COUNTER, "r")) != NULL) { - _buf = fgets(buf, TSLEN, ct); + if (fgets(buf, TSLEN, ct) != buf) + perror("fgets"); snprintf(buf, TSLEN, "%d\n", atoi(buf) + 1); fclose(ct); } diff --git a/test/elfcopy/Makefile b/test/elfcopy/Makefile index f1302f133979..5114a68e7b2f 100644 --- a/test/elfcopy/Makefile +++ b/test/elfcopy/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile 2141 2011-11-10 15:03:40Z jkoshy $ +# $Id: Makefile 3025 2014-04-18 16:20:25Z jkoshy $ TOP= ../.. @@ -18,4 +18,4 @@ clobber: clean SUBDIR= plugin -.include +.include "${TOP}/mk/elftoolchain.subdir.mk" diff --git a/test/elfcopy/plugin/Makefile b/test/elfcopy/plugin/Makefile index a72fbfe7d371..36e33a35687c 100644 --- a/test/elfcopy/plugin/Makefile +++ b/test/elfcopy/plugin/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile 2082 2011-10-27 04:38:32Z jkoshy $ +# $Id: Makefile 3025 2014-04-18 16:20:25Z jkoshy $ PLUGINS= ardiff teraser @@ -9,7 +9,7 @@ ${PLUGINS}: ${MAKE} -f Makefile.${plugin} .endfor -clean depend: +clean cleandepend depend: .for plugin in ${PLUGINS} ${MAKE} -f Makefile.${plugin} ${.TARGET} .endfor diff --git a/test/elfcopy/plugin/Makefile.ardiff b/test/elfcopy/plugin/Makefile.ardiff index 7f371a7a975c..a7baa0a0292b 100644 --- a/test/elfcopy/plugin/Makefile.ardiff +++ b/test/elfcopy/plugin/Makefile.ardiff @@ -1,9 +1,7 @@ -# $Id: Makefile.ardiff 2096 2011-11-01 04:42:04Z jkoshy $ +# $Id: Makefile.ardiff 3121 2014-12-21 05:46:01Z kaiwang27 $ TOP= ../../.. -.include "${TOP}/mk/elftoolchain.os.mk" - PROG= ardiff NOMAN= diff --git a/test/elfcopy/plugin/ardiff.c b/test/elfcopy/plugin/ardiff.c index e54f6a9f6cdc..907d1ea80da9 100644 --- a/test/elfcopy/plugin/ardiff.c +++ b/test/elfcopy/plugin/ardiff.c @@ -12,7 +12,7 @@ * By default, it compares nothing and consider the test "not ok" * iff it encounters errors while reading archive. * - * $Id: ardiff.c 2142 2011-11-10 15:29:59Z jkoshy $ + * $Id: ardiff.c 3102 2014-10-29 21:09:01Z jkoshy $ */ #include @@ -93,9 +93,8 @@ main(int argc, char **argv) /* Open file 1 */ a1 = archive_read_new(); - archive_read_support_compression_none(a1); archive_read_support_format_ar(a1); - if (archive_read_open_file(a1, argv[0], + if (archive_read_open_filename(a1, argv[0], 1024*10)) { warnx("%s", archive_error_string(a1)); filediff(tc, "archive open failed", NULL); @@ -103,9 +102,8 @@ main(int argc, char **argv) /* Open file 2 */ a2 = archive_read_new(); - archive_read_support_compression_none(a2); archive_read_support_format_ar(a2); - if (archive_read_open_file(a2, argv[1], + if (archive_read_open_filename(a2, argv[1], 1024*10)) { warnx("%s", archive_error_string(a2)); filediff(tc, "archive open failed", NULL); @@ -233,10 +231,11 @@ static void incct(const char *pathname) { FILE *fp; - char buf[10], *_buf; + char buf[10]; if ((fp = fopen(pathname, "r")) != NULL) { - _buf = fgets(buf, 10, fp); + if (fgets(buf, 10, fp) != buf) + perror("fgets"); snprintf(buf, 10, "%d\n", atoi(buf) + 1); fclose(fp); } diff --git a/test/elfcopy/plugin/teraser.c b/test/elfcopy/plugin/teraser.c index 59d587f7f048..0deb7cc90630 100644 --- a/test/elfcopy/plugin/teraser.c +++ b/test/elfcopy/plugin/teraser.c @@ -2,7 +2,7 @@ * make it easy to `diff'. (option -e) * 2. Check the sanity of timestamp. (option -c) * - * $Id: teraser.c 2142 2011-11-10 15:29:59Z jkoshy $ + * $Id: teraser.c 3102 2014-10-29 21:09:01Z jkoshy $ */ #include @@ -28,7 +28,7 @@ main(int argc, char **argv) char opt; char checktime; char erasetime; - char buf[TSLEN + 1], *_buf; + char buf[TSLEN + 1]; char *tc; int fd; int ts; @@ -85,7 +85,8 @@ main(int argc, char **argv) if (ts <= now && ts >= now - TDELAY) { fprintf(stderr, "%s - timestamp ok\n", tc); if ((ps = fopen(PASSED, "r")) != NULL) { - _buf = fgets(buf, TSLEN, ps); + if (fgets(buf, TSLEN, ps) != buf) + perror("fgets"); snprintf(buf, TSLEN, "%d\n", atoi(buf) + 1); fclose(ps); @@ -98,7 +99,8 @@ main(int argc, char **argv) fprintf(stderr, "%s - timestamp not ok\n", tc); } if ((ct = fopen(COUNTER, "r")) != NULL) { - _buf = fgets(buf, TSLEN, ct); + if (fgets(buf, TSLEN, ct) != NULL) + perror("fgets"); snprintf(buf, TSLEN, "%d\n", atoi(buf) + 1); fclose(ct); } diff --git a/test/elfcopy/tc/strip-empty-1/in/strip-empty-1.in.shar b/test/elfcopy/tc/strip-empty-1/in/strip-empty-1.in.shar new file mode 100644 index 000000000000..6ff3cf214cc2 --- /dev/null +++ b/test/elfcopy/tc/strip-empty-1/in/strip-empty-1.in.shar @@ -0,0 +1,32 @@ +# This is a shell archive. Save it in a file, remove anything before +# this line, and then unpack it by entering "sh file". Note, it may +# create directories; files and directories will be owned by you and +# have default permissions. +# +# This archive contains: +# +# empty.o.uu +# +echo x - empty.o.uu +sed 's/^X//' >empty.o.uu << '446fa33c5b702a1d1fbfe3ec7a501a1a' +Xbegin 644 empty.o +XM?T5,1@(!`0D```````````$`/@`!`````````````````````````'`````` +XM`````````$```````$``!P`$```Nempty.o.uu << '446fa33c5b702a1d1fbfe3ec7a501a1a' +Xbegin 644 empty.o +XM?T5,1@(!`0D```````````$`/@`!`````````````````````````%`````` +XM`````````$```````$```@`!```N +.include "${TOP}/mk/elftoolchain.tetbase.mk" diff --git a/test/libdwarf/ts/Makefile b/test/libdwarf/ts/Makefile index 84d6e2404b14..05ddf91e16d4 100644 --- a/test/libdwarf/ts/Makefile +++ b/test/libdwarf/ts/Makefile @@ -1,7 +1,9 @@ # -# $Id: Makefile 2084 2011-10-27 04:48:12Z jkoshy $ +# $Id: Makefile 3025 2014-04-18 16:20:25Z jkoshy $ # +TOP= ../../.. + SUBDIR+= dwarf_init SUBDIR+= dwarf_next_cu_header SUBDIR+= dwarf_get_address_size @@ -22,4 +24,4 @@ SUBDIR+= dwarf_pubnames SUBDIR+= dwarf_macinfo SUBDIR+= dwarf_ranges -.include +.include "${TOP}/mk/elftoolchain.subdir.mk" diff --git a/test/libdwarf/ts/Makefile.tset b/test/libdwarf/ts/Makefile.tset index af0f82a10dbc..6546de89d2cf 100644 --- a/test/libdwarf/ts/Makefile.tset +++ b/test/libdwarf/ts/Makefile.tset @@ -1,6 +1,4 @@ -# $Id: Makefile.tset 2198 2011-11-23 16:13:45Z jkoshy $ - -.include "${TOP}/mk/elftoolchain.os.mk" +# $Id: Makefile.tset 3122 2014-12-21 05:46:10Z kaiwang27 $ # libdwarf test suite uses libdwarf in /usr/local (i.e. SGI libdwarf), # if TCGEN is defined. @@ -15,6 +13,11 @@ LDADD+= -ldwarf DPADD+= ${LIBELF} LDADD+= -lelf +# Test cases do not have manual pages. +NOMAN= noman + +.include "${TOP}/mk/elftoolchain.os.mk" + # Determine the location of the XML handling library. .if ${OS_HOST} == FreeBSD LDADD+= -lbsdxml @@ -51,6 +54,3 @@ ${f}: ${TS_OBJROOT}/common/object/${f}.gz .if ${OS_HOST} != NetBSD WARNS?= 2 .endif - -# Test cases do not have manual pages. -NOMAN= noman diff --git a/test/libdwarf/ts/README b/test/libdwarf/ts/README index b163c50a7ccd..0a041dcbd604 100644 --- a/test/libdwarf/ts/README +++ b/test/libdwarf/ts/README @@ -1,4 +1,4 @@ -: $Id: README 2084 2011-10-27 04:48:12Z jkoshy $ +: $Id: README 3072 2014-06-23 03:08:44Z kaiwang27 $ Libdwarf test suite use XML files to describe test case, invocable component and test purpose. @@ -32,3 +32,15 @@ When a test case is compiled with 'make TCGEN=yes', it will instead link with SGI libdwarf and genearte XML files during TP execution. These generated XML files can then be used directly to test this libdwarf implementation. + +For example, to generate XML files for test case dwarf_next_cu_header: + +% cd /path/to/elftoolchain/test/libdwarf/ +# unsetenv TET_ROOT +% make clean && make TCGEN=yes +% cd ts/dwarf_next_cu_header +% setenv TET_ROOT /path/to/elftoolchain/test/tet +% env ICLIST=dt32-g1:dt64-g1:ec32-g1:ec64-g1:ld_symver.o-64-g1 ./tc_dwarf_next_cu_header + +(ICLIST defines a list of test objects on which the test case +generates. One gzipped XML file is generated for each test object.) diff --git a/test/libdwarf/ts/common/die_traverse2.c b/test/libdwarf/ts/common/die_traverse2.c new file mode 100644 index 000000000000..059ca13cb1c0 --- /dev/null +++ b/test/libdwarf/ts/common/die_traverse2.c @@ -0,0 +1,120 @@ +/*- + * Copyright (c) 2010,2014 Kai Wang + * 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: die_traverse2.c 3076 2014-06-23 23:54:01Z kaiwang27 $ + */ + +#include +#include +#include + +#include "driver.h" + +static int die_cnt; + +/* + * DIE traverse function shared by test cases. (another version with + * .debug_types support) + */ + +static void +_die_traverse_recursive2(Dwarf_Debug dbg, Dwarf_Die die, + Dwarf_Bool is_info, void (*die_callback)(Dwarf_Die die)) +{ + Dwarf_Die die0; + Dwarf_Off offset; + Dwarf_Half tag; + Dwarf_Error de; + const char *tagname; + int r; + + assert(dbg != NULL && die != NULL && die_callback != NULL); + + if (dwarf_tag(die, &tag, &de) != DW_DLV_OK) { + tet_printf("dwarf_tag failed: %s\n", dwarf_errmsg(de)); + result = TET_FAIL; + } + tagname = NULL; + if (dwarf_get_TAG_name(tag, &tagname) != DW_DLV_OK) { + tet_infoline("dwarf_get_TAG_name failed"); + result = TET_FAIL; + } + offset = 0; + if (dwarf_dieoffset(die, &offset, &de) != DW_DLV_OK) { + tet_printf("dwarf_dieoffset failed: %s\n", dwarf_errmsg(de)); + result = TET_FAIL; + } + tet_printf("DIE #%d (%s) [%#x]\n", die_cnt++, tagname, offset); + + die_callback(die); + + /* Search children. */ + r = dwarf_child(die, &die0, &de); + if (r == DW_DLV_ERROR) + tet_printf("%s: dwarf_child failed: %s", __func__, + dwarf_errmsg(de)); + else if (r == DW_DLV_OK) + _die_traverse_recursive2(dbg, die0, is_info, die_callback); + + /* Search sibling. */ + r = dwarf_siblingof_b(dbg, die, &die0, is_info, &de); + if (r == DW_DLV_ERROR) + tet_printf("%s: dwarf_siblingof failed: %s", __func__, + dwarf_errmsg(de)); + else if (r == DW_DLV_OK) + _die_traverse_recursive2(dbg, die0, is_info, die_callback); +} + +static void +_die_traverse2(Dwarf_Debug dbg, Dwarf_Bool is_info, + void (*die_callback)(Dwarf_Die die)) +{ + Dwarf_Die die; + Dwarf_Error de; + Dwarf_Unsigned cu_next_offset; + + assert(dbg != NULL && die_callback != NULL); + + die_cnt = 0; + + if (is_info) { + TS_DWARF_CU_FOREACH2(dbg, 1, cu_next_offset, de) { + if (dwarf_siblingof_b(dbg, NULL, &die, 1, &de) != + DW_DLV_OK) + break; + _die_traverse_recursive2(dbg, die, 1, die_callback); + } + } else { + do { + TS_DWARF_CU_FOREACH2(dbg, 0, cu_next_offset, de) { + if (dwarf_siblingof_b(dbg, NULL, &die, 0, + &de) != DW_DLV_OK) + break; + _die_traverse_recursive2(dbg, die, 0, + die_callback); + } + } while (dwarf_next_types_section(dbg, &de) == DW_DLV_OK); + } +} diff --git a/test/libdwarf/ts/common/driver.h b/test/libdwarf/ts/common/driver.h index 7d84a017e386..580683ffd17e 100644 --- a/test/libdwarf/ts/common/driver.h +++ b/test/libdwarf/ts/common/driver.h @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: driver.h 2084 2011-10-27 04:48:12Z jkoshy $ + * $Id: driver.h 3074 2014-06-23 03:08:53Z kaiwang27 $ */ #ifndef _DRIVER_H_ @@ -62,9 +62,16 @@ struct dwarf_tp { while (dwarf_next_cu_header((D), NULL, NULL, NULL, NULL, &(N), \ &(DE)) == DW_DLV_OK) -#define TS_DWARF_DIE_TRAVERSE(D, CB) \ +#define TS_DWARF_CU_FOREACH2(D,I,N,DE) \ + while (dwarf_next_cu_header_c((D), (I), NULL, NULL, NULL, NULL, \ + NULL, NULL, NULL, NULL, &(N), &(DE)) == DW_DLV_OK) + +#define TS_DWARF_DIE_TRAVERSE(D,CB) \ _die_traverse((D), (CB)) +#define TS_DWARF_DIE_TRAVERSE2(D,I,CB) \ + _die_traverse2((D), (I), (CB)) + #ifndef TCGEN #define _TS_CHECK_VAR(X,S) do { \ diff --git a/test/libdwarf/ts/common/object/ld_symver.o-64-g1.gz b/test/libdwarf/ts/common/object/ld_symver.o-64-g1.gz new file mode 100644 index 0000000000000000000000000000000000000000..5fd90579c81140f0e5d9d115f2222cc25c9dea8d GIT binary patch literal 36785 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 @@ -48,7 +48,7 @@ static struct dwarf_tp dwarf_tp_array[] = { }; static int result = TET_UNRESOLVED; #include "driver.c" -#include "die_traverse.c" +#include "die_traverse2.c" static void _dwarf_attrlist(Dwarf_Die die) @@ -90,7 +90,8 @@ tp_dwarf_attrlist(void) TS_DWARF_INIT(dbg, fd, de); - TS_DWARF_DIE_TRAVERSE(dbg, _dwarf_attrlist); + TS_DWARF_DIE_TRAVERSE2(dbg, 1, _dwarf_attrlist); + TS_DWARF_DIE_TRAVERSE2(dbg, 0, _dwarf_attrlist); if (result == TET_UNRESOLVED) result = TET_PASS; diff --git a/test/libdwarf/ts/dwarf_attrlist/ec32-g1.xml.gz b/test/libdwarf/ts/dwarf_attrlist/ec32-g1.xml.gz index 3408f55c6e59ddf73b3f931902b85f40e011545f..f2a53356cc7c7b21d01d63966caaa5f6344b86be 100644 GIT binary patch delta 17 YcmcbqbyJH&zMF$1Z~cnkjU0iZ06FCb00000 delta 17 YcmcbqbyJH&zMF%i?)6RYjU0iZ06hl=bpQYW diff --git a/test/libdwarf/ts/dwarf_attrlist/ec64-g1.xml.gz b/test/libdwarf/ts/dwarf_attrlist/ec64-g1.xml.gz index 13581a27d24c933aef7e45208fb06653b63f51c1..19faaf701f76326d603581b94029e73cbb5d130b 100644 GIT binary patch delta 17 YcmaE?^;nBTzMF$1fBlN!jU3UU06Rej9{>OV delta 17 YcmaE?^;nBTzMF%i{`F1ojU3UU06t>|lmGw# diff --git a/test/libdwarf/ts/dwarf_attrlist/ld_symver.o-64-g1.xml.gz b/test/libdwarf/ts/dwarf_attrlist/ld_symver.o-64-g1.xml.gz new file mode 100644 index 0000000000000000000000000000000000000000..b78ab0abd9b2598feb6290b7b3f551047f6a3ef8 GIT binary patch literal 3754 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 literal 0 HcmV?d00001 diff --git a/test/libdwarf/ts/dwarf_die_query/Makefile b/test/libdwarf/ts/dwarf_die_query/Makefile index efcf1bc97c4e..0f99aa3e1bbf 100644 --- a/test/libdwarf/ts/dwarf_die_query/Makefile +++ b/test/libdwarf/ts/dwarf_die_query/Makefile @@ -1,8 +1,8 @@ -# $Id: Makefile 2084 2011-10-27 04:48:12Z jkoshy $ +# $Id: Makefile 3075 2014-06-23 03:08:57Z kaiwang27 $ TOP= ../../../.. TS_SRCS= dwarf_die_query.c -TS_DATA= dt32-g1 dt64-g1 ec32-g1 ec64-g1 dto64-g1 +TS_DATA= dt32-g1 dt64-g1 ec32-g1 ec64-g1 dto64-g1 ld_symver.o-64-g1 .include "${TOP}/mk/elftoolchain.tet.mk" diff --git a/test/libdwarf/ts/dwarf_die_query/dt32-g1.xml.gz b/test/libdwarf/ts/dwarf_die_query/dt32-g1.xml.gz index 2cda689a79455a844989e8b79913fab0099cb1ca..1fc0851421177f3aec1f519d478906e5311484cd 100644 GIT binary patch delta 808 zcmV+@1K0eu3%d&lABzYG@Rg@ikqATtfSq@ z_nr+u)$kJpL}L4IHCuh6)nU>hvG;40_cdF5n#G~wVX-;)@yQma*vG#s+1?ZF4U-Ou zz2EAF4L;G}tlf0&ehk;&NlkEd<9lOs30b&*TaJCeB{T;aei?Uubxh<-ZKyjTz1>k` zZu(uWAbyI7daN^`#za)98CvszpUxiT(wXbl0 z0&gj9HUF$?FLR^Bo5s7t7!*gmzt_?EwJ0hnTn{=gN0a;!grG*z3!9Ci zw+upTm<0|M>5(PuoeAlIbtgK%qvgir@;{Q)+xGeJAG7iUnE^1bZ?mCnHax!-k2i}C my>f@+U(xFp(ak&AXn$DzBln9>AvRY!{PsI(iU9DrqyPYG{fm(R delta 802 zcmV+-1Ks?)3$+UfABzYGuP@X~kqATtr8o7-kx zQyZDkj3>6LK*8ksOfo+kn=XA0V(jsMom!2dUJxR=@!**tIWl~vgaR2ja!0`obd9lf zh$rt-C?H-&MYyq6|E1sp%?rtaUmqXyjkSgz^-onr5Bit$aF`zX57H3S`~6NDg1-Hp zsFS>ZDoaw!&?oA5o*?wABObMJ!q-s{W34VVd7G#n7OOki)Q}Ykw)!8f4pk3})xCE* z?>!rSs^KRHh{X2aYPR}BtHY#2V(-@~?`yXBG>b#U!(wypX^uv+E8~wdb^{> z-1NI#LHraE^;l;>jcu!{Qv~;^-df1fY>o(LgO|eC7Ni^o=B=j3T&Tu()Sw~2C`MO! zqEV?jj!1C*%KLK)3Xd>qFG0uuP~h*S>6I9+Q6qP%4x<)o)Mt0GPUOZGzY3!oYG2`h z1m05IYW`W(Ugk!LH;s3PF({6Bf3KtSYf)5ExE^$z90zy^8RBIBPX9&_KWNTloPXEz zL47`|sNe}!zuq`!K}!lzqR;8B$~mFvQJab)b$2s;)} zFF9(6tJ;AJ2cw88+nGNTfP-mN8oi!>v9zr0cdd}nbAHRHN(OlLkH^kIJtbV75q_7qNafrmQ4Y>490m*qNHULmSV9EZvQH|x~k0$ve2tkda7d9J3 zZyAKxFbfrQljN6U@L<$olpx9#)c7qjvMnE@)(x7koO8=l{a$D756 gUb%zlWTX9I@sA)cK7H!uN{9db4&L-?Ns6QZ0I$7|!2kdN diff --git a/test/libdwarf/ts/dwarf_die_query/dt64-g1.xml.gz b/test/libdwarf/ts/dwarf_die_query/dt64-g1.xml.gz index 211645acbf4360e9b916145ee688a70932405b91..6a1a6fd54759f1bd5cd157943941609018ce5b90 100644 GIT binary patch delta 485 zcmVNF>@PoV>UKL8zSC6;`X&!_s>>jIHD{d_85 zX)L+M!-w#l#pKvUPw}xDv6=z8Et6bdPG-}RS><4srk2T)J0`IQA&yuw&BM*m0fek1Kpo4eh2M=1v;h`occR_Ty5kAySsXmgT z9=wEqpx6!?`cRbeC?JrmCnWTBlGGLy$>)f4W7mj?sU zVq!J(drnp}EiVZ|#Jz!a<__}pT=g(hFa=XE#XJ;qZI=+#0!Ln7M{N>tO64iS6ik7I zB5vdDe-XfWO@z%knSzrUQ*Z$108Z37nF1RHrx9cn96GUuP8?H&DUeN6reF%5BTT_e z6cZ?-4vKJ*!|Ow)U)UK-n+^AG#pA`|L$BQ7_*eA0MfC7a bHrgK+|H%E~Q;5x#4*&Zdgp>3Sqoe=;{gL0b delta 479 zcmV<50U-Xl3$qIdABzYGuP@X~kqATsx@ju0PoV>U{{cGGN-X&%pHKC%*99VR`uSAA z(pYkhhY#U9i^;Kzp5kLQVl@MFTPC@_oXn;rv&z9NO)ZlpcT8drLL9MVpcU{TNP6a~ zq{kd|hM!kRP92mcNNw!B0QLE$M;;E10vk{eKnL&04<59T!$VC@?tGlkKDiP5-ENvKdpDbTw$bh=3Q;f3%8feVcX4!)k=6E;&3QDyp4s z=3KBgwlppbz9dvcQ+2Kd&0hD(CS0N=lWg1u26{RG*QhrtT+=T}xy z#l&jn_nfR|T3!-_h} zDJD=v9Tedrhu4Qp!4z0hDvGVO`47Nvu6%p^>Dz2*n+^AG#pA`|L$BOHbh6R@u=q!i V7oXmBbEU(-eh1fAXrpwb001>s;wS(B diff --git a/test/libdwarf/ts/dwarf_die_query/dto64-g1.xml.gz b/test/libdwarf/ts/dwarf_die_query/dto64-g1.xml.gz index 7b2d38d04585e197e686e3a34dcfcdbd4ba00b26..2cd4ea5a2ff71d26658562b80ea6cc1607130950 100644 GIT binary patch delta 51 zcmV-30L=fg3%LsjABzYG@s+1ju?Ua_AsqjaUbl!I-pNM$!{Q&gUwjI&xzgdc-vLoR Ju8pUp002XK7p(vQ delta 44 zcmV+{0Mq}u3$hCcABzYGP&ztHu?Ua_8i-Cd+8-AG2=e07r*5uv`0aP?HMLE6qyPYD CDH2!! diff --git a/test/libdwarf/ts/dwarf_die_query/dwarf_die_query.c b/test/libdwarf/ts/dwarf_die_query/dwarf_die_query.c index 45b9c44d1abe..5c99fc230497 100644 --- a/test/libdwarf/ts/dwarf_die_query/dwarf_die_query.c +++ b/test/libdwarf/ts/dwarf_die_query/dwarf_die_query.c @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: dwarf_die_query.c 2084 2011-10-27 04:48:12Z jkoshy $ + * $Id: dwarf_die_query.c 3075 2014-06-23 03:08:57Z kaiwang27 $ */ #include @@ -42,15 +42,18 @@ */ static void tp_dwarf_die_query(void); +static void tp_dwarf_die_query_types(void); static void tp_dwarf_die_query_sanity(void); static struct dwarf_tp dwarf_tp_array[] = { {"tp_dwarf_die_query", tp_dwarf_die_query}, + {"tp_dwarf_die_query_types", tp_dwarf_die_query_types}, {"tp_dwarf_die_query_sanity", tp_dwarf_die_query_sanity}, {NULL, NULL}, }; static int result = TET_UNRESOLVED; #include "driver.c" #include "die_traverse.c" +#include "die_traverse2.c" static void _dwarf_die_query(Dwarf_Die die) @@ -102,6 +105,27 @@ done: TS_RESULT(result); } +static void +tp_dwarf_die_query_types(void) +{ + Dwarf_Debug dbg; + Dwarf_Error de; + int fd; + + result = TET_UNRESOLVED; + + TS_DWARF_INIT(dbg, fd, de); + + TS_DWARF_DIE_TRAVERSE2(dbg, 0, _dwarf_die_query); + + if (result == TET_UNRESOLVED) + result = TET_PASS; + +done: + TS_DWARF_FINISH(dbg, de); + TS_RESULT(result); +} + static void tp_dwarf_die_query_sanity(void) { diff --git a/test/libdwarf/ts/dwarf_die_query/ec32-g1.xml.gz b/test/libdwarf/ts/dwarf_die_query/ec32-g1.xml.gz index d54847f126eaafacb5caa2897ddcf74d224e20b1..0dde7100876f7a61cd137e58163c81b07a8f1667 100644 GIT binary patch delta 11546 zcmbW-WmH_@mL}i;0fGm2x8Uv)90I|mAQTcjXmID?R(Rp=uE8Y`5?q42rh>a$kRg5V z?djFsGqZaBo%5|#KWm@od*2;vnqvBj67uTRNm7Ys{3|5@lHoRRa$c^zpUnacCj^-% zw|70k5`GK-@RS%`ZPI`7MoS!;7)l$xxj#|umAKw z*seQmZeH~%yIHv8df&hBhYd}(neWz5B$@@_0Z)%O8eNncR2{i?m| z`U&$PIBXwyd%qc^tp9X|rO&u;yZ@Mge*dj2C_7k!Qk)X2ZBVC32`izoDy_CX0k1<3 zTUnpnm+%roXLgzI_GVs1kKw70->xZ5%2)aOSx)d zEVd;$3$(dsd>x{)NZ#0TJ?%u^1;^*}!4Eut zq3V31ZW>Lt)5GTWAPmw=W~GI=`Y$kUvP?LwUupAN1taxmp%`r+*cakN#4F;x*k9hx z#aH$L=-SpZL(yZe#=k0m4(2a(ew%z3c5%)0X^VnS4}Zk?t1=>wt~~J`w^&V2JhR zx5e)`IH=`EQ!eSfbG32(sT1lHs`?gt-l~v9J@A0?5{Pa-?kmej=_3{*+Yu4u0i;86 zRMN9ZtX75wlH^I}>!u)l(T|A7`!8)rARUT;J&E`psock7R3zJR7SI>!?a{tjm&Lk) zJ-4r6hnniFI&i0~Rv%18w2mIBP_otot<_XJXWtH|jKz*PrfWnGt*Cc>xlM?@^Lh8` zp|d=GS_$RyIEVAVQc_;yinBP?JmGp|f8}~U_0N;3DMM83T%XC26ryt@m_Md+tAk+# zvt}-|hNz8Sua&MMaqTN~1zrSzzM$3A)ILE+s+43IF^3NkV>XMDLMA68isYi;_IkxU zOMx-;D=_xE{sl5dj#Zf=k_f~;5BMX1dAxzZQ8Rza%p@sbxy!7X@w$R_Q?>n<$ioMlTDUieJwDsc8qIFd}nY`GrwCb-U7yWgrM`-d8Fu=!z|N@O?3^2phlW?D*}qmDpgFC4j*_ zQvoe`$pZj`L-_dIU3_6%@)ejq`p zwZzsrP4%XYAs>Ilt@H>b-5K&15C5MO^x6x;+^Vvm-_{)@@(7By64!M(%(=dWSTjp} zL=TKcTsUK2c&hUydPC4+>Lbqse^kOcMsu`UA_zCFiB6T{u7N_02)l0AN~#)LYr^@$ z0O%&YIF%8;@g+#q!$Jv^Vs>jCa2na=X?4Yj`F`GN?am|ZfB^avkpS?<>=m<4ksO2w z9!EwsuMc7D_7O%tvU@O_I0VOM=V6XfHq%|j9-ZyMF7-PhAxE{bgKi?L>Z+C;)kZi@ z-t-@3yRyeD>zSJ71uc+_xDommt?T6-wZn`ey$CPa_Y9`nOWoCv6>1AsWxqn6k1##` zGpz~b`SbHWa`D0r0ihI*T_jrp*G4IC7Z`aOdIrJk?W!G*R$&*nc=gk^sQs5w6~gR{ z$#%2m$cLT;^3}#>j(qHOP$-P1^X>goYE%Bw{Rz3qnog<1DU*PV?;o@iHlw@b?9bvC z-iOqX+Ki?AMl|+~rebMB9;s&6K3A^{hgRJ^f)(bmAyQ^*z~OZ0f`{>}!r89rvL|_8LQ(a7@}!4Z+aFK2k)0|clG4GSAm2gkZUX}tJ@zm@*+O3& zdH+R^EorPMmwxLvUT}t;m$B4WtCqzVVw^>Z3sIS4imWU2z5RN3=Ed(5yS{|EPJXl@-A*yY!_!l)_ERXV2c9$e1FI(_@wA={n` zkLX+SU*z2SvE^y}TxB)}lU}r8{>Y=>qf0XvaLQ2LhbmBLbL93WNq!JL5)U=YvdeNb z*QZr3dpEAP%(aP*3$Z~uTP*ur0N+co02l@`**BIN*ZD5PS`-2l<57cH z2zz=DaOji?`m3@(XL6#Hqslw{$r6`{=n!>4k=>MxI9e~E;1m}mV{+`J(%L8pLV1$j z!7{?$Qj;#%7s<${xK>*X`A7jGBOD&V>SbevIb!Xe>3iOqP=E}-KM0ii`(}sIS)YAd zr+Mp%56GF+N}o($^@auQ${kTRI%`{%cOTi)ve1f z>$Hs7*}0EW+Ft40uOKLgv>5WDaO2QEo$=XN={3N^N#C(>7}vT|W1;u;o{@B4eZPG& z-hRK4XVB@wher;fZFUQIr)L=N99H^8l;cai6d-S>A&R-r(RPgWZSH{!eJU^|G(pxh zOwukA+i?OXmf_NBzm!5lZ_d5@cWbZzp723)U}7_;k#E$|@HxscQOQ+hkY&*uXk@1$ zM0ebhWQdI~VCNnU+t_PZ2Go|ktBY@9V7C)BubDr13s2L$$CD<0K)C#jnvn!ZUUeWv z*qu;K2a!8|NMaXLnAK&`AZcfL*PY=?uHB4G+z`WCIU}%FUHiD^akWe}ttj)Lt+``% z^cH%HLII#lX!4q?wk;=`S z%)eXsqR!#&4y{wK`I3ks#KOY#``U8ZYm^Hsj4k6#Ld~da1f=2mON@h`N-o#mRBT+$zZq4MSr>!eCx+ zJUoUrq4C0jq5Ei*fQ1^|5o0xB4o3y=x_K+Ai;3h`*I92uwG=F^JR>SvsAir9(WS#E zyTvi4qR32qMo-BCCcH7}iqT=Fu7(^UdB(gvL2pN|z*>VVbn$agDYfo&GKbxv7M3V_ z&fOmyUzS@fo)j}O?zvaEm%E9FT3WIAgkM#(-{B*a36Tf`*xpdy245TF@Acz1(@O8W zS?Wc`q0YCq2B@%U%8MtTU$n|BmUD3t^K8fA4u<-WOE$Yl&o<9#oimHIDol<`jTXqt zsF?G_jc}y8YOD*<_)yNFv}-rCM&gbPO5}P~Lurq|Kpa{|Wqm@l*Zy8;70pf*Xy-0D z%Co+jsvf8aXr(sWB6T>s>nPq&xI{fPl2$zW!ZMIbs-Y*4_~i z>vS_eAMP}e1J~`(R~pj#K6ghYBua8e68rImSVQg}oaWc=hm*Hb=>L%)@xrMD2fxvz zcA)1|no_n;NpW6&4-AXJzB2CSF>)oEopbv`9XFqQEr+T{22b^+_IAUBs4oxji!8c? z8F;%vTL%xfy@_#uMsG#rq$f>z(i3ilidHPpx2i|SmEy>4VS5s)JM9)hpx&SJ)S13E^8X8G#OCLy~StRtplG?Wwt$&hYbB}mI zRNrx7?J-u1xsENjx}?Sbe5lwh0E0AK+JR)Q2>kHpOMZpRm7Z|=Vz{(r(I>L$5%u`! z-P~}Yk0U6QT{tZk?V^njE&Rik4E0fBuJ+VBR#+_+2Nm$FFCbxKwkZ1vtfp+7hNl8p zqfb2nC>e)e{$a&{5vQCEE*$B*f=nHq`2Xej~*I#3WU|LZGA*leM}ex9nNN zDJ}&~8Eqf(s)SGb-iIn9a^e|B9qp_TNNe@>e7({|Ax8WH?Od0{>2u|0{QmG z(*c*}%Y)Pj7H(cOXjc7Q0&Spvdyf)LGK=7sXljw<-G~J@N>7s}r+`l_Zp#Bs+3*{u~BCylF4qGMB4+_(A9l?-^tf9;X(6ivZ{R>Pa2yH<-vT?mwt0O9_ z>A!cUpZ_ImSsudPVo!{l4xfcYTD^S5OH2Vzw@28`!R1p%+Ax-bVWu;A66qZx`>tOQ z@YBMf_1AGW+~M(OH^1*ylH2F?Siy{P-WQMs7q=m6@6M3zsdUJ~{mp39th2$->XF;c zQ^*{UxM8@rb#ZV*pR>43o@}9g_Ymt<@eOz@^0;lQ(mb_JdLf3#NC8;~qct{qhQ01b zR`vo=_+`XVgzcPoFNi2?WeWMU=j_{N8=4G-cH(s6yw-b*Pa@73VCs3Cx(~paeI6VCr%-STwL@F(OR13HJWddWpnIJA>sT@YqFS63 zDnt1ecNF%pY0bq>lgpqVwJ}qv?`U02j@6dit`K*`6?3`uMoILEsg0BdmeV7fzkBrZ z(b#%H&CXdK7lO}BvdL4P*$Po5dQGsu-dcKm>o2LP0z7fU6)~&_k zG$x+z$Vqpbj!SGw&Z{M;^b|y<_R`se=cMwIdiU!-V+ahr@*f>02VP5V9_7H%*e1J! zLvydKo^2P`OLDrgZXa1&JKp!{bRK^MJ+O_A7PjaWBBM>>f!z<_C6Y#w=tu?yo+WLT z+jI-c8urZ~F;j$}(*Qr*&)iyaB4cy}Km4)^p^TsF7pI>?=j~WDq7ZUzwZR54#&+~$ zygVEK%gPBGoDB>xdH}`maBcJ;6C%7Hx$+G-^r?^`TAr=3@s=`CcAWcxDU)oy)w#oD z9^QFH6n=TeXf#C-I4sXfdHH2Qi6in_aX(w#N5`TY4Qx&|VCoy>rS(~s?RYlgp!ZlIII#L4p)f6@faDahZ? z)%sX#?Nxr7YpgGm?jbirM{*$Z5{&)Q-haa}?k^uFM&xY8rvGpFBlvLeCVC~QaDB9` zd?^TBm=60wQAN&|{txhb!5Lviph$Y!h%ZEC>+u{2!&TUjG<`6Q%v9+kXE$^FT0Fb6 zEf4;FRDU0|LMZ&neHyl^IqZ6mG=1`EhOM?<`mAl$3=meB!sl$(3*drOAQRcL#GTS~ zebmB;%}Qh=y>tSpnHLzEGm$#!=zv3mc>I|~aWkwFJ#|)VB|*dVq)z>od>UgRRLJDn znNh&<26orfYDR$U)Z#1#pZSHxnsg4_cwL>x)34mJEU{(!CONHt63_*l$|GofO^YaA zMBMpmw>ku$zPV=O{Y2vtj}!&oW{jUU^uh*0*uX~>3M0C4xbxy=DEKLnJw4D&hRi-6VlmIPYO*9v1@T5aSIo2`$&>_esQ^g{t+`{ zh~!+4w!a^LorVz)Z`}{(b$Sa=jbJL1_(z?7>Qch(c_ z4AxdTFZ-Fhq>G>0VlUaJM1Tmmsu9uEd?z=U)Cuf46ONZY&g=*#wh4I9YwC04^YvAW zRb8t1k7g~X{ij(E2{Ro7)^a{dH}=ZLj7@LG7t?KD6pyfl50QXx3J zyzC-C=9P9iF(HPGO>J5>IQscxuDu)kHNXRB z%UQ0IOSuzIohKQ|2AZU_@i`5Yojk5l?@-?efeitRGFU@3w9)FCrRPDZIYFZ457vsrs zz8WW}cv)u5P&w#jEsV9Dc6&uybsM>M?T|NGj}NNe>pmS&ekbTi{3F6Q_}ZDbCvnH> zU_lOl28epUQ2*7tCNBGMUE##kl(wAO&oug9oL*P@-<&?Zqb^ws%)Xk)C8OB+l#`Xt z;w+kF_}ZlF=5xr%rggWtke`x**aIhHVfNSj=>t%|<#W7ec|68Z9K7uCbB&86fg)of zab%3?@amT7x5#bs6ujX`9I*5WU!4-y#K>uHfWEA~^*#&#{zt~#`INJYlhmI36mh|@ zr$Ejq(M-lgm02SL$M#%J42KbR!dMNqO@4l%yDJ(-d=Ju4%ELY7gZql*7ryHU+?+*% zvV-AaVLl(br|H_N;`bO!rS3xl?1^U>hee6t#n zw9KdbobK`9jMej0e|b*#hTT*}1w~nZF5SNi$NzZKbwgeINSWhU z)%vv{`==qei*Dme@q477*l~)ri4C8r^$9(nab-2XcOocBu(;Gi{WKr;4|c~QiTs84 z-=kW_fiibTC)y7r1WL4PMb5Vg_S0^fAeIJg#?{op+A=uD)ySBX3Uy0DV*Hw6pylWH zmh#_cCJPn@Zix6!h_sLj$B3*vJi^lluJyhK{1u$=RP#l! zbN-qQmR|76GC`HWXX<7?^0Rd8wkn=#=Vc#ApGNbJ&hr;YP2C#;D$Z$*b3o(YsCrW0 zkRrwCG34ne+|6xmTJ|y-cI7Mr7#Wm4iE^*liHTTTM51F%n{8KiZiKJTvY#e|Z=%N7 znhwO6dzmz?$Y-ZkfsIM3$pyqX^9*^xcK#Hp8bh{nKP~B#kM0hu>i9eqwELGO3UBUy z4URL_QmWRW?=A+}O<03hu0mGDlKqtf5|bQ8Iy`lyI7Q=aVg|W5Pd8Jx_35wbQhzP| zkw>UiWtUW9Kocqn$8JKj;pmJ^Up!&6BClDsP=LX9gv{AYUy~JAgu3X<#lYr4S_j|N zSnPd`^&^=h>gH%$+jYtgcpqfA<4KhGIrip^cDGTG^PxoxI0oK}fZDg3-gjPH50gpDSQJW(SG;k*F>tFDZY5q0%X|DPe@6v{`pF$4W=o3 zZ%>Q;dD-)^ZI3emL5`LKnat*#1$mIn0An6;V(`$p$-DD-4^hXQVE%nZ^7o&GEN{ON z=^&q8vpa(^HovUl2kJ)V5*~5&?R1dVp=dl22T$6t#K`TX#S*-F2O(UtbHd}t;M~*0 zFGP32;}zsAhuC*kn=k*~NNVvCJ#FSF=c)eb?%G^BqMr5yJ*OZ9Oo8R!!Vvrx*8REK z{NeDC@YYu%_*nH)JjRj)#wYK`p!zM;IZmGYPR-cDZHlh5oTW|zccNSwKQO(D`m!UR zTnj-6L9gnsOj+V0yG`j$Pa_X}56_t4g0iemCuo`nhv>h&KLt5DL%hmr8%3<|+|M3a zr6bSI?&3b$tZW7Vzu-J?$$*(-%vMO(FQmJ3&avWNhN&64o^x;3M_&rMwYqI&kh$em ztCzG-|I7IcLdwn1rhKMvn~RYFY)3do%eAb8O#uvwz4RSBakzYEG%9;9!K17krejej zkq(-Qw%J5jVuDfyv(6I5QX~YTa@5gi*0ndJVaxKYl(oJ9@pw<{b|i}&`rJiSV&s$w z^6jSMU?C)HCV4v~zhPU_AX2>`yHUx$QzyV0d6sElNCMWPhMioARJgulaOg&Qi(?gU zEPBe7?@f?X1&@*5;gKg79eB=UhKAMMm*8_)GNk!h58PMurzbS(xEoJ?b$faLJU11# zovNt;muCv-D)v?nlx7T3<=a0h2?Qy|ybZDM3;D68wv)=O{hZk5jpq@@!;FeGd#ySm z4Gx75no-~FgtKXNPzl>>jpt0$a67cL>F(xQCA+2mZ!^bv(KjXuKLj!w|7~(WjDWMMV*ntc9yDPOblb z2v!W=?ypKFPzMeZY_UIQ{|fIMf^+jSwMCH%xznXG8-lm^W@9eSESjmDSAX@W4qfeD zqJIi7l%~nKJgy>!MOBjv|yv1toB}+C0w?r9&4cUJQ62v-^dcD2*A@4_H zO8|?b{lKh=u|OVkZN~~y`6q~~$@I@7=WRsofpf4IvK{o{-R$oA7i;iiG;35S`V6VfgFx(59iAJ{2xRH<<_SHi*fcq7Bd$4u~ zb)Cg)gwKt5!ihZmm|Z@CBla=FuP-=}Vq3%t<*^caO1HK53mYM1X^g%Ec%kUlf21SX z59~} zo!}}S*fm@JB}Fi2V;$}1*F%5M!3;uf=Wv-kD((GRlDvO|QToew$bS>iM|JtS1_%GC z4StKCh10_E@mm z2S4GCr6s=NNlE&H_&V%WDz4*SQ9mGwM72nboGB>zgTjBy^Vb;b=)ODDK@GWH7wZ9e zVP4Q!Iu5{xX?xD$g*ARO)#>YPb4qsqfEv`n-pNT{p{|FWu6=Q7+1T2qKjG@u&iYyd zw-la2*K6zWZaHdOwS?X>7Tj6$pXvtdL+w#%KBzkFFU)b586HmCm3cgGN=%v^2*2}O zpKcl`0zY?J+nHXp*ejYYswmAM4@kT`Hwu~g8*N(TyzVk)Oa0y5$uzL%s!N-|46SZHhCPiw2(Hn}CXcVrkt6N{ zSSfPr2elw$Lfm*o(IY@EfakSHdRNs?Ih(1wprMCMxQGa=)ALXXD`z? z0n>v2Y+UaXNmzrE7M&?Gm5Ce?&-Z=~gzBu#a)c(zIg7LzGq<{upKM6vhj6YDzV7=7 z+9xB))$D_3+D&2z|7x^>I}hSkBDw5&{ib=xh{ucghq5Z=#+x9;aToG^cmpB2BlUK4 zMZ+FXkXZ*J$X-F9Q|%%{pe+0=wwza}uqXiTntIzdTmhML7|pb!93j8rTA0ig+1own zy;PF2uc52lnLEF=<Z87m#bT0&s=Si`pZ@7XRbn-7%73NC7?$Owsbi?KzhHQLB-80qF-mGbv=)%QN(bICbFecsuk3$M>ouO{W96 z^+{;&e>5%>BQs1xLMt%F5i}LkMh9*ydq_TG2MAuw&Xb5_m7CZCR8l_Ld0ioDWEjzU zqVurIz8O2C&BLdcIkl9Thc~|nzZHesBCdazO$dB94xX!_U8RZYnT1k$3l?)+aWP^Mac>hg=CduhI?nOs=SjTb}8iY0=mJ( z037Geegm_mMAI%g*E2*N%!N8+Y^HOPwtAyI&!~Z>i^^ygeYKjT9^91q!4x8u!M*yWi&}B zTZQ9QosmyVI<`p;Sr>g_wqGi)#+aeH^;O01dQGW=`s-~%O{pV+?PDU0cd?^Zid)-> zZh!6*PqTc6Kf!TWSY}T52hXQu3Ol{qvu6h^5uZ-BF7Gcgp_y@aD=vLIPOGDUC6C-C zgD;C-)!^{$WySAdQ1HgNO;391n_YtylLGI$b~mHhr+*u%zWcS&D5i7LB~2lBWw0+Q z7;ClK)&%5pdu5LvRg?88a11XV55p(KDxC9qUw&|&Ak%eo+gdh$vG?&mnJ6%>2Y9#Sf0jxrMEL-!|OKmQdlkPjwd{wrZnoiO^Of(V_!#QkXS zy^nzl2)_-Id6Xc)8eb?VWY(A8D%-IJM}vM_Nkm}mh+kMqQx0 zdOWr?cLFXcAi|op^xNA^oA?v*t5f1R`=$RhUHt$kLz5EE|IZfD|73~CK$SfP+&uuZ z2AeQ4_R9JIH_cpjvdy=@L;$zWDz!D3rhWL`72&#m=LMVCFQ1+3MQMVM0?o2Egx~=? z<**KmVEg^3{R{pzr@CpjHtp;r0j=p(SkkT~`^HirhUY$j*ZN%!p>8e;sf|Se`F}E| zf&b^6o?L1A%GcDVQc_Mt8veSRYNJHZ$A7HJgy$_;8$XESd4o#;5O-nM`1{mM*DhB& zvK#YM?yqLNyp;a4MRP*R)zEP<)7Enq_4kARtK*4rrCT*;-DthdneSV^3xJEdWVxsr zqMv_1hE7XaZhbWg#Wka)L-x%N9qR24#q4{1J`~}1+{L-)MUuIH>9wSE5Zbv{T!-1;^` zYElX2!WnIA86-nON*_CbkIC}*~2i^CMM2VfB9H~*QsDFhLH*z^TU~KW>Q8l{^7{@VTb$l-Tej z2h}}8?u0tzM=eQdx^N0FJHh_DDJdN_5(3n_Ad*=xuhOuOV$+TVk9lK{`o^d1Mj!Vx z#89tc*7t=N=`AD$$EaBzQ|RRb5mQnQP+Dq9%tN2k#<%_=4HYR|=ctE;zsDbtlFQ85)Vn2H?lqyZRp7{^9&kR&eZWz8UOe-v!J8__|f>dxvME-1y~yG z{=$O$H0QuIGDpczDFRwce`L%s3Vgdd&u!xX+)`$Jp8u%bt-A8i)b+r3{&f8WC+ z`+ZNtWpxX5)@PAE!KU<7uQ9%4JUoq z+9B7gD`T*$&`rW*gYn}D6bC23P7rOdTKVx&shxX=$pEO5`R1(7?c(5&;=b7)7E)F9 z^cZ8vZrjYSklJR9GdCaiR8e35ut7Z!#@84DiESs*-D%TS@9cL59>Fa!($8Huos z=fvug)}Z@6^2D*tB!_E%@t(@%=MWeWg94h?YRGRtQNeB@J@PYp(AgPPJ*Rsj12?#_|cuOU&}de-zF zpDYZ^+IXG`3m*uI4#G(@4HM6~q1sNVW=Vdm0yFtqBogoD5QL036BvU;XzAk2e+KO; ziW(<6oE=-fFO;UdZKYE08}6e;dOiBB&oq2uD?hKf6bI%V3m6B{j7KmY@tmd&&Xojyyqq(Vge9&2^sIY(j2@*SK&^lA&70(?-uS)=; z=c|pVslBXws0p1o+Y=mry-(l9<|gv#l(L5HZ1p=Jm!+MDso&{k*=Op_(1`|6O6J3E z`WUitM#I$>iI&u%;MNf-wnDNSvl6#$S7Yig6PsyoltmZAstcT#QoLUMqjsn%|QmW;qTJ7N#emUA% z2COS_g2Z5fRu35z4y?(*p)DEk;B<$rJ;7N-y14v0uKCG}Poj$D_3q|5(bavEUi|T> zDKmkGX5u;$ckmN5))sL{{AFNUZzpT_ZjIOR(8p@dAE%RuYXEU?>q{ma(NUN)Vg&ADSie;K79Aj(J8G$AU*|G} z)oG3z+c;^Nuv(7OMRdWrYdFzf>Zx&5u$1&c?rV$>$@4ABQv|4Mx#6qX$nbFZSY-1S zxU-0&c5z}7<6u0>)11fty+n3%!P>^|*sP2!e2=G^f~$JBC0nmaKaKLsmj0{O;3W8D zORuA9bjVFjkO~ntr_$1|aJJv0;DKfoiqom5@$A?cJJ}FXlS0HyyM`*J zCNPPnk7<2MAN}vIqYY-V#_%x-6_2i6rFitiT>@Z~UiHd=K={6J36tf#*Lu|KPn42B zbN0WH2zO<^Poi!Iu@nzkuKVel?ob6SksFvbYw5&dzl(&{u=4SdpR8@9=KGrC7D@H7 zXR3L)37whB7NWc{M2)0gp=Xd5m{Gi?ZA zZBvX@g0ARZW9$o&KQlOzGP}(q*EKE>--F4D;A@9w@>8=@WS}PgUn!Z$i*QP<5w5xx zOPYSwu(!}pp^GS#)7Jjw4O3*t_{uI7GAJPRleJn|dL~i_o=D z1$7-EpZTM61jY3YZzX0{Ttx_4*B-)J$oC`y5SEmTm~i^BcL`1g@H^MP~Q@%aR|Dn zwv=!mYwDcDBc&TCt_A-B9I5aP;N9eVxz4tkBB>Vr7$n6E=yeFYTbS~gzVESgf{#*J zv-VyTC?qD4-h7{~%(ocFK*rjs=?LtZ3KQWXB^k6so)0>E>N(69kZ$+ev1Jw}mUBEn zghA^&=(cb)EWC}(t-|8xio9M;i9?o+18eT=NJ~(tu^D6fa6;yY=vNCEsZ@5yr!+(h zeD1Ginw7h6M0ry2a4EX)-ko-5A<}PRP^83CROFHRx&Il@8j_Q&CvEM@niy${w@=Bi zFTmJ4q6*7MJ#nr>s4dK63ClGLmPP8-n1PNg=94KyyQ*}L~nBw#nhse;kNSm5Ulrd!PxRYb+CGiLZic_*Jg!A7AzF5y1L--5Z*vm5yC9nlm}^F`>{#aAK?p- zIHhu)VqQgvICfsMmn_*}bBnZ;55=!@;zirKY* z1xeBKp2=ifbo>dx{P$6_DjM$)mm2BBaWCSDA&Li-^jhMnNFb~IoO_oapQ5AjkBkC4 z%5w~-88&jWtEA$D11gT!fT0g}5-7ZS#JaBE+|`l&14E{FbAQ>uZZU!}rVF&WfTygj zl2ov8OcqoW)|JMCWmqF7AA$&M7n2%lrH*jOR2?#!rbB*Q2SyRDqd7CaF;xK3o+wYM z^z~(f?2{0Mmw;*uLj9APJh{7-jJz(Cr`v6)M)l04A>U}c0f*bkO#}=dr=wm8yPXnP z+IO5c4^mVLF^+Z&o!FVPmR6`0)AK@dgv*4j--IFVmR~|;>~@5K#++MpVVv*vp?cG{+n#x z1AOHkes0R6XuSM4+ZdKAr02f6fm7d{M)B(J4%q69oIgp2gJ;Y?rP@yzfCTLUl2#p3 z)6M2XS?(wqP($n?Y+BxBFWB@JzhPP>$Qp{p(mGg8W9BGtv8euY?x{pMNw+*1&$}ty zwY2BwA2T!hpR`akWTdG);!U2Qg0}!3)O<9VYoznB;BqwO3)HLcPw3pt5ootxMpcK! zhwuI3Cwjhopf<*n%FWKrAuzo&ep$9P?Np#LBL@L((t8PSyfp%C!Xwzkv^*?S^WRN!=fCXafpL)mpaN!Go)$~4@4I8jPEBESyJk}RN~)Bt4DNzyT@Ard zuQQ(jpAiLB`3FZ~Gsv5x%?7eUA6Sl}uHC6?z{BqKDS+0So&SKPjS$$z+u42Co1J}v zBG0r55w@tjyjme?FcZu2Fy$;cA_IhJ&!si6N$p;d)V$oIX3CrX?Sd}@?SMblJAn#A zNL&PN0-{djo^-A<>_jcx47A5s$z0xC8LuFEbqEV7#m*ZnqySz#}?caHldXQ{Qh z$FIEQTkU|Tf$CHQJ~uULllN?W@}b9n&^lL3ILrl`+DkRRj^XTUwt4T+a#(zr^f8k6 z&bU7Lh>Ua_HMhm{qD`3*YSKR2l8pJLEL!D&ygKWXLgSydl8%$U;KA3^)um0~*R39Y zM!k)GSLGC0y~uR0@#tP6>q|&jB_@~K&rZ#a>9ms9^oxO2m10;^?@2RyV(UKr zn2zl|+mEeaS9keS|1})(u!LaC;j!qO3Oi_YU~@Kl@bR*%STo820qQOaN67{WG-BG% zNWAj--NL!CyPO6vEN&S6H9jHxN|;S$EzdGO+Flt=X6U7v>h*PMH~;)v*+GA!z9oN# z#eSI^rlg#2x1ohG-~)o5h@YjBUYa?XUC>E%t_a@~A=+#ECMW;iY;}C!LEBhz~VyODd%xXJBJ>>mVdT*Ek1vS+9cJ%OcclE-c6MNrtrr$iq_ptPH1IaY-W$V}E z+5+Rzy9cKk)RuH|KLu>kii%;X4IRdK7FHwej#4j;lY&(lcwtX`GzkFsd`o1XaDAd( zs1=_BJEl14=vS+sf}m}CSp{IOoX}~=d}bn0$VsMuaI&-^CN_H70_6bbw!bD;x?b=5#^pgq*oi# z<>bPij?bb>R|k?;3rOH9vsehwZ#59ub%!CZjv1KQ9VeH^w+6|dTx2mxH+NI5l#`C3 z%maMz%}-(k8(__wUc&sqt!YoeXCNGXQn(=mkEm7~<&N&m80UO~b_t33K0H}&o_^0F z*#d($!UF=8+HzNN8)gk0uiHlhFRg^$ivO9)JG+@h`$kbHdJDG~erwSvy8P|TW*BZC zaBnHQ*UD)H+Ppu#hTAE+0^QwwJnoa#91b~^8dx75L0@%Nx^gL>+yp+)+Z=+Xe)QAu<(~C<@%B{G@nKX{$^4=Ol>v4g9z`WOF?Dn^Y zOOgT0=`TaNpEO4Tn)7tH%RdH52x`1YldKp)BQb_?I^9Y#F)fYX^O7GvbUr!Hs}M}{ z-C-S6luEq{A2y34<$K-OP{mutCSZ?G4?=HxSNRdzVPGAjl1V#iF_6W{9HdTb!aS6U zHbS{h*-PJ#jau2u7&(o9Xc#<5dy&#qqxZ1FRk_Az`3rq<<}FckwLd~z0zs*=ZbP50 z?7%buPjks?6_=4q+yJ>V_H@42-tH0=C`KF{{KXf|s`xz9++_g^V;t_nh7Rf!b*bsI z*MAMwH!dhEdtc4+B~ou`QL;F|d%;6#Bm1gMDhjPHeLisue&45|PAo38d={v1qA{aD zPDWR{@W3k(I(!;GhzE&(hCf{WN_;h(!xD5%OowdZ1jC*ono=bmy6P&BymoOAiOap5 zWNS~U34o88*;v22jW||o-2&{8w;Ch_QH_{9}3T7K2gUg>=-t9T6ADgCKT0( zK^=Bv9&*Vp-&yEc&wuVj-wTSQVGIy(1>P|;=gh7#%S4N^1W?)$vudhqZI7uk5{>7} zMsBOq%M|4mMZ&(0yRuHIF!toc6BbClp?@b*k|ZT6(~)rk4~Z1iJ9M;M*J&*m;P@36 zmz$qCdORqvbx)Kb4)^!4!tH!_0xjGRXLvPyqorN2_ysK&6+3#pPR`dpPI;$7VkGYm zy0^JmrhvP99HbYDJ@{F+cqG%q@NJgxy9LR<56AHQh%@GP&)6qKY%k>55blVndYzqL zA?6PG@c3WJ=14M_^ayV?C{v z1>8bN2&wcNZ(W&ehSdf(1*8#NPwVNYOMd}IcOBdK@nb-R>O}D1E14c&mBXUCmMri> z^qlMkB}L5D@+-c^hKTmwsmPxcvA&eSvElJ(Zm4nx0Y%-P`M#6TE;iN{tY4;Pv$Re5 z%MOGTER5&cCW|$BNg6H#H;50MBe4HejwF=7-P z+jvL$*IR|x5ZDD8y)pN!$5`)}oyk;vORT?GeO2qfiW0g}@-4dXlqHROxWGWuCQ^SU zTjKsMJIhx9P_ zkLvm3D|YrmeEjB&P~0!dAm-sCT1+}amFkd7rsjcJ zdtv9j_N2U$#LG+HSmB(5JExq`o9rZGWf)LqBDT0^&U}NQ6`a3bYt$lAZmq4+I3S=x zd7c@W<7V-rG?$vYPa)?vbvOyNkYM+Wk@kGU>RbARTL^dAv(1w~nkw9?-vt1W#GCl5ieQ^$16kmyOn zAPX4_p}R-$v0l57R_#LZpOXu5^~zJb+n)eutnHi!R_rWd!g(Ptgl5H=H3 z>xZq1(MXLkrEw=6L#{FX)H@l4qg`Thx+v@v;N6Y*ZB5&#x!vKNnxCyfQ9Tg2H*wtf zp!K~elZW5FaEWEPMg6DXmo!Zy{FAnzi*h2ovtikiT1@RaMR~Na=wni(CRb^Y%oN-}2( zj$%7hZHUxy#9PI_RyozBh{Sww{@~HK7qWD>pSN?V7R6h8XF?AV@Y_h2OKhGQ82gLd zd%BT*=#QTO01r5Y_^R3{t&G85kYYbPUBp!rkTu5-9*!=WbFRXg_cH6TfZ5T5v<*06 z;J0GH)%TscCT6g7iC$zWh9DYD^ldCn%~X#0Xnoi%4kOfawdaqC%hIMA>q4*VMeOzK z%e!UGvfieZw!WnQI}mPc02g;(uFbJGWDfCMPPB&Q6^gD@*VkawzF?;kYhbKYs*i2# z_JXTXWj;kA5em#ViIQ+8gNI}LD0QX z%D{a!E(0rz9B->?+pCq_-6Kikq%C%jGqysQ6Zp|#$^xWL3*xG8Ay1p3RCK{#Hb!z( zHW=p!x{m+kBt6l5oibn0`G9au%Y8wozGasOfHiupt#w`FrCUOoNjUD%$mx zzX=sswwq27No3sR%>%*Q?>AtVZoB+o@P!=I?4R$M!1w`{hmQvi{}cBMnLB>9MNgOO zB@cI3{B;hH0Ic@SH3%PQZed~CO5;fLr0do*ln=Db&`w`h7=O(97eP`be&!%4QPl> z)pXbB)3JC7u!iH6yQ%HW(vuH2m==S`q02_a$C*tVV3=YuRXjmOdV5bBoMJ z#3;!I*B$ww3SrEHo7Da)8gQqOQW&E|Lh)0RUsZZK zEid!_537ole#v$Inr)FZG)&v&eJvjg)qP;Gg7*h6{g95|+x;~@2`B5mvvQLD-|=1U zfa)2T%xy$!Z#~K$37s(H*XYQ5JeGRBdn}k%J06C_+UTUjUJmCmXy=e9WhV5lMcpxc z(HGzO5Ip#15UsCPI5M|=$b~;;FaU&Z$`XvTU=};>Eoe$u^vH`|%s#FADsF<8ngcJH z7}zww&TLQqVWOQ?o@|@h+WCVv$)ca(U`zino6CjQ>Sx#{6$7;Yv1Qtwn9W&#s>Vbn z4L<|l4c~)}$}-HdJD9zDt*v$M3=#_80CBRvF?x?5?YzTtT8Z7L8!2`TE!iGFe~ zDh!eg)xWC)$ir9alIy%=E;~KEQv-Wczg$}<%|9Q4&)=q^rB&vu_RJh5|HE5v=to)^ zZ*TvB+Q!4vZs>7fhhKcxu4lvoeAyZ4!8_gR**EOi60F{c5m zqAjsa3jL^A$Huc;!V_7V_4I2vFL_NZKg;FMu^^FfiL%Zsd`2SSb2`oYK}b1i9H_3s zFycX%_9bOqSTs_>nhXkMTN!=R*qEi(W7=`zwO(IGslv0D7e92#uVjG z!kn_^pyG=Z6l2LoHZz-Q@1XFvHe)EL02C_9I%sROyt<5fq0o_9u>03fAouu3&b3x78q55?D|Kkf45aWKTawDTVX1_K(S%tfNJms90(CP zfbuh(>OU=I(&osEZ*&+hoS6v1)fzn3$VqW;<~@hi8pkJX7H#W7(9lAA@WyNG-qI>EYx~i0V~(NVSA_}JP_Yyky^DT+sop_Yv=^{bD-TPmpVI`u#4v?r z`l9-yRD^3^-=8!moQAA59%O&g5YPhEuR=5h(}}xs_g`}|@k1~%Oblt%#s^v%5|2z- zqEFl^S-OTXvE`z;r`T(nRx0hFLnl>X^Lw6wcyS8NtqAfuw~BA64re6W7Be&|lrAqC ze&`k};U+hRp~@B4wI>sG=!4vS6D5CFo9IuL%GEy!=7KIK4ZTRM6X#Ak@$mIWYfXz>Z`X+k8csZUYisIOoBg`s++=k;1(vh<^pzEI4YW&`-A6Rg9V;`%4>=Ny$Q_71Q*B@vPo#pu)qQa%n zr%)3#$A?$m64uTP`*Ik5uNnPLQg@yru)H(o0ri1$NDWtgankHHsM}TW{c6-rY}zxP zLCP;y`bdyJ7{ZoWR&3T?xj09c9&u$5^_RZp_Mw9EL%u?EYsYkq&j~umkVUX{Jq}sn zm?V;r^zwP42dpW|<1(*Cdn1|U=<l9+DN084*V$T53$sws0xTsW2` z44=tUy!T#`4oVY)w!M%4=u;-bYZzB?V*3i4xej5mKcGDDGD%F^Y5K!?t{+@pWN@S< z8WBKpSP;U}R|ofI+g{BU0eav{y%MYgW7D5cg^Rd68L+0#5UUSrfxEpev>-8!Feel- z=~gu97zmu_z}_Wx(h8$W@p z5!O5l0dC&wWHPQP-7L}Q3gLUre@DnN&jGSrFy+5fn^El z_{M-ra$6IfFa_4Do(kWP)lFjoZG^3>hnsR{Tn*)SqJC(SCn#TujmDGt1Ei7oXCKOe zZ|GVolsXtpTZ8H6N$dC0bJ88wl9(*nNYcaY8dPwVOG&Un6nSVRDLh$8XZlh6D|Co1 z+f{Y^9&dHvGf;`p>vAb5X1)+Pd4pFiTtBX2zVqk&6HcdzxX}E`ciccF{8^0duowmu zSYB(jv7Da_X;c-HySgR&?rZcBq@GBQHAJ=g+6#%Va^6?3G3AA;Rp8jsGml*aeBvzH!AQRgYXg6VQLs?*qH+E8IO>G{ z2}tPftly`0V;499PshiRpjX}rKck<=jh$`})^2z-J~9ALl8`n+dKqTN!lEvUSQ7eo ziGM4tSh@`2hq#CyrhPT0YIt6-&!#phDft$&Y;)eQrJ1LB8E7@yp^0{uBDCq7`8uVf zFDhBb#G+c~niJkysHtqHiC(;cAi&mHUPG7jrns)PZVj(v_ou_1vNkfgC|dv7 z)iLmy>PzJ)omO0pQrh2C!eTnSLg6M~CU1PH2suYIAfwPZXVTQb9$2z7sgd4(0}`OB z^v6i_D>JWDt*BD12z(^Ve5W|XIfd#)%tt83!~czfVS}4GjE}SywTdh4Wy&eEJdqoN z5>n{Co%OftLw+nqp7I^Zf6nUj=FeAZpGiVzfMVcb^g6ZwO1DmCS!ge3@6KXaXs@!) zJY&O)`Yrhw&)gK-{R4h_y z;%>|KJcG{0YJ62tW31r!e$y4;?spTN=ob*DM+jj2T47)h0eVay4&MHwsZ;7i*~D$K z@3TG8q%N)lo+|r8(WE$Bu;x?3R_v?CzCrOz`9`)_tHGWBcBve37uD{LnPxLfUQL6f z)U+`Y10B#q{m-h-gaAf5_y} z{hcMxrx_dWTfEX}(%0|RT=!as@~Y-f<=(m*ur5_HP*{FuD-DDzyTq-yseVn0JY;G6 z-0z{r$t_?ri;)1q?^OA1``!J)HKFKT_Uv=VXTTSBI^Zn&excRJuq3&5(Y}_g^%Odw zpkr@4?R>#<%QRdTD7d8OJi9&znEW`%FdaV{)AF%KX=a9D6PFvBI6ytHiXiNpqHVD^ zAOiS57`L24g6t!hs@O4S0#MCAuRm6p^a_?QKYdhWY(klSi0h~?gD*j^K1M9@RV%e- zURlV1w)SBVu7;$D5yjs^MX7~!WLgOLyx-FC#RABj57f^OyWC33C?er*zPfcDgl=7FX%Eldyu}f#<{YoBXJH#8!gu-d(~!!?NefnHvW| z=XWu&wK)f0InhsFTLKgY4pKt_4?asyzj{4v`i54NEW7m#94?uwcaN3+Hhlh$=YRBj zUV8j{V$)L7e4c|R#aUbHVa0j*j%+BkA&+%?RE_h=&|JHN zbFB?wtvr4($|B2sR&o>;L;o)+Fs$%b3OqVIO96*~zfyqhuN0v8hZOh-{3`{h|2Iu@vpznuW|KT^QtuN06)`U)sQ`hQ#YF`ECMvJbir-l^6rv2H7ax(sR@(X0w+nx{-( zmN<1AN!i~kgJe;9?M=uuR7ZlD>(D{PYN5nEF^dGlgc+@;yAC{JFCVy z)|`O2&*IkOBk3K-guhqGPeQS$7)oo8(UXGj>|s-U+XhRkZ9xE;UYC46y_}D`3$*kT zusnGaZMLMhMNwk-ql>!LkVc0^|3lQBaL8#moG3zaCySV*Adr{<>X@!UL3lOw!AKgx zRVe}sHRH6K&0g5>amHdeGdfMRb3nTd5jUMGrJj1c84Ri$lzNka>=P zzz^4_=_2)>kmoE*#7%Xe<5Yu!!Y!UR#sF(OJh3CvuoJ?6svgr3n#3q``h~)}Jtq32 z#`BRYCi#$^WJRQKC=jqzX#-}Tf|Z0-=JBx;oulzrUYx7re)lO|lYNk0 zzHQu^fa#gm{K$owKu0t`wYe3ma7+d^f+%&SZVD#S^2w@LE& zS`FyA@{h`K5jn@m|K3#ym`8NN^!Cv Ke8@z7@xK6rOn_Mc diff --git a/test/libdwarf/ts/dwarf_die_query/ec64-g1.xml.gz b/test/libdwarf/ts/dwarf_die_query/ec64-g1.xml.gz index 21559130a67932705782023da6a128b6228eaaf8..3c9890e18d005f0d29dd631ed3c1d8bb21c8b7c3 100644 GIT binary patch delta 58 zcmV-A0LA}}W0YeEABzYG@s+1ju?S=_DE>Q}UxGj0*dl9he))e!W?_d_1wVEB+y3^q Q%>Up21x!*KkYSky00T7}RsaA1 delta 51 zcmV-30L=fCV~t}7ABzYGjqKS=u?S=_A;uP2d-KcxGt>$@eJc2=+u!!Lzh(aa{x9cF J=*cpf1^{ob8Y2Jz diff --git a/test/libdwarf/ts/dwarf_die_query/ld_symver.o-64-g1.xml.gz b/test/libdwarf/ts/dwarf_die_query/ld_symver.o-64-g1.xml.gz new file mode 100644 index 0000000000000000000000000000000000000000..c8de24e2c300f10b353f4fdf3f092d15c3e718a5 GIT binary patch literal 8494 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 J3Jp_{{U10&F_!=U literal 8114 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 EFBjVt%>V!Z literal 8140 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 diff --git a/test/libdwarf/ts/dwarf_form/dwarf_form.c b/test/libdwarf/ts/dwarf_form/dwarf_form.c index 8567b5a14491..5ef73d3f486b 100644 --- a/test/libdwarf/ts/dwarf_form/dwarf_form.c +++ b/test/libdwarf/ts/dwarf_form/dwarf_form.c @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: dwarf_form.c 2084 2011-10-27 04:48:12Z jkoshy $ + * $Id: dwarf_form.c 3084 2014-09-02 22:08:13Z kaiwang27 $ */ #include @@ -48,7 +48,7 @@ static struct dwarf_tp dwarf_tp_array[] = { }; static int result = TET_UNRESOLVED; #include "driver.c" -#include "die_traverse.c" +#include "die_traverse2.c" static void _dwarf_form(Dwarf_Die die) @@ -62,11 +62,14 @@ _dwarf_form(Dwarf_Die die) Dwarf_Unsigned uvalue; Dwarf_Signed svalue; Dwarf_Block *block; + Dwarf_Sig8 sig8; + Dwarf_Ptr ptr; Dwarf_Error de; char *str; int i, r; int r_formref, r_global_formref, r_formaddr, r_formflag; int r_formudata, r_formsdata, r_formblock, r_formstring; + int r_formsig8, r_formexprloc; r = dwarf_attrlist(die, &attrlist, &attrcount, &de); if (r == DW_DLV_ERROR) { @@ -141,6 +144,16 @@ _dwarf_form(Dwarf_Die die) TS_CHECK_INT(r_formstring); if (r_formstring == DW_DLV_OK) TS_CHECK_STRING(str); + + r_formsig8 = dwarf_formsig8(at, &sig8, &de); + TS_CHECK_INT(r_formsig8); + if (r_formsig8 == DW_DLV_OK) + TS_CHECK_BLOCK(sig8.signature, 8); + + r_formexprloc = dwarf_formexprloc(at, &uvalue, &ptr, &de); + TS_CHECK_INT(r_formexprloc); + if (r_formexprloc == DW_DLV_OK) + TS_CHECK_BLOCK(ptr, uvalue); } } @@ -155,7 +168,8 @@ tp_dwarf_form(void) TS_DWARF_INIT(dbg, fd, de); - TS_DWARF_DIE_TRAVERSE(dbg, _dwarf_form); + TS_DWARF_DIE_TRAVERSE2(dbg, 1, _dwarf_form); + TS_DWARF_DIE_TRAVERSE2(dbg, 0, _dwarf_form); if (result == TET_UNRESOLVED) result = TET_PASS; diff --git a/test/libdwarf/ts/dwarf_form/ec32-g1.xml.gz b/test/libdwarf/ts/dwarf_form/ec32-g1.xml.gz index 8342c21cf7e1272ae6c9f5eaaec18d6496c0473b..bf8b65ed07b49872fcfc7eaccdf34fa5959e8063 100644 GIT binary patch literal 101798 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≀Ah~53c^)%NK+3+n!kVY8q8hLV0!_efN85Ep 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 diff --git a/test/libdwarf/ts/dwarf_next_cu_header/dt64-g1.xml.gz b/test/libdwarf/ts/dwarf_next_cu_header/dt64-g1.xml.gz index 60dfb4202084dd48cfc1aaabffaaf86c7bfacd2f..93a44424c7d154fed2fefe8ad883c5ebdfe29635 100644 GIT binary patch literal 252 zcmV#fT7wmdH+voTBCRu5^-X z*drGm-$Ge~>s3ML1@WcJ>Ft6ypf|Xs1P?YqJEf5pv*m2TGA|xY9$c%8zLUqbWmP%w z+(_91ULCz*5;s^AZo^2eI>PXURou|;ION|JSYItHL;F@ny!y|SF6fAU9@mFZK%eK2 zSf0%E;UYvT;x~$DjIsA!xR==s731kkNrEIuf+R?SB*+&am;a7sDx6LWM6Am|3jhF; CPjZ3) literal 246 zcmVzu-0KJsv2*vklT#X{5Wwda+`e7tbLNu2Dum;BmGnO9!4C zDI35c(FJDlfHmPZl+>sTj9=Kq16_|}|Gk0j5MdeGk7mTn|C~~ @@ -38,10 +38,12 @@ static void tp_dwarf_next_cu_header(void); static void tp_dwarf_next_cu_header_b(void); +static void tp_dwarf_next_cu_header_c(void); static void tp_dwarf_next_cu_header_loop(void); static struct dwarf_tp dwarf_tp_array[] = { {"tp_dwarf_next_cu_header", tp_dwarf_next_cu_header}, {"tp_dwarf_next_cu_header_b", tp_dwarf_next_cu_header_b}, + {"tp_dwarf_next_cu_header_c", tp_dwarf_next_cu_header_c}, {"tp_dwarf_next_cu_header_loop", tp_dwarf_next_cu_header_loop}, {NULL, NULL}, }; @@ -100,8 +102,8 @@ tp_dwarf_next_cu_header_b(void) TS_DWARF_INIT(dbg, fd, de); while (dwarf_next_cu_header_b(dbg, &cu_header_length, &cu_version, - &cu_abbrev_offset, &cu_pointer_size, &cu_offset_size, - &cu_extension_size, &cu_next_offset, &de) == DW_DLV_OK) { + &cu_abbrev_offset, &cu_pointer_size, &cu_offset_size, + &cu_extension_size, &cu_next_offset, &de) == DW_DLV_OK) { TS_CHECK_UINT(cu_header_length); TS_CHECK_UINT(cu_version); TS_CHECK_INT(cu_abbrev_offset); @@ -119,6 +121,64 @@ done: TS_RESULT(result); } +static void +tp_dwarf_next_cu_header_c(void) +{ + Dwarf_Debug dbg; + Dwarf_Error de; + Dwarf_Unsigned cu_header_length; + Dwarf_Half cu_version; + Dwarf_Off cu_abbrev_offset; + Dwarf_Half cu_pointer_size; + Dwarf_Half cu_offset_size; + Dwarf_Half cu_extension_size; + Dwarf_Sig8 cu_type_sig; + Dwarf_Unsigned cu_type_offset; + Dwarf_Unsigned cu_next_offset; + int fd, result; + + result = TET_UNRESOLVED; + + TS_DWARF_INIT(dbg, fd, de); + + while (dwarf_next_cu_header_c(dbg, 1, &cu_header_length, &cu_version, + &cu_abbrev_offset, &cu_pointer_size, &cu_offset_size, + &cu_extension_size, NULL, NULL, &cu_next_offset, &de) == + DW_DLV_OK) { + TS_CHECK_UINT(cu_header_length); + TS_CHECK_UINT(cu_version); + TS_CHECK_INT(cu_abbrev_offset); + TS_CHECK_UINT(cu_pointer_size); + TS_CHECK_UINT(cu_offset_size); + TS_CHECK_UINT(cu_extension_size); + TS_CHECK_UINT(cu_next_offset); + } + + do { + while (dwarf_next_cu_header_c(dbg, 0, &cu_header_length, + &cu_version, &cu_abbrev_offset, &cu_pointer_size, + &cu_offset_size, &cu_extension_size, &cu_type_sig, + &cu_type_offset, &cu_next_offset, &de) == DW_DLV_OK) { + TS_CHECK_UINT(cu_header_length); + TS_CHECK_UINT(cu_version); + TS_CHECK_INT(cu_abbrev_offset); + TS_CHECK_UINT(cu_pointer_size); + TS_CHECK_UINT(cu_offset_size); + TS_CHECK_UINT(cu_extension_size); + TS_CHECK_BLOCK(cu_type_sig.signature, 8); + TS_CHECK_UINT(cu_type_offset); + TS_CHECK_UINT(cu_next_offset); + } + } while (dwarf_next_types_section(dbg, &de) == DW_DLV_OK); + + if (result == TET_UNRESOLVED) + result = TET_PASS; + +done: + TS_DWARF_FINISH(dbg, de); + TS_RESULT(result); +} + #define _LOOP_COUNT 50 static void diff --git a/test/libdwarf/ts/dwarf_next_cu_header/ec32-g1.xml.gz b/test/libdwarf/ts/dwarf_next_cu_header/ec32-g1.xml.gz index 6efbf28a509d006e2d9bfb74b0d377e3f8bbe160..c613d8ec741ee644cbf5148c5ad00731e5efd9d1 100644 GIT binary patch literal 372 zcmV-)0gL`0iwFor1*TH~17%|~GA(B@E_iKh0PU6EZi65c#_#tO-g(t1AX*dcs}QBw zk{Bh3?$6WD*>sDWcI~2*S}qOegYS31^F^Fm8P8d4Gm7Bm0PNk9WkpI@SzXZBR)XxG z6Pb~My(mI!a%9P#$*!ucYpB&EGPXY#NY09bI@*?c744=qFO5o202^4Jos%V(P5u1n#gvl)WQV;=})dWW>{>&f6thyZVv7WOG-a8jCh}?ZLEYbN`lo z)MTH@zPo9y$v%^PciLQ&ecEMTUY6o}{K;SANY9GR&`+qRRRg1|RRg1|RRg1|)&GV$ S#ara?_Uj#`3r$7*82|u-9lN0b literal 352 zcmV-m0iXUKiwFqp)7eV^17%|~GA(B@E_iKh0PU4cZi6roh4(#$cV0zc8$%*Nu3`Z( z2@*1vG4$v3b&1l77N(~z z4afblagr$BurkXkt}lvK;Pwk-X-c4Jce#3C7v z8=-*EyTNxZ8WkK7VtG!(kz+TYmLgZk2@cShkAz%ZyJRxS>`Z2r@lSjG=+-~|2-0mr$?Q)Q?_>TBYn!|E`DoF+T5itrb(Oox7}Bi yrTo7B)UWGko)MeApKzX5SD3k4U18>Gb%mL$)&GV$ueZ?2&DT5W>e}`I6951)4yd01 diff --git a/test/libdwarf/ts/dwarf_next_cu_header/ec64-g1.xml.gz b/test/libdwarf/ts/dwarf_next_cu_header/ec64-g1.xml.gz index e03947ddbac558cedb8c71dcf5ee21cd8594a810..180062815342f94b94f2f6bf80331c6237fcf58e 100644 GIT binary patch literal 378 zcmV-=0fqh_iwFor1*TH~17%}2G%aT_E_iKh0PU4sk3=vSh41%QxN|k3Rjh>hD-E5R zX(BX~{rL6UHL;1^)_#O#OfSWI>O2SUi5anSR?x(zBtVBVu#XRx6$@_VZAlVaaC~}7 z>l~N#SzyxQ3r$b7?x*BjN31Tb6Z_)^E@*ic7uymqTprr8QrJfydSUEz`L?xNIz&eMF{ z07SmV*93S3BaO3pz=0QNH1m-|0FmbHO^|yqLQ9fE4|^@?;&vf6-L~FXwbl;7JYr1c9-B(l<|6G6dw{^75iGymxZPTiO*{W3ovsJ4G YW~)~J8|GSXvBTum8@gHAF#H(+0OQ`gVE_OC literal 358 zcmV-s0h#_EiwFqp)7eV^17%}2G%aT_E_iKh0PU5_Zi6roMfd#*?^s3P2T&x)uUO!i z1PK`n41IikT_P&c+Vmk(5MhaY?{Lo;X5xZ@yeN6%a2Alm89K)Y0AeLU-U^mDO48F) zTIW>oXGK{{FFZZ*x>spk$3U0XiSuzlOD@jp;sEs`biCX01{G8|J#+Vzv3wcKG(2822%9vl?Qm_8?cwU_mF2I4v?PF%J_di zrSDUJa(&JnT^@?<{dNDJ49U5t8-p+b1Wpjh50(?)v3?Bs>ypdW?(dg>o*o~=AH$5D zZ*DK+LQ0%TyuNIXUcQ*(GcvSP5G9}U$NmLKA?GsySWCvWrkZ5v6G}|aIW}BYP~E>4!U||(tC8Sl$7(ufaEnvLR$0dT~~3NE`FPo za=sYY!_?$IV8;XwtdOkH8FwO^@pdzT51$OB0;;b^^2OfF&YgUmCpube9fnJXg6 z8DUteWVlkg!0%kS;+bpi7(n?;T_96Kcdtd9j6Zdy_?*oth?BP{)y1klJ8_11xJxOP z1RIlxAmxT5B!@>UcHV<_`&Wz#gPCK5#*w7G6ZeRdJFso9uX`OA4n>ukM^5ShEMpnn9Eos zlw1)(#*Lxr%grX4;Llt0_KRT`VaqiQ99=Mtz8X zhgmGH6@VCt3X+_z_crAn-=FSMbxuh@5|N}c6jiFNc&8Ko(m9>idjX>44M-lF2R(8u z`z+#DotKD`01_2smiV26v|;x#{xV$&kTmoaKqa~KPyIUWcGxX`k~H)cz(}&+mE@ph z#+h-S2@emd4@8pTi0G+W5^nSg`U>#HWgieHQAti?wq6_UmM(+eCd-H;!Mh@-u35{A z)l9PZ3Y6z%G<84{ktCsz>&Esxl4AU)LCVBQ=>CUFQk=~lvNLl;9>08tD$#Hd;v_0b z)!v&eQ(3$K(DtE%GXx}@nZ!rZ>ZtE>WDJ@q{xwJ$xiTcKh#<{CO`kZGl|=keQYuk%Wx%hLRZsEU0GOCBBJa@eEn4zjHVTwfEBnhYf7+6M3j8G>87JbEVKBRB2r#1 z`jrM9-YbDfva@kT?rl9^&MP>lRs6LQtN^Vd5J?WqbbGS4UAvFJITkAxZxsRAD=Nux zG*FKAm>f39X}w;j*Kg5DoARi<+`s6Y@=9z8a&rCA!atLU6vLIsl7jR{a*qnw-> zja+Yxs8K=Ny1ce5U!nvFGa^ckk78Qi*>kai;~`>k4Ku__WR&ODktH0g0P9LblnOa-YO)c`>-cv? z=)A)Cm*;(eB;u|J)9H+!bSW+)tpm1!Y_NJ%e=J^wkZ)wzV>HFf2NK0Jbtkx|Klc~i8%Q983zx}(KBBj<6vc_ zdgy!~{SUgnA3R=tM) +.include "${TOP}/mk/elftoolchain.tetbase.mk" diff --git a/test/libelf/tset/Makefile b/test/libelf/tset/Makefile index 707a3ab82137..63e958691306 100644 --- a/test/libelf/tset/Makefile +++ b/test/libelf/tset/Makefile @@ -1,7 +1,9 @@ # -# $Id: Makefile 1638 2011-07-10 15:43:19Z jkoshy $ +# $Id: Makefile 3025 2014-04-18 16:20:25Z jkoshy $ # +TOP= ../../.. + SUBDIR+= common # must be first SUBDIR+= abi @@ -55,4 +57,4 @@ SUBDIR+= gelf_getehdr SUBDIR+= gelf_newehdr SUBDIR+= gelf_xlate -.include +.include "${TOP}/mk/elftoolchain.subdir.mk" diff --git a/test/libelf/tset/elf_update/update.m4 b/test/libelf/tset/elf_update/update.m4 index e1d3e6b33f53..5d7e789a8e9c 100644 --- a/test/libelf/tset/elf_update/update.m4 +++ b/test/libelf/tset/elf_update/update.m4 @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: update.m4 2833 2012-12-30 16:16:51Z jkoshy $ + * $Id: update.m4 3081 2014-07-28 08:53:14Z jkoshy $ */ #include @@ -743,7 +743,7 @@ tcSectionType$2$1(void) goto done; } - sh->sh_type = SHT_NULL - 1; + sh->sh_type = SHT_LOOS - 1; (void) elf_flagshdr(scn, ELF_C_SET, ELF_F_DIRTY); if ((offset = elf_update(e, ELF_C_NULL)) != (off_t) -1) { @@ -773,6 +773,88 @@ FN(32,`msb') FN(64,`lsb') FN(64,`msb') +/* + * Verify that sections with unrecognized sh_type values in the + * range [SHT_LOUSER,SHT_HIUSER], [SHT_LOPROC,SHT_HIPROC], + * and [SHT_LOOS,SHT_HIOS] are accepted. + */ + +define(`ADD_SECTION',` + if ((scn = elf_newscn(e)) == NULL) { + TP_UNRESOLVED("elf_newscn() failed: \"%s\".", + elf_errmsg(-1)); + goto done; + } + if ((sh = elf$1_getshdr(scn)) == NULL) { + TP_UNRESOLVED("elf$1_getshdr() failed: \"%s\".", + elf_errmsg(-1)); + goto done; + } + sh->sh_type = $2; + if ((d = elf_newdata(scn)) == NULL) { + TP_UNRESOLVED("elf_newdata() failed: \"%s\".", + elf_errmsg(-1)); + goto done; + } + d->d_align = 1; + d->d_buf = NULL; + d->d_size = 0; + d->d_off = (off_t) 0; + (void) elf_flagdata(d, ELF_C_SET, ELF_F_DIRTY); + (void) elf_flagshdr(scn, ELF_C_SET, ELF_F_DIRTY);') +undefine(`FN') +define(`FN',` +void +tcSectionTypeOSUserProcDefined_$2$1(void) +{ + int error, fd, result; + off_t offset; + Elf *e; + Elf_Data *d; + Elf_Scn *scn; + Elf$1_Shdr *sh; + + TP_CHECK_INITIALIZATION(); + + TP_ANNOUNCE("TOUPPER($2)$1: user, OS and processor specific " + "section types are accepted.") ; + + result = TET_UNRESOLVED; + e = NULL; + fd = -1; + + _TS_OPEN_FILE(e, "newehdr.$2$1", ELF_C_READ, fd, goto done;); + + /* + * Create two new sections, one of type SHT_LOOS (0x60000000UL), + * and the other of type SHT_HIUSER (0xFFFFFFFFUL). These + * should be accepted as valid sections. + */ + ADD_SECTION($1,`SHT_LOOS') + ADD_SECTION($1,`SHT_HIUSER') + + if ((offset = elf_update(e, ELF_C_NULL)) == (off_t) -1) { + TP_FAIL("elf_update() failed."); + goto done; + } + + result = TET_PASS; + + done: + if (e) + (void) elf_end(e); + if (fd) + (void) close(fd); + tet_result(result); +}') + +FN(32,`lsb') +FN(32,`msb') +FN(64,`lsb') +FN(64,`msb') + +undefine(`ADD_SECTION') + /* * An Elf_Data descriptor that is malformed in various ways * should be rejected. diff --git a/test/libelftc/Makefile b/test/libelftc/Makefile index c9f086cc7b8d..f7a3903e2b9e 100644 --- a/test/libelftc/Makefile +++ b/test/libelftc/Makefile @@ -1,36 +1,6 @@ -# $Id: Makefile 2826 2012-12-29 16:39:18Z jkoshy $ - -TOP = ../.. - -.include "${TOP}/mk/elftoolchain.tetvars.mk" - -.if !defined(TET_EXECUTE) -TET_EXECUTE= ${.OBJDIR} -.endif - -.if make(tccbuild) -TET_OPTIONS+= -b -.endif - -.if make(tccclean) -TET_OPTIONS+= -c -.endif - -.if make(execute) || make(test) -TET_OPTIONS+= -e -.endif - -.MAIN: all - -.PHONY: clobber execute tccbuild tccclean test - -execute tccbuild tccclean test: - TET_ROOT=${TET_ROOT} TET_EXECUTE=${TET_EXECUTE} \ - TET_SUITE_ROOT=${.CURDIR} ${TET_ROOT}/bin/tcc ${TET_OPTIONS} . - -clobber: clean - rm -rf ${TET_RESULTS_DIR} ${TET_TMP_DIR} +# $Id: Makefile 3028 2014-04-18 16:20:43Z jkoshy $ +TOP= ../.. SUBDIR= tset -.include +.include "${TOP}/mk/elftoolchain.tetbase.mk" diff --git a/test/libelftc/tset/Makefile b/test/libelftc/tset/Makefile index f0ba944fee21..6602c88c37ca 100644 --- a/test/libelftc/tset/Makefile +++ b/test/libelftc/tset/Makefile @@ -1,7 +1,8 @@ -# $Id: Makefile 2861 2013-01-05 09:35:42Z jkoshy $ +# $Id: Makefile 3025 2014-04-18 16:20:25Z jkoshy $ +TOP= ../../.. SUBDIR= SUBDIR+= elftc_string_table SUBDIR+= elftc_version -.include +.include "${TOP}/mk/elftoolchain.subdir.mk" diff --git a/test/libelftc/tset/Makefile.tset b/test/libelftc/tset/Makefile.tset index b28e6f717b48..dc637a90263a 100644 --- a/test/libelftc/tset/Makefile.tset +++ b/test/libelftc/tset/Makefile.tset @@ -1,8 +1,9 @@ -# $Id: Makefile.tset 2845 2012-12-31 04:19:35Z jkoshy $ +# $Id: Makefile.tset 3021 2014-04-17 16:32:00Z jkoshy $ -# All the test cases in this test suite need -lelftc. -DPADD+= ${LIBELFTC} -LDADD+= -lelftc +# All the test cases in this test suite need -lelftc. In addition, +# a few need -lelf. +DPADD+= ${LIBELFTC} ${LIBELF} +LDADD+= -lelftc -lelf GENERATE_TEST_SCAFFOLDING= yes diff --git a/test/libelftc/tset/elftc_string_table/string_table.m4 b/test/libelftc/tset/elftc_string_table/string_table.m4 index 0c6f730686db..74e66c99c12b 100644 --- a/test/libelftc/tset/elftc_string_table/string_table.m4 +++ b/test/libelftc/tset/elftc_string_table/string_table.m4 @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: string_table.m4 2868 2013-01-06 13:28:47Z jkoshy $ + * $Id: string_table.m4 3021 2014-04-17 16:32:00Z jkoshy $ */ /* @@ -33,10 +33,12 @@ #include #include +#include #include #include #include #include +#include #include "tet_api.h" diff --git a/test/nm/Makefile b/test/nm/Makefile index df34d664a64f..fc9f5d1667e6 100644 --- a/test/nm/Makefile +++ b/test/nm/Makefile @@ -1,36 +1,6 @@ -# $Id: Makefile 2137 2011-11-10 13:09:30Z jkoshy $ - -TOP = ../.. - -.include "${TOP}/mk/elftoolchain.tetvars.mk" - -.if !defined(TET_EXECUTE) -TET_EXECUTE= ${.OBJDIR} -.endif - -.if make(tccbuild) -TET_OPTIONS+= -b -.endif - -.if make(tccclean) -TET_OPTIONS+= -c -.endif - -.if make(execute) || make(test) -TET_OPTIONS+= -e -.endif - -.MAIN: all - -.PHONY: clobber execute tccbuild tccclean test - -execute tccbuild tccclean test: - TET_EXECUTE=${TET_EXECUTE} TET_SUITE_ROOT=${.CURDIR} \ - TET_ROOT=${TET_ROOT} ${TET_ROOT}/bin/tcc ${TET_OPTIONS} . - -clobber: clean - rm -rf ${TET_RESULTS_DIR} ${TET_TMP_DIR} +# $Id: Makefile 3028 2014-04-18 16:20:43Z jkoshy $ +TOP= ../.. SUBDIR= ts -.include +.include "${TOP}/mk/elftoolchain.tetbase.mk" diff --git a/test/nm/ts/Makefile b/test/nm/ts/Makefile index b5352371f7d7..6d23d32206bb 100644 --- a/test/nm/ts/Makefile +++ b/test/nm/ts/Makefile @@ -1,4 +1,6 @@ -# $Id: Makefile 2085 2011-10-27 05:06:47Z jkoshy $ +# $Id: Makefile 3025 2014-04-18 16:20:25Z jkoshy $ + +TOP= ../../.. SUBDIR+= nm_archive1 SUBDIR+= nm_archive2 @@ -9,4 +11,4 @@ SUBDIR+= nm_option SUBDIR+= nm_shared_object1 SUBDIR+= nm_shared_object2 -.include +.include "${TOP}/mk/elftoolchain.subdir.mk" diff --git a/test/tet/Makefile b/test/tet/Makefile index e5396862ce2d..602ff6771fd4 100644 --- a/test/tet/Makefile +++ b/test/tet/Makefile @@ -1,7 +1,7 @@ # # Build TET from source. # -# $Id: Makefile 2117 2011-11-09 05:48:03Z jkoshy $ +# $Id: Makefile 3024 2014-04-18 16:20:11Z jkoshy $ # TOP= ../.. @@ -41,7 +41,7 @@ clean: clobber: rm -rf ${TET_ROOT} ${TET_BUILD_MARKER} ${TET_PATCH_MARKER} -depend test: .SILENT +cleandepend depend test: .SILENT true .else