文章目录
- 前言
- Greenhillls中gsize的用法
- 修改ld文件将lib中的data段指定区域
- 示例定义与链接
- 总结
前言
项目开发过程中,遇到客户开发ASW,提供Lib进行集成,但ASW中的标定量没有定义对应的data段,导致无法将标定量指定到特定的内存。本文介绍将Lib中的data段链接到指定区域的一种方法。以及当我们拿到Lib后,如何获取Lib中的有用信息。
Greenhillls中gsize的用法
gsize用来查看文件中的各个段的大小,输入的文件可以是.o文件,.a文件(lib)或可执行文件。
使用方法:
Usage: gsize [-table] [-all] [-nototals] file1 [file2 ...]@commandfile read in additional options from <commandfile>-help display this help message-all show all sections. overrides -text -nobss etc-commons display common symbols (ELF only)-count_commons include commons in total size of .bss .sbss-[no]details suppress/display section detail info-[no]totals suppress/display section summary info-table display output in table format-gcompare display output in format suitable for gcompare-text only show text sections. same as -nodata -nobss-notext ignore text sections-nodata ignore data sections-nobss ignore bss sections-zero display zero-length sections
当我们拿到一个lib后,使用如下方式,可以完整读取到lib中的各个文件中的各个段的大小
gsize -all libTest.a
打印信息示例如下:
最后输出的是整个lib中所占的各个段大小
前面会输出Lib中各个文件的各个段大小
另外,可以使用ax -t命令将lib中的.o解压出来
修改ld文件将lib中的data段指定区域
在GHS编译手册中有介绍,如何将.o或.a文件中的段链接到指定段,如下图所示
注意:对于.a和.o,不要使用完整路径,只用其名称即可
如果我们需要将lib中的所有文件的data段指定到特定段,可以按下面的定义:
使用*通配符,即可表示为lib中的所有文件
示例定义与链接
示例中,ASW已有一部分标定量定义到指定的caldata段,其他还有一些文件中的data段未映射到data,将lib中的其他data段也映射到caldata上。
.caldata :{. = ALIGN(4);*(.caldata) . = ALIGN(4);libASW.a(*(.data)). = ALIGN(4);} > ram_cal
通过该方式,将lib中的data段重映射到caldata段
在未映射时,lib中的data段会被分配到默认的data段(sram_data),地址不是单独的一块区域
重映射后,lib中的data数据被映射到caldata段,为指定地址
总结
使用该方法有一个弊端,就是标定量和观测量(若初始化不为0)无法区分,还是建议将标定量放在单独的文件中,这样维护起来更加方便。