一、file 可执行文件 可查看可执行文件是ARM架构还是X86架构

Linux file命令用于辨识文件类型。

通过file指令,我们得以辨识该文件的类型。

参数:

-b  列出辨识结果时,不显示文件名称。

-c  详细显示指令执行过程,便于排错或分析程序执行的情形。

-f<名称文件>  指定名称文件,其内容有一个或多个文件名称呢感,让file依序辨识这些文件,格式为每列一个文件名称。

-L  直接显示符号连接所指向的文件的类别。

-m<魔法数字文件>  指定魔法数字文件。

-v  显示版本信息。

-z  尝试去解读压缩文件的内容。

[文件或目录…] 要确定类型的文件列表,多个文件之间使用空格分开,可以使用shell通配符匹配多个文件。

如图所示该可执行文件类型为pc端运行的

二、nm 可执行文件 可查看文件中的符号,包括全局变量,全局函数等

nm

显示二进制目标文件的符号表

补充说明

nm命令 被用于显示二进制目标文件的符号表。

语法

nm(选项)(参数)

选项

-A:每个符号前显示文件名;

-D:显示动态符号;

-g:仅显示外部符号;

-r:反序显示符号表。

参数

目标文件:二进制目标文件,通常是库文件和可执行文件。

三、 ldd 可执行文件 可查看文件执行所需要的动态库

ldd

打印程序或者库文件所依赖的共享库列表

补充说明

ldd命令 用于打印程序或者库文件所依赖的共享库列表。

语法

ldd(选项)(参数)

选项

–version:打印指令版本号;

-v:详细信息模式,打印所有相关信息;

-u:打印未使用的直接依赖;

-d:执行重定位和报告任何丢失的对象;

-r:执行数据对象和函数的重定位,并且报告任何丢失的对象和函数;

–help:显示帮助信息。

参数

文件:指定可执行程序或者文库。

其他介绍

首先ldd不是一个可执行程序,而只是一个shell脚本

ldd能够显示可执行模块的dependency,其原理是通过设置一系列的环境变量,如下:LD_TRACE_LOADED_OBJECTS、LD_WARN、LD_BIND_NOW、LD_LIBRARY_VERSION、LD_VERBOSE等。当LD_TRACE_LOADED_OBJECTS环境变量不为空时,任何可执行程序在运行时,它都会只显示模块的dependency,而程序并不真正执行。要不你可以在shell终端测试一下,如下:

export LD_TRACE_LOADED_OBJECTS=1

再执行任何的程序,如ls等,看看程序的运行结果。

四、strings 可执行文件 可查看文件中所有的符号,包括编译器版本信息

strings

在对象文件或二进制文件中查找可打印的字符串

补充说明

strings命令 在对象文件或二进制文件中查找可打印的字符串。字符串是4个或更多可打印字符的任意序列,以换行符或空字符结束。 strings命令对识别随机对象文件很有用。

语法

strings [ -a ] [ - ] [ -o ] [ -t Format ] [ -n Number ] [ -Number ] [file … ]

选项

-a --all:扫描整个文件而不是只扫描目标文件初始化和装载段

-f –print-file-name:在显示字符串前先显示文件名

-n –bytes=[number]:找到并且输出所有NUL终止符序列

:设置显示的最少的字符数,默认是4个字符

-t --radix={o,d,x} :输出字符的位置,基于八进制,十进制或者十六进制

-o :类似–radix=o

-T --target= :指定二进制文件格式

-e --encoding={s,S,b,l,B,L} :选择字符大小和排列顺序:s = 7-bit, S = 8-bit, {b,l} = 16-bit, {B,L} = 32-bit

@ :读取中选项

五、 readelf 可执行文件 可查看文件的所有详细信息,包括文件的头信息,动态库信息,段信息等

readelf

用于显示elf格式文件的信息

补充说明

readelf命令 用来显示一个或者多个elf格式的目标文件的信息,可以通过它的选项来控制显示哪些信息。这里的elf-file(s)就表示那些被检查的文件。可以支持32位,64位的elf格式文件,也支持包含elf文件的文档(这里一般指的是使用ar命令将一些elf文件打包之后生成的例如lib*.a之类的“静态库”文件)。

这个程序和objdump提供的功能类似,但是它显示的信息更为具体,并且它不依赖BFD库(BFD库是一个GNU项目,它的目标就是希望通过一种统一的接口来处理不同的目标文件),所以即使BFD库有什么bug存在的话也不会影响到readelf程序。

运行readelf的时候,除了-v和-H之外,其它的选项必须有一个被指定。

ELF文件类型

种类型的ELF文件:

可重定位文件:用户和其他目标文件一起创建可执行文件或者共享目标文件,例如lib*.a文件。

可执行文件:用于生成进程映像,载入内存执行,例如编译好的可执行文件a.out。

共享目标文件:用于和其他共享目标文件或者可重定位文件一起生成elf目标文件或者和执行文件一起创建进程映像,例如lib*.so文件。

ELF文件作用:

ELF文件参与程序的连接(建立一个程序)和程序的执行(运行一个程序),所以可以从不同的角度来看待elf格式的文件:

如果用于编译和链接(可重定位文件),则编译器和链接器将把elf文件看作是节头表描述的节的集合,程序头表可选。

如果用于加载执行(可执行文件),则加载器则将把elf文件看作是程序头表描述的段的集合,一个段可能包含多个节,节头表可选。

如果是共享文件,则两者都含有。

ELF文件总体组成:

elf文件头描述elf文件的总体信息。包括:系统相关,类型相关,加载相关,链接相关。

系统相关表示:elf文件标识的魔术数,以及硬件和平台等相关信息,增加了elf文件的移植性,使交叉编译成为可能。

类型相关就是前面说的那个类型。

加载相关:包括程序头表相关信息。

链接相关:节头表相关信息。

六、 总结

file 是比较常用的指令,可以查看可执行文件是否经过交叉编译,能否在ARM平台上运行

举报/反馈

章鱼哥嵌入式开发

114获赞 94粉丝
从事嵌入式开发多年,多么痛的领悟
关注
0
0
收藏
分享