|
|
1
51
对象文件可以包含一堆内容:基本上是以下列表的部分或全部:
|
|
|
2
11
有几种标准格式(Unix上的COFF、ELF),基本上它们是用于可执行文件的格式的变体,但缺少一些信息。这些缺失的信息将在链接时完成。 对象文件格式基本上包含相同的信息:
当对象链接在一起时,代码中引用外部符号的部分将被实际值替换(好吧,这仍然过于简单化,最后一部分将在运行程序时在加载时完成,但这就是想法)。 对象文件还可能包含解析导入和导出所必需的更多符号信息(对于调试非常有用)。可以使用strip命令删除该信息。 |
|
|
3
7
|
|
|
4
5
相反,动态链接的可执行文件可能看起来像:
要查看标题(包括节名称),可以使用:
拆卸:
|
|
|
5
5
可以 打开!别害怕,你只需要合适的工具!作为二进制数据,文本编辑器当然不是正确的工具;一个合适的工具可以是十六进制编辑器,或者像emacs这样的高级编辑器,或者一个工具,它不是简单地“输出”字节的“十六进制”表示形式,让你独自解释数据,而是知道特定的格式,并在某种程度上正确地“解释”数据(例如,GIMP将PNG文件解释为图像并显示它,PNG分析器将“分解”PNG部分中的数据(显示以特定字节表示的标志,…等等)。 在您的例子中,一般的答案是对象文件包含您编译的代码(和数据),加上链接器所需的所有额外信息,以及最终更多的信息。
其中每一个都有分析内容的工具;例如
|
|
6
4
对象文件是已编译的源文件。 这意味着它是机器代码,这取决于目标平台(如果您真的愿意,可以在Windows上为Unix编译)和所使用的编译器。不同的编译器将从同一源文件生成不同的机器代码。 |
|
7
2
linker 生成可执行文件。它本质上是一堆带有命名部分的机器代码指令(对应于您的函数)。来自维基百科的 Object File
|
|
|
8
1
在GNU编译环境中,可以在可执行文件和对象文件中使用objdump进行查看。 如您所见,该对象仅包含编译文件中声明/引用的函数代码(该文件仅包含带有scanf调用和printf调用的main函数)。
如果在可执行文件上使用objdump,您可以看到 更多 函数(除了对象内部的函数)。这证明了对象文件只包含源文件中定义的函数以及对其他函数的引用。这些参考将在链接阶段解决。 linking , compilation 和 objects . |