我正在尝试在以下模拟器上运行交叉编译的可执行文件
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


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!