尝试执行文件</file>时出现“sh:./ <file> not found”错误

时间:2014-07-07 09:13:02

标签: c++ linux arm sh buildroot

我遇到过一个我见过的最奇怪的问题。我正在为Linux上的Linux CPU交叉编译应用程序。我正在使用 buildroot ,一切顺利,直到我尝试在目标上运行应用程序:我得到-sh: ./hw: not found。 E.g:

$ 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比较了可执行文件,但没有发现太多的差异。我pasted both outputs here。我唯一注意到的是行Version5 EABI, soft-float ABIVersion5 EABI。我尝试通过传递-mfloat-abi=softfp-mfloat-abi=soft之一来消除差异,但编译器似乎忽略了它。我想,这并不重要,因为编译器甚至都没有警告过。

我还想过,如果可执行文件在某种程度上不兼容,那么 sh 可能会输出此错误。但在我的主机PC上,我发现在这种情况下会出现另一个错误,例如:

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

1 个答案:

答案 0 :(得分:9)

sh打印出这个奇怪的错误,因为它试图将您的程序作为 shell脚本运行

您的错误./hw: not found可能是由未找到动态链接器(AKA ELF解释器)引起的。尝试使用-static将其编译为静态程序,或使用动态加载程序运行它:# /lib/ld-linux.so.2 ./hw或类似的东西。

如果问题是动态加载程序在工具链和运行时环境中的命名方式不同,则可以修复它:

  • 在运行时环境中:使用符号链接。
  • 在工具链中:使用-Wl,--dynamic-linker=/lib/ld-linux.so.2