欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

如何在C代码中获取编译后的bin文件的大小

程序员文章站 2022-03-10 17:15:14
...

开发环境:KEIL-MDK(RealView)

 

需求说明

要在C代码程序中获取编译器最终生成的bin文件大小。

 

思路

通过读取编译器中生成的链接符号变量来计算。

 

 

 

解决方案

比如,测试程序中生成的Code大小为1906个字节,RO-data的大小为486个字节。两者相加1906+486=2392.

如何在C代码中获取编译后的bin文件的大小

项目配置:

如何在C代码中获取编译后的bin文件的大小

分散加载脚本:

; *************************************************************
; *** 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;
			
		}

 

测试验证

如何在C代码中获取编译后的bin文件的大小

从图中可以看出,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文件的大小。

如何在C代码中获取编译后的bin文件的大小

 

参考资料:

MDK-ARM链接程序使用了两种方式控制程序的链接,即链接控制命令选项和链接脚本文件。当使用链接控制命令选项时,链接器定义了Image%%RW%%BaseImage%%RW%%LimitImage%%RO%%BaseImage%%RO%%LimitImage%%ZI%%BaseImage%%ZI%%Limit6个段地址描述符。这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代码中如何使用链接脚本中定义的变量

 

 

相关标签: KEIL-MDK开发环境

上一篇: log4j使用

下一篇: Mybatis笔记一