/system/bin/linker 中的段错误,为 Android 编译的二进制文件

Segfault in /system/bin/linker with binary compiled for Android

我正在尝试构建 Kona for Android and have been running into some issues. The patches I made to Kona are available 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 window:

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 段错误。

https://github.com/tavmem/konaStk

有单独的 Kona 版本

它提供有关 Kona 执行过程的堆栈报告,打印出有关 Kona 可执行文件执行的几乎每个步骤的大量详细信息。

我将它用作调试工具,and/or 向 Kona 添加新功能。它可能有助于显示发生停止和分段错误的位置。

如果您先在 Linux 环境中试用(感受一下),然后在 Android 环境中试用,可能会更容易使用。

想通了!是铿锵声!出于某种原因,它导致了段错误。我仍然不知道为什么...但是问题仍然基本解决了。