system.map u-boot.map

System.map

 linux kernel 编译后产生的 System.map 文件是通过如下命令生成的

nm vmlinux | sort | less

上图中的第二列表示符号类型,如果是小写字母,一般表示局部性,大写字母,一般表示全局性(外部)

 

 

其他字母表示的函数类型,可以查询 binutils 文档

 u-boot.map

相比于System.map,uboot的 u-boot.map 信息更加丰富。

 

 u-boot.map文件是通过 ld 的命令行选项 -Map=u-boot.map 生成的

ld的命令行选项如果不是直接被ld调用,而是通过gcc的话,需要在ld的命令行选项加上 -Wl 前缀,比如 -Wl,-Map=a.map,其中 -Map=a.map 就是ld的命令行选项。

gcc foo.o bar.o -Wl,-eENTRY -Wl,-Map=a.map

 

 

 --whole-archive 和 --no-whole-archive 是ld专有的命令行参数,--whole-archive 能够把在其后面出现的静态库包含的函数和变量输出到动态库,--no-whole-archive 则关掉这个特性。

一般情况下,对于自己编写的.c文件,需要保留所有符号;而对于gcc函数库,只需要保留使用到的函数

 

 

Linker script and memory map

展示了符号所在的段和内存地址

Discarded input sections

如果链接器没有找到对函数和变量的任何引用,编译后包含在程序中的函数和变量并不总是最终二进制文件的一部分,它们将会被删除但是仍然会出现在Map文件的Discarded input sections 部分。

 

posted @ 2023-02-26 17:05  流水灯  阅读(165)  评论(0编辑  收藏  举报