首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >cortex-a8设备交叉编译时的链接器问题

cortex-a8设备交叉编译时的链接器问题
EN

Stack Overflow用户
提问于 2016-04-01 21:51:58
回答 1查看 364关注 0票数 0

我正在使用测试板,并希望运行类似hello world run on device的示例代码,它给出-sh:./ VAR-SOM-AM33:not found error

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

代码如下

代码语言:javascript
复制
#include <stdio.h>
    int main(){
    printf("hello world");
    return 0;
}

对于交叉编译文件

代码语言:javascript
复制
arm-linux-gnueabihf-gcc test.c -march=armv7-a -marm -mthumb-interwork -mfloat-abi=hard -mfpu=neon -mtune=cortex-a8 -o test

输出二进制文件如下所示

代码语言:javascript
复制
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

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

代码语言:javascript
复制
root@am335x-evm:~# ./test 
-sh: ./test: not found

文件权限也由以下项更改

代码语言:javascript
复制
root@am335x-evm:~# chmod +x test 

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

在硬件上运行的演示文件,其体系结构如下

代码语言:javascript
复制
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

和交叉编译的文件,其体系结构如下

代码语言:javascript
复制
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如下

代码语言:javascript
复制
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命令。

代码语言:javascript
复制
root@am335x-evm:~# ldd
-sh: ldd: not found

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

代码语言:javascript
复制
arm-linux-gnueabihf-gcc -mtune=cortex-a8 -march=armv7  -O -c test.c -o test 

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

代码语言:javascript
复制
root@am335x-evm:~# chmod +x test 
root@am335x-evm:~# ./test 
./test: line 1: syntax error: word unexpected (expecting ")")

请建议如何解决此问题。

EN

回答 1

Stack Overflow用户

发布于 2016-04-01 22:46:25

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

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

代码语言:javascript
复制
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]

交叉编译的文件程序头

代码语言:javascript
复制
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]

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

代码语言:javascript
复制
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:~# 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36358133

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档