Я столкнулся с самой странной проблемой, которую я когда-либо встречал. Я кросс-компилирую приложение для процессора ARM с Linux на борту. Я использую buildroot, и все идет хорошо, пока я не пытаюсь запустить приложение на цели: я получаю -sh: ./hw: not found
. Например.:
$ cat /tmp/test.cpp
#include <cstdio>
#include <vector>
int main(int argc, char** argv){
printf("Hello Kitty!\n");
return 0;
}
$ ./arm-linux-g++ -march=armv7-a /tmp/test.cpp -o /tftpboot/hw
загрузить исполняемый файл в цель; затем выдача на цель:
# ./hw
-sh: ./hw: Permission denied
# chmod +x ./hw
# ./hw
-sh: ./hw: not found
# ls -l ./hw
-rwxr-xr-x 1 root root 6103 Jan 1 03:40 ./hw
Это еще не все: после сборки с помощью компилятора дистрибутива, такого как arm-linux-gnueabi-g++ -march=armv7-a /tmp/test.cpp -o /tftpboot/hw
, приложение работает нормально!
Я сравнивал исполняемые файлы через readelf -a -W /tftpboot/hw
, но особой разницы не заметил. Я вставил сюда оба вывода. Единственное, что я заметил, это строки Version5 EABI, soft-float ABI
vs Version5 EABI
. Я попытался удалить разницу, передав -mfloat-abi=softfp
и -mfloat-abi=soft
, но компилятор, похоже, игнорирует ее. Я полагаю, однако, что это не имеет большого значения, так как компилятор даже не предупреждает.
Я также подумал, что, возможно, sh выводит эту ошибку, если исполняемый файл каким-то образом несовместим. Но на моем хост-компьютере я вижу другую ошибку в этом случае, например:
$ sh /tftpboot/hw
/tftpboot/hw: 1: /tftpboot/hw: Syntax error: word unexpected (expecting ")")