Инициализация структур более 12 байтов получает SIGILL - PullRequest
0 голосов
/ 06 февраля 2020

Я пытаюсь запустить кросс-скомпилированный исполняемый файл на следующем эмуляторе

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

Что такое инициализация структур> a определенный размер, который мне здесь не хватает? В случае, если это имеет значение, я опираюсь на

$ 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 и пытаюсь запустить до регулярного выражения.

1 Ответ

0 голосов
/ 28 апреля 2020

У меня была та же проблема, которую я решил, используя более старую версию NDK, в моем случае r20b. https://developer.android.com/ndk/downloads/older_releases

...