如何在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%%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代码中如何使用链接脚本中定义的变量

 

 

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Arduino ,将源代码编译成二进制文件(.bin)是很常见的。如果您需要对二进制文件进行加密,可以考虑使用加密算法(如AES)对二进制文件进行加密。下面是一个简单的示例代码,使用AES算法对二进制文件进行加密: ```c #include <AES.h> AES aes; void setup() { Serial.begin(9600); // 加密密钥,需要保密 byte key[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10 }; // 从SD卡加载二进制文件 File file = SD.open("file.bin", FILE_READ); if (!file) { Serial.println("Failed to open file"); return; } // 获取文件大小 size_t fileSize = file.size(); // 创建一个缓冲区,用于存储文件内容 byte* buffer = (byte*)malloc(fileSize); if (!buffer) { Serial.println("Failed to allocate buffer"); return; } // 读取文件内容到缓冲区 file.read(buffer, fileSize); file.close(); // 加密文件内容 aes.do_aes_encrypt(buffer, fileSize, key, 128); // 将加密后的文件内容写入SD卡 File encryptedFile = SD.open("encrypted.bin", FILE_WRITE); if (!encryptedFile) { Serial.println("Failed to create encrypted file"); return; } encryptedFile.write(buffer, fileSize); encryptedFile.close(); free(buffer); Serial.println("Encryption complete"); } void loop() { // do nothing } ``` 这个示例代码做了以下几件事情: 1. 定义一个AES对象,用于加密算法。 2. 定义加密密钥,需要保密。 3. 从SD卡加载二进制文件。 4. 创建一个缓冲区,用于存储文件内容。 5. 读取文件内容到缓冲区。 6. 加密文件内容。 7. 将加密后的文件内容写入SD卡。 8. 释放缓冲区。 请注意,这只是一个简单的示例,不保证完全安全。如果您需要更高级的加密算法和安全性,请考虑使用专业的加密软件和硬件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值