查看可执行程序的依赖库及相关信息

主要针对ELF(可执行文件和可链接文件),有点反汇编的味道

 

VC6里有depend和dumpbin,Linux下是ldd和objdump,可查询依赖库

 

objdump可查到所使用cross-compile的版本,用法为objdump -s --section=.comment $prog

 

 嵌入式版本有arm-linux-readelf:

 

(1)在host (x86) 机器上, 使用 arm-linux-readelf -d $target_prog 或 arm-linux-readelf -a | grep "Shared" $target_prog
(2)在target(arm)机器上,使用 /lib/ld.so.2 --list $prog  

 

此外,file命令可以查看文件基本信息 

 

ar 让你能查看函数库里的详细情况和用多个对象文件生成一个库文件。

经常用法:

     1. ar -t libname.a //显示所有对象文件(.o文件)的列表.例: # ar t libtest.a
     libtest1.o
     libtest2.o

     2. ar -rv libname.a  objfile1.o objfile2.o ... objfilen.o  //把objfile1.o--objfilen.o打包成一个库文件

 

nm --列出目标文件(.o)的符号清单

常用法:

nm -s filename.a/filename.o/a.out  里边所有的符号列表一清二楚。例:
# nm -s a.out
080495b8 A __bss_start
08048334 t call_gmon_start

 

其实ar和nm的功能基本都可以用objdump配合适当的参数实现

 

研究这个问题是因为之前交叉编译了QT4.7的库,但忘了使用的是不是EABI的交叉编译工具,通过arm-linux-readelf -h读取头文件,显示OS/ABI-ARM,Flags-GNU EABI,再由file显示gcc3.4.1,确定不是eabi版的

 

(以下转)我开始的时候并不知道怎么指定gcc的EABI,还以为4.1以上的gcc自动都是EABI,结果就是生成的内核能跑,而init进程(根文件系统的第一个进程)却运行不了。而最让我啼笑皆非的是 readelf,这绝对对我是误导的,例如:
一个ABI的文件
#readelf -h aa
ELF Header:
  Magic:   7f 45 4c 46 01 01 01 61 00 00 00 00 00 00 00 00 
  Class:                             ELF32
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            ARM
  ABI Version:                       0
  Type:                              EXEC (Executable file)
  Machine:                           ARM
  Version:                           0x1
  Entry point address:               0x80f0
  Start of program headers:          52 (bytes into file)
  Start of section headers:          2361284 (bytes into file)
  Flags:                             0x2, has entry point, GNU EABI
  Size of this header:               52 (bytes)
  Size of program headers:           32 (bytes)
  Number of program headers:         4
  Size of section headers:           40 (bytes)
  Number of section headers:         35
  Section header string table index: 32
看见Flags那行了吗?清清楚楚写的是GNU EABI,其实它是ABI(想起来台词:它看起来是一个电吹风,其实还是刮胡刀)
真正的EABI是这样的
#readelf -h a.out
ELF Header:
  Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 
  Class:                             ELF32
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              EXEC (Executable file)
  Machine:                           ARM
  Version:                           0x1
  Entry point address:               0x8130
  Start of program headers:          52 (bytes into file)
  Start of section headers:          2460164 (bytes into file)
  Flags:                             0x4000002, has entry point, Version4 EABI
  Size of this header:               52 (bytes)
  Size of program headers:           32 (bytes)
  Number of program headers:         6
  Size of section headers:           40 (bytes)
  Number of section headers:         36
  Section header string table index: 33

 

你可能感兴趣的:(linux,嵌入式)