Takes 32-bit OMF .obj files (produced by nasm -f obj) plus a
PMODE/W or DOS/32A extender stub binary and emits an MZ+LE
executable that runs on FreeDOS / DOSBox / QEMU+FreeDOS / dos_emu
/ real DOS without an extra dos4gw.exe redistribution.
Designed for the i386/DOS retro-compiler family:
uc386 (C23) and
ucpp386 (C++) both use pyle to
ship .exe artifacts without an Open Watcom installation on the
build host. (Open Watcom has no native macOS build, so wlink-based
pipelines can't run on a Mac; pyle removes that dependency.)
Extracted from uc386/addons/harness/pyle.py into a sibling
package so both compilers can consume it. Mirrors how the
peephole optimizer became
upeep386 and how upeepz80
serves the Z80 compiler family.
pip install pyle
Or from source:
pip install -e .
from pathlib import Path
from pyle import parse_omf, link, write_le, STUB_DIR
objects = [parse_omf(Path("user.obj")), parse_omf(Path("bridge.obj"))]
image = link(objects)
stub = (STUB_DIR / "pmodew_stub.bin").read_bytes()
write_le(image, stub, entry_symbol="_pmodew_start",
out_path=Path("user.exe"))
For DOS/32A: pass bind_dos32a_stub(raw_dos32a_bytes) to
write_le instead, with explicit_stack_object=True. DOS/32A
isn't bundled — fetch DOS32A.EXE from
https://archive.org/details/dos32a-912-bin (zlib license).
CLI: pyle user.obj bridge.obj -o user.exe.
- 32-bit USE32 segments only:
_TEXT class=CODE,_DATA class=DATA,_BSS class=BSS. - Fixup kinds: rel32 (self-relative offset, used by
call/jmprel32) and off32 (32-bit absolute offset, used bymov eax, _label). - Multiple input objects, cross-object PUBDEF/EXTDEF resolution.
- Single linker pass; produces an MZ+LE with the extender stub
bundled as the MZ portion (the
.exeis self-contained).
No 16-bit code, no far jumps, no COMDAT. Use Open Watcom's wlink
when you need a richer linker.
pyle.py— the linker (OMF parser + LE emitter + small linker).pmodew_stub.bin— the PMODE/W extender as a ready-to-prepend blob (~9 KB). BSD-ish license; bundled with permission.
GPL-3.0-or-later for the linker code itself. The bundled extender stubs ship under their respective upstream licenses (PMODE/W: free-for-any-use with attribution).