#! /bin/sh # Copyright (C) 2012, 2013 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 # common.h # # #include <stdio.h> # # struct foobar # { # int foo; # struct foobar *bar; # }; # # extern int call_foo(struct foobar *foobar_struct_ptr); # main.c # # #include "common.h" # # int main(int argc, char ** argv) # { # struct foobar b; # b.foo = 42; # b.bar = &b; # # return call_foo(b.bar); # } # shared.c # # #include "common.h" # # int call_foo(struct foobar *fb) # { # return fb->bar->foo - 42; # } # gcc -fPIC -g -c -Wall shared.c # gcc -shared -o libtestfile_multi_shared.so shared.o # gcc -g -o testfile_multi_main -L. -ltestfile_multi_shared main.c -Wl,-rpath,. # dwz -m testfile_multi.dwz testfile_multi_main libtestfile_multi_shared.so # main.c # # struct foobarbaz # { # int counter; # char *bookstore; # }; # # int # main (int argc, char **argv) # { # struct foobarbaz fbb; # return 0; # } # gcc -g -o testfile-dwzstr main.c # cp testfile-dwzstr testfile-dwzstr.alt # dwz -m testfile-dwzstr.multi testfile-dwzstr testfile-dwzstr.alt testfiles libtestfile_multi_shared.so testfile_multi_main testfile_multi.dwz testfiles testfile-dwzstr testfile-dwzstr.multi testrun_compare ${abs_top_builddir}/src/readelf --debug-dump=info testfile_multi_main <<\EOF DWARF section [28] '.debug_info' at offset 0x1078: [Offset] Compilation unit at offset 0: Version: 4, Abbreviation section offset: 0, Address size: 8, Offset size: 4 [ b] compile_unit producer (strp) "GNU C 4.7.0 20120507 (Red Hat 4.7.0-5) -mtune=generic -march=x86-64 -g" language (data1) C89 (1) name (strp) "main.c" comp_dir (GNU_strp_alt) "/home/mark/src/tests/dwz" low_pc (addr) 0x00000000004006ac <main> high_pc (udata) 44 (0x00000000004006d8) stmt_list (sec_offset) 0 [ 26] imported_unit import (GNU_ref_alt) [ b] [ 2b] pointer_type byte_size (data1) 8 type (GNU_ref_alt) [ 53] [ 31] subprogram external (flag_present) name (strp) "main" decl_file (data1) 1 decl_line (data1) 3 prototyped (flag_present) type (GNU_ref_alt) [ 3e] low_pc (addr) 0x00000000004006ac <main> high_pc (udata) 44 (0x00000000004006d8) frame_base (exprloc) [ 0] call_frame_cfa GNU_all_tail_call_sites (flag_present) sibling (ref_udata) [ 6e] [ 48] formal_parameter name (strp) "argc" decl_file (data1) 1 decl_line (data1) 3 type (GNU_ref_alt) [ 3e] location (exprloc) [ 0] fbreg -36 [ 56] formal_parameter name (strp) "argv" decl_file (data1) 1 decl_line (data1) 3 type (ref_udata) [ 6e] location (exprloc) [ 0] fbreg -48 [ 61] variable name (string) "b" decl_file (data1) 1 decl_line (data1) 5 type (GNU_ref_alt) [ 5a] location (exprloc) [ 0] fbreg -32 [ 6e] pointer_type byte_size (data1) 8 type (ref_udata) [ 2b] EOF # Same as above, but find alt debug file in a .dwz subdir. mkdir .dwz mv testfile_multi.dwz .dwz testrun_compare ${abs_top_builddir}/src/readelf --debug-dump=info testfile_multi_main <<\EOF DWARF section [28] '.debug_info' at offset 0x1078: [Offset] Compilation unit at offset 0: Version: 4, Abbreviation section offset: 0, Address size: 8, Offset size: 4 [ b] compile_unit producer (strp) "GNU C 4.7.0 20120507 (Red Hat 4.7.0-5) -mtune=generic -march=x86-64 -g" language (data1) C89 (1) name (strp) "main.c" comp_dir (GNU_strp_alt) "/home/mark/src/tests/dwz" low_pc (addr) 0x00000000004006ac <main> high_pc (udata) 44 (0x00000000004006d8) stmt_list (sec_offset) 0 [ 26] imported_unit import (GNU_ref_alt) [ b] [ 2b] pointer_type byte_size (data1) 8 type (GNU_ref_alt) [ 53] [ 31] subprogram external (flag_present) name (strp) "main" decl_file (data1) 1 decl_line (data1) 3 prototyped (flag_present) type (GNU_ref_alt) [ 3e] low_pc (addr) 0x00000000004006ac <main> high_pc (udata) 44 (0x00000000004006d8) frame_base (exprloc) [ 0] call_frame_cfa GNU_all_tail_call_sites (flag_present) sibling (ref_udata) [ 6e] [ 48] formal_parameter name (strp) "argc" decl_file (data1) 1 decl_line (data1) 3 type (GNU_ref_alt) [ 3e] location (exprloc) [ 0] fbreg -36 [ 56] formal_parameter name (strp) "argv" decl_file (data1) 1 decl_line (data1) 3 type (ref_udata) [ 6e] location (exprloc) [ 0] fbreg -48 [ 61] variable name (string) "b" decl_file (data1) 1 decl_line (data1) 5 type (GNU_ref_alt) [ 5a] location (exprloc) [ 0] fbreg -32 [ 6e] pointer_type byte_size (data1) 8 type (ref_udata) [ 2b] EOF mv .dwz/testfile_multi.dwz . rmdir .dwz testrun_compare ${abs_top_builddir}/src/readelf --debug-dump=info libtestfile_multi_shared.so <<\EOF DWARF section [25] '.debug_info' at offset 0x106c: [Offset] Compilation unit at offset 0: Version: 4, Abbreviation section offset: 0, Address size: 8, Offset size: 4 [ b] compile_unit producer (strp) "GNU C 4.7.0 20120507 (Red Hat 4.7.0-5) -fpreprocessed -mtune=generic -march=x86-64 -g -fPIC" language (data1) C89 (1) name (strp) "shared.c" comp_dir (GNU_strp_alt) "/home/mark/src/tests/dwz" low_pc (addr) +0x0000000000000670 <call_foo> high_pc (udata) 23 (+0x0000000000000687) stmt_list (sec_offset) 0 [ 26] imported_unit import (GNU_ref_alt) [ b] [ 2b] subprogram external (flag_present) name (strp) "call_foo" decl_file (data1) 1 decl_line (data1) 3 prototyped (flag_present) type (GNU_ref_alt) [ 3e] low_pc (addr) +0x0000000000000670 <call_foo> high_pc (udata) 23 (+0x0000000000000687) frame_base (exprloc) [ 0] call_frame_cfa GNU_all_call_sites (flag_present) [ 41] formal_parameter name (string) "fb" decl_file (data1) 1 decl_line (data1) 3 type (GNU_ref_alt) [ 76] location (exprloc) [ 0] fbreg -24 EOF # Same as above, but find alt debug file in a .dwz subdir. mkdir .dwz mv testfile_multi.dwz .dwz testrun_compare ${abs_top_builddir}/src/readelf --debug-dump=info libtestfile_multi_shared.so <<\EOF DWARF section [25] '.debug_info' at offset 0x106c: [Offset] Compilation unit at offset 0: Version: 4, Abbreviation section offset: 0, Address size: 8, Offset size: 4 [ b] compile_unit producer (strp) "GNU C 4.7.0 20120507 (Red Hat 4.7.0-5) -fpreprocessed -mtune=generic -march=x86-64 -g -fPIC" language (data1) C89 (1) name (strp) "shared.c" comp_dir (GNU_strp_alt) "/home/mark/src/tests/dwz" low_pc (addr) +0x0000000000000670 <call_foo> high_pc (udata) 23 (+0x0000000000000687) stmt_list (sec_offset) 0 [ 26] imported_unit import (GNU_ref_alt) [ b] [ 2b] subprogram external (flag_present) name (strp) "call_foo" decl_file (data1) 1 decl_line (data1) 3 prototyped (flag_present) type (GNU_ref_alt) [ 3e] low_pc (addr) +0x0000000000000670 <call_foo> high_pc (udata) 23 (+0x0000000000000687) frame_base (exprloc) [ 0] call_frame_cfa GNU_all_call_sites (flag_present) [ 41] formal_parameter name (string) "fb" decl_file (data1) 1 decl_line (data1) 3 type (GNU_ref_alt) [ 76] location (exprloc) [ 0] fbreg -24 EOF mv .dwz/testfile_multi.dwz . rmdir .dwz testrun_compare ${abs_top_builddir}/src/readelf --debug-dump=info testfile-dwzstr <<\EOF DWARF section [28] '.debug_info' at offset 0x1088: [Offset] Compilation unit at offset 0: Version: 4, Abbreviation section offset: 0, Address size: 8, Offset size: 4 [ b] compile_unit producer (GNU_strp_alt) "GNU C 4.7.2 20121109 (Red Hat 4.7.2-8) -mtune=generic -march=x86-64 -g" language (data1) C89 (1) name (GNU_strp_alt) "main.c" comp_dir (GNU_strp_alt) "/home/mark/src/tests" low_pc (addr) 0x00000000004004ec <main> high_pc (udata) 18 (0x00000000004004fe) stmt_list (sec_offset) 0 [ 26] imported_unit import (GNU_ref_alt) [ b] [ 2b] subprogram external (flag_present) name (GNU_strp_alt) "main" decl_file (data1) 1 decl_line (data1) 8 prototyped (flag_present) type (GNU_ref_alt) [ 30] low_pc (addr) 0x00000000004004ec <main> high_pc (udata) 18 (0x00000000004004fe) frame_base (exprloc) [ 0] call_frame_cfa GNU_all_call_sites (flag_present) [ 41] formal_parameter name (GNU_strp_alt) "argc" decl_file (data1) 1 decl_line (data1) 8 type (GNU_ref_alt) [ 30] location (exprloc) [ 0] fbreg -36 [ 4f] formal_parameter name (GNU_strp_alt) "argv" decl_file (data1) 1 decl_line (data1) 8 type (GNU_ref_alt) [ 41] location (exprloc) [ 0] fbreg -48 [ 5d] variable name (string) "fbb" decl_file (data1) 1 decl_line (data1) 10 type (GNU_ref_alt) [ 14] location (exprloc) [ 0] fbreg -32 EOF exit 0