如何使用 OpenWatcom `owcc` 创建 DOS .com 文件,但没有 OpenWatcom libc?
How to create DOS .com file with OpenWatcom `owcc`, but without the OpenWatcom libc?
这是一个简短的 C 文件 cu.c
:
int main(int argc, char **argv) {
(void)argc; (void)argv;
return 0;
}
当我用 OpenWatcom 将其编译为 DOS .com 文件时,结果几乎是 3 KiB:
$ owcc -bcom -mcmodel=t -fno-stack-check -Os -s -march=i86 -W -Wall -Wextra -o cu.com cu.c
$ ls -l cu.com
-rwxr-x--- 1 pts pts 2938 Jun 20 19:26 cu.com
具有相同功能(仅退出)的最小可能 DOS .com 文件为 1 字节长:它包含单个 ret
指令(字节 0xc3)。
如何在没有 OpenWatcom C 库 (libc) 的情况下将我的 cu.c
文件(可能有一些修改,我不关心 argc 或 argv)编译成较小的 DOS .com 文件,最好少于 100 个字节?我将直接从我的程序调用 DOS API 函数 (int 0x21
),因此我不需要任何 OpenWatcom C 库函数。
请注意 COM executables with Open Watcom 没有回答我的问题,因为那里提供的解决方案都包含 OpenWatcom C 库。
我能够通过在我的自定义 .lnk 文件中使用 format dos com
而不是 system com
来解决它。通过这样做,system begin com
in link.lnk
中的 libfile cstart_t.obj
没有被使用,因此没有引用 OpenWatcom C 库中的启动代码。
生成的 .com 文件只有 3 个字节(xor ax, eax
;ret
),对此我很满意。为了使它实际上 运行,我必须准备并添加我的 .obj
文件,尽管它包含 ..start:
并设置段。
我仍在寻找不需要自定义 .lnk 文件的解决方案。
这是一个简短的 C 文件 cu.c
:
int main(int argc, char **argv) {
(void)argc; (void)argv;
return 0;
}
当我用 OpenWatcom 将其编译为 DOS .com 文件时,结果几乎是 3 KiB:
$ owcc -bcom -mcmodel=t -fno-stack-check -Os -s -march=i86 -W -Wall -Wextra -o cu.com cu.c
$ ls -l cu.com
-rwxr-x--- 1 pts pts 2938 Jun 20 19:26 cu.com
具有相同功能(仅退出)的最小可能 DOS .com 文件为 1 字节长:它包含单个 ret
指令(字节 0xc3)。
如何在没有 OpenWatcom C 库 (libc) 的情况下将我的 cu.c
文件(可能有一些修改,我不关心 argc 或 argv)编译成较小的 DOS .com 文件,最好少于 100 个字节?我将直接从我的程序调用 DOS API 函数 (int 0x21
),因此我不需要任何 OpenWatcom C 库函数。
请注意 COM executables with Open Watcom 没有回答我的问题,因为那里提供的解决方案都包含 OpenWatcom C 库。
我能够通过在我的自定义 .lnk 文件中使用 format dos com
而不是 system com
来解决它。通过这样做,system begin com
in link.lnk
中的 libfile cstart_t.obj
没有被使用,因此没有引用 OpenWatcom C 库中的启动代码。
生成的 .com 文件只有 3 个字节(xor ax, eax
;ret
),对此我很满意。为了使它实际上 运行,我必须准备并添加我的 .obj
文件,尽管它包含 ..start:
并设置段。
我仍在寻找不需要自定义 .lnk 文件的解决方案。