如何在GNU ld链接脚本中仅在非空段时触发断言失败?
解决GNU ld新版本中.ctors段断言总是触发的问题
问题根源在于GNU ld的行为变化:早期版本(如2.24)中,段定义内部的ASSERT仅在该段被实际填充(非空)时才会执行;但新版本的ld会执行脚本里所有ASSERT语句,不管所在段是否为空,这就导致原来的写法会让断言总是触发。
要实现仅在.ctors段非空时触发断言,你可以借助SIZEOF()函数检查段的大小,将断言移到段定义外部,修改后的链接脚本代码如下:
.ctors : ALIGN(4) SUBALIGN(4) { *(.ctors) } ASSERT(SIZEOF(.ctors) == 0, "Constructors (.ctors) are not supported.");
逻辑说明
SIZEOF(.ctors)会返回.ctors段的字节大小:
- 当段非空时,大小大于0,
SIZEOF(.ctors) == 0不成立,触发断言; - 当段为空时,大小为0,断言条件成立,不会触发提示。
这种写法完全兼容新旧版本的ld,能精准实现你需要的判断逻辑。
内容的提问来源于stack exchange,提问作者pts
相关产品推荐
相关产品推荐

