如何避免vlink链接C与ASM代码时合并CODE和BSS段?
解决vc/vbcc/vasm/vlink工具链中CODE与BSS段合并的警告问题
问题背景
我正在使用vc/vbcc/vasm/vlink工具链,将C文件hello.c与汇编文件level_1_interrupt_autovector.asm进行链接。程序可在fs-uae中运行,但链接阶段出现以下警告:
Warning 58: Relative references between code section "CODE" and bss section "BSS" (hello.o) force a combination of the two.
Warning 22: Attributes of section CODE were changed from r-x- to rwx- in hello.o.
疑问
- 如何避免CODE和BSS段被合并?
- 该问题是否与
lea (_gdata,PC),A5指令相关?
问题原因与解决方案
核心原因
问题确实和lea (_gdata,PC),A5指令直接相关。PC相对寻址只能计算同一段内的地址偏移,当CODE段通过这种方式访问BSS段的_gdata时,vlink为了让寻址合法,只能被迫合并CODE和BSS段,同时把CODE段属性改为rwx(因为BSS段是可写的)。
解决方法
- 修改寻址方式:把PC相对寻址改成绝对寻址,替换指令为:
lea _gdata,A5 - 调整变量存储段:将
_gdata从BSS段移到DATA段(全局数据段),这样PC相对寻址可以在同段内生效,避免跨段引用。汇编中声明示例:section DATA,data _gdata: dc.l 0 - 强制分离段的链接选项:给vlink添加
-sc选项,强制分离代码与数据段,但前提是代码中已经消除了所有跨段的PC相对引用,否则会触发链接错误。
内容的提问来源于stack exchange,提问作者Jens Mühlenhoff
相关产品推荐
相关产品推荐

