linux - 为 cortex-a8 设备交叉编译时出现链接器问题

标签 linux linker arm cross-compiling

<分区>

我正在使用 VAR-SOM-AM33开发板并希望在设备上运行像 hello world 这样的示例代码,它会给出 -sh:./test:not found 错误

用于编译代码的工具链是 gcc-linaro-arm-linux-gnueabihf-4.7-2013.03-20130313_linux。

代码如下

#include <stdio.h>
    int main(){
    printf("hello world");
    return 0;
}

交叉编译文件

arm-linux-gnueabihf-gcc test.c -march=armv7-a -marm -mthumb-interwork -mfloat-abi=hard -mfpu=neon -mtune=cortex-a8 -o test

输出的二进制文件如下所示

test: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.31, BuildID[sha1]=2ce1c5b3d97dac2093fe2cd2d340cdaa9989923f, not stripped

将该文件复制到硬件中并运行后显示以下错误

root@am335x-evm:~# ./test 
-sh: ./test: not found

文件权限也改变了

root@am335x-evm:~# chmod +x test 

但结果显示相同的未找到错误。

在硬件上运行的demo文件,其架构如下

root@am335x-evm:~# readelf -A /usr/bin/hello
Attribute Section: aeabi
File Attributes
Tag_CPU_name: "7-A"
Tag_CPU_arch: v7
Tag_CPU_arch_profile: Application
Tag_ARM_ISA_use: Yes
Tag_THUMB_ISA_use: Thumb-2
Tag_VFP_arch: VFPv3
Tag_Advanced_SIMD_arch: NEONv1
Tag_ABI_PCS_wchar_t: 4
Tag_ABI_FP_denormal: Needed
Tag_ABI_FP_exceptions: Needed
Tag_ABI_FP_number_model: IEEE 754
Tag_ABI_align8_needed: Yes
Tag_ABI_align8_preserved: Yes, except leaf SP
Tag_ABI_enum_size: int
Tag_ABI_HardFP_use: SP and DP

和交叉编译后的文件,其架构如下

root@am335x-evm:~# readelf -A test 
Attribute Section: aeabi
File Attributes
Tag_CPU_name: "7-A"
Tag_CPU_arch: v7
Tag_CPU_arch_profile: Application
Tag_ARM_ISA_use: Yes
Tag_THUMB_ISA_use: Thumb-2
Tag_VFP_arch: VFPv3
Tag_Advanced_SIMD_arch: NEONv1
Tag_ABI_PCS_wchar_t: 4
Tag_ABI_FP_denormal: Needed
Tag_ABI_FP_exceptions: Needed
Tag_ABI_FP_number_model: IEEE 754
Tag_ABI_align8_needed: Yes
Tag_ABI_align8_preserved: Yes, except leaf SP
Tag_ABI_enum_size: int
Tag_ABI_HardFP_use: SP and DP
Tag_ABI_VFP_args: VFP registers
Tag_CPU_unaligned_access: v6
Tag_unknown_44: 1 (0x1)

另外硬件cpuinfo如下

root@am335x-evm:~# cat /proc/cpuinfo 
Processor   : ARMv7 Processor rev 2 (v7l)
BogoMIPS    : 718.02
Features    : swp half thumb fastmult vfp edsp thumbee neon vfpv3 tls 
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x3
CPU part    : 0xc08
CPU revision    : 2

Hardware    : Variscite VAR-SOM-AM33
Revision    : 0000
Serial      : 0000000000000000

我试过在目标设备上运行 ldd 命令。

root@am335x-evm:~# ldd
-sh: ldd: not found

所以我怀疑这个问题与链接器有关。 如果我只是编译文件,而不链接它。

arm-linux-gnueabihf-gcc -mtune=cortex-a8 -march=armv7  -O -c test.c -o test 

现在,如果我运行这个文件,我会得到这个错误。

root@am335x-evm:~# chmod +x test 
root@am335x-evm:~# ./test 
./test: line 1: syntax error: word unexpected (expecting ")")

请建议如何解决这个问题。

最佳答案

感谢您的解决方案,我发现链接器有错误。

现有文件有链接器ld-linux.so.3,交叉编译文件有链接器ld-linux-armhf.so.3

root@am335x-evm:/usr/bin# readelf -l hello

Elf file type is EXEC (Executable file)
Entry point 0x82fc
There are 8 program headers, starting at offset 52

Program Headers:
  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
  EXIDX          0x00044c 0x0000844c 0x0000844c 0x00008 0x00008 R   0x4
  PHDR           0x000034 0x00008034 0x00008034 0x00100 0x00100 R E 0x4
  INTERP         0x000134 0x00008134 0x00008134 0x00013 0x00013 R   0x1
      [Requesting program interpreter: /lib/ld-linux.so.3]

交叉编译文件程序头

root@am335x-evm:~# readelf -l test 

Elf file type is EXEC (Executable file)
Entry point 0x82f9
There are 8 program headers, starting at offset 52

Program Headers:
  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
  EXIDX          0x000450 0x00008450 0x00008450 0x00008 0x00008 R   0x4
  PHDR           0x000034 0x00008034 0x00008034 0x00100 0x00100 R E 0x4
  INTERP         0x000134 0x00008134 0x00008134 0x00019 0x00019 R   0x1
      [Requesting program interpreter: /lib/ld-linux-armhf.so.3]

更改后链接器程序在目标设备上运行。

root@am335x-evm:~# cd /lib/
root@am335x-evm:/lib# ls -l ld-linux.so.3      
lrwxrwxrwx    1 1000     1000           12 Aug  7  2012 ld-linux.so.3 -> ld-2.12.2.so
root@am335x-evm:/lib# ln -s /li ld-2.12.2.so ld-linux-armhf.so.3
/lib/     /linuxrc
root@am335x-evm:/lib# ln -s /lib/ld-2.12.2.so  ld-linux-armhf.so.3
root@am335x-evm:/lib# ldconfig 
root@am335x-evm:/lib# cd
root@am335x-evm:~# ./test 
hello worldroot@am335x-evm:~# 

关于linux - 为 cortex-a8 设备交叉编译时出现链接器问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36358133/

相关文章:

python - 在curl下载python脚本时添加延迟,然后通过管道执行脚本?

c++ - 在类静态常量 ODR

android - 交叉编译到arm时找不到lpthread

c - 通过pthread create调用时,通过alsa输出声音的功能不起作用:无声音,CPU使用率100%

linux - 如何检查Linux实例中任何脚本的最后运行时间

linux - 如何在多台机器上执行 ps 来监控它们的性能

c - 与 OpenSSL 的静态链接

windows - 警告 : cannot find entry symbol nable-stdcall-fixup; defaulting

rust - 使用 OpenOCD 和 arm-none-eabi-gdb 将二进制文件加载到 stm32f103c8t6

node.js - Beaglebone (ARM) 上的串口 Node 错误