我想获取程序结尾的地址,并在编译/链接器时检查我是否有足够的空间,在代码之后,在执行时放置一些随机数据。
但是由于 PROVIDE 关键字提供的符号就像 C 代码中的普通变量一样,我无法在编译时验证它。
在链接器脚本中,我有符号:
PROVIDE (__data_end_rom = _etext + SIZEOF (.data));
所以我可以使用这个符号来获取我的代码末尾的地址:
extern u16 __data_end_rom;
如果我假设结束地址为 0xffff,我可以计算可用内存:
#define AVAILABLE_MEM (0Xffff - &__data_end_rom)
我正在考虑使用 gcc 4.6 中提供的 _Static_assert(cond, message) 检查可用内存
_Static_assert(SIZE_I_WANT_TO_ASSURE <= AVAILABLE_MEM, "NOT ENOUGH MEMORY!!!");
我的问题是:宏 AVAILABLE_MEM 不是在编译时计算的,所以我得到了错误:
error: expression in static assertion is not constant
有没有办法直接在标签中或以其他方式提供 __data_end_rom 地址?
我知道我无法在编译时得到它,因为符号只会在链接器时被链接,所以有什么方法可以让链接器失败?
我可以直接在链接器脚本中检查这一点,但我不喜欢这样做,因为 SIZE_I_WANT_TO_ASSURE 是从配置头中的其他宏计算的另一个宏。