【问题标题】:"sh: ./<file> not found" error when trying to execute a file尝试执行文件时出现“sh: ./<file> not found”错误
【发布时间】:2014-08-27 17:18:54
【问题描述】:

我遇到了一个我遇到过的最奇怪的问题。我正在为带有板载 Linux 的 ARM CPU 交叉编译一个应用程序。我正在使用 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 比较了可执行文件,但没有发现太多差异。我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 ")")

【问题讨论】:

标签: c++ linux arm sh buildroot


【解决方案1】:

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

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

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

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

【讨论】:

  • 是的,-static 选项成功了!非常感谢!只是好奇-如果您知道,请告诉我:应该在那里链接什么库,以及为什么在我静态链接之前该文件被视为脚本?系统没有看到文件中的“ELF”签名吗?
  • @YagamyLight:问题不在于库,而在于动态链接器,即加载动态可执行文件的程序。在 Linux 中,它通常是 /lib/ld-linux*。你可以看到 objdump -s -j /bin/ls 是什么,/bin/ls 是一个可以工作的动态可执行文件。
  • @YagamyLight:该文件被视为脚本,因为 sh 对其第一个参数所做的事情:将其视为脚本。要将其视为命令(也可能是程序),请使用sh -c ./hw。但是,你可以简单地写./hw
  • 但我还是不明白:sh 调用的是动态加载器,对吧?如何将它静态链接到文件中,如果在这种情况下为了加载文件,我们需要链接器,但链接器在文件中,因此无法加载文件。
  • @YagamyLight:不,程序有动态链接器的 name,由--dynamic-linker 链接器选项设置。真正的动态链接器位于系统中的一个文件中。而sh不调用动态加载器,它调用内核给exec()程序,内核看到它是一个ELF文件(签名),检查它是否有解释器(解释器几乎总是动态加载器(如果存在),如果存在则运行解释器。如果您的程序引用的动态链接器不存在,您将收到file not found 错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-27
  • 1970-01-01
  • 2021-07-27
相关资源
最近更新 更多