开发板上的第一个应用程序也要折腾
错误描述: 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 下面的库文件 就用对应版本的, 这样才能执行成功.