首先,我们先来了解一下什么是可重定位目标文件,如图:
我们看到,源文件经过翻译器处理后形成的** .o **文件 就是可重定位目标文件。
目标文件总共有三种:①共享目标文件②可执行目标文件③可重定位目标文件。
其中,③可重定位目标文件包含二进制数据和代码,可以在编译时和其它可重定位目标文件合并起来,创建一个可执行目标文件。如上图的 ld 将 main.o和sum.o以及一些必要的系统目标文件组合起来,创建了可执行目标文件prog。
而一个典型的ELF可重定位目标文件的格式如下图:
其中,每个“节”的意思是:
①.text :已编译程序的机器代码。
②.rodata :只读数据。
③.data :已初始化的全局和静态C变量
④.bss :未初始化的全局和静态C变量
⑤.symtab :一个符号表,存放在程序中定义和引用的函数和全局变量的信息,不包含局 部变量的条目。
⑥.rel .text :一个 .text节中位置的列表。
⑦.rel .data :被模块引用或定义的所有全局变量的重定位信息。
⑧.debug :调试符号表。
⑨.line :原始C源程序中的行号和 .text节中机器指令之间的映射。
⑩.strtab :一个字符串表,内容包括 .symtab 和debug节中的符号表。
而“节头部表”包含每个节的节名、偏移和大小。
✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂
cmu上此章节的main.c和sum.c源码如下:
✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂
我们要获取他们的.o文件的话(可在包含源文件的文件夹里看到),只用输入如下指令即可:
✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂
若是还想看看它们的ELF头部信息,只需输入如下指令即可:
注意这里是.o不是.c
✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂
在上面,我们列出了典型的ELF可重定位目标文件的格式,如果想查看具体的“节”的信息,只要输入如下指令即可:
(大写S,.o文件)
✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂
若是想查看.o文件的符号表信息,只要输入如下指令即可:
(小写s,.o文件)
✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂
readelf一般用于查看ELF格式的文件信息
而指令man可以查看其它指令的参数,就像一本工具书一样。并且man有固定的输出格式:
NAME 命令名称及功能简要说明
SYNOPSIS 用法说明,包括可用的选项
DESCRIPTION 命令功能的详细说明,可能包括每一个选项的意义
OPTIONS 说明每一项的意义
FILES 此命令相关的配置文件
BUGS
EXAMPLES 使用示例
SEE ALSO 另外参照
man的基本使用操作如下:
1.查看指令:
man 需要查看的命令
这样我们就能看到ls的各个参数了(查看时会跳到另一个页面):
2. 查看时的翻屏操作:
向后翻一屏:space(空格键) 向前翻一屏:b
向后翻一行:Enter(回车键) 向前翻一行:k
查看时的查找操作:
/关键词 向后查找 n:下一个
?关键词 向前查找 N:前一个
3.退出:直接点击q键,回到原来的界面。
有关man的更多信息,可以看看这位博主的帖子:https://www.cnblogs.com/chenmingjun/p/8352478.html