android - 初始化超过 12 个字节的结构得到 SIGILL
问题描述
我正在尝试在以下模拟器上运行交叉编译的可执行文件
system-images;android-21;google_apis;armeabi-v7a
我有以下Makefile
NDK=/usr/local/android-sdk/ndk/21.0.6113669/toolchains/llvm/prebuilt/linux-x86_64
bam: bam.c
$(NDK)/bin/clang --target=armv7-none-linux-androideabi21 \
--gcc-toolchain=$(NDK) --sysroot=$(NDK)/sysroot \
-g -DANDROID -march=armv7-a -mthumb -std=gnu99 -o bam.o -c bam.c
$(NDK)/bin/clang --target=armv7-none-linux-androideabi21 \
--gcc-toolchain=$(NDK) --sysroot=$(NDK)/sysroot \
-g -DANDROID -march=armv7-a -mthumb bam.o -o bam
adb push bam /cache/bam
adb shell "/cache/bam && echo Passed"
以下bam.c在初始化时崩溃bar
。
#include <stdio.h>
#include <stdint.h>
struct foo {
int a;
int b;
int c;
char d;
};
int main ( int argc, char *argv[] ) {
struct foo bar = {15,7};
if (bar.a != 0) printf("Happy\n");
return 0;
}
通过以下方式
$ make bam
/usr/local/android-sdk/ndk-cur/toolchains/llvm/prebuilt/linux-x86_64/bin/clang \
--target=armv7-none-linux-androideabi21 \
--gcc-toolchain=/usr/local/android-sdk/ndk-cur/toolchains/llvm/prebuilt/linux-x86_64 \
--sysroot=/usr/local/android-sdk/ndk-cur/toolchains/llvm/prebuilt/linux-x86_64/sysroot \
-g -DANDROID -march=armv7-a -mthumb -std=gnu99 -o bam.o -c bam.c
/usr/local/android-sdk/ndk-cur/toolchains/llvm/prebuilt/linux-x86_64/bin/clang \
--target=armv7-none-linux-androideabi21 \
--gcc-toolchain=/usr/local/android-sdk/ndk-cur/toolchains/llvm/prebuilt/linux-x86_64 \
--sysroot=/usr/local/android-sdk/ndk-cur/toolchains/llvm/prebuilt/linux-x86_64/sysroot \
-g -DANDROID -march=armv7-a -mthumb bam.o -o bam
adb push bam /cache/bam
bam: 1 file pushed. 0.2 MB/s (7788 bytes in 0.043s)
adb shell "/cache/bam && echo Passed"
Illegal instruction
当我删除最后一个字符字段时,bam.c看起来像这样
#include <stdio.h>
#include <stdint.h>
struct foo {
int a;
int b;
int c;
//char d;
};
int main ( int argc, char *argv[] ) {
struct foo bar = {15,7};
if (bar.a != 0) printf("Happy\n");
return 0;
}
它的行为符合预期。
make bam
/usr/local/android-sdk/ndk/21.0.6113669/toolchains/llvm/prebuilt/linux-x86_64/bin/clang --target=armv7-none-linux-androideabi21 \
--gcc-toolchain=/usr/local/android-sdk/ndk/21.0.6113669/toolchains/llvm/prebuilt/linux-x86_64 --sysroot=/usr/local/android-sdk/ndk/21.0.6113669/toolchains/llvm/prebuilt/linux-x86_64/sysroot \
-g -DANDROID -march=armv7-a -mthumb -std=gnu99 -o bam.o -c bam.c
/usr/local/android-sdk/ndk/21.0.6113669/toolchains/llvm/prebuilt/linux-x86_64/bin/clang --target=armv7-none-linux-androideabi21 \
--gcc-toolchain=/usr/local/android-sdk/ndk/21.0.6113669/toolchains/llvm/prebuilt/linux-x86_64 --sysroot=/usr/local/android-sdk/ndk/21.0.6113669/toolchains/llvm/prebuilt/linux-x86_64/sysroot \
-g -DANDROID -march=armv7-a -mthumb bam.o -o bam
adb push bam /cache/bam
bam: 1 file pushed. 0.7 MB/s (7756 bytes in 0.011s)
adb shell "/cache/bam && echo Passed"
Happy
Passed
初始化结构>我在这里缺少的某个大小是什么?万一这很重要,我正在继续
$ uname -a
Linux kdev 4.15.0-72-generic #81-Ubuntu SMP Tue Nov 26 12:20:02 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
作为记录,这是我在静态链接到 icui18n 并尝试启动正则表达式时遇到的问题的重现。
解决方案
我有同样的问题,我通过使用旧版本的 NDK 解决了,在我的例子中是 r20b。 https://developer.android.com/ndk/downloads/older_releases
推荐阅读
- vue.js - 探索性 Vue.js 示例所需的存储空间
- javascript - 更新卡片类别时按钮不起作用
- c# - Prism导航返回页面后打破页面绑定
- c - 我用什么代码来询问数量和付款?
- apache-spark - Spark - 读取和写入相同的 S3 位置
- mysql - 如何在 MySQL 中回滚到 django 默认创建的事务?
- java - 将超类方法返回的超类实例转换为子类实例
- php - 数据库播种 laravel 创建 50 个用户并为每个用户附加一个关系
- vhdl - Shift left register with load and enable signals
- apl - APL 中的重复函数应用