Linker ELF和MAP文件之间的差异

Linker ELF和MAP文件之间的差异,linker,embedded,elf,Linker,Embedded,Elf,链接器可以输出ELF和映射文件。这些文件在嵌入式系统中尤其重要,因为ELF文件通常用于读取变量或函数的地址。此外,ELF文件由不同的嵌入式测量或分析工具使用 当我打开一个映射文件,然后在其中,我可以看到每个全局变量和每个外部函数的以下信息:分配地址、符号名、分配字节、内存单元和内存部分 另一方面,一旦我打开ELF文件,它是一个二进制文件,不可读。然而,我使用的一些工具能够读出并解释它。这些工具可以解释ELF文件,获取变量/函数的符号名及其地址信息,甚至可以显示函数原型 据我所知,ELF和MAP文

链接器可以输出ELF和映射文件。这些文件在嵌入式系统中尤其重要,因为ELF文件通常用于读取变量或函数的地址。此外,ELF文件由不同的嵌入式测量或分析工具使用

当我打开一个映射文件,然后在其中,我可以看到每个全局变量和每个外部函数的以下信息:分配地址、符号名、分配字节、内存单元和内存部分

另一方面,一旦我打开ELF文件,它是一个二进制文件,不可读。然而,我使用的一些工具能够读出并解释它。这些工具可以解释ELF文件,获取变量/函数的符号名及其地址信息,甚至可以显示函数原型

据我所知,ELF和MAP文件基本上包含相同的信息,只是第一个是二进制文件,后一个是文本文件。 那么,从内容的角度来看,这两个文件之间的实际区别是什么呢


提前谢谢你

链接器的主要输出(即其主要用途)是生成完全链接的可执行代码。这是ELF(可执行链接格式)文件。正如您所观察到的,ELF文件可能包含符号-这些符号用于调试。它还可能包含将机器代码与生成机器代码的源代码相关联的元数据。但是它的大部分内容(以及非可选部分)是可执行的机器代码和数据对象,它们是您的应用程序

映射文件是一个可选的仅限信息的人类可读输出,其中包含有关应用程序中代码和数据对象的位置和大小的信息。映射文件包含一个摘要,显示代码的总大小和内存使用情况

在嵌入式交叉开发环境中,将代码加载到源代码级符号调试器时,将使用ELF文件中的符号信息。调试器获取ELF文件中的二进制代码/数据段并将其加载到目标上(通常使用JTAG或其他调试/编程硬件工具),它将符号和源代码级调试元数据加载到调试器中,然后在目标上执行实机代码时,该执行反映在原始源代码中的调试器中,您可以在源代码级别查看、单步执行和中断代码


简而言之,ELF文件就是您的程序。映射文件,顾名思义,是可执行文件的映射-它告诉您可执行文件中的内容。

鉴于任何可能回答的人都必须隐式地知道这些文件是什么,您确实不需要尝试解释或猜测。“这个简短的问题相当长。”克利福德说得很好。然而,当提出一个带有额外信息的“大声思考”问题时,可能会使问题变得更长,另一方面,它也会导致提问者得出额外的结论。所以这可能会引出一个更精确的最后一个问题。这当然让我解决了明显的误解,而不仅仅是区别。谢谢你的回答。不过,我有一句话要说。您编写了ELF文件:““它还可能包含将机器代码与生成它的源代码相关联的元数据。”。从我有限的理解来看,元数据实际上将机器代码与汇编代码相关联?至少这是我的印象,因为我使用的工具可以重建应用程序的调用图,其中包括图中每个函数的汇编指令。只有在加载源文件后,该工具才能在程序集之外显示应用程序源代码。还是我错了?@SimpleThings元数据包含与源代码相关的行号信息。由于汇编指令和机器代码指令之间存在直接关系,因此机器代码与汇编代码的关联在符号表中是隐式的。您所指的工具正在生成反汇编(从机器代码到组装)。如果您要求,编译器可以从源代码生成汇编代码。有些编译器将此作为中间步骤,然后进行组装。如果您从源代码生成一个程序集列表,则该列表很可能包含以下行。。。人类可读形式的信息。我尝试使用readELF工具读取一个ELF文件。它的符号表包含地址、符号名称、大小、类型(OBJ、FUNC、SECTION)、绑定(LOCAL、GLOBAL)等字段。但我不明白如何从中重构原始应用程序代码/程序集?我找不到所提到的汇编指令和机器代码指令之间的直接关系。@SimpleThings ReadElf显然没有显示elf文件的所有内容,它的输出是元数据。要查看任何可读格式的代码,您需要一个反汇编程序。不能从目标代码复制源代码。这就像试图用卫生纸重建一棵树。