Получил недопустимую инструкцию при запуске простой программы hello world с использованием новейшего кросс-компилятора - PullRequest
0 голосов
/ 31 мая 2018

все.Я использовал новейший cross_compiler (установленный sudo apt install gcc-arm-linux-gnueabi в Ubuntu 18.04, версия 7.3), чтобы скомпилировать простую программу "hello world" c

#include <stdio.h>

int main()
{
    printf("Hello World!\r\n");
    return 0;
}

, использованную ниже для компиляциикод, я использовал статическую ссылку

arm-linux-gnueabi-gcc -o hello hello.c -static

Затем я сначала запустил его на своем Raspberry Pi0w, и он работал очень хорошо. После этого я запустил его на моей плате s3c2440, которая является ARM9 и очень старое ядро. Однако, он не работал правильно.

# ./hello
Illegal instruction

Я не знал, почему и как это решить. Затем я использовал кросс-компилятор версии 3.4.5, чтобы скомпилировать его снова, и на этот раз программа работала гладко.не может работать правильно на Raspberry Pi, после запуска программы ничего не произошло. "Hello World!"не появился.

Я использовал команду file для проверки этих двух программ (не знаю, помогают ли они или нет): программа, скомпилированная новейшим компилятором:

hello: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked, for GNU/Linux 3.2.0, BuildID[sha1]=6b0a4b6cb4bf672d4cf1fbd171ec62a96e622d69, not stripped

и по старому компилятору это:

hello_old: ELF 32-bit LSB executable, ARM, version 1 (ARM), statically linked, for GNU/Linux 2.4.3, with debug_info, not stripped

Самый новый arm-linux-gnueabi-gcc это

$ arm-linux-gnueabi-gcc -v
Using built-in specs.
COLLECT_GCC=arm-linux-gnueabi-gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc-cross/arm-linux-gnueabi/7/lto-wrapper
Target: arm-linux-gnueabi
Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 7.3.0-16ubuntu3' --with-bugurl=file:///usr/share/doc/gcc-7/README.Bugs --enable-languages=c,ada,c++,go,d,fortran,objc,obj-c++ --prefix=/usr --with-gcc-major-version-only --with-as=/usr/bin/arm-linux-gnueabi-as --with-ld=/usr/bin/arm-linux-gnueabi-ld --program-suffix=-7 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-libitm --disable-libquadmath --disable-libquadmath-support --enable-plugin --with-system-zlib --with-target-system-zlib --enable-multiarch --enable-multilib --disable-sjlj-exceptions --with-arch=armv5t --with-float=soft --disable-werror --enable-multilib --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=arm-linux-gnueabi --program-prefix=arm-linux-gnueabi- --includedir=/usr/arm-linux-gnueabi/include
Thread model: posix
gcc version 7.3.0 (Ubuntu/Linaro 7.3.0-16ubuntu3)

И старый кросс-компилятор, который я использовал, это

$ arm-gcc-old -v
Reading specs from /work/gcc-3.4.5-glibc-2.3.6/bin/../lib/gcc/arm-linux/3.4.5/specs
Configured with: /work/tools/create_crosstools/crosstool-0.43/build/arm-linux/gcc-3.4.5-glibc-2.3.6/gcc-3.4.5/configure --target=arm-linux --host=i686-host_pc-linux-gnu --prefix=/work/tools/gcc-3.4.5-glibc-2.3.6 --with-float=soft --with-headers=/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/include --with-local-prefix=/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux --disable-nls --enable-threads=posix --enable-symvers=gnu --enable-__cxa_atexit --enable-languages=c,c++ --enable-shared --enable-c99 --enable-long-long
Thread model: posix
gcc version 3.4.5

Что я должен сделать, чтобы правильно скомпилировать код с использованием новейшего компилятора?Ядро на s3c2440

# uname -a
Linux (none) 2.6.22.6 #1 Thu May 31 14:02:09 CST 2018 armv4tl unknown

И это ядро ​​было скомпилировано новейшим кросс-компилятором 7.3

Спасибо!

...