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


    错误描述:
    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 下面的库文件 就用对应版本的, 这样才能执行成功.

  • 相关阅读:
    Django之模板
    Web框架的原理
    mysql 索引
    pymysql模块的使用
    MySQl创建用户和授权
    php去除h5标签
    phpcms_完整版
    快速上手Linux 玩转典型应用_慕课网笔记
    php 微擎
    二维码接口
  • 原文地址:https://www.cnblogs.com/kmist/p/11369935.html
Copyright © 2020-2023  润新知