dalvik segfault on embedded linux

1

all. I'm trying to get dalvikVM running on embedded linux. I use xilinx-linux for zynq-zc702 running on qemu. I followed this tutorial:

http://www.bolatdinc.com/?p=336&cpage=1

I ported ashmem and logger to my linux kernel and compiled dalvik for armv7-a architecture. But when I run /system/bin/dalvikvm I get segfault with folowing strace:

execve("/system/bin/dalvikvm", ["dalvikvm"], [/* 10 vars */]) = 0
set_tls(0xb0012c70, 0xb00144bc, 0xffffffd0, 0, 0) = 0
getpid()                                = 1210
getuid32()                              = 0
geteuid32()                             = 0
getgid32()                              = 0
getegid32()                             = 0
sigaction(SIGILL, {0xb0005b29, [], SA_RESTART|SA_SIGINFO}, NULL, 0) = 0
sigaction(SIGABRT, {0xb0005b29, [], SA_RESTART|SA_SIGINFO}, NULL, 0) = 0
sigaction(SIGBUS, {0xb0005b29, [], SA_RESTART|SA_SIGINFO}, NULL, 0) = 0
sigaction(SIGFPE, {0xb0005b29, [], SA_RESTART|SA_SIGINFO}, NULL, 0) = 0
sigaction(SIGSEGV, {0xb0005b29, [], SA_RESTART|SA_SIGINFO}, NULL, 0) = 0
sigaction(SIGSTKFLT, {0xb0005b29, [], SA_RESTART|SA_SIGINFO}, NULL, 0) = 0
sigaction(SIGPIPE, {0xb0005b29, [], SA_RESTART|SA_SIGINFO}, NULL, 0) = 0
stat64("/vendor/lib/libdvm.so", 0xbec3da20) = -1 ENOENT (No such file or directory)
stat64("/system/lib/libdvm.so", {st_mode=S_IFREG|0775, st_size=753884, ...}) = 0
open("/system/lib/libdvm.so", O_RDONLY|O_LARGEFILE) = 3
lseek(3, 0, SEEK_SET)                   = 0
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0\0\0\0\0004\0\0\0"..., 4096) = 4096
lseek(3, -8, SEEK_END)                  = 753876
read(3, "\1\0\0\0\0\0\0\0", 8)          = 8
mmap2(NULL, 765952, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb6e95000
mmap2(0xb6e95000, 719912, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0) = 0xb6e95000
mprotect(0xb6e95000, 720896, PROT_READ|PROT_WRITE|PROT_EXEC) = 0
mmap2(0xb6f45000, 31748, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0xb0) = 0xb6f45000
mmap2(0xb6f4d000, 8812, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb6f4d000
close(3)                                = 0
stat64("/vendor/lib/liblog.so", 0xbec3d778) = -1 ENOENT (No such file or directory)
stat64("/system/lib/liblog.so", {st_mode=S_IFREG|0775, st_size=13888, ...}) = 0
open("/system/lib/liblog.so", O_RDONLY|O_LARGEFILE) = 3
lseek(3, 0, SEEK_SET)                   = 0
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0\0\0\0\0004\0\0\0"..., 4096) = 4096
lseek(3, -8, SEEK_END)                  = 13880
read(3, "\1\0\0\0\0\0\0\0", 8)          = 8
mmap2(NULL, 16384, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb6e91000
mmap2(0xb6e91000, 10864, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0) = 0xb6e91000
mprotect(0xb6e91000, 12288, PROT_READ|PROT_WRITE|PROT_EXEC) = 0
mmap2(0xb6e94000, 412, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x3) = 0xb6e94000
close(3)                                = 0
stat64("/vendor/lib/libc.so", 0xbec3d4d0) = -1 ENOENT (No such file or directory)
stat64("/system/lib/libc.so", {st_mode=S_IFREG|0775, st_size=282212, ...}) = 0
open("/system/lib/libc.so", O_RDONLY|O_LARGEFILE) = 3
lseek(3, 0, SEEK_SET)                   = 0
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0\0\0\0\0004\0\0\0"..., 4096) = 4096
lseek(3, -8, SEEK_END)                  = 282204
read(3, "\1\0\0\0\0\0\0\0", 8)          = 8
mmap2(NULL, 327680, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb6e41000
mmap2(0xb6e41000, 270012, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0) = 0xb6e41000
mprotect(0xb6e41000, 270336, PROT_READ|PROT_WRITE|PROT_EXEC) = 0
mmap2(0xb6e83000, 10100, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x42) = 0xb6e83000
mmap2(0xb6e86000, 43772, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb6e86000
close(3)                                = 0
mprotect(0xb6e41000, 270336, PROT_READ|PROT_EXEC) = 0
--- SIGSEGV {si_signo=SIGSEGV, si_code=SEGV_MAPERR, si_addr=0xc} ---
open("/dev/log/main", O_WRONLY|O_LARGEFILE) = 3
writev(3, [{"\7", 1}, {"libc\0", 5}, {"Fatal signal 11 (SIGSEGV) at 0x0"..., 49}], 3) = 55
gettid()                                = 1210
socket(PF_FILE, SOCK_STREAM, 0)         = 4
connect(4, {sa_family=AF_FILE, sun_path=@"android:debuggerd"}, 20) = -1 ECONNREFUSED (Connection refused)
close(4)                                = 0
sigaction(SIGSEGV, {SIG_DFL, [], SA_RESTART}, {0xb0005b29, [], SA_RESTART|SA_SIGINFO}, 0) = 0
rt_sigreturn()                          = -61456
--- SIGSEGV {si_signo=SIGSEGV, si_code=SEGV_MAPERR, si_addr=0xc} ---
+++ killed by SIGSEGV +++
Segmentation fault

What is strange, that even if I comment all the lines in dalvik/dalvikvm/Main.cpp main(...) function except return 0; I still get this segfault.

writev(3, [{"\7", 1}, {"libc\0", 5}, {"Fatal signal 11 (SIGSEGV) at 0x0"..., 49}], 3) = 55

Seems to be some kind of libc/bionic issue, but I still don't know how to resolve it.

If I create very basic helloworld app and Android.mk for it, build helloworld as part of android tree I get the same segfault. If I build helloworld with arm-xilinx-linux-gnueabi- toolchain, it works fine. I believe that's because it is linked to glibc, not bionic.

I'm not quite good in disassembling stuff, so I attached objdump -d outputs for working helloworld and segfaulting one.

Working:

../testapp/main_stdlib:     file format elf32-littlearm


Disassembly of section .init:

0000836c <_init>:
    836c:   e92d4008    push    {r3, lr}
    8370:   eb00001d    bl  83ec <call_weak_fn>
    8374:   e8bd8008    pop {r3, pc}

Disassembly of section .plt:

00008378 <.plt>:
    8378:   e52de004    push    {lr}        ; (str lr, [sp, #-4]!)
    837c:   e59fe004    ldr lr, [pc, #4]    ; 8388 <_init+0x1c>
    8380:   e08fe00e    add lr, pc, lr
    8384:   e5bef008    ldr pc, [lr, #8]!
    8388:   00008388    .word   0x00008388
    838c:   e28fc600    add ip, pc, #0, 12
    8390:   e28cca08    add ip, ip, #8, 20  ; 0x8000
    8394:   e5bcf388    ldr pc, [ip, #904]! ; 0x388
    8398:   e28fc600    add ip, pc, #0, 12
    839c:   e28cca08    add ip, ip, #8, 20  ; 0x8000
    83a0:   e5bcf380    ldr pc, [ip, #896]! ; 0x380
    83a4:   e28fc600    add ip, pc, #0, 12
    83a8:   e28cca08    add ip, ip, #8, 20  ; 0x8000
    83ac:   e5bcf378    ldr pc, [ip, #888]! ; 0x378

Disassembly of section .text:

000083b0 <_start>:
    83b0:   e3a0b000    mov fp, #0
    83b4:   e3a0e000    mov lr, #0
    83b8:   e49d1004    pop {r1}        ; (ldr r1, [sp], #4)
    83bc:   e1a0200d    mov r2, sp
    83c0:   e52d2004    push    {r2}        ; (str r2, [sp, #-4]!)
    83c4:   e52d0004    push    {r0}        ; (str r0, [sp, #-4]!)
    83c8:   e59fc010    ldr ip, [pc, #16]   ; 83e0 <_start+0x30>
    83cc:   e52dc004    push    {ip}        ; (str ip, [sp, #-4]!)
    83d0:   e59f000c    ldr r0, [pc, #12]   ; 83e4 <_start+0x34>
    83d4:   e59f300c    ldr r3, [pc, #12]   ; 83e8 <_start+0x38>
    83d8:   ebffffeb    bl  838c <_init+0x20>
    83dc:   ebfffff0    bl  83a4 <_init+0x38>
    83e0:   0000857c    .word   0x0000857c
    83e4:   000084e4    .word   0x000084e4
    83e8:   00008518    .word   0x00008518

000083ec <call_weak_fn>:
    83ec:   e59f3014    ldr r3, [pc, #20]   ; 8408 <call_weak_fn+0x1c>
    83f0:   e59f2014    ldr r2, [pc, #20]   ; 840c <call_weak_fn+0x20>
    83f4:   e08f3003    add r3, pc, r3
    83f8:   e7932002    ldr r2, [r3, r2]
    83fc:   e3520000    cmp r2, #0
    8400:   012fff1e    bxeq    lr
    8404:   eaffffe3    b   8398 <_init+0x2c>
    8408:   00008314    .word   0x00008314
    840c:   00000018    .word   0x00000018

00008410 <deregister_tm_clones>:
    8410:   e92d4008    push    {r3, lr}
    8414:   e3000734    movw    r0, #1844   ; 0x734
    8418:   e59f3024    ldr r3, [pc, #36]   ; 8444 <deregister_tm_clones+0x34>
    841c:   e3400001    movt    r0, #1
    8420:   e0603003    rsb r3, r0, r3
    8424:   e3530006    cmp r3, #6
    8428:   98bd8008    popls   {r3, pc}
    842c:   e3003000    movw    r3, #0
    8430:   e3403000    movt    r3, #0
    8434:   e3530000    cmp r3, #0
    8438:   08bd8008    popeq   {r3, pc}
    843c:   e12fff33    blx r3
    8440:   e8bd8008    pop {r3, pc}
    8444:   00010737    .word   0x00010737

00008448 <register_tm_clones>:
    8448:   e92d4008    push    {r3, lr}
    844c:   e3000734    movw    r0, #1844   ; 0x734
    8450:   e3003734    movw    r3, #1844   ; 0x734
    8454:   e3400001    movt    r0, #1
    8458:   e3403001    movt    r3, #1
    845c:   e0603003    rsb r3, r0, r3
    8460:   e1a03143    asr r3, r3, #2
    8464:   e0833fa3    add r3, r3, r3, lsr #31
    8468:   e1b010c3    asrs    r1, r3, #1
    846c:   08bd8008    popeq   {r3, pc}
    8470:   e3002000    movw    r2, #0
    8474:   e3402000    movt    r2, #0
    8478:   e3520000    cmp r2, #0
    847c:   08bd8008    popeq   {r3, pc}
    8480:   e12fff32    blx r2
    8484:   e8bd8008    pop {r3, pc}

00008488 <__do_global_dtors_aux>:
    8488:   e92d4010    push    {r4, lr}
    848c:   e3004734    movw    r4, #1844   ; 0x734
    8490:   e3404001    movt    r4, #1
    8494:   e5d43000    ldrb    r3, [r4]
    8498:   e3530000    cmp r3, #0
    849c:   18bd8010    popne   {r4, pc}
    84a0:   ebffffda    bl  8410 <deregister_tm_clones>
    84a4:   e3a03001    mov r3, #1
    84a8:   e5c43000    strb    r3, [r4]
    84ac:   e8bd8010    pop {r4, pc}

000084b0 <frame_dummy>:
    84b0:   e300061c    movw    r0, #1564   ; 0x61c
    84b4:   e3400001    movt    r0, #1
    84b8:   e92d4008    push    {r3, lr}
    84bc:   e5903000    ldr r3, [r0]
    84c0:   e3530000    cmp r3, #0
    84c4:   0a000004    beq 84dc <frame_dummy+0x2c>
    84c8:   e3003000    movw    r3, #0
    84cc:   e3403000    movt    r3, #0
    84d0:   e3530000    cmp r3, #0
    84d4:   0a000000    beq 84dc <frame_dummy+0x2c>
    84d8:   e12fff33    blx r3
    84dc:   e8bd4008    pop {r3, lr}
    84e0:   eaffffd8    b   8448 <register_tm_clones>

000084e4 <main>:
    84e4:   e52db004    push    {fp}        ; (str fp, [sp, #-4]!)
    84e8:   e28db000    add fp, sp, #0
    84ec:   e24dd014    sub sp, sp, #20
    84f0:   e50b0010    str r0, [fp, #-16]
    84f4:   e50b1014    str r1, [fp, #-20]  ; 0xffffffec
    84f8:   e308358c    movw    r3, #34188  ; 0x858c
    84fc:   e3403000    movt    r3, #0
    8500:   e50b3008    str r3, [fp, #-8]
    8504:   e3a03000    mov r3, #0
    8508:   e1a00003    mov r0, r3
    850c:   e28bd000    add sp, fp, #0
    8510:   e8bd0800    ldmfd   sp!, {fp}
    8514:   e12fff1e    bx  lr

00008518 <__libc_csu_init>:
    8518:   e92d45f8    push    {r3, r4, r5, r6, r7, r8, sl, lr}
    851c:   e1a07000    mov r7, r0
    8520:   e59f504c    ldr r5, [pc, #76]   ; 8574 <__libc_csu_init+0x5c>
    8524:   e1a08001    mov r8, r1
    8528:   e59f6048    ldr r6, [pc, #72]   ; 8578 <__libc_csu_init+0x60>
    852c:   e1a0a002    mov sl, r2
    8530:   e08f5005    add r5, pc, r5
    8534:   ebffff8c    bl  836c <_init>
    8538:   e08f6006    add r6, pc, r6
    853c:   e0656006    rsb r6, r5, r6
    8540:   e1b06146    asrs    r6, r6, #2
    8544:   08bd85f8    popeq   {r3, r4, r5, r6, r7, r8, sl, pc}
    8548:   e2455004    sub r5, r5, #4
    854c:   e3a04000    mov r4, #0
    8550:   e5b53004    ldr r3, [r5, #4]!
    8554:   e1a00007    mov r0, r7
    8558:   e1a01008    mov r1, r8
    855c:   e1a0200a    mov r2, sl
    8560:   e2844001    add r4, r4, #1
    8564:   e12fff33    blx r3
    8568:   e1540006    cmp r4, r6
    856c:   1afffff7    bne 8550 <__libc_csu_init+0x38>
    8570:   e8bd85f8    pop {r3, r4, r5, r6, r7, r8, sl, pc}
    8574:   000080dc    .word   0x000080dc
    8578:   000080d8    .word   0x000080d8

0000857c <__libc_csu_fini>:
    857c:   e12fff1e    bx  lr

Disassembly of section .fini:

00008580 <_fini>:
    8580:   e92d4008    push    {r3, lr}
    8584:   e8bd8008    pop {r3, pc}

With segfault:

~/android/out/debug/target/product/generic/system/bin/dalvikvm:     file format elf32-littlearm


Disassembly of section .plt:

00008410 <.plt>:
    8410:   e52de004    .word   0xe52de004
    8414:   e59fe004    .word   0xe59fe004
    8418:   e08fe00e    .word   0xe08fe00e
    841c:   e5bef008    .word   0xe5bef008
    8420:   00000cc0    .word   0x00000cc0
    8424:   e28fc600    .word   0xe28fc600
    8428:   e28cca00    .word   0xe28cca00
    842c:   e5bcfcc0    .word   0xe5bcfcc0

Disassembly of section .text:

00008430 <__aeabi_llsr-0x30>:
    8430:   e1a0000d    .word   0xe1a0000d
    8434:   e3a01000    .word   0xe3a01000
    8438:   e28f2004    .word   0xe28f2004
    843c:   e28f3004    .word   0xe28f3004
    8440:   eafffff7    .word   0xeafffff7
    8444:   ea000014    .word   0xea000014
    8448:   00009000    .word   0x00009000
    844c:   00009008    .word   0x00009008
    8450:   00009010    .word   0x00009010
    8454:   00009018    .word   0x00009018
    8458:   e1a00000    .word   0xe1a00000
    845c:   e1a00000    .word   0xe1a00000

00008460 <__aeabi_llsr>:
    8460:   e2523020    subs    r3, r2, #32
    8464:   e262c020    rsb ip, r2, #32
    8468:   41a00230    lsrmi   r0, r0, r2
    846c:   51a00331    lsrpl   r0, r1, r3
    8470:   41800c11    orrmi   r0, r0, r1, lsl ip
    8474:   e1a01231    lsr r1, r1, r2
    8478:   e12fff1e    bx  lr

0000847c <__aeabi_llsl>:
    847c:   e2523020    subs    r3, r2, #32
    8480:   e262c020    rsb ip, r2, #32
    8484:   41a01211    lslmi   r1, r1, r2
    8488:   51a01310    lslpl   r1, r0, r3
    848c:   41811c30    orrmi   r1, r1, r0, lsr ip
    8490:   e1a00210    lsl r0, r0, r2
    8494:   e12fff1e    bx  lr
    8498:   47702000    ldrbmi  r2, [r0, -r0]!
    849c:   e51ff004    ldr pc, [pc, #-4]   ; 84a0 <__aeabi_llsl+0x24>
    84a0:   00008499    muleq   r0, r9, r4

Any help or ideas are appreciated. THanks

android
embedded-linux
dalvik
disassembly
bionic
asked on Stack Overflow Jun 4, 2013 by user2451629

2 Answers

0

It is hard to tell from your trace where it actually failed. Are you using Android or trying to use dalvik in a non-android configuration? It might be easier to use an embedded configuration of Android than to try to port Dalvik to a non-bionic-based Linux distribution.

Android system components such as Dalvik use quite a few additional kernel components, so it may be that you are still missing some of them.

I enable the following in the kernel configuration and I'm able to run dalvik:

#
# Android
#
CONFIG_ANDROID=y
CONFIG_ANDROID_BINDER_IPC=y
CONFIG_ASHMEM=y
CONFIG_ANDROID_LOGGER=y
CONFIG_ANDROID_TIMED_OUTPUT=y
# CONFIG_ANDROID_TIMED_GPIO is not set
CONFIG_ANDROID_LOW_MEMORY_KILLER=y
CONFIG_ANDROID_INTF_ALARM_DEV=y
answered on Stack Overflow May 23, 2014 by Jamey Hicks
0

Eventually I was able to resolve this by picking up dalvik sources and dependencies from Android build tree and creating my own set of makefiles instead of Android.mk. In my Makefiles I used linking with libc from my arm-xilinx-linux-gnueabi- toolchain instead of bionic. In this case everything runs perfectly

answered on Stack Overflow May 30, 2014 by user2451629

User contributions licensed under CC BY-SA 3.0