llvm链接器(lld)映射文件格式解释

问题描述 投票:0回答:2

我想解析 lld 映射文件。有解释或文档吗? 我检查了 clang 文档lld 文档,但未能找到有用的信息。 这是我的地图文件的示例

             VMA              LMA     Size Align Out     In      Symbol
      2002a8           2002a8       1d     1 .interp
      2002a8           2002a8       1d     1         <internal>:(.interp)
      2002c8           2002c8       20     4 .note.ABI-tag
      2002c8           2002c8       20     4         /opt/tiger/typhoon-blade/gccs/x86_64-x86_64-gcc-830/sysroot/usr/lib/../lib64/crt1.o:(.note.ABI-tag)
      2002e8           2002e8     24c0     8 .dynsym
      2002e8           2002e8     24c0     8         <internal>:(.dynsym)
      2027a8           2027a8      310     2 .gnu.version
      2027a8           2027a8      310     2         <internal>:(.gnu.version)
      202ab8           202ab8      170     4 .gnu.version_r
      202ab8           202ab8      170     4         <internal>:(.gnu.version_r)
      202c28           202c28       24     8 .gnu.hash
      202c28           202c28       24     8         <internal>:(.gnu.hash)
      202c4c           202c4c      c48     4 .hash
      202c4c           202c4c      c48     4         <internal>:(.hash)
      203894           203894     2c20     1 .dynstr
      203894           203894     2c20     1         <internal>:(.dynstr)
      2064b8           2064b8     9d50     8 .rela.dyn
      2064b8           2064b8     9d50     8         <internal>:(.rela.dyn)
      210208           210208     21f0     8 .rela.plt
      210208           210208     21f0     8         <internal>:(.rela.plt)
      212400           212400     b7b7    16 .rodata
      212400           212400        8     4         <internal>:(.rodata)
      212410           212410      262    16         build64_release/version.cpp.o:(.rodata)
      212410           212410        4     1                 kSvnInfoCount
      212420           212420      1e5     1                 kSvnInfo
      212605           212605        e     1                 kMainInfo
      212613           212613        8     1                 kBuildType
      212620           212620       19     1                 kBuildTime
      212640           212640       10     1                 kBuilderName
      212650           212650        d     1                 kHostName
      212660           212660       11     1                 kCompiler
      212671           212671        1     1                 kScmVersion
      212680           212680       80    16         <internal>:(.rodata)
      212700           212700     4bea     1         <internal>:(.rodata)
      2172ec           2172ec       18     4         build64_release/cpputil/json/libjson.a(json_params.cpp.o):(.rodata._ZNK9rapidjson12GenericValueINS_4UTF8IcEENS_12CrtAllocatorEE6AcceptINS_6WriterINS_19GenericStringBufferIS2_S3_EES2_S2_S3_EEEEbRT_)
      217304           217304       18     4         build64_release/cpputil/json/libjson.a(json_params.cpp.o):(.rodata._ZNK9rapidjson12GenericValueINS_4UTF8IcEENS_12CrtAllocatorEE6AcceptINS_12PrettyWriterINS_15FileWriteStreamES2_S2_S3_EEEEbRT_)
      21731c           21731c       84     4         build64_release/cpputil/json/libjson.a(json_params.cpp.o):(.rodata._ZN9rapidjson13GenericReaderINS_4UTF8IcEES2_NS_12CrtAllocatorEE10ParseValueILj0ENS_19GenericStringStreamIS2_EENS_19GenericDocumentLiteIS2_S3_S3_EEEEvRT0_RT1_)
linker llvm lld map-files
2个回答
0
投票

这个源文件的标题有一个模糊的格式轮廓,这是我最好的:

https://github.com/llvm/llvm-project/blob/main/lld/COFF/MapFile.cpp

描述格式与link.exe相同。其中一些描述如下:

https://www.codeproject.com/Articles/3472/Finding-Crash-Information-Using-the-MAP-File

我希望能提供更多帮助,因为我还需要更多信息。


0
投票

您输出的格式看起来更像是

lld
中的ELF格式,而不是另一个答案中提到的COFF格式。更好的链接是:

https://github.com/llvm/llvm-project/blob/main/lld/ELF/MapFile.cpp

这里的列对应于“虚拟内存地址”(VMA)、“逻辑内存地址”(LMA)、映射文件条目的大小(十六进制)、以字节为单位的对齐方式(十进制)、“输出部分” 、“输入部分”以及该部分中的符号名称。

让我们看看您的

.rodata
部分,它比列表中前面的部分更有趣:

      212400           212400     b7b7    16 .rodata
      212400           212400        8     4         <internal>:(.rodata)
      212410           212410      262    16         build64_release/version.cpp.o:(.rodata)
      212410           212410        4     1                 kSvnInfoCount
      212420           212420      1e5     1                 kSvnInfo

它从地址 0x212400 开始(虚拟地址和逻辑地址是相同的,而且我还没有见过不存在这种情况的映射文件)。它总共包含 0xb7b7(47031 dec)字节,从 16 字节边界开始。链接器输出的节的名称是

.rodata
。它是由多个“输入”部分构建的(由编译器生成,或者可能由单独的链接步骤生成)。

第一个是内部的:

<internal>:(.rodata)
,包含与 4 字节边界对齐的 8 字节数据;由于包含部分已经是 16 字节对齐的,因此这不会影响起始地址,因此它从与输出部分相同的位置开始。

第二个来自一个名为

.o
build64_release/version.cpp.o
文件,该文件有自己的
.rodata
(例如,这些可能是一组常量整数、字符串、结构体等)。此源有 0x262 (610 dec) 字节,我们强制重新对齐到 16 字节,因此即使前一个数据位只有 8 字节长,我们还是跳过了 8 个字节以返回到更大的对齐,现在地址是0x212410来启动这个组。在这个组中,我展示了前两个符号(我们看到的第一个命名符号),它们是
kSvnInfoCount
kSvnInfo
。我们在这里看到它们有多大,以及它们从哪里开始。看来,因为 section 是 16 字节对齐的,所以每个部分都在该级别对齐,但如果您有一些内容,例如 32 字节对齐,它可能仍会向前跳到其在该部分中的位置.

我希望这对某人有帮助。相信我,您宁愿解析这种格式而不是 GCC 映射文件格式,为了使人类可读,GCC 可以用数十种不同的方式表示相同类型的信息,并且需要复杂的状态机进行解析。

© www.soinside.com 2019 - 2024. All rights reserved.