& quot; sh: ./<file> не найден & quot; ошибка при попытке выполнить файл

Я столкнулся с самой странной проблемой, которую я когда-либо встречал. Я кросс-компилирую приложение для процессора 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 против Version5 EABI, Я попытался удалить разницу, передавая любой из -mfloat-abi=softfp а также -mfloat-abi=soft, но компилятор, кажется, игнорирует это. Полагаю, это не имеет значения, так как компилятор даже не предупреждает.

Я тоже подумала, наверное ш выводит эту ошибку, если исполняемый файл каким-либо образом несовместим. Но на моем хост-компьютере в этом случае я вижу другую ошибку, например:

$ sh /tftpboot/hw
/tftpboot/hw: 1: /tftpboot/hw: Syntax error: word unexpected (expecting ")")

6

Решение

sh печатает эту странную ошибку, потому что она пытается запустить вашу программу как сценарий оболочки!

Ваша ошибка ./hw: not found вероятно, вызван тем, что динамический компоновщик (AKA ELF интерпретатор) не найден. Попробуйте скомпилировать его как статическую программу с -static или запустить его с вашим динамическим загрузчиком: # /lib/ld-linux.so.2 ./hw или что-то типа того.

Если проблема в том, что динамический загрузчик называется по-разному в вашей цепочке инструментов и в вашей среде выполнения, вы можете это исправить:

  • В среде выполнения: с символической ссылкой.
  • В цепочке инструментов: используйте -Wl,--dynamic-linker=/lib/ld-linux.so.2
9

Другие решения


По вопросам рекламы [email protected]