Dalvik Segfault на встроенном Linux
Все. Я пытаюсь запустить dalvikVM на встроенном Linux. Я использую xilinx-linux для zynq-zc702, работающего на qemu. Я следовал этому уроку:
http://www.bolatdinc.com/?p=336&cpage=1
Я портировал ashmem и logger в свое ядро Linux и скомпилировал dalvik для архитектуры armv7-a. Но когда я запускаю /system/bin/dalvikvm, я получаю segfault со следующей строкой:
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
Что странно, даже если я прокомментирую все строки в функции main (...) dalvik/dalvikvm/Main.cpp, кроме return 0; Я все еще получаю этот сегмент.
writev(3, [{"\7", 1}, {"libc\0", 5}, {"Fatal signal 11 (SIGSEGV) at 0x0"..., 49}], 3) = 55
Кажется, это какая-то проблема с libc / bionic, но я до сих пор не знаю, как ее решить.
Если я создаю очень простое приложение helloworld и Android.mk для него, собираю helloworld как часть дерева Android, я получаю тот же segfault. Если я создаю helloworld с помощью набора инструментов arm-xilinx-linux-gnueabi-, он работает нормально. Я верю, что это связано с glibc, а не с бионикой.
Я не очень хорош в разборке вещей, поэтому я приложил выходные данные objdump -d для работы helloworld и segfaulting.
За работой:
../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}
С 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
Любая помощь или идеи приветствуются. Спасибо
2 ответа
В конце концов мне удалось решить эту проблему, выбрав исходные коды и зависимости dalvik из дерева сборки Android и создав собственный набор make-файлов вместо Android.mk. В моих файлах Makefile я использовал связывание с libc из моего набора инструментов arm-xilinx-linux-gnueabi- вместо бионического. В этом случае все работает отлично
По твоему следу трудно сказать, где это действительно не удалось. Вы используете Android или пытаетесь использовать dalvik в конфигурации без Android? Возможно, будет проще использовать встроенную конфигурацию Android, чем пытаться портировать Dalvik на дистрибутив Linux, не основанный на бионике.
Компоненты системы Android, такие как Dalvik, используют довольно много дополнительных компонентов ядра, поэтому, возможно, некоторые из них вам все еще не хватает.
Я включаю следующее в конфигурации ядра и могу запустить 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