生成映射文件,显示可执行文件

时间:2017-05-15 06:26:02

标签: c gcc linker

我在linux环境中生成可执行文件时链接多个.so文件。现在我想要的是内存映射,它显示了在可执行文件中链接的各个.so文件的内存范围,如

0x12345678 - 0x12345800  -> lib1.so
0x12345800 - 0x12345A0C  -> lib2.so
0x12345A0C - 0x12346A00  -> lib3.so

为了生成地图文件,我将参数传递给带有" -Wl,-Map = output.map"的gcc链接器,但生成的地图文件不会以这种格式显示信息。

是否可以为这样的.so文件生成地图文件?如果是,那么有人可以建议如何生成包含这样的信息的地图文件吗?

2 个答案:

答案 0 :(得分:2)

.so文件在运行时以动态链接 - 它们的加载地址在链接时是未知的,因此无法生成您想要的地图文件。

如果你想在链接时知道一个静态映射,你需要链接静态库,或者只是在运行时决定加载.so库的操作系统这个事实。

ldd会告诉您在加载时需要解决哪些外部引用 - 但它显然无法告诉您地址。

答案 1 :(得分:0)

  

是否可以为这样的.so文件生成地图文件?

可以在流程中生成类似于在运行时的地图,例如通过检查/proc/self/maps,或遵循运行时加载程序_r_debug->r_map链接列表。

正如tofro的回答正确指出的那样,可以在静态链接时生成这样的映射,因为在二进制文件开始运行之前,共享库的加载地址是不可知的。