1 #! /bin/sh 2 # Copyright (C) 2012, 2013 Red Hat, Inc. 3 # This file is part of elfutils. 4 # 5 # This file is free software; you can redistribute it and/or modify 6 # it under the terms of the GNU General Public License as published by 7 # the Free Software Foundation; either version 3 of the License, or 8 # (at your option) any later version. 9 # 10 # elfutils is distributed in the hope that it will be useful, but 11 # WITHOUT ANY WARRANTY; without even the implied warranty of 12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 # GNU General Public License for more details. 14 # 15 # You should have received a copy of the GNU General Public License 16 # along with this program. If not, see <http://www.gnu.org/licenses/>. 17 18 . $srcdir/test-subr.sh 19 20 # common.h 21 # 22 # #include <stdio.h> 23 # 24 # struct foobar 25 # { 26 # int foo; 27 # struct foobar *bar; 28 # }; 29 # 30 # extern int call_foo(struct foobar *foobar_struct_ptr); 31 32 # main.c 33 # 34 # #include "common.h" 35 # 36 # int main(int argc, char ** argv) 37 # { 38 # struct foobar b; 39 # b.foo = 42; 40 # b.bar = &b; 41 # 42 # return call_foo(b.bar); 43 # } 44 45 # shared.c 46 # 47 # #include "common.h" 48 # 49 # int call_foo(struct foobar *fb) 50 # { 51 # return fb->bar->foo - 42; 52 # } 53 54 # gcc -fPIC -g -c -Wall shared.c 55 # gcc -shared -o libtestfile_multi_shared.so shared.o 56 # gcc -g -o testfile_multi_main -L. -ltestfile_multi_shared main.c -Wl,-rpath,. 57 # dwz -m testfile_multi.dwz testfile_multi_main libtestfile_multi_shared.so 58 59 # main.c 60 # 61 # struct foobarbaz 62 # { 63 # int counter; 64 # char *bookstore; 65 # }; 66 # 67 # int 68 # main (int argc, char **argv) 69 # { 70 # struct foobarbaz fbb; 71 # return 0; 72 # } 73 74 # gcc -g -o testfile-dwzstr main.c 75 # cp testfile-dwzstr testfile-dwzstr.alt 76 # dwz -m testfile-dwzstr.multi testfile-dwzstr testfile-dwzstr.alt 77 78 testfiles libtestfile_multi_shared.so testfile_multi_main testfile_multi.dwz 79 testfiles testfile-dwzstr testfile-dwzstr.multi 80 81 testrun_compare ${abs_top_builddir}/src/readelf --debug-dump=info testfile_multi_main <<\EOF 82 83 DWARF section [28] '.debug_info' at offset 0x1078: 84 [Offset] 85 Compilation unit at offset 0: 86 Version: 4, Abbreviation section offset: 0, Address size: 8, Offset size: 4 87 [ b] compile_unit 88 producer (strp) "GNU C 4.7.0 20120507 (Red Hat 4.7.0-5) -mtune=generic -march=x86-64 -g" 89 language (data1) C89 (1) 90 name (strp) "main.c" 91 comp_dir (GNU_strp_alt) "/home/mark/src/tests/dwz" 92 low_pc (addr) 0x00000000004006ac <main> 93 high_pc (udata) 44 (0x00000000004006d8) 94 stmt_list (sec_offset) 0 95 [ 26] imported_unit 96 import (GNU_ref_alt) [ b] 97 [ 2b] pointer_type 98 byte_size (data1) 8 99 type (GNU_ref_alt) [ 53] 100 [ 31] subprogram 101 external (flag_present) 102 name (strp) "main" 103 decl_file (data1) 1 104 decl_line (data1) 3 105 prototyped (flag_present) 106 type (GNU_ref_alt) [ 3e] 107 low_pc (addr) 0x00000000004006ac <main> 108 high_pc (udata) 44 (0x00000000004006d8) 109 frame_base (exprloc) 110 [ 0] call_frame_cfa 111 GNU_all_tail_call_sites (flag_present) 112 sibling (ref_udata) [ 6e] 113 [ 48] formal_parameter 114 name (strp) "argc" 115 decl_file (data1) 1 116 decl_line (data1) 3 117 type (GNU_ref_alt) [ 3e] 118 location (exprloc) 119 [ 0] fbreg -36 120 [ 56] formal_parameter 121 name (strp) "argv" 122 decl_file (data1) 1 123 decl_line (data1) 3 124 type (ref_udata) [ 6e] 125 location (exprloc) 126 [ 0] fbreg -48 127 [ 61] variable 128 name (string) "b" 129 decl_file (data1) 1 130 decl_line (data1) 5 131 type (GNU_ref_alt) [ 5a] 132 location (exprloc) 133 [ 0] fbreg -32 134 [ 6e] pointer_type 135 byte_size (data1) 8 136 type (ref_udata) [ 2b] 137 EOF 138 139 # Same as above, but find alt debug file in a .dwz subdir. 140 mkdir .dwz 141 mv testfile_multi.dwz .dwz 142 testrun_compare ${abs_top_builddir}/src/readelf --debug-dump=info testfile_multi_main <<\EOF 143 144 DWARF section [28] '.debug_info' at offset 0x1078: 145 [Offset] 146 Compilation unit at offset 0: 147 Version: 4, Abbreviation section offset: 0, Address size: 8, Offset size: 4 148 [ b] compile_unit 149 producer (strp) "GNU C 4.7.0 20120507 (Red Hat 4.7.0-5) -mtune=generic -march=x86-64 -g" 150 language (data1) C89 (1) 151 name (strp) "main.c" 152 comp_dir (GNU_strp_alt) "/home/mark/src/tests/dwz" 153 low_pc (addr) 0x00000000004006ac <main> 154 high_pc (udata) 44 (0x00000000004006d8) 155 stmt_list (sec_offset) 0 156 [ 26] imported_unit 157 import (GNU_ref_alt) [ b] 158 [ 2b] pointer_type 159 byte_size (data1) 8 160 type (GNU_ref_alt) [ 53] 161 [ 31] subprogram 162 external (flag_present) 163 name (strp) "main" 164 decl_file (data1) 1 165 decl_line (data1) 3 166 prototyped (flag_present) 167 type (GNU_ref_alt) [ 3e] 168 low_pc (addr) 0x00000000004006ac <main> 169 high_pc (udata) 44 (0x00000000004006d8) 170 frame_base (exprloc) 171 [ 0] call_frame_cfa 172 GNU_all_tail_call_sites (flag_present) 173 sibling (ref_udata) [ 6e] 174 [ 48] formal_parameter 175 name (strp) "argc" 176 decl_file (data1) 1 177 decl_line (data1) 3 178 type (GNU_ref_alt) [ 3e] 179 location (exprloc) 180 [ 0] fbreg -36 181 [ 56] formal_parameter 182 name (strp) "argv" 183 decl_file (data1) 1 184 decl_line (data1) 3 185 type (ref_udata) [ 6e] 186 location (exprloc) 187 [ 0] fbreg -48 188 [ 61] variable 189 name (string) "b" 190 decl_file (data1) 1 191 decl_line (data1) 5 192 type (GNU_ref_alt) [ 5a] 193 location (exprloc) 194 [ 0] fbreg -32 195 [ 6e] pointer_type 196 byte_size (data1) 8 197 type (ref_udata) [ 2b] 198 EOF 199 mv .dwz/testfile_multi.dwz . 200 rmdir .dwz 201 202 testrun_compare ${abs_top_builddir}/src/readelf --debug-dump=info libtestfile_multi_shared.so <<\EOF 203 204 DWARF section [25] '.debug_info' at offset 0x106c: 205 [Offset] 206 Compilation unit at offset 0: 207 Version: 4, Abbreviation section offset: 0, Address size: 8, Offset size: 4 208 [ b] compile_unit 209 producer (strp) "GNU C 4.7.0 20120507 (Red Hat 4.7.0-5) -fpreprocessed -mtune=generic -march=x86-64 -g -fPIC" 210 language (data1) C89 (1) 211 name (strp) "shared.c" 212 comp_dir (GNU_strp_alt) "/home/mark/src/tests/dwz" 213 low_pc (addr) +0x0000000000000670 <call_foo> 214 high_pc (udata) 23 (+0x0000000000000687) 215 stmt_list (sec_offset) 0 216 [ 26] imported_unit 217 import (GNU_ref_alt) [ b] 218 [ 2b] subprogram 219 external (flag_present) 220 name (strp) "call_foo" 221 decl_file (data1) 1 222 decl_line (data1) 3 223 prototyped (flag_present) 224 type (GNU_ref_alt) [ 3e] 225 low_pc (addr) +0x0000000000000670 <call_foo> 226 high_pc (udata) 23 (+0x0000000000000687) 227 frame_base (exprloc) 228 [ 0] call_frame_cfa 229 GNU_all_call_sites (flag_present) 230 [ 41] formal_parameter 231 name (string) "fb" 232 decl_file (data1) 1 233 decl_line (data1) 3 234 type (GNU_ref_alt) [ 76] 235 location (exprloc) 236 [ 0] fbreg -24 237 EOF 238 239 # Same as above, but find alt debug file in a .dwz subdir. 240 mkdir .dwz 241 mv testfile_multi.dwz .dwz 242 testrun_compare ${abs_top_builddir}/src/readelf --debug-dump=info libtestfile_multi_shared.so <<\EOF 243 244 DWARF section [25] '.debug_info' at offset 0x106c: 245 [Offset] 246 Compilation unit at offset 0: 247 Version: 4, Abbreviation section offset: 0, Address size: 8, Offset size: 4 248 [ b] compile_unit 249 producer (strp) "GNU C 4.7.0 20120507 (Red Hat 4.7.0-5) -fpreprocessed -mtune=generic -march=x86-64 -g -fPIC" 250 language (data1) C89 (1) 251 name (strp) "shared.c" 252 comp_dir (GNU_strp_alt) "/home/mark/src/tests/dwz" 253 low_pc (addr) +0x0000000000000670 <call_foo> 254 high_pc (udata) 23 (+0x0000000000000687) 255 stmt_list (sec_offset) 0 256 [ 26] imported_unit 257 import (GNU_ref_alt) [ b] 258 [ 2b] subprogram 259 external (flag_present) 260 name (strp) "call_foo" 261 decl_file (data1) 1 262 decl_line (data1) 3 263 prototyped (flag_present) 264 type (GNU_ref_alt) [ 3e] 265 low_pc (addr) +0x0000000000000670 <call_foo> 266 high_pc (udata) 23 (+0x0000000000000687) 267 frame_base (exprloc) 268 [ 0] call_frame_cfa 269 GNU_all_call_sites (flag_present) 270 [ 41] formal_parameter 271 name (string) "fb" 272 decl_file (data1) 1 273 decl_line (data1) 3 274 type (GNU_ref_alt) [ 76] 275 location (exprloc) 276 [ 0] fbreg -24 277 EOF 278 mv .dwz/testfile_multi.dwz . 279 rmdir .dwz 280 281 testrun_compare ${abs_top_builddir}/src/readelf --debug-dump=info testfile-dwzstr <<\EOF 282 283 DWARF section [28] '.debug_info' at offset 0x1088: 284 [Offset] 285 Compilation unit at offset 0: 286 Version: 4, Abbreviation section offset: 0, Address size: 8, Offset size: 4 287 [ b] compile_unit 288 producer (GNU_strp_alt) "GNU C 4.7.2 20121109 (Red Hat 4.7.2-8) -mtune=generic -march=x86-64 -g" 289 language (data1) C89 (1) 290 name (GNU_strp_alt) "main.c" 291 comp_dir (GNU_strp_alt) "/home/mark/src/tests" 292 low_pc (addr) 0x00000000004004ec <main> 293 high_pc (udata) 18 (0x00000000004004fe) 294 stmt_list (sec_offset) 0 295 [ 26] imported_unit 296 import (GNU_ref_alt) [ b] 297 [ 2b] subprogram 298 external (flag_present) 299 name (GNU_strp_alt) "main" 300 decl_file (data1) 1 301 decl_line (data1) 8 302 prototyped (flag_present) 303 type (GNU_ref_alt) [ 30] 304 low_pc (addr) 0x00000000004004ec <main> 305 high_pc (udata) 18 (0x00000000004004fe) 306 frame_base (exprloc) 307 [ 0] call_frame_cfa 308 GNU_all_call_sites (flag_present) 309 [ 41] formal_parameter 310 name (GNU_strp_alt) "argc" 311 decl_file (data1) 1 312 decl_line (data1) 8 313 type (GNU_ref_alt) [ 30] 314 location (exprloc) 315 [ 0] fbreg -36 316 [ 4f] formal_parameter 317 name (GNU_strp_alt) "argv" 318 decl_file (data1) 1 319 decl_line (data1) 8 320 type (GNU_ref_alt) [ 41] 321 location (exprloc) 322 [ 0] fbreg -48 323 [ 5d] variable 324 name (string) "fbb" 325 decl_file (data1) 1 326 decl_line (data1) 10 327 type (GNU_ref_alt) [ 14] 328 location (exprloc) 329 [ 0] fbreg -32 330 EOF 331 332 exit 0 333