我正在尝试为Android构建Kona并且遇到了一些问题。我向Kona制作的补丁可用here。
首先,我试图避免使用ndk-build
,因此编辑了makefile以支持Android。其中的细节对这个问题(或有趣)并不特别有用,所以我会跳过它们。
基本上,源文件的编译方式如下:
arm-linux-androideabi-clang -g -fpic -ffunction-sections -funwind-tables -fstack-protector -no-canonical-prefixes -mtune=xscale -msoft-float -mthumb -fomit-frame-pointer -fno-strict-aliasing -O3 -c -o src/ks.o src/ks.c
...
arm-linux-androideabi-clang -g -fpic -ffunction-sections -funwind-tables -fstack-protector -no-canonical-prefixes -mtune=xscale -msoft-float -mthumb -fomit-frame-pointer -fno-strict-aliasing -O3 src/0.o src/c.o src/getline.o src/getline_android.o src/mt.o src/p.o src/r.o src/k.o src/kc.o src/kx.o src/kg.o src/km.o src/kn.o src/ko.o src/ks.o src/v.o src/va.o src/vc.o src/vd.o src/vf.o src/vg.o src/vq.o src/main.o -o k -Wl,--gc-sections -Wl,-z,nocopyreloc -lgcc -no-canonical-prefixes -Wl,--no-undefined -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now -mthumb -lc -lm -ldl
我根据我看到ndk-build
使用的内容来设置这些标志。然后我运行了以下内容:
ryan@DevPC-LX:~/stuff/kdroid$ adb remount
remount succeeded
ryan@DevPC-LX:~/stuff/kdroid$ adb push ./k /system/bin/k
3201 KB/s (724928 bytes in 0.221s)
ryan@DevPC-LX:~/stuff/kdroid$
现在,尝试运行二进制文件只是段错误:
ryan@DevPC-LX:~/stuff/kdroid$ adb shell
# k
[1] + Stopped (signal) k
#
[1] Segmentation fault k
#
这个是开始变得怪异的地方。如果我尝试使用gdb,我会得到这个:
ryan@DevPC-LX:~/stuff/kdroid$ adb shell
# gdbserver :5039 /system/bin/k
Process /system/bin/k created; pid = 297
Listening on port 5039
在另一个shell窗口中:
ryan@DevPC-LX:~/stuff/kdroid$ arm-linux-androideabi-gdb
GNU gdb (GDB) 7.6
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "--host=x86_64-linux-gnu --target=arm-linux-android".
For bug reporting instructions, please see:
<http://source.android.com/source/report-bugs.html>.
/home/ryan/.gdbinit:1: Error in sourced command file:
No symbol table is loaded. Use the "file" command.
(gdb) symbol-file k
Reading symbols from /media/ryan/stuff/kdroid/k...done.
(gdb) target remote :5039
Remote debugging using :5039
0xb0001000 in ?? ()
(gdb) continue
Continuing.
Cannot access memory at address 0x0
Program received signal SIGSEGV, Segmentation fault.
0xb0004d36 in ?? ()
(gdb) bt
#0 0xb0004d36 in ?? ()
#1 0xb0005278 in ?? ()
#2 0xb0005278 in ?? ()
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
(gdb)
ndk-stack给了我这个:
********** Crash dump: **********
Build fingerprint: 'generic/sdk/generic:2.3.3/GRI34/101070:eng/test-keys'
pid: 297, tid: 297 >>> /system/bin/k <<<
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0003cabc
Stack frame #00 pc b0004d36 /system/bin/linker: Unable to open symbol file k/linker. Error (20): Not a directory
所以......链接器似乎崩溃了。如果我将/system/bin/linker
拉入当前目录,那么我得到了这个:
********** Crash dump: **********
Build fingerprint: 'generic/sdk/generic:2.3.3/GRI34/101070:eng/test-keys'
pid: 291, tid: 291 >>> k <<<
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0003cabc
Stack frame #00 pc b0004d36 /system/bin/linker: Routine BFD: ./linker: warning: sh_link not set for section `.ARM.exidx'
??
??:0
Crash dump is completed
所有非常令人困惑。
我绝对没有线索到目前为止可能出现的问题。我的意思是,我觉得我的编译器命令有问题,但我不知道是什么。
编辑:我的编译器命令肯定是错误。如果我构建这个程序:
int main() { return 0; }
使用ndk-build
并使用我之前发布的命令行标记,构建的版本没有ndk-build
段错误。
答案 0 :(得分:1)
想出来!是Clang!出于某种原因,它导致了段错误。我仍然不知道为什么......但问题仍然基本解决了。
答案 1 :(得分:0)
https://github.com/tavmem/konaStk
有一个单独版本的Kona它提供有关Kona执行过程的堆栈报告,打印出大量有关Kona可执行文件所做的每一步的详细信息。
我将它用作调试和/或向Kona添加新功能的工具。它可能有助于显示Stop和Segmentation Fault发生的位置。
如果你先在Linux环境中试用它(感受它),可能会更容易使用,然后在Android环境中试用它。