Skip to content

Commit

Permalink
readelf: Fix .debug_types printing with implicit section_info.
Browse files Browse the repository at this point in the history
Commit 314e9d7 "readelf: Handle .debug_info first if any other debug
section needs it" disabled section_info printing if it was already
handled. But section_types was an alias for section_info. So unless
section_info was explicitly printed, .debug_types wasn't.

Make section_types its own thing to print .debug_types and make
section_info imply section_types. Add a testcase to make sure
.debug_types is now printed.

Signed-off-by: Mark Wielaard <[email protected]>
  • Loading branch information
Mark Wielaard committed Jun 1, 2018
1 parent 0f5b772 commit a6a783a
Show file tree
Hide file tree
Showing 5 changed files with 149 additions and 6 deletions.
9 changes: 9 additions & 0 deletions src/ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,12 @@
2018-05-31 Mark Wielaard <[email protected]>

* readelf.c (enum section_e): Make section_types not an alias of
section_info.
(section_all): Add section_types.
(parse_opt): Add both section_info and section_types for "info"
and "info+".
(print_debug_units): Don't be silent for debug_types.

2018-05-31 Mark Wielaard <[email protected]>

* readelf.c (attr_callback): Only register section_loc when not
Expand Down
16 changes: 10 additions & 6 deletions src/readelf.c
Original file line number Diff line number Diff line change
Expand Up @@ -237,8 +237,7 @@ static enum section_e
section_abbrev = 1, /* .debug_abbrev */
section_aranges = 2, /* .debug_aranges */
section_frame = 4, /* .debug_frame or .eh_frame & al. */
section_info = 8, /* .debug_info, .debug_types */
section_types = section_info,
section_info = 8, /* .debug_info, (implies .debug_types) */
section_line = 16, /* .debug_line */
section_loc = 32, /* .debug_loc */
section_pubnames = 64, /* .debug_pubnames */
Expand All @@ -248,12 +247,13 @@ static enum section_e
section_exception = 1024, /* .eh_frame & al. */
section_gdb_index = 2048, /* .gdb_index */
section_macro = 4096, /* .debug_macro */
section_addr = 8192,
section_addr = 8192, /* .debug_addr */
section_types = 16384, /* .debug_types (implied by .debug_info) */
section_all = (section_abbrev | section_aranges | section_frame
| section_info | section_line | section_loc
| section_pubnames | section_str | section_macinfo
| section_ranges | section_exception | section_gdb_index
| section_macro | section_addr)
| section_macro | section_addr | section_types)
} print_debug_sections, implicit_debug_sections;

