开发板上的第一个应用程序也要折腾

错误描述:
linux内核和文件系统搭建好了,自然是要跑一个hello world以表尊重,但是问题出现了.
./hello 

提示:
hello (46): undefined instruction: pc=(ptrval)
CPU: 0 PID: 46 Comm: led2 Not tainted 5.2.6 #23
Hardware name: SMDK2440
PC is at 0xb6f05328
LR is at 0xb6f00734
pc : [<b6f05328>]    lr : [<b6f00734>]    psr: 80000010
sp : beeb6c00  ip : beeb6ea0  fp : b6f00418
r10: b6f00734  r9 : b6f00288  r8 : beeb6c20
r7 : b6f00000  r6 : 0002702c  r5 : b6f006ec  r4 : b6f00000
r3 : 00000001  r2 : 00026f10  r1 : 00001915  r0 : 000000a0
Flags: Nzcv  IRQs on  FIQs on  Mode USER_32  ISA ARM  Segment user
Control: c000717f  Table: 33034000  DAC: 00000055
Code: e59b2004 e203300f e59d7020 e353000a (e6ef1071) 
Illegal instruction
提示 undefined instruction 未定义指令. 这个时候,上一次的经验就体现出来了.
这和我编译busybox的时候一样,
我想起来我现在的编译器版本是arm-linux-gcc 4.6.4 编译出来的应用对我这个s3c2440c来说太新了,我这个cpu不支持新的arm指令,所以编译器报错了. 

于是我改用arm-linux-gcc 3.+ 的版本. 本想着应该是可以了.
再次执行 

提示: 
-/bin/sh: ./hello: not found

在百度之后:
找到排查错误的方法:

1. 在ubuntu上:
readelf hello -a 查看ELF信息:
程序头:
  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
  PHDR           0x000034 0x00008034 0x00008034 0x000c0 0x000c0 R E 0x4
  INTERP         0x0000f4 0x000080f4 0x000080f4 0x00013 0x00013 R   0x1
      [Requesting program interpreter: /lib/ld-linux.so.2]
  LOAD           0x000000 0x00008000 0x00008000 0x00750 0x00750 R E 0x8000
  LOAD           0x000750 0x00010750 0x00010750 0x00128 0x0012c RW  0x8000
  DYNAMIC        0x000760 0x00010760 0x00010760 0x000c8 0x000c8 RW  0x4
  NOTE           0x000108 0x00008108 0x00008108 0x00020 0x00020 R   0x4
看到关键字了; 依赖于 /lib/ld-linux.so.2

那么我有没有呢 ?
/usr/sbin # ls /lib/
ld-linux.so.3  libc.so.6      libm.so.6      modules        tmp


我居然是ld-linux.so.3

这时候我想起来: 这个ld-linux.so.3 是我从gcc-linux-arm 4.6.4 的编译器里拷贝过来的,现在 我换成了gcc3 ,所以可能不支持. 

解决方法:
所以降所有lib文件 都重新从arm-linux-gcc 3+ 的文件夹中拷贝. 

编译,执行成功.

总结: 用什么版本的编译器编译的,lib 下面的库文件 就用对应版本的, 这样才能执行成功.

 

posted @ 2019-08-17 19:08  kmist  阅读(714)  评论(0编辑  收藏  举报