You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何避免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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 15:00:01