/* Select hex dumping of sections. */
Expand Down Expand Up @@ -463,10 +463,14 @@ parse_opt (int key, char *arg,
else if (strcmp (arg, "frame") == 0 || strcmp (arg, "frames") == 0)
print_debug_sections |= section_frame;
else if (strcmp (arg, "info") == 0)
print_debug_sections |= section_info;
{
print_debug_sections |= section_info;
print_debug_sections |= section_types;
}
else if (strcmp (arg, "info+") == 0)
{
print_debug_sections |= section_info;
print_debug_sections |= section_types;
show_split_units = true;
}
else if (strcmp (arg, "loc") == 0)
Expand Down Expand Up @@ -7448,7 +7452,7 @@ print_debug_units (Dwfl_Module *dwflmod,
Elf_Scn *scn, GElf_Shdr *shdr,
Dwarf *dbg, bool debug_types)
{
const bool silent = !(print_debug_sections & section_info);
const bool silent = !(print_debug_sections & section_info) && !debug_types;
const char *secname = section_name (ebl, ehdr, shdr);

if (!silent)
Expand Down
6 changes: 6 additions & 0 deletions tests/ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
2018-05-31 Mark Wielaard <[email protected]>

* run-readelf-types.sh: New test.
* Makefile.am (TESTS): Add run-readelf-types.sh.
(EXTRA_DIST): Likewise.

2018-05-31 Mark Wielaard <[email protected]>

* splitdwarf4-not-split4.dwo.bz2: New test file.
Expand Down
2 changes: 2 additions & 0 deletions tests/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,7 @@ TESTS = run-arextract.sh run-arsymtest.sh run-ar.sh newfile test-nlist \
run-backtrace-demangle.sh run-stack-d-test.sh run-stack-i-test.sh \
run-stack-demangled-test.sh run-readelf-zx.sh run-readelf-zp.sh \
run-readelf-addr.sh run-readelf-str.sh \
run-readelf-types.sh \
run-readelf-dwz-multi.sh run-allfcts-multi.sh run-deleted.sh \
run-linkmap-cut.sh run-aggregate-size.sh run-peel-type.sh \
vdsosyms run-readelf-A.sh \
Expand Down Expand Up @@ -250,6 +251,7 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh run-ar.sh \
testfile_multi.dwz.bz2 testfile_multi_main.bz2 \
testfile-dwzstr.bz2 testfile-dwzstr.multi.bz2 \
run-readelf-addr.sh run-readelf-str.sh \
run-readelf-types.sh \
run-allfcts-multi.sh \
test-offset-loop.bz2 test-offset-loop.alt.bz2 \
run-prelink-addr-test.sh \
Expand Down
122 changes: 122 additions & 0 deletions tests/run-readelf-types.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
#! /bin/sh
# Copyright (C) 2018 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

# Make sure --debug-dump=info implies .debug_types, even when implicit.
# See run-typeiter.sh
testfiles testfile-debug-types

testrun_compare ${abs_top_builddir}/src/readelf --debug-dump=str --debug-dump=info testfile-debug-types<<\EOF
DWARF section [28] '.debug_info' at offset 0x1089:
[Offset]
Compilation unit at offset 0:
Version: 4, Abbreviation section offset: 0, Address size: 8, Offset size: 4
[ b] compile_unit abbrev: 8
producer (strp) "GNU C++ 4.8.2 20140120 (Red Hat 4.8.2-16) -mtune=generic -march=x86-64 -g -fdebug-types-section"
language (data1) C_plus_plus (4)
comp_dir (strp) "/home/mark/src/elfutils/tests"
low_pc (addr) 0x00000000004005b0 <main>
high_pc (data8) 11 (0x00000000004005bb)
stmt_list (sec_offset) 0
[ 29] subprogram abbrev: 9
external (flag_present) yes
name (strp) "main"
decl_file (data1) <stdin> (1)
decl_line (data1) 1
type (ref4) [ 46]
low_pc (addr) 0x00000000004005b0 <main>
high_pc (data8) 11 (0x00000000004005bb)
frame_base (exprloc)
[ 0] call_frame_cfa
GNU_all_call_sites (flag_present) yes
[ 46] base_type abbrev: 10
byte_size (data1) 4
encoding (data1) signed (5)
name (string) "int"
[ 4d] variable abbrev: 11
name (string) "a"
decl_file (data1) <stdin> (1)
decl_line (data1) 1
type (ref_sig8) {18763953736e2de0}
external (flag_present) yes
location (exprloc)
[ 0] addr 0x601030 <a>
[ 64] variable abbrev: 11
name (string) "b"
decl_file (data1) <stdin> (1)
decl_line (data1) 1
type (ref_sig8) {7cf9bbf793fcaf13}
external (flag_present) yes
location (exprloc)
[ 0] addr 0x601031 <b>
DWARF section [31] '.debug_str' at offset 0x11dd:
Offset String
[ 0] "/home/mark/src/elfutils/tests"
[ 1e] "GNU C++ 4.8.2 20140120 (Red Hat 4.8.2-16) -mtune=generic -march=x86-64 -g -fdebug-types-section"
[ 7e] "main"
DWARF section [32] '.debug_types' at offset 0x1260:
[Offset]
Type unit at offset 0:
Version: 4, Abbreviation section offset: 0, Address size: 8, Offset size: 4
Type signature: 0x7cf9bbf793fcaf13, Type offset: 0x38 [38]
[ 17] type_unit abbrev: 1
language (data1) C_plus_plus (4)
GNU_odr_signature (data8) 4783233826607187165
stmt_list (sec_offset) 0
[ 25] structure_type abbrev: 2
name (string) "A"
signature (ref_sig8) {18763953736e2de0}
declaration (flag_present) yes
sibling (ref4) [ 38]
[ 34] structure_type abbrev: 3
name (string) "B"
declaration (flag_present) yes
[ 38] structure_type abbrev: 4
name (string) "B"
byte_size (data1) 1
decl_file (data1) <stdin> (1)
decl_line (data1) 1
specification (ref4) [ 34]
Type unit at offset 67:
Version: 4, Abbreviation section offset: 0, Address size: 8, Offset size: 4
Type signature: 0x18763953736e2de0, Type offset: 0x25 [25]
[ 5a] type_unit abbrev: 1
language (data1) C_plus_plus (4)
GNU_odr_signature (data8) 16005269134005989797
stmt_list (sec_offset) 0
[ 68] structure_type abbrev: 5
name (string) "A"
byte_size (data1) 1
decl_file (data1) <stdin> (1)
decl_line (data1) 1
[ 6e] structure_type abbrev: 6
name (string) "B"
declaration (flag_present) yes
signature (ref_sig8) {7cf9bbf793fcaf13}
[ 79] member abbrev: 7
name (string) "x"
decl_file (data1) <stdin> (1)
decl_line (data1) 1
type (ref4) [ 6e]
data_member_location (data1) 0
EOF

exit 0

0 comments on commit a6a783a

Please sign in to comment.