[PATCH 0/3] Performance tweaks for libdw
by Josh Stone
I did some investigation into libdw performance hotspots, and came up
with a few tweaks that in total trim nearly 1/3 the running time. I'm
running on Mark's recent empty-location patch, and I primarily used
"tests/varlocs -k >/dev/null" as a moderately long-running benchmark.
I'm using gcc-4.8.2-1.fc20.x86_64 and kernel-3.11.9-300.fc20.x86_64,
running on an i7-2600.
The perf profile initially looked like this:
Samples: 343K of event 'cycles', Event count (approx.): 318932712301
33.69% varlocs libdw.so [.] __libdw_find_attr
16.47% varlocs libdw.so [.] lookup.isra.0
15.63% varlocs libdw.so [.] __libdw_form_val_len
13.11% varlocs libdw.so [.] dwarf_siblingof
4.84% varlocs libdw.so [.] dwarf_tag
4.62% varlocs libdw.so [.] walk_children.4364
2.35% varlocs libdw.so [.] __libdw_findabbrev
2.32% varlocs libdw.so [.] Dwarf_Abbrev_Hash_find
1.26% varlocs libdw.so [.] dwarf_child
Patch 1 addresses form_val_len with an inlined fast path for forms with
constant length. Patch 2 is a rework of get_uleb128 and get_sleb128,
which are significant in find_attr and elsewhere. Patch 3 addresses the
hash lookup which is called often to find DIE abbreviations.
The perf profile now looks like this:
Samples: 229K of event 'cycles', Event count (approx.): 213925592727
44.63% varlocs libdw.so [.] __libdw_find_attr
22.28% varlocs libdw.so [.] dwarf_siblingof
7.64% varlocs libdw.so [.] walk_children.4388
7.07% varlocs libdw.so [.] dwarf_tag
5.18% varlocs libdw.so [.] __libdw_findabbrev
2.88% varlocs libdw.so [.] __libdw_form_val_compute_len
2.11% varlocs libdw.so [.] dwarf_child
1.44% varlocs libdw.so [.] __libdw_formref
1.12% varlocs libdw.so [.] scope_visitor
The remaining busy work is simply walking through attributes, from DIE
to DIE. I believe optimizing this further will be hard without keeping
track of DIE lengths somewhere, which is a lot to cache. Putting the
length in Dwarf_Die itself is not feasible, because those are short-
lived and frequently recreated.
Here's some summary information for how these patches change varloc -k:
libdw varlocs varlocs
text time maxres
Base: 243072 84.42s 242360k
P1: 243296 74.91s 242356k
P2: 243184 70.61s 242360k
P3: 243600 56.75s 243588k
My timings are not statistically rigorous measurements, but it still
seems a clear win across the board. Other benchmarks I've tried, like
tests/allfcts and stap -l syscall.*, show similar improvement.
Feedback is always appreciated.
Thanks,
Josh
9 years, 11 months
[patch] Detect infinite backtraces
by Jan Kratochvil
Hi Mark,
as discussed in
[PATCH] stack: Add new '-n MAXFRAMES' option. Resolve addresses after unwind.
I have found I forgot to implement what GDB has as
gdb.dwarf2/dw2-dup-frame.exp
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
I find it easier in the case of elfutils as all supported unwinding archs have
grows-down kind of stack.
It breaks support for -fsplit-stack (GDB gdb.base/morestack.exp) but that is
IMO an add-on extension which just coincidentally worked with current
checked-in elfutils unwinder (I did not test it).
Thanks,
Jan
10 years
[PATCH] configure: add a --disable-werror option
by Mike Frysinger
Building with -Werror makes a lot of sense for development, but not a lot
for distro deployments. Changes in default flag settings, versions of the
compiler or C library, or 3rd party libraries can easily trigger harmless
warnings that are a waste of time to track down. Especially when elfutils
itself enables many extra -W flags. So add a configure flag for distros
to utilize when building.
Signed-off-by: Mike Frysinger <vapier(a)gentoo.org>
---
ChangeLog | 5 +++++
config/eu.am | 2 +-
configure.ac | 8 ++++++++
3 files changed, 14 insertions(+), 1 deletion(-)
diff --git a/ChangeLog b/ChangeLog
index a0ce570..3ccd2a9 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2014-01-02 Mike Frysinger <vapier(a)gentoo.org>
+
+ * configure.ac: Add --disable-werror flag. Export WERROR.
+ * config/eu.am (AM_CFLAGS): Change -Werror to $(WERROR).
+
2013-12-20 Mark Wielaard <mjw(a)redhat.com>
* NEWS (libdwfl): Add dwfl_getthread_frames.
diff --git a/config/eu.am b/config/eu.am
index 38718c7..220c843 100644
--- a/config/eu.am
+++ b/config/eu.am
@@ -32,7 +32,7 @@
DEFS = -D_GNU_SOURCE -DHAVE_CONFIG_H -DLOCALEDIR='"${localedir}"'
AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_srcdir)/lib -I..
AM_CFLAGS = -std=gnu99 -Wall -Wshadow \
- $(if $($(*F)_no_Werror),,-Werror) \
+ $(if $($(*F)_no_Werror),,$(WERROR)) \
$(if $($(*F)_no_Wunused),,-Wunused -Wextra) \
$(if $($(*F)_no_Wformat),-Wno-format,-Wformat=2) \
$($(*F)_CFLAGS)
diff --git a/configure.ac b/configure.ac
index 72fb3e8..f0fe890 100644
--- a/configure.ac
+++ b/configure.ac
@@ -48,6 +48,14 @@ AC_CONFIG_FILES([elfutils.spec:config/elfutils.spec.in])
AC_CANONICAL_HOST
+AC_ARG_ENABLE(werror,
+[AS_HELP_STRING([--disable-werror],
+ [turn off -Werror @<:@default=enabled@:>@])])
+if test "x$enable_werror" != "xno"; then
+ WERROR="-Werror"
+fi
+AC_SUBST(WERROR)
+
AC_ARG_ENABLE(deterministic-archives,
[AS_HELP_STRING([--enable-deterministic-archives],
[ar and ranlib default to -D behavior])], [
--
1.8.4.3
10 years, 1 month
Some stuff for 0.159+
by Mark Wielaard
Hi,
The last release had lots of new features. I don't have any grand plans
for the next release. I was mostly going to spend time on bug fixing and
cleanups. The following items is just what I personally wanted to spend
some time on. I don't think everything below makes it for the next
release (0.159 lets say somewhere in March). And I might have forgotten
stuff. But it is probably what I will spend some time on next.
- Bugs, there are more, but these two were what I wanted to at least
look at:
https://bugzilla.redhat.com/show_bug.cgi?id=1037051
elfutils FTBFS if "-Werror=format-security" flag is used
Currently we just remove that flag, but if we can rewrite the code to
enable it by default for all files that would be nice. Dunno if that
is really possible in all cases though.
https://bugzilla.redhat.com/show_bug.cgi?id=1020842
libelf: segment fault on x86-64
while file's bss offset have a large
number
This slipped through the cracks, there has even been a patch proposed
on the list:
http://thread.gmane.org/gmane.comp.sysutils.elfutils.devel/3181
And lets see what else people report.
https://bugzilla.redhat.com/buglist.cgi?bug_status=NEW&component=elfutils
- Merge robustify commits to master if they make sense.
And look at the portable branch patches suggested by Mike Frysinger
https://lists.fedorahosted.org/pipermail/elfutils-devel/2014-January/0036...
- Move .gnu_debugaltlink handling from libdw to libdwfl and make
ENABLE_DWZ the default. As discussed before:
https://lists.fedorahosted.org/pipermail/elfutils-devel/2013-December/003...
- string functions (this would be a new feature). I abandoned this since
it was a lot of work for such a small feature and we were right before
a release. But I keep writing code that would be much easier if we had
string functions for the common DWARF constants. This would resurrect:
https://git.fedorahosted.org/cgit/elfutils.git/log/?h=mjw/dwarfstrings
- speedup/cache __libdwfl_addrsym. This is the main reason eu-readelf
(without -N) and to a lesser extend eu-stack (without -q) is so slow.
They do address lookups without any caching, so they potentially need
to search through all of them each time. It has been discussed before.
https://lists.fedorahosted.org/pipermail/elfutils-devel/2013-July/003126....
Needs lots of testing to make sure the results returned are equal.
- Jan's idea to use /proc/PID/map_files when available seems very
attractive:
https://lists.fedorahosted.org/pipermail/elfutils-devel/2013-December/003...
As an alternative fallback we can try to reuse the technique we are
already using in dwfl_linux_proc_find_elf for extracting the vdso
through getting the in-memory ELF image from the target process.
I got this working through some ugly hacks. elf_from_remote_memory
does work for the vdso, but not always for other images. That code
needs to be cleaned up and we need to find a way to pass information
about the target pid from the dwfl_linux_proc_report callback to the
dwfl_linux_proc_find_elf callback (or maybe introduce new report and
find_elf callbacks for this functionality).
- unwinder backends for aarch64 and arm7hl
- aarch64 is mostly there on my branch
https://git.fedorahosted.org/cgit/elfutils.git/log/?h=mjw/aarch64-unwind
But needs actual testing and last time I played with it glibc didn't
seem to properly mark _start and _clone causing the link register to
point to the current pc and gcc didn't always seem to
produce .eh_frame for all functions. So might need some interaction
with the rest of the toolchain to make sure everything is correct.
- arm32 might be a bit tricky. When there is a .debug_frame it should
be simple. If not, then we might just give up for now. Or add a
EXIDX to CFI translator fallback to the backend.
- Maybe tweak the defaults for eu-stack based on feedback.
Maybe use more debug information than just the line numbers if
available (e.g. use the subprogram or inlined_subroutine names for the
addresses found).
Not all the above might make it before 0.159, and maybe some other stuff
that I forgot about pops up, but it is a start and should keep me busy
till March. And of course we can push out a new release earlier if some
really nasty regressions/bugs are found and fixed before that.
Cheers,
Mark
10 years, 1 month
[PATCH] Use -Wformat=2 by default for all files.
by Mark Wielaard
This just makes sure that all format strings are given as literals to
printf like functions so the compiler can see and check them. Remove
all no_Wformat, add -Wformat=2 unconditionally to AM_CFLAGS.
Signed-off-by: Mark Wielaard <mjw(a)redhat.com>
---
backends/ChangeLog | 10 ++++++
backends/Makefile.am | 3 +-
backends/aarch64_regs.c | 30 +++++++++++++----
config/ChangeLog | 4 +++
config/eu.am | 5 ++-
src/ChangeLog | 18 +++++++++++
src/Makefile.am | 6 +---
src/nm.c | 86 ++++++++++++++++++++++++-------------------------
src/size.c | 30 ++++++-----------
src/strings.c | 33 +++++++++++++------
tests/ChangeLog | 4 +++
tests/Makefile.am | 1 -
12 files changed, 138 insertions(+), 92 deletions(-)
diff --git a/backends/ChangeLog b/backends/ChangeLog
index a742eb2..0df6819 100644
--- a/backends/ChangeLog
+++ b/backends/ChangeLog
@@ -1,3 +1,13 @@
+2014-01-22 Mark Wielaard <mjw(a)redhat.com>
+
+ * Makefile.am (aarch64_regs_no_Wformat): Removed.
+ * aarch64_regs.c (regtype): Add bool nr argument. snprintf arg
+ when nr is true.
+ (regtyper): New function.
+ (regtypen): Likewise.
+ (aarch64_register_info): Call either regtyper or regtypen not
+ regtype directly.
+
2014-01-14 Mark Wielaard <mjw(a)redhat.com>
* aarch64_symbol.c (aarch64_check_special_symbol): Check shdr is
diff --git a/backends/Makefile.am b/backends/Makefile.am
index b8bea36..90e93a8 100644
--- a/backends/Makefile.am
+++ b/backends/Makefile.am
@@ -1,6 +1,6 @@
## Process this file with automake to create Makefile.in
##
-## Copyright (C) 2000-2010, 2013 Red Hat, Inc.
+## Copyright (C) 2000-2010, 2013, 2014 Red Hat, Inc.
## Copyright (C) 2012 Tilera Corporation
## This file is part of elfutils.
##
@@ -86,7 +86,6 @@ aarch64_SRCS = aarch64_init.c aarch64_regs.c aarch64_symbol.c \
aarch64_corenote.c aarch64_retval.c aarch64_cfi.c
libebl_aarch64_pic_a_SOURCES = $(aarch64_SRCS)
am_libebl_aarch64_pic_a_OBJECTS = $(aarch64_SRCS:.c=.os)
-aarch64_regs_no_Wformat = yes
sparc_SRCS = sparc_init.c sparc_symbol.c sparc_regs.c sparc_retval.c \
sparc_corenote.c sparc64_corenote.c sparc_auxv.c
diff --git a/backends/aarch64_regs.c b/backends/aarch64_regs.c
index aec201f..bd10c46 100644
--- a/backends/aarch64_regs.c
+++ b/backends/aarch64_regs.c
@@ -1,5 +1,5 @@
/* Register names and numbers for AArch64 DWARF.
- Copyright (C) 2013 Red Hat, Inc.
+ Copyright (C) 2013, 2014 Red Hat, Inc.
This file is part of elfutils.
This file is free software; you can redistribute it and/or modify
@@ -47,32 +47,48 @@ aarch64_register_info (Ebl *ebl __attribute__ ((unused)),
return 128;
ssize_t
- regtype (const char *setname, int type, const char *fmt, int arg)
+ regtype (const char *setname, int type, const char *rname, bool nr, int arg)
{
*setnamep = setname;
*typep = type;
- int s = snprintf (name, namelen, fmt, arg);
+ int s;
+ if (nr)
+ s = snprintf (name, namelen, "%s%d", rname, arg);
+ else
+ s = snprintf (name, namelen, "%s", rname);
if (s < 0 || (unsigned) s >= namelen)
return -1;
return s + 1;
}
+ ssize_t
+ regtyper (const char *setname, int type, const char *rname)
+ {
+ return regtype (setname, type, rname, false, 0);
+ }
+
+ ssize_t
+ regtypen (const char *setname, int type, const char *rname, int arg)
+ {
+ return regtype (setname, type, rname, true, arg);
+ }
+
*prefix = "";
*bits = 64;
switch (regno)
{
case 0 ... 30:
- return regtype ("integer", DW_ATE_signed, "x%d", regno);
+ return regtypen ("integer", DW_ATE_signed, "x", regno);
case 31:
- return regtype ("integer", DW_ATE_address, "sp", 0);
+ return regtyper ("integer", DW_ATE_address, "sp");
case 32:
return 0;
case 33:
- return regtype ("integer", DW_ATE_address, "elr", 0);
+ return regtyper ("integer", DW_ATE_address, "elr");
case 34 ... 63:
return 0;
@@ -84,7 +100,7 @@ aarch64_register_info (Ebl *ebl __attribute__ ((unused)),
integers. 128-bit quad-word is the only singular value that
covers the whole register, so mark the register thus. */
*bits = 128;
- return regtype ("FP/SIMD", DW_ATE_unsigned, "v%d", regno - 64);
+ return regtypen ("FP/SIMD", DW_ATE_unsigned, "v", regno - 64);
case 96 ... 127:
return 0;
diff --git a/config/ChangeLog b/config/ChangeLog
index 53fddec..0fca489 100644
--- a/config/ChangeLog
+++ b/config/ChangeLog
@@ -1,3 +1,7 @@
+2014-01-22 Mark Wielaard <mjw(a)redhat.com>
+
+ * eu.am (AM_CFLAGS): Unconditionally add -Wformat=2.
+
2014-01-03 Mark Wielaard <mjw(a)redhat.com>
* elfutils.spec.in: Update for 0.158.
diff --git a/config/eu.am b/config/eu.am
index 38718c7..d2b4e79 100644
--- a/config/eu.am
+++ b/config/eu.am
@@ -1,6 +1,6 @@
## Common automake fragments for elfutils subdirectory makefiles.
##
-## Copyright (C) 2010 Red Hat, Inc.
+## Copyright (C) 2010, 2014 Red Hat, Inc.
##
## This file is part of elfutils.
##
@@ -31,10 +31,9 @@
DEFS = -D_GNU_SOURCE -DHAVE_CONFIG_H -DLOCALEDIR='"${localedir}"'
AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_srcdir)/lib -I..
-AM_CFLAGS = -std=gnu99 -Wall -Wshadow \
+AM_CFLAGS = -std=gnu99 -Wall -Wshadow -Wformat=2 \
$(if $($(*F)_no_Werror),,-Werror) \
$(if $($(*F)_no_Wunused),,-Wunused -Wextra) \
- $(if $($(*F)_no_Wformat),-Wno-format,-Wformat=2) \
$($(*F)_CFLAGS)
if MUDFLAP
diff --git a/src/ChangeLog b/src/ChangeLog
index 8bbcff4..a277e0d 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,21 @@
+2014-01-22 Mark Wielaard <mjw(a)redhat.com>
+
+ * Makefile.am (nm_no_Wformat): Removed.
+ (size_no_Wformat): Likewise.
+ (strings_no_Wformat): Likewise.
+ (addr2line_no_Wformat): Likewise.
+ * size.c (show_sysv): Use fmtstr directly as literal in printf.
+ (show_sysv_one_line): Likewise.
+ * strings.c (locfmt): Removed.
+ (radix): New static enum.
+ (parse_opt): Set radix, not locfmt.
+ (process_chunk_mb): Use fmtstr directly as literal in printf based
+ on radix.
+ (process_chunk): Likewise.
+ * nm.c (show_symbols_sysv): Use fmtstr directly as literal in printf.
+ (show_symbols_bsd): Likewise.
+ (show_symbols_posix): Likewise.
+
2014-01-21 Mark Wielaard <mjw(a)redhat.com>
* stack.c (show_inlines): New static boolean.
diff --git a/src/Makefile.am b/src/Makefile.am
index 9a78348..e371160 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1,6 +1,6 @@
## Process this file with automake to create Makefile.in
##
-## Copyright (C) 1996-2013 Red Hat, Inc.
+## Copyright (C) 1996-2014 Red Hat, Inc.
## This file is part of elfutils.
##
## This file is free software; you can redistribute it and/or modify
@@ -88,10 +88,6 @@ if DEMANGLE
demanglelib = -lstdc++
endif
-nm_no_Wformat = yes
-size_no_Wformat = yes
-strings_no_Wformat = yes
-addr2line_no_Wformat = yes
# XXX While the file is not finished, don't warn about this
ldgeneric_no_Wunused = yes
diff --git a/src/nm.c b/src/nm.c
index 62efb2d..82807bf 100644
--- a/src/nm.c
+++ b/src/nm.c
@@ -1,5 +1,5 @@
/* Print symbol information from ELF file in human-readable form.
- Copyright (C) 2000-2008, 2009, 2011, 2012 Red Hat, Inc.
+ Copyright (C) 2000-2008, 2009, 2011, 2012, 2014 Red Hat, Inc.
This file is part of elfutils.
Written by Ulrich Drepper <drepper(a)redhat.com>, 2000.
@@ -794,15 +794,6 @@ show_symbols_sysv (Ebl *ebl, GElf_Word strndx, const char *fullname,
/* TRANS: the "sysv|" parts makes the string unique. */
longest_where, sgettext ("sysv|Line"));
- /* Which format string to use (different radix for numbers). */
- const char *number_fmtstr;
- if (radix == radix_hex)
- number_fmtstr = "%0*" PRIx64;
- else if (radix == radix_decimal)
- number_fmtstr = "%0*" PRId64;
- else
- number_fmtstr = "%0*" PRIo64;
-
#ifdef USE_DEMANGLE
size_t demangle_buffer_len = 0;
char *demangle_buffer = NULL;
@@ -850,9 +841,15 @@ show_symbols_sysv (Ebl *ebl, GElf_Word strndx, const char *fullname,
addressbuf[0] = sizebuf[0] = '\0';
else
{
- snprintf (addressbuf, sizeof (addressbuf), number_fmtstr,
+ snprintf (addressbuf, sizeof (addressbuf),
+ (radix == radix_hex ? "%0*" PRIx64
+ : (radix == radix_decimal ? "%0*" PRId64
+ : "%0*" PRIo64)),
digits, syms[cnt].sym.st_value);
- snprintf (sizebuf, sizeof (sizebuf), number_fmtstr,
+ snprintf (sizebuf, sizeof (sizebuf),
+ (radix == radix_hex ? "%0*" PRIx64
+ : (radix == radix_decimal ? "%0*" PRId64
+ : "%0*" PRIo64)),
digits, syms[cnt].sym.st_size);
}
@@ -929,19 +926,6 @@ show_symbols_bsd (Elf *elf, const GElf_Ehdr *ehdr, GElf_Word strndx,
if (prefix != NULL && ! print_file_name)
printf ("\n%s:\n", fname);
- static const char *const fmtstrs[] =
- {
- [radix_hex] = "%6$s%2$0*1$" PRIx64 "%8$s %7$s%3$c%4$s %5$s",
- [radix_decimal] = "%6$s%*" PRId64 "%8$s %7$s%3$c%4$s %5$s",
- [radix_octal] = "%6$s%2$0*1$" PRIo64 "%8$s %7$s%3$c%4$s %5$s"
- };
- static const char *const sfmtstrs[] =
- {
- [radix_hex] = "%6$s%2$0*1$" PRIx64 "%8$s %10$0*9$" PRIx64 " %7$s%3$c%4$s %5$s",
- [radix_decimal] = "%6$s%2$*1$" PRId64 "%8$s %10$*9$" PRId64 " %7$s%3$c%4$s %5$s",
- [radix_octal] = "%6$s%2$0*1$" PRIo64 "%8$s %10$0*9$" PRIo64 " %7$s%3$c%4$s %5$s"
- };
-
#ifdef USE_DEMANGLE
size_t demangle_buffer_len = 0;
char *demangle_buffer = NULL;
@@ -1016,16 +1000,34 @@ show_symbols_bsd (Elf *elf, const GElf_Ehdr *ehdr, GElf_Word strndx,
else
color = color_symbol;
}
-
- printf (print_size && syms[cnt].sym.st_size != 0
- ? sfmtstrs[radix] : fmtstrs[radix],
- digits, syms[cnt].sym.st_value,
- class_type_char (elf, ehdr, &syms[cnt].sym), marker,
- symstr,
- color_mode ? color_address : "",
- color,
- color_mode ? color_off : "",
- digits, (uint64_t) syms[cnt].sym.st_size);
+ if (print_size && syms[cnt].sym.st_size != 0)
+ printf ((radix == radix_hex
+ ? "%6$s%2$0*1$" PRIx64 "%8$s %10$0*9$" PRIx64
+ " %7$s%3$c%4$s %5$s"
+ : (radix == radix_decimal
+ ? "%6$s%2$*1$" PRId64 "%8$s %10$*9$" PRId64
+ " %7$s%3$c%4$s %5$s"
+ : "%6$s%2$0*1$" PRIo64 "%8$s %10$0*9$" PRIo64
+ " %7$s%3$c%4$s %5$s")),
+ digits, syms[cnt].sym.st_value,
+ class_type_char (elf, ehdr, &syms[cnt].sym), marker,
+ symstr,
+ color_mode ? color_address : "",
+ color,
+ color_mode ? color_off : "",
+ digits, (uint64_t) syms[cnt].sym.st_size);
+ else
+ printf ((radix == radix_hex
+ ? "%6$s%2$0*1$" PRIx64 "%8$s %7$s%3$c%4$s %5$s"
+ : (radix == radix_decimal
+ ? "%6$s%2$*1$" PRId64 "%8$s %7$s%3$c%4$s %5$s"
+ : "%6$s%2$0*1$" PRIo64 "%8$s %7$s%3$c%4$s %5$s")),
+ digits, syms[cnt].sym.st_value,
+ class_type_char (elf, ehdr, &syms[cnt].sym), marker,
+ symstr,
+ color_mode ? color_address : "",
+ color,
+ color_mode ? color_off : "");
}
if (color_mode)
@@ -1047,14 +1049,6 @@ show_symbols_posix (Elf *elf, const GElf_Ehdr *ehdr, GElf_Word strndx,
if (prefix != NULL && ! print_file_name)
printf ("%s:\n", fullname);
- const char *fmtstr;
- if (radix == radix_hex)
- fmtstr = "%s %c%s %0*" PRIx64 " %0*" PRIx64 "\n";
- else if (radix == radix_decimal)
- fmtstr = "%s %c%s %*" PRId64 " %*" PRId64 "\n";
- else
- fmtstr = "%s %c%s %0*" PRIo64 " %0*" PRIo64 "\n";
-
int digits = length_map[gelf_getclass (elf) - 1][radix];
#ifdef USE_DEMANGLE
@@ -1096,7 +1090,11 @@ show_symbols_posix (Elf *elf, const GElf_Ehdr *ehdr, GElf_Word strndx,
putchar_unlocked (' ');
}
- printf (fmtstr,
+ printf ((radix == radix_hex
+ ? "%s %c%s %0*" PRIx64 " %0*" PRIx64 "\n"
+ : (radix == radix_decimal
+ ? "%s %c%s %*" PRId64 " %*" PRId64 "\n"
+ : "%s %c%s %0*" PRIo64 " %0*" PRIo64 "\n")),
symstr,
class_type_char (elf, ehdr, &syms[cnt].sym),
mark_special
diff --git a/src/size.c b/src/size.c
index dfa46b1..9db55c8 100644
--- a/src/size.c
+++ b/src/size.c
@@ -1,5 +1,5 @@
/* Print size information from ELF file.
- Copyright (C) 2000-2007,2009,2012 Red Hat, Inc.
+ Copyright (C) 2000-2007,2009,2012,2014 Red Hat, Inc.
This file is part of elfutils.
Written by Ulrich Drepper <drepper(a)redhat.com>, 2000.
@@ -441,14 +441,6 @@ show_sysv (Elf *elf, const char *prefix, const char *fname,
digits - 2, sgettext ("sysv|size"),
digits, sgettext ("sysv|addr"));
- const char *fmtstr;
- if (radix == radix_hex)
- fmtstr = "%-*s %*" PRIx64 " %*" PRIx64 "\n";
- else if (radix == radix_decimal)
- fmtstr = "%-*s %*" PRId64 " %*" PRId64 "\n";
- else
- fmtstr = "%-*s %*" PRIo64 " %*" PRIo64 "\n";
-
/* Iterate over all sections. */
GElf_Off total = 0;
while ((scn = elf_nextscn (elf, scn)) != NULL)
@@ -459,7 +451,11 @@ show_sysv (Elf *elf, const char *prefix, const char *fname,
/* Ignore all sections which are not used at runtime. */
if ((shdr->sh_flags & SHF_ALLOC) != 0)
{
- printf (fmtstr,
+ printf ((radix == radix_hex
+ ? "%-*s %*" PRIx64 " %*" PRIx64 "\n"
+ : (radix == radix_decimal
+ ? "%-*s %*" PRId64 " %*" PRId64 "\n"
+ : "%-*s %*" PRIo64 " %*" PRIo64 "\n")),
maxlen, elf_strptr (elf, shstrndx, shdr->sh_name),
digits - 2, shdr->sh_size,
digits, shdr->sh_addr);
@@ -490,14 +486,6 @@ show_sysv_one_line (Elf *elf)
error (EXIT_FAILURE, 0,
gettext ("cannot get section header string table index"));
- const char *fmtstr;
- if (radix == radix_hex)
- fmtstr = "%" PRIx64 "(%s)";
- else if (radix == radix_decimal)
- fmtstr = "%" PRId64 "(%s)";
- else
- fmtstr = "%" PRIo64 "(%s)";
-
/* Iterate over all sections. */
GElf_Off total = 0;
bool first = true;
@@ -515,8 +503,10 @@ show_sysv_one_line (Elf *elf)
fputs_unlocked (" + ", stdout);
first = false;
- printf (fmtstr, shdr->sh_size,
- elf_strptr (elf, shstrndx, shdr->sh_name));
+ printf ((radix == radix_hex ? "%" PRIx64 "(%s)"
+ : (radix == radix_decimal ? "%" PRId64 "(%s)"
+ : "%" PRIo64 "(%s)")),
+ shdr->sh_size, elf_strptr (elf, shstrndx, shdr->sh_name));
total += shdr->sh_size;
}
diff --git a/src/strings.c b/src/strings.c
index 084eb99..37210a7 100644
--- a/src/strings.c
+++ b/src/strings.c
@@ -1,5 +1,5 @@
/* Print the strings of printable characters in files.
- Copyright (C) 2005-2010, 2012 Red Hat, Inc.
+ Copyright (C) 2005-2010, 2012, 2014 Red Hat, Inc.
This file is part of elfutils.
Written by Ulrich Drepper <drepper(a)redhat.com>, 2005.
@@ -116,8 +116,15 @@ static bool char_7bit;
/* True if file names should be printed before strings. */
static bool print_file_name;
-/* Location print format string. */
-static const char *locfmt;
+/* Radix for printed numbers. */
+static enum
+{
+ radix_none = 0,
+ radix_decimal,
+ radix_hex,
+ radix_octal
+} radix = radix_none;
+
/* Page size in use. */
static size_t ps;
@@ -279,16 +286,16 @@ parse_opt (int key, char *arg,
switch (arg[0])
{
case 'd':
- locfmt = "%7" PRId64 " ";
+ radix = radix_decimal;
break;
case 'o':
octfmt:
- locfmt = "%7" PRIo64 " ";
+ radix = radix_octal;
break;
case 'x':
- locfmt = "%7" PRIx64 " ";
+ radix = radix_hex;
break;
default:
@@ -355,8 +362,11 @@ process_chunk_mb (const char *fname, const unsigned char *buf, off64_t to,
fputs_unlocked (": ", stdout);
}
- if (unlikely (locfmt != NULL))
- printf (locfmt, (int64_t) to - len - (buf - start));
+ if (unlikely (radix != radix_none))
+ printf ((radix == radix_octal ? "%7" PRIo64 " "
+ : (radix == radix_decimal ? "%7" PRId64 " "
+ : "%7" PRIx64 " ")),
+ (int64_t) to - len - (buf - start));
if (unlikely (*unprinted != NULL))
{
@@ -420,8 +430,11 @@ process_chunk (const char *fname, const unsigned char *buf, off64_t to,
fputs_unlocked (": ", stdout);
}
- if (likely (locfmt != NULL))
- printf (locfmt, (int64_t) to - len - (buf - start));
+ if (likely (radix != radix_none))
+ printf ((radix == radix_octal ? "%7" PRIo64 " "
+ : (radix == radix_decimal ? "%7" PRId64 " "
+ : "%7" PRIx64 " ")),
+ (int64_t) to - len - (buf - start));
if (unlikely (*unprinted != NULL))
{
diff --git a/tests/ChangeLog b/tests/ChangeLog
index aa468c4..cbf2672 100644
--- a/tests/ChangeLog
+++ b/tests/ChangeLog
@@ -1,3 +1,7 @@
+2014-01-22 Mark Wielaard <mjw(a)redhat.com>
+
+ * Makefile.am (line2addr_no_Wformat): Removed.
+
2014-01-21 Mark Wielaard <mjw(a)redhat.com>
* Makefile.am (TESTS): Add run-stack-i-test.sh.
diff --git a/tests/Makefile.am b/tests/Makefile.am
index aa13cfa..c75e796 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -355,7 +355,6 @@ get_lines_LDADD = $(libdw) $(libelf) $(libmudflap)
get_files_LDADD = $(libdw) $(libelf) $(libmudflap)
get_aranges_LDADD = $(libdw) $(libelf) $(libmudflap)
allfcts_LDADD = $(libdw) $(libelf) $(libmudflap)
-line2addr_no_Wformat = yes
line2addr_LDADD = $(libdw) $(libmudflap)
addrscopes_LDADD = $(libdw) $(libmudflap)
funcscopes_LDADD = $(libdw) $(libmudflap)
--
1.8.4.2
10 years, 1 month
[PATCH 1/2] backends: arm_cfi SP (r13) is restored from CFA by default.
by Mark Wielaard
Signed-off-by: Mark Wielaard <mjw(a)redhat.com>
---
backends/ChangeLog | 4 ++++
backends/arm_cfi.c | 3 +++
tests/ChangeLog | 5 +++++
tests/run-addrcfi.sh | 2 +-
4 files changed, 13 insertions(+), 1 deletion(-)
diff --git a/backends/ChangeLog b/backends/ChangeLog
index 045fa9d..c8e2b30 100644
--- a/backends/ChangeLog
+++ b/backends/ChangeLog
@@ -1,3 +1,7 @@
+2014-01-25 Mark Wielaard <mjw(a)redhat.com>
+
+ * arm_cfi.c (arm_abi_cfi): Restore SP (r13) from CFA.
+
2014-01-24 Mark Wielaard <mjw(a)redhat.com>
* arm_reloc.def: Update list.
diff --git a/backends/arm_cfi.c b/backends/arm_cfi.c
index e0cc44b..971a1fc 100644
--- a/backends/arm_cfi.c
+++ b/backends/arm_cfi.c
@@ -54,6 +54,9 @@ arm_abi_cfi (Ebl *ebl __attribute__ ((unused)), Dwarf_CIE *abi_info)
Stack Pointer (r13) as setup in the previous frame. */
DW_CFA_def_cfa, ULEB128_7 (13), ULEB128_7 (0),
+ /* The Stack Pointer (r13) is restored from CFA address by default. */
+ DW_CFA_val_offset, ULEB128_7 (13), ULEB128_7 (0),
+
#define SV(n) DW_CFA_same_value, ULEB128_7 (n)
/* Callee-saved regs r4-r8, r10, r11. */
SV (4), SV (5), SV (6), SV (7), SV (8), SV (10), SV (11),
diff --git a/tests/ChangeLog b/tests/ChangeLog
index cbf2672..fa8a42a 100644
--- a/tests/ChangeLog
+++ b/tests/ChangeLog
@@ -1,3 +1,8 @@
+2014-01-25 Mark Wielaard <mjw(a)redhat.com>
+
+ * run-addrcfi.sh (EM_ARM): Change reg13 (sp) from undefined to
+ location expression: call_frame_cfa stack_value.
+
2014-01-22 Mark Wielaard <mjw(a)redhat.com>
* Makefile.am (line2addr_no_Wformat): Removed.
diff --git a/tests/run-addrcfi.sh b/tests/run-addrcfi.sh
index a4225ac..5d33246 100755
--- a/tests/run-addrcfi.sh
+++ b/tests/run-addrcfi.sh
@@ -2519,7 +2519,7 @@ dwarf_cfi_addrframe (.eh_frame): no matching address range
integer reg10 (r10): same_value
integer reg11 (r11): same_value
integer reg12 (r12): undefined
- integer reg13 (sp): undefined
+ integer reg13 (sp): location expression: call_frame_cfa stack_value
integer reg14 (lr): same_value
integer reg15 (pc): location expression: regx(14)
FPA reg16 (f0): undefined
--
1.8.4.2
10 years, 1 month
[PATCH] backends: Update arm_reloc.def.
by Mark Wielaard
The elflint self test now also checks ET_REL files. Update the list of
relocation types to include all known relocations from elf.h.
R_ARM_SWI24 was obsolete and is now named R_ARM_TLS_DESC. The only other
relocation used in the dynamic linker is R_ARM_IRELATIVE.
Signed-off-by: Mark Wielaard <mjw(a)redhat.com>
---
backends/ChangeLog | 4 +++
backends/arm_reloc.def | 81 ++++++++++++++++++++++++++++++++++++++++++++++++--
2 files changed, 83 insertions(+), 2 deletions(-)
diff --git a/backends/ChangeLog b/backends/ChangeLog
index 0df6819..045fa9d 100644
--- a/backends/ChangeLog
+++ b/backends/ChangeLog
@@ -1,3 +1,7 @@
+2014-01-24 Mark Wielaard <mjw(a)redhat.com>
+
+ * arm_reloc.def: Update list.
+
2014-01-22 Mark Wielaard <mjw(a)redhat.com>
* Makefile.am (aarch64_regs_no_Wformat): Removed.
diff --git a/backends/arm_reloc.def b/backends/arm_reloc.def
index eeb2160..4b7894b 100644
--- a/backends/arm_reloc.def
+++ b/backends/arm_reloc.def
@@ -1,5 +1,5 @@
/* List the relocation types for arm. -*- C -*-
- Copyright (C) 2005-2010 Red Hat, Inc.
+ Copyright (C) 2005-2010, 2014 Red Hat, Inc.
This file is part of elfutils.
This file is free software; you can redistribute it and/or modify
@@ -41,7 +41,7 @@ RELOC_TYPE (SBREL32, REL)
RELOC_TYPE (THM_PC22, REL)
RELOC_TYPE (THM_PC8, REL)
RELOC_TYPE (AMP_VCALL9, REL)
-RELOC_TYPE (SWI24, REL)
+RELOC_TYPE (TLS_DESC, EXEC|DYN)
RELOC_TYPE (THM_SWI8, REL)
RELOC_TYPE (XPC25, REL)
RELOC_TYPE (THM_XPC22, REL)
@@ -56,12 +56,78 @@ RELOC_TYPE (GOTOFF, REL)
RELOC_TYPE (GOTPC, REL)
RELOC_TYPE (GOT32, REL)
RELOC_TYPE (PLT32, REL)
+RELOC_TYPE (CALL, REL)
+RELOC_TYPE (JUMP24, REL)
+RELOC_TYPE (THM_JUMP24, REL)
+RELOC_TYPE (BASE_ABS, REL)
RELOC_TYPE (ALU_PCREL_7_0, REL)
RELOC_TYPE (ALU_PCREL_15_8, REL)
RELOC_TYPE (ALU_PCREL_23_15, REL)
RELOC_TYPE (LDR_SBREL_11_0, REL)
RELOC_TYPE (ALU_SBREL_19_12, REL)
RELOC_TYPE (ALU_SBREL_27_20, REL)
+RELOC_TYPE (TARGET1, REL)
+RELOC_TYPE (SBREL31, REL)
+RELOC_TYPE (V4BX, REL)
+RELOC_TYPE (TARGET2, REL)
+RELOC_TYPE (PREL31, REL)
+RELOC_TYPE (MOVW_ABS_NC, REL)
+RELOC_TYPE (MOVT_ABS, REL)
+RELOC_TYPE (MOVW_PREL_NC, REL)
+RELOC_TYPE (MOVT_PREL, REL)
+RELOC_TYPE (THM_MOVW_ABS_NC, REL)
+RELOC_TYPE (THM_MOVT_ABS, REL)
+RELOC_TYPE (THM_MOVW_PREL_NC, REL)
+RELOC_TYPE (THM_MOVT_PREL, REL)
+RELOC_TYPE (THM_JUMP19, REL)
+RELOC_TYPE (THM_JUMP6, REL)
+RELOC_TYPE (THM_ALU_PREL_11_0, REL)
+RELOC_TYPE (THM_PC12, REL)
+RELOC_TYPE (ABS32_NOI, REL)
+RELOC_TYPE (REL32_NOI, REL)
+RELOC_TYPE (ALU_PC_G0_NC, REL)
+RELOC_TYPE (ALU_PC_G0, REL)
+RELOC_TYPE (ALU_PC_G1_NC, REL)
+RELOC_TYPE (ALU_PC_G1, REL)
+RELOC_TYPE (ALU_PC_G2, REL)
+RELOC_TYPE (LDR_PC_G1, REL)
+RELOC_TYPE (LDR_PC_G2, REL)
+RELOC_TYPE (LDRS_PC_G0, REL)
+RELOC_TYPE (LDRS_PC_G1, REL)
+RELOC_TYPE (LDRS_PC_G2, REL)
+RELOC_TYPE (LDC_PC_G0, REL)
+RELOC_TYPE (LDC_PC_G1, REL)
+RELOC_TYPE (LDC_PC_G2, REL)
+RELOC_TYPE (ALU_SB_G0_NC, REL)
+RELOC_TYPE (ALU_SB_G0, REL)
+RELOC_TYPE (ALU_SB_G1_NC, REL)
+RELOC_TYPE (ALU_SB_G1, REL)
+RELOC_TYPE (ALU_SB_G2, REL)
+RELOC_TYPE (LDR_SB_G0, REL)
+RELOC_TYPE (LDR_SB_G1, REL)
+RELOC_TYPE (LDR_SB_G2, REL)
+RELOC_TYPE (LDRS_SB_G0, REL)
+RELOC_TYPE (LDRS_SB_G1, REL)
+RELOC_TYPE (LDRS_SB_G2, REL)
+RELOC_TYPE (LDC_SB_G0, REL)
+RELOC_TYPE (LDC_SB_G1, REL)
+RELOC_TYPE (LDC_SB_G2, REL)
+RELOC_TYPE (MOVW_BREL_NC, REL)
+RELOC_TYPE (MOVT_BREL, REL)
+RELOC_TYPE (MOVW_BREL, REL)
+RELOC_TYPE (THM_MOVW_BREL_NC, REL)
+RELOC_TYPE (THM_MOVT_BREL, REL)
+RELOC_TYPE (THM_MOVW_BREL, REL)
+RELOC_TYPE (TLS_GOTDESC, REL)
+RELOC_TYPE (TLS_CALL, REL)
+RELOC_TYPE (TLS_DESCSEQ, REL)
+RELOC_TYPE (THM_TLS_CALL, REL)
+RELOC_TYPE (PLT32_ABS, REL)
+RELOC_TYPE (GOT_ABS, REL)
+RELOC_TYPE (GOT_PREL, REL)
+RELOC_TYPE (GOT_BREL12, REL)
+RELOC_TYPE (GOTOFF12, REL)
+RELOC_TYPE (GOTRELAX, REL)
RELOC_TYPE (GNU_VTENTRY, REL)
RELOC_TYPE (GNU_VTINHERIT, REL)
RELOC_TYPE (THM_PC11, REL)
@@ -71,6 +137,17 @@ RELOC_TYPE (TLS_LDM32, REL)
RELOC_TYPE (TLS_LDO32, REL)
RELOC_TYPE (TLS_IE32, REL)
RELOC_TYPE (TLS_LE32, REL)
+RELOC_TYPE (TLS_LDO12, REL)
+RELOC_TYPE (TLS_LE12, REL)
+RELOC_TYPE (TLS_IE12GP, REL)
+
+RELOC_TYPE (ME_TOO, REL)
+RELOC_TYPE (THM_TLS_DESCSEQ16, REL)
+RELOC_TYPE (THM_TLS_DESCSEQ32, REL)
+RELOC_TYPE (THM_GOT_BREL12, REL)
+
+RELOC_TYPE (IRELATIVE, EXEC|DYN)
+
RELOC_TYPE (RXPC25, REL)
RELOC_TYPE (RSBREL32, REL)
RELOC_TYPE (THM_RPC22, REL)
--
1.8.4.2
10 years, 1 month
[PATCH 1/2] stack: Add -d, --debugname. Lookup DWARF debuginfo name for frame address.
by Mark Wielaard
Includes test that shows -d matches the function name that corresponds to
the actual source line we report with -s for a frame address.
Signed-off-by: Mark Wielaard <mjw(a)redhat.com>
---
src/ChangeLog | 10 +++
src/stack.c | 56 ++++++++++++++++-
tests/ChangeLog | 9 +++
tests/Makefile.am | 6 +-
tests/run-stack-d-test.sh | 112 +++++++++++++++++++++++++++++++++++
tests/testfiledwarfinlines.bz2 | Bin 0 -> 4225 bytes
tests/testfiledwarfinlines.core.bz2 | Bin 0 -> 39713 bytes
7 files changed, 188 insertions(+), 5 deletions(-)
create mode 100755 tests/run-stack-d-test.sh
create mode 100755 tests/testfiledwarfinlines.bz2
create mode 100644 tests/testfiledwarfinlines.core.bz2
diff --git a/src/ChangeLog b/src/ChangeLog
index 57be0bb..143d73c 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,5 +1,15 @@
2014-01-20 Mark Wielaard <mjw(a)redhat.com>
+ * stack.c (show_debugname): New static boolean.
+ (die_name): New function.
+ (print_frames): If show_debugname is true set symname to the
+ first function-like DIE with a name in scope for the address in
+ the debuginfo.
+ (parse_opt): Handle '-d'.
+ (main): Add 'd' to options.
+
+2014-01-20 Mark Wielaard <mjw(a)redhat.com>
+
* addr2line.c (handle_address): Initialize scopes to NULL.
2014-01-17 Roland McGrath <roland(a)redhat.com>
diff --git a/src/stack.c b/src/stack.c
index 275be08..ae0ef12 100644
--- a/src/stack.c
+++ b/src/stack.c
@@ -28,6 +28,7 @@
#include <fcntl.h>
#include ELFUTILS_HEADER(dwfl)
+#include <dwarf.h>
#include <system.h>
/* Name and version of program. */
@@ -49,6 +50,7 @@ static bool show_one_tid = false;
static bool show_quiet = false;
static bool show_raw = false;
static bool show_modules = false;
+static bool show_debugname = false;
static int maxframes = 2048;
@@ -192,6 +194,23 @@ frame_callback (Dwfl_Frame *state, void *arg)
return DWARF_CB_OK;
}
+static const char*
+die_name (Dwarf_Die *die)
+{
+ Dwarf_Attribute attr;
+ const char *name;
+ name = dwarf_formstring (dwarf_attr_integrate (die,
+ DW_AT_MIPS_linkage_name,
+ &attr)
+ ?: dwarf_attr_integrate (die,
+ DW_AT_linkage_name,
+ &attr));
+ if (name == NULL)
+ name = dwarf_diename (die);
+
+ return name;
+}
+
static void
print_frames (struct frames *frames, pid_t tid, int dwflerr, const char *what)
{
@@ -209,7 +228,31 @@ print_frames (struct frames *frames, pid_t tid, int dwflerr, const char *what)
Dwfl_Module *mod = dwfl_addrmodule (dwfl, pc_adjusted);
const char *symname = NULL;
if (mod && ! show_quiet)
- symname = dwfl_module_addrname (mod, pc_adjusted);
+ {
+ if (show_debugname)
+ {
+ Dwarf_Addr bias = 0;
+ Dwarf_Die *cudie = dwfl_module_addrdie (mod, pc_adjusted, &bias);
+ Dwarf_Die *scopes = NULL;
+ int nscopes = dwarf_getscopes (cudie, pc_adjusted - bias,
+ &scopes);
+
+ /* Find the first function-like DIE with a name in scope. */
+ for (int i = 0; symname == NULL && i < nscopes; i++)
+ {
+ Dwarf_Die *scope = &scopes[i];
+ int tag = dwarf_tag (scope);
+ if (tag == DW_TAG_subprogram
+ || tag == DW_TAG_inlined_subroutine
+ || tag == DW_TAG_entry_point)
+ symname = die_name (scope);
+ }
+ free (scopes);
+ }
+
+ if (symname == NULL)
+ symname = dwfl_module_addrname (mod, pc_adjusted);
+ }
int width = get_addr_width (mod);
printf ("#%-2u 0x%0*" PRIx64, nr, width, (uint64_t) pc);
@@ -382,8 +425,12 @@ parse_opt (int key, char *arg __attribute__ ((unused)),
show_activation = true;
break;
+ case 'd':
+ show_debugname = true;
+ break;
+
case 'v':
- show_activation = show_source = show_module = true;
+ show_activation = show_source = show_module = show_debugname = true;
break;
case 'b':
@@ -506,12 +553,15 @@ main (int argc, char **argv)
{ NULL, 0, NULL, 0, N_("Output selection options:"), 0 },
{ "activation", 'a', NULL, 0,
N_("Additionally show frame activation"), 0 },
+ { "debugname", 'd', NULL, 0,
+ N_("Additionally try to lookup DWARF debuginfo name for frame address"),
+ 0 },
{ "module", 'm', NULL, 0,
N_("Additionally show module file information"), 0 },
{ "source", 's', NULL, 0,
N_("Additionally show source file information"), 0 },
{ "verbose", 'v', NULL, 0,
- N_("Show all additional information (activation, module and source)"), 0 },
+ N_("Show all additional information (activation, debugname, module and source)"), 0 },
{ "quiet", 'q', NULL, 0,
N_("Do not resolve address to function symbol name"), 0 },
{ "raw", 'r', NULL, 0,
diff --git a/tests/ChangeLog b/tests/ChangeLog
index 733d8e6..70b0551 100644
--- a/tests/ChangeLog
+++ b/tests/ChangeLog
@@ -1,3 +1,12 @@
+2014-01-20 Mark Wielaard <mjw(a)redhat.com>
+
+ * Makefile.am (TESTS): Add run-stack-d-test.sh.
+ (EXTRA_DIST): Add run-stack-d-test.sh, testfiledwarfinlines.bz2
+ testfiledwarfinlines.core.bz2.
+ * run-stack-d-test.sh: New test.
+ * testfiledwarfinlines.bz2: New test file.
+ * testfiledwarfinlines.core.bz2: Likewise.
+
2014-01-16 Mark Wielaard <mjw(a)redhat.com>
* run-nm-self.sh: Don't use testrun_on_self_quiet but just testrun
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 1253574..35f6e87 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -108,7 +108,7 @@ TESTS = run-arextract.sh run-arsymtest.sh newfile test-nlist \
run-backtrace-native-core-biarch.sh run-backtrace-core-x86_64.sh \
run-backtrace-core-i386.sh run-backtrace-core-ppc.sh \
run-backtrace-core-s390x.sh run-backtrace-core-s390.sh \
- run-backtrace-demangle.sh
+ run-backtrace-demangle.sh run-stack-d-test.sh
if !BIARCH
export ELFUTILS_DISABLE_BIARCH = 1
@@ -264,7 +264,9 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh \
run-backtrace-core-s390x.sh run-backtrace-core-s390.sh \
run-backtrace-demangle.sh testfile-backtrace-demangle.bz2 \
testfile-backtrace-demangle.cc \
- testfile-backtrace-demangle.core.bz2
+ testfile-backtrace-demangle.core.bz2 \
+ run-stack-d-test.sh \
+ testfiledwarfinlines.bz2 testfiledwarfinlines.core.bz2
if USE_VALGRIND
valgrind_cmd='valgrind -q --error-exitcode=1 --run-libc-freeres=no'
diff --git a/tests/run-stack-d-test.sh b/tests/run-stack-d-test.sh
new file mode 100755
index 0000000..040c2fa
--- /dev/null
+++ b/tests/run-stack-d-test.sh
@@ -0,0 +1,112 @@
+#! /bin/sh
+# Copyright (C) 2014 Red Hat, Inc.
+# This file is part of elfutils.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# elfutils is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+. $srcdir/test-subr.sh
+
+# // g++ dwarfinlines.cpp -g -o testfiledwarfinlines -O2
+# int
+# fubar (int x)
+# {
+# __asm__ ( "nop" ::: );
+# return 42 / x - 2;
+# }
+#
+# void foobar (int z1, int z2)
+# {
+# __asm__ ( "nop" ::: );
+# int x = z1 + z2;
+# while (z1 + x + 1 != 42)
+# x = fubar (z1 + z2 + x);
+# }
+#
+# void bar (int z)
+# {
+# int a, b;
+# a = b = z / 2;
+# foobar(a, b);
+# }
+#
+# void foo (int x)
+# {
+# if (x > 0)
+# bar(x - 2);
+# }
+#
+# void fu (int y)
+# {
+# __asm__ ( "nop" ::: );
+# foo (y + 1);
+# }
+#
+# int
+# main (int argc, char **argv)
+# {
+# fu (argc);
+# }
+testfiles testfiledwarfinlines testfiledwarfinlines.core
+
+# Depending on whether we are running make check or make installcheck
+# the actual binary name under test might be different. It is used in
+# the error message, which we also try to match.
+if test "$elfutils_testrun" = "installed"; then
+STACKCMD=${bindir}/`program_transform stack`
+else
+STACKCMD=${abs_top_builddir}/src/stack
+fi
+
+# Without -d the top function comes out as fu.
+testrun_compare ${abs_top_builddir}/src/stack -n 2 -e testfiledwarfinlines --core testfiledwarfinlines.core<<EOF
+PID 13654 - core
+TID 13654:
+#0 0x00000000004006c8 fu(int)
+#1 0x00000000004004c5 main
+$STACKCMD: tid 13654: shown max number of frames (2, use -n 0 for unlimited)
+EOF
+
+# But when asking for source we see it is actually on line 6.
+# (Which is in function fubar, not fu).
+testrun_compare ${abs_top_builddir}/src/stack -n 2 -s -e testfiledwarfinlines --core testfiledwarfinlines.core<<EOF
+PID 13654 - core
+TID 13654:
+#0 0x00000000004006c8 fu(int)
+ /home/mark/src/tests/dwarfinlines.cpp:6
+#1 0x00000000004004c5 main
+ /home/mark/src/tests/dwarfinlines.cpp:39
+$STACKCMD: tid 13654: shown max number of frames (2, use -n 0 for unlimited)
+EOF
+
+# So with --debugname we get the function correct as fubar.
+testrun_compare ${abs_top_builddir}/src/stack -n 2 -d -e testfiledwarfinlines --core testfiledwarfinlines.core<<EOF
+PID 13654 - core
+TID 13654:
+#0 0x00000000004006c8 fubar
+#1 0x00000000004004c5 main
+$STACKCMD: tid 13654: shown max number of frames (2, use -n 0 for unlimited)
+EOF
+
+# Which now matches the source line (again 6 of course).
+testrun_compare ${abs_top_builddir}/src/stack -n 2 -s -d -e testfiledwarfinlines --core testfiledwarfinlines.core<<EOF
+PID 13654 - core
+TID 13654:
+#0 0x00000000004006c8 fubar
+ /home/mark/src/tests/dwarfinlines.cpp:6
+#1 0x00000000004004c5 main
+ /home/mark/src/tests/dwarfinlines.cpp:39
+$STACKCMD: tid 13654: shown max number of frames (2, use -n 0 for unlimited)
+EOF
+
+exit 0
diff --git a/tests/testfiledwarfinlines.bz2 b/tests/testfiledwarfinlines.bz2
new file mode 100755
index 0000000000000000000000000000000000000000..db14f8167fa952551cbb61361d1e81f20e7b43ad
GIT binary patch
literal 4225
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
Xcb2$Xw>Eb%|BJaIoG3_YoL5wU-)@qw
literal 0
HcmV?d00001
diff --git a/tests/testfiledwarfinlines.core.bz2 b/tests/testfiledwarfinlines.core.bz2
new file mode 100644
index 0000000000000000000000000000000000000000..2299e1e7afe5697ec0553f0da018257010b8b7b1
GIT binary patch
literal 39713
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
W=GtNOUJZEC8^+!e74>~zHu-<`$5Dm=
literal 0
HcmV?d00001
--
1.7.1
10 years, 1 month
[PATCH] addr2line: handle_address initialize scopes to NULL.
by Mark Wielaard
dwarf_getscopes returns the number of scope DIEs containing a PC address.
It returns -1 for errors or 0 if no scopes match PC. If dwarf_getscopes
returned 0, then scopes will not be allocated and handle_address might free
the uninitialized scopes pointer. Make sure it always has a defined value.
Signed-off-by: Mark Wielaard <mjw(a)redhat.com>
---
src/ChangeLog | 4 ++++
src/addr2line.c | 2 +-
2 files changed, 5 insertions(+), 1 deletions(-)
diff --git a/src/ChangeLog b/src/ChangeLog
index 99b1156..57be0bb 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,7 @@
+2014-01-20 Mark Wielaard <mjw(a)redhat.com>
+
+ * addr2line.c (handle_address): Initialize scopes to NULL.
+
2014-01-17 Roland McGrath <roland(a)redhat.com>
* strip.c (handle_elf): Check for bogus values in sh_link, sh_info,
diff --git a/src/addr2line.c b/src/addr2line.c
index 0541fb6..50fc2b3 100644
--- a/src/addr2line.c
+++ b/src/addr2line.c
@@ -642,7 +642,7 @@ handle_address (const char *string, Dwfl *dwfl)
Dwarf_Addr bias = 0;
Dwarf_Die *cudie = dwfl_module_addrdie (mod, addr, &bias);
- Dwarf_Die *scopes;
+ Dwarf_Die *scopes = NULL;
int nscopes = dwarf_getscopes (cudie, addr - bias, &scopes);
if (nscopes < 0)
return 1;
--
1.7.1
10 years, 1 month
[RFC] libelf: segment fault on x86-64 while file's bss offset have a large number
by Hongxu Jia
*Environment
cat /etc/issue
Ubuntu 13.04 \n \l
uname -a
Linux pek-hjia-d1 3.8.0-31-generic #46-Ubuntu SMP Tue Sep 10 20:03:44 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
*Problem
1) Here is the test source code
$ cat >> test.c << EOF
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include "libelf.h"
int main(int argc, char *argv[])
{
int fd;
Elf *e;
if (elf_version(EV_CURRENT) == EV_NONE)
{
printf ("library out of date\n");
exit (1);
}
if ((fd = open("test/xB.linkhuge", O_RDWR)) < 0) {
printf("%s %d failed\n", __FUNCTION__, __LINE__);
exit (1);
}
if ((e = elf_begin(fd, ELF_C_RDWR_MMAP, (Elf *) 0)) == 0) {
printf("failed %s", elf_errmsg (-1));
exit (1);
}
elf_flagelf (e, ELF_C_SET, ELF_F_LAYOUT);
elf_update(e, ELF_C_WRITE);
elf_end(e);
close(fd);
}
EOF
2) Download http://kojipkgs.fedoraproject.org/packages/elfutils/0.157/2.fc21/x86_64/e...
to get libelf.a for debug.
Download http://kojipkgs.fedoraproject.org/packages/elfutils/0.157/2.fc21/x86_64/e...
to get libelf.h for debug.
3) Compile test.c with libelf.a
$ gcc test.c -o test_case -static -L. -lelf
4) Prepare file whose bss offset have a large number '00200000'
Download the attachment from
https://bugzilla.redhat.com/show_bug.cgi?id=1020842
$ ls test/xB.linkhuge -al
-rwxr-xr-x 1 jiahongxu jiahongxu 1221403 Oct 18 18:55 test/xB.linkhuge
$ readelf -a xB.linkhuge
......
[Nr] Name Type Address Offset
Size EntSize Flags Link Info Align
skip..
[25] .data PROGBITS 00000000005128a0 001128a0
0000000000010168 0000000000000000 WA 0 0 32
[26] .bss NOBITS 0000000001000000 00200000
0000000000010050 0000000000000000 WA 0 0 32
[27] .comment PROGBITS 0000000000000000 00122a08
0000000000000011 0000000000000001 MS 0 0 1
......
5) Run test_case with strace, there was mmap/munmap error.
$ strace ./test_case
execve("./test_case", ["./test_case"], [/* 59 vars */]) = 0
uname({sys="Linux", node="pek-hjia-d1", ...}) = 0
brk(0) = 0x16a6000
brk(0x16a71c0) = 0x16a71c0
arch_prctl(ARCH_SET_FS, 0x16a6880) = 0
brk(0x16c81c0) = 0x16c81c0
brk(0x16c9000) = 0x16c9000
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
open("test/xB.linkhuge", O_RDWR) = 3
fcntl(3, F_GETFL) = 0x8002 (flags O_RDWR|O_LARGEFILE)
fstat(3, {st_mode=S_IFREG|0755, st_size=1221403, ...}) = 0
mmap(NULL, 1221403, PROT_READ|PROT_WRITE, MAP_SHARED, 3, 0) = 0x7ff720fe2000
fstat(3, {st_mode=S_IFREG|0755, st_size=1221403, ...}) = 0
ftruncate(3, 2097152) = 0
msync(0x7ff720fe2000, 1216568, MS_SYNC) = 0
munmap(0x7ff720fe2000, 2097152) = 0
close(3) = 0
exit_group(0) = ?
6) $ ls test/xB.linkhuge -al
-rwxr-xr-x 1 jiahongxu jiahongxu 2097152 Oct 18 19:04 test/xB.linkhuge
*Analysis
1) While ELF_C_RDWR_MMAP was used, elf_begin invoked mmap() to map file
into memory with the size of '1221403'.
...strace log...
mmap(NULL, 1221403, PROT_READ|PROT_WRITE, MAP_SHARED, 3, 0) = 0x7ff720fe2000
................
2) While 'xB.linkhuge' bss Offset has a large number '00200000', elf_update
caculated file size by __elf64_updatenull_wrlock and the size was
enlarged from '1221403' to '2097152'
3) In this situation, elf_update invoked ftruncate to enlarge the file,
and memory size (elf->maximum_size) also was incorrectly updated.
...strace log...
ftruncate(3, 2097152)
................
4) There was segment fault in elf_end which invoked munmap with the
length is the enlarged file size '2097152', not the length of
mmap '1216568'.
...strace log...
munmap(0x7ff720fe2000, 2097152) = 0
................
*Solution
1) I tried to modify elf_update.c, don't update memory size
(elf->maximum_size) in this situation. It fixed this issue
and everything looks ok, but I am not sure the modification
is necessary.
......
11 diff --git a/libelf/elf_update.c b/libelf/elf_update.c
12 --- a/libelf/elf_update.c
13 +++ b/libelf/elf_update.c
14 @@ -120,7 +120,9 @@ write_file (Elf *elf, off_t size, int change_bo, size_t shnum)
15 size = -1;
16 }
17
18 - if (size != -1 && elf->parent == NULL)
19 + /* If the file is enlarged by truncate, we should not update maximum_size to
20 + avoid segment fault while invoking munmap in elf_end */
21 + if (size != -1 && elf->parent == NULL && (size_t) size <= elf->maximum_size)
22 elf->maximum_size = size;
......
2) I also tried to add check before munmap in elf_end by msync with
the length of elf->maximum_size, if msync return error, munmap
should not be invoked, this could avoid segment fault.
--- a/libelf/elf_end.c
+++ b/libelf/elf_end.c
@@ -217,7 +217,10 @@ elf_end (elf)
if ((elf->flags & ELF_F_MALLOCED) != 0)
free (elf->map_address);
else if ((elf->flags & ELF_F_MMAPPED) != 0)
- munmap (elf->map_address, elf->maximum_size);
+ {
+ if (msync (elf->map_address, elf->maximum_size, MS_SYNC) == 0)
+ munmap (elf->map_address, elf->maximum_size);
+ }
}
3) Any suggestion is welcomed.
--
1.8.1.2
10 years, 1 month