Watcom
Watcom编译器套件是一个功能强大的编译器/汇编/生成/链接器套件,它附带了用于二进制文件操作的工具。
关于使用编译器的几句警告
用于测试此编译器的第三方商业测试在编译器向开源的过渡过程中没有幸存下来。 换句话说,对于大多数实际用途来说,它们已经丢失了。 因此,并且由于当前的支持有限,因此编译器如今尚未得到彻底测试,并且更改和错误修复可能会在编译器及其生成的代码中引入错误。 不论怎样,以下是在OpenWatcom C/C++1.9编译器中发现的一些可耻和可怕的错误,这些错误是为Smaller C编译器编写的测试提供的。 这些测试肯定碰到了这些问题:
- Crash while parsing declarations
- Compound assignment with division or modulo produces bogus results
- Ternary conditional operator isn't doing default conversions
- missing lvalue check
- comma operator not working when assigning structures
创建一个平面(flat)二进制文件
OpenWatcom的链接器WLink可以使用命令行选项或链接器脚本生成平面二进制文件。 这些选项没有很好的文档记录(请参阅C++主参考手册的链接器部分),但它的一个维护者帮助构建了一个示例链接器脚本:
name kernel.bin # name of resulting binary output raw # type of binary (ELF, PE, MZ, PharLap, ...) offset=0x100000 # skip first meg; base address of binary file startup.obj # objects to link - this one has to be first file fdc.obj file gui.obj file idt.obj # add more obj files here order # in which order should segments be put into binary clname CODE offset=0x100000 # offset for reference fixups clname DATA
此链接器脚本不包括二进制文件中的BSS类,因为它的未初始化数据无论如何,并且只会为生成的二进制文件添加不必要的大小。
WLink从命令行执行链接器脚本,如下所示:
wlink @linkerscript.lnk
如何告诉Watcom生成XXX文件?
原生而言,所有Watcom C/C++ 编译器都可以默认产生OMF (.obj) 文件。 (见论坛帖子)。
Watcom 11.0c和Open Watcom 1.3有什么不同?
差别不大; Open Watcom增加了一些新功能。
为什么我的最终可执行文件实际上不是可执行文件
Watcom习惯于在您的代码中插入额外的函数调用,这些调用在最终的二进制代码中不一定可用。 要解决此问题,请在命令行中添加 “-s” 开关以禁用堆栈溢出检查。
然而,32位C(WCC38 6)和C++(WPP38)编译器插入函数调用处理器将标记为无效,并且如果中断控制器未就绪,CPU将出现三重故障。 这似乎不是16位编译器的问题。 我仍在尝试找出如何绕过这些调用。
链接Watcom生成的对象文件并将其与JLOC链接会在运行时导致一些问题
Watcom让DS遵循DS:DGROUP,如果你不想要这种结构,你不得不去调Jloc。