如何在C代码中获取编译后的bin文件的大小
开发环境:KEIL-MDK(RealView)
需求说明
要在C代码程序中获取编译器最终生成的bin文件大小。
思路
通过读取编译器中生成的链接符号变量来计算。
解决方案
比如,测试程序中生成的Code大小为1906个字节,RO-data的大小为486个字节。两者相加1906+486=2392.
项目配置:
分散加载脚本:
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************
LR_IROM1 0x08000000 0x00080000 { ; load region size_region
ER_IROM1 0x08000000 0x00080000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
.ANY (+XO)
}
RW_IRAM1 0x20000000 0x00020000 { ; RW data
.ANY (+RW +ZI)
}
}
注意:其中的执行域的名称为ER_IROM1。
添加代码:
extern int Image$$ER_IROM1$$RO$$Base;
extern int Image$$ER_IROM1$$RO$$Limit;
#define LINKER_VAR_IROM_START Image$$ER_IROM1$$RO$$Base
#define LINKER_VAR_IROM_LIMIT Image$$ER_IROM1$$RO$$Limit
{
int *pBase, *pLimit;
int nSize;
pBase = &LINKER_VAR_IROM_START;
pLimit = &LINKER_VAR_IROM_LIMIT;
nSize = (int)pLimit - (int)pBase;
}
测试验证
从图中可以看出,pBase和pLimit这两个变量已经得到了链接器的结果。两者相减,结果即为2392.
还可以用简单方法:
extern int Image$$ER_IROM1$$RO$$Length;
#define LINKER_VAR Image$$ER_IROM1$$RO$$Length
int n;
n = (int)&LINKER_VAR;
同样的方法,可以获取RW部分的大小。
extern int Image$$RW_IRAM1$$RW$$Length;
#define LINKER_VAR_RW Image$$RW_IRAM1$$RW$$Length
int k;
k = (int)&LINKER_VAR_RW;
n+k即可得到bin文件的大小。
参考资料:
MDK-ARM链接程序使用了两种方式控制程序的链接,即链接控制命令选项和链接脚本文件。当使用链接控制命令选项时,链接器定义了Image%%RW%%Base、Image%%RW%%Limit、Image%%RO%%Base、Image%%RO%%Limit、Image%%ZI%%Base和Image%%ZI%%Limit等6个段地址描述符。这6个描述符可以直接在程序中引用。而在使用链接脚本文件后,这6个描述符号没有了,取而代之的是链接脚本文件中的段描述符,格式为:Image%%段名%%Base 和Image%%段名%%Limit。 (要把上述的%换成$)
http://www.realview.asia/support/man/docs/armlink/armlink_pge1362065952432.htm
Image$$ execution region symbols
https://blog.csdn.net/czg13548930186/article/details/78535419
C代码中如何使用链接脚本中定义的变量
上一篇: log4j使用
下一篇: Mybatis笔记一