我在linux环境中生成可执行文件时链接多个.so文件。现在我想要的是内存映射,它显示了在可执行文件中链接的各个.so文件的内存范围,如
0x12345678 - 0x12345800 -> lib1.so
0x12345800 - 0x12345A0C -> lib2.so
0x12345A0C - 0x12346A00 -> lib3.so
为了生成地图文件,我将参数传递给带有" -Wl,-Map = output.map"的gcc链接器,但生成的地图文件不会以这种格式显示信息。
是否可以为这样的.so文件生成地图文件?如果是,那么有人可以建议如何生成包含这样的信息的地图文件吗?
答案 0 :(得分:2)
.so文件在运行时以动态链接 - 它们的加载地址在链接时是未知的,因此无法生成您想要的地图文件。
如果你想在链接时知道一个静态映射,你需要链接静态库,或者只是在运行时决定加载.so库的操作系统这个事实。
ldd
会告诉您在加载时需要解决哪些外部引用 - 但它显然无法告诉您地址。
答案 1 :(得分:0)
是否可以为这样的.so文件生成地图文件?
可以在流程中生成类似于在运行时的地图,例如通过检查/proc/self/maps
,或遵循运行时加载程序_r_debug->r_map
链接列表。
正如tofro的回答正确指出的那样,不可以在静态链接时生成这样的映射,因为在二进制文件开始运行之前,共享库的加载地址是不可知的。