Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C ARM交叉编译:错误未找到此类文件或目录/命令_C_Linux_Gcc_Arm_Cross Compiling - Fatal编程技术网

C ARM交叉编译:错误未找到此类文件或目录/命令

C ARM交叉编译:错误未找到此类文件或目录/命令,c,linux,gcc,arm,cross-compiling,C,Linux,Gcc,Arm,Cross Compiling,我已经编写了简单的Hello world程序,并使用gcc arm linux gnueabi编译器编译了它。它编译得很好,但当我试图在ARM机器上执行它时,它抱怨“没有这样的文件或目录”。我认为,gcc-arm-linux-gnueabi只适用于嵌入式linux,因为它使用了e(mbedded)abi。它与ARM Linux ABI不同吗 请帮我解决这个问题 代码在这里 #include "stdio.h" int main(void) { printf("Hello world !\n

我已经编写了简单的Hello world程序,并使用
gcc arm linux gnueabi
编译器编译了它。它编译得很好,但当我试图在ARM机器上执行它时,它抱怨“没有这样的文件或目录”。我认为,
gcc-arm-linux-gnueabi
只适用于嵌入式linux,因为它使用了e(mbedded)abi。它与ARM Linux ABI不同吗

请帮我解决这个问题

代码在这里

#include "stdio.h"

int main(void) {
  printf("Hello world !\n");
  return 0;
}
编译为

armlinuxgnueabigcc-Wall-ocroscomphello.c

当我在目标ARM上执行这个crosscomp时,机器错误是crosscomp没有这样的文件或目录

编辑当我使用arm linux gnueabi gcc时,入口点与目标机器入口点(readelf-l crosscom)不匹配,但当我使用与目标机器匹配的AARC64 linux gnu gcc入口点编译时。但现在错误变成了对./crosscomp的权限被拒绝。我试过sudo,上面写着crosscomp:没有这样的命令

注意我在askubuntu上发布了相同的问题,但没有得到回应

readelf的输出如下所示

ELF标头:

 Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 
  Class:                             ELF64
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              EXEC (Executable file)
  Machine:                           AArch64
  Version:                           0x1
  Entry point address:               0x400470
  Start of program headers:          64 (bytes into file)
  Start of section headers:          4488 (bytes into file)
  Flags:                             0x0
  Size of this header:               64 (bytes)
  Size of program headers:           56 (bytes)
  Number of program headers:         8
  Size of section headers:           64 (bytes)
  Number of section headers:         29
  Section header string table index: 26

当特定可执行文件所需的动态加载程序丢失时,会出现这种特殊的错误消息

通过对有问题的可执行文件应用
readelf
,可以找到所需的动态加载程序的名称。例如,在我的x86-64 Linux机器上

$ readelf -l /bin/ls | grep 'program interpreter'
  [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
(“程序解释器”是“动态加载程序”的另一个名称。)


因此,在开发框中的
crosscomp
二进制文件上运行上述命令。(如果您没有
readelf
或收到错误消息,请尝试
arm linux gnueabi readelf
)目标arm机器上需要存在以“程序解释器:”命名的文件。如果您不知道从何处获取它,请发布上述命令的输出+
ls-l
,该目录中应该有丢失的文件。

ls-l crosscomp的输出是什么?好的,简而言之,这个错误是因为工具链不是针对目标ARM处理器的,您需要使用与编译目标板的rootfs完全相同的工具链。谢谢Gaurav。任何关于发现工具链的建议,您都可以参考本文。从目标rootfs上的任何二进制文件,可能是busybox。如果未删除注释,请参考供应商网站。它应该有工具链或BSP下载链接。你能告诉我,你从哪里得到这个板的BSP,或者你是如何编译它的文件系统的吗?谢谢zwol,我已经确认了目标机器的入口点和加载程序是相同的/准确的。当我搜索crosscomp时,第二个系统调用被写入,字符串权限被拒绝,尽管它正在打印未找到的命令。我很难过stuck@shami你能把完整的未经编辑的strace输出复制粘贴到问题中吗?还有
ls-l./crosscomp
的输出和
readelf-e./crosscomp
的输出。谢谢,我可以在Monday@shami还有一件事;这是一个不太可能出现的愚蠢问题,但为了确保,请执行
chmod+x./crosscomp
,然后再次尝试运行它。文件标志为-rwxr-x 1 readelf具有很长的输出。怎么补充呢?