It turns out the string copy code in wpp/wbpp "collapses" the OPT_STRING
into a string by strcpy()'ing s->data over the struct. The programmer
who wrote that apparently assumed an implementation that copies
byte-for-byte, which might be true of many older C runtimes, but in
Linux, fails to account for GCC/GLIBC's use of DWORD or QWORD sized word
copies. When the copy unit is not a byte, string corruption can result
when the source and dest pointers overlap. Symptoms of this bug was that
the Watcom compiler could not compile itself properly because the
makefile referred to "xobjs/wcexcept.obj" which was then corrupted to
"xobjexcept.opt.obj". The bwpp tool would write it as
xobjexcept.opt.obj, and then builder and wmake would see that
xobjs/wcexcept.obj was not built and throw an error. This corruption was
generally invisible unless you ran that part of the build under
something that monitored file I/O, like "strace" in Linux which would
show the original and corrupted file names in use.

To be honest, I think the way the linker handles OPT_STRING is goddamn
messy, but that's for another commit.