LLD链接器mapfile格式说明文档及解析方法咨询
LLD生成的mapfile没有独立的官方格式说明,它的格式设计兼容GNU ld的mapfile标准,你可以按照通用的链接器mapfile规则进行解析。你提供的示例中各字段和结构的含义如下:
字段含义说明
表头共7个字段,对应含义如下:
- VMA:虚拟内存地址,即段或符号在程序运行时的虚拟空间地址,以十六进制表示
- LMA:加载内存地址,即段或符号在二进制文件中被加载到内存的实际地址,普通用户态程序下通常与VMA值相同
- Size:段或符号占用的字节长度,十六进制表示
- Align:段或符号的地址对齐字节数,十六进制表示
- Out:输出段名称,即链接后最终二进制文件中的段名,如
.interp、.rodata等 - In:输入段来源,即构成输出段的输入文件对应段信息,格式为
目标文件路径:(输入段名),其中<internal>代表该段为链接器自动生成 - Symbol:具体符号名,只有对应到变量、函数等具体符号的行才会展示该字段
层级规则
mapfile通过缩进区分内容所属的层级,从高到低分为三级:
- 无缩进行:输出段的总览信息,记录整个输出段的总地址、总大小、对齐规则
- 一级缩进行:构成输出段的单个输入段信息,记录每个输入段的地址、大小、来源
- 二级缩进行:输入段内包含的具体符号信息,记录每个符号的地址、大小、名称
示例片段
你提供的mapfile片段如下:
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_)
如果需要编写自动化解析脚本,可根据行首的缩进量判断内容层级,再按空格分割提取对应字段即可。需要注意部分字段之间可能存在多个连续空格,分割时需要做去重处理。
内容的提问来源于stack exchange,提问作者Heyi Sun
相关产品推荐
相关产品推荐

