首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将超过12个字节的结构初始化为SIGILL

将超过12个字节的结构初始化为SIGILL
EN

Stack Overflow用户
提问于 2020-02-06 16:03:54
回答 1查看 53关注 0票数 0

我试图在下面的仿真器上运行交叉编译的可执行文件

system-images;android-21;google_apis;armeabi-v7a

我有下面的Makefile

代码语言:javascript
复制
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初始化时崩溃。

代码语言:javascript
复制
#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;
}

以下列方式

代码语言:javascript
复制
$ 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

当我删除最后一个char字段时,bam.c看起来如下所示

代码语言:javascript
复制
#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;
}

它的行为和预期的一样。

代码语言:javascript
复制
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并试图启动regex时遇到的一个问题的再现。

EN

回答 1

Stack Overflow用户

发布于 2020-04-28 08:37:40

我也遇到了同样的问题,在我的例子中,我使用了NDK,r20b的旧版本来解决问题。https://developer.android.com/ndk/downloads/older_releases

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60099118

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档