OpenWatcom C编译器中common symbols的使用方法问询
如何在OpenWatcom C编译器编译的C源代码中使用COMMON(公共)符号?
COMMON符号的核心特性是允许同一符号在多个编译单元中被声明/定义,但最多仅一个单元提供非零初始化的定义。以下是针对OpenWatcom环境的测试与解决方案:
GCC环境的对比参考
使用GCC配合-fcommon参数编译测试代码(以fwptr为示例符号,对应w1o.c和w2o.c两个源文件)时,可实现预期逻辑:单独编译w1o.c输出FW1,同时编译两个文件时输出FW2。需注意,这是GCC的非标准行为——C标准明确此类重复定义属于编译错误,启用-fno-common参数可让GCC遵循标准规范。
OpenWatcom C编译器的限制
使用OpenWatcom的owcc编译上述两个C文件时,会触发redefinition of _fwptr ignored的警告,最终运行结果始终为FW1。通过dmpobj查看w1o.obj的结构可知,owcc将fwptr放入_BSS段,以PUBDEF386记录符号,并未生成COMMON符号对应的COMDEF记录。
实现COMMON符号的可行方案
OpenWatcom的汇编器wasm和链接器wlink支持COMMON符号:编写汇编文件w1oc.asm,通过COMM _fwptr:DWORD:1声明COMMON符号,使用wasm编译该汇编文件后,即可配合C代码实现预期的COMMON符号特性。
结论
OpenWatcom的C编译器(wcc386)不支持直接通过C源代码生成COMMON符号,并非使用方式有误。若要在C项目中利用COMMON符号的特性,需要通过汇编代码定义符号后再在C中引用。
内容的提问来源于stack exchange,提问作者pts
相关产品推荐
相关产品推荐

