SIGBUS in elfutils
Hi,
I'm seeing a SIGBUS in elfutils, and I'm not sure why I'm getting
this.
LD_LIBRARY_PATH=libdw:libelf:backends/ gdb ./src/readelf
[...]
(gdb) set args -n tests/testfile67
(gdb) run
Starting program: /home/kroeckx/elfutils-0.156/src/readelf -n tests/testfile67
Note segment of 1044 bytes at offset 0xe8:
Owner Data size Type
CORE 336 PRSTATUS
info.si_signo: 4, info.si_code: 0, info.si_errno: 0, cursig: 4
sigpend: <>
sighold: <>
pid: 805, ppid: 804, pgrp: 804, sid: 699
utime: 0.000042, stime: 0.000103, cutime: 0.000000, cstime: 0.000000
orig_r2: 2571552016, fpvalid: 1
pswm: 0x0705c00180000000 pswa: 0x00000000800000d6
r0: 4393751543808 r1: 4398002544388
r2: 11 r3: 2571578208
r4: 2571702016 r5: 4398003235624
r6: 2571580768 r7: 2571702016
r8: 2571578208 r9: 2571552016
r10: 2571552016 r11: 0
r12: 4398003499008 r13: 2148274656
r14: 0 r15: 4398040761216
a0: 0x000003ff a1: 0xfd54a6f0 a2: 0x00000000 a3: 0x00000000
a4: 0x00000000 a5: 0x00000000 a6: 0x00000000 a7: 0x00000000
a8: 0x00000000 a9: 0x00000000 a10: 0x00000000 a11: 0x00000000
a12: 0x00000000 a13: 0x00000000 a14: 0x00000000 a15: 0x00000000
CORE 136 PRPSINFO
state: 0, sname: R, zomb: 0, nice: 0, flag: 0x0000000000400400
uid: 0, gid: 0, pid: 805, ppid: 804, pgrp: 804, sid: 699
fname: 1, psargs: ./1
CORE 304 AUXV
Program received signal SIGBUS, Bus error.
0xf7f673f4 in gelf_getauxv (data=data@entry=0x4c8f8, ndx=ndx@entry=0, dst=dst@entry=0xffffd070) at gelf_getauxv.c:100
100 *dst = ((GElf_auxv_t *) data_scn->d.d_buf)[ndx];
(gdb) p ((GElf_auxv_t *) data_scn->d.d_buf)
$1 = (GElf_auxv_t *) 0xf7d182fc
(gdb) disass
Dump of assembler code for function gelf_getauxv:
0xf7f673a0 <+0>: save %sp, -96, %sp
0xf7f673a4 <+4>: mov %i0, %g1
0xf7f673a8 <+8>: cmp %g1, 0
0xf7f673ac <+12>: be,pn %icc, 0xf7f6744c <gelf_getauxv+172>
0xf7f673b0 <+16>: clr %i0
0xf7f673b4 <+20>: ld [ %g1 + 4 ], %g2
0xf7f673b8 <+24>: cmp %g2, 0x18
0xf7f673bc <+28>: bne,pn %icc, 0xf7f67444 <gelf_getauxv+164>
0xf7f673c0 <+32>: inc %i1
0xf7f673c4 <+36>: ld [ %g1 + 0x20 ], %g2
0xf7f673c8 <+40>: ld [ %g2 + 0x6c ], %g2
0xf7f673cc <+44>: ld [ %g2 + 0x14 ], %g2
0xf7f673d0 <+48>: cmp %g2, 1
0xf7f673d4 <+52>: be,pn %icc, 0xf7f6740c <gelf_getauxv+108>
0xf7f673d8 <+56>: ld [ %g1 + 0xc ], %g2
0xf7f673dc <+60>: sll %i1, 4, %i1
0xf7f673e0 <+64>: cmp %i1, %g2
0xf7f673e4 <+68>: bgu,pn %icc, 0xf7f67458 <gelf_getauxv+184>
0xf7f673e8 <+72>: mov 0x15, %o0
0xf7f673ec <+76>: ld [ %g1 ], %g1
0xf7f673f0 <+80>: add %g1, %i1, %i1
=> 0xf7f673f4 <+84>: ldd [ %i1 + -16 ], %g2
0xf7f673f8 <+88>: std %g2, [ %i2 ]
0xf7f673fc <+92>: ldd [ %i1 + -8 ], %g2
0xf7f67400 <+96>: std %g2, [ %i2 + 8 ]
0xf7f67404 <+100>: rett %i7 + 8
0xf7f67408 <+104>: mov %o2, %o0
0xf7f6740c <+108>: sll %i1, 3, %i1
0xf7f67410 <+112>: cmp %i1, %g2
0xf7f67414 <+116>: bgu,pn %icc, 0xf7f67454 <gelf_getauxv+180>
0xf7f67418 <+120>: add %i1, -8, %i1
0xf7f6741c <+124>: ld [ %g1 ], %g1
0xf7f67420 <+128>: ld [ %g1 + %i1 ], %g2
0xf7f67424 <+132>: add %g1, %i1, %i1
0xf7f67428 <+136>: clr [ %i2 ]
0xf7f6742c <+140>: st %g2, [ %i2 + 4 ]
0xf7f67430 <+144>: ld [ %i1 + 4 ], %g1
0xf7f67434 <+148>: clr [ %i2 + 8 ]
0xf7f67438 <+152>: st %g1, [ %i2 + 0xc ]
0xf7f6743c <+156>: rett %i7 + 8
0xf7f67440 <+160>: mov %o2, %o0
0xf7f67444 <+164>: call 0xf7f56940 <__libelf_seterrno>
0xf7f67448 <+168>: mov 4, %o0
0xf7f6744c <+172>: rett %i7 + 8
0xf7f67450 <+176>: nop
0xf7f67454 <+180>: mov 0x15, %o0 ! 0x15
0xf7f67458 <+184>: call 0xf7f56940 <__libelf_seterrno>
0xf7f6745c <+188>: clr %i0
0xf7f67460 <+192>: rett %i7 + 8
0xf7f67464 <+196>: nop
End of assembler dump.
(gdb) info reg
g0 0x0 0
g1 0xf7d182fc -137264388
g2 0x130 304
g3 0x3dfd9c 4062620
g4 0xf871cd58 -126759592
g5 0x8 8
g6 0x5554494c 1431587148
g7 0xf7ff26d0 -134273328
o0 0x15 21
o1 0x354 852
o2 0x111f8 70136
o3 0x0 0
o4 0xf7ffbcc0 -134234944
o5 0x4a644 304708
sp 0xffffcf38 0xffffcf38
o7 0xf7fe1e0c -134341108
l0 0x0 0
l1 0x2fc 764
l2 0xffffcf28 -12504
l3 0xf7f109f8 -135198216
l4 0x0 0
l5 0xf7ffbf40 -134234304
l6 0x0 0
l7 0xf7f7c000 -134758400
i0 0x0 0
i1 0xf7d1830c -137264372
i2 0xffffd070 -12176
i3 0x1 1
i4 0x18 24
i5 0x4c068 311400
fp 0xffffcf98 0xffffcf98
i7 0x28474 164980
y 0x0 0
psr 0xff990082 [ #1 S #16 #19 #20 #23 #24 #25 #26 #27 #28 #29 #30 #31 ]
wim *value not available*
tbr *value not available*
pc 0xf7f673f4 0xf7f673f4 <gelf_getauxv+84>
npc 0xf7f673f8 0xf7f673f8 <gelf_getauxv+88>
fsr 0x0 [ ]
csr *value not available*
(gdb) bt
#0 0xf7f673f4 in gelf_getauxv (data=data@entry=0x4c8f8, ndx=ndx@entry=0, dst=dst@entry=0xffffd070) at gelf_getauxv.c:100
#1 0x0002847c in handle_auxv_note (desc_pos=<optimized out>, descsz=<optimized out>, core=<optimized out>, ebl=0x4c298) at readelf.c:8613
#2 handle_notes_data (ebl=ebl@entry=0x4c298, start=<optimized out>, data=<optimized out>, ehdr=<optimized out>) at readelf.c:8743
#3 0x000298ec in handle_notes (ehdr=0xffffd3b8, ebl=0x4c298) at readelf.c:8812
#4 process_elf_file (dwflmod=<optimized out>, fd=<optimized out>) at readelf.c:884
#5 0x0002b9a0 in process_dwflmod (dwflmod=<optimized out>, userdata=0x4c158, name=0x4c268 "tests/testfile67", base=2147483648, arg=0xffffd5b0) at readelf.c:690
#6 0xf7fa075c in dwfl_getmodules (dwfl=dwfl@entry=0x4c018, callback=callback@entry=0x2b940 <process_dwflmod>, arg=arg@entry=0xffffd5b0, offset=offset@entry=0) at dwfl_getmodules.c:82
#7 0x00017788 in process_file (fd=7, fname=0xffffd8a1 "tests/testfile67", only_one=true) at readelf.c:775
#8 0x00012818 in main (argc=3, argv=0xffffd764) at readelf.c:295
dst is a stack allocated GElf_auxv_t. I can't see anything obvious
wrong with the code, and it works on all other arches.
Is there some requirement from alligned access?
Kurt
Reply to: