1. About JWlink

JWlink is a linker for x86 that can create 16-, 32- and 64-bit binaries. It's a fork of Open Watcom Wlink. Some features have been added and a few bugs have been fixed. Generally, it has been made more compatible with the MS linker (the cmdline syntax is still quite different).

Besides JWlink's source code there are also precompiled binaries available for Windows, DOS and Linux. The packages containing precompiled binaries also include a Manual (in HtmlHelp format for Windows, else in plain Html).

2. Installation

There's no installation procedure for JWlink. If JWlink is to be used frequently, it might be a good idea to copy the binary to a directory that is included in the PATH environment variable.

Besides JWlink there are 2 additional binaries;

Note: the names of the DOS versions of those binaries have a 'd' suffix (JWlibd.exe, cvpackd.exe). This suffix must be removed, because JWlink will always call the "unsuffixed" variant.

3. How to create the JWlink binaries

If you want to compile the JWlink sources, you'll need:
- the JWlink source package
- Open Watcom (v1.8 or newer)
- if a JWlink DOS binary is to be build, the HX development package

To create the jwlink binary:
- Win32, DOS: Adjust the path for the Watcom root directory ( variable WATCOM ) in file Makefile. If no DOS version of jwlink is to be created, set variable DOS = 0. Then run 'wmake'.
- Linux: Adjust the path for the Watcom root directory ( variable WATCOM ) in file OWLinux.mak. Then run 'wmake -f OWLinux.mak'.

4. Changes in Detail

Compared to Open Watcom Wlink, the following changes took place:

PE binaries:
JWlink is able to produce PE32+ binaries for Win64. This format is
automatically enabled when a PE32+ object module is detected.
new options LARGEaddressaware (32-bit Windows PE) and NOLARGEaddressaware
(64-bit Windows PE32+).
constant data is put into the readonly section "rdata" ( MS link
compatible ) [ OW WLink writes it into read-write section DGROUP ].
.idata section - which is used to store import information - is merged
with ".rdata" ( MS link compatible ). [ OW Wlink creates a separate section for .idata ].
.edata section - which is used to store export information - is merged
with ".rdata" ( MS link compatible ). [ OW Wlink creates a separate section for .edata ].
linker "-export" directives in section ".drectve" ( COFF modules only )
may contain an "internal name" addition ( MS link compatible ). Example:
"-export:[email protected]"
linker "-entry" directive in section ".drectve" ( COFF modules only )
doesn't need a leading underscore, it is added internally ( MS link
compatible ). This eliminates the need to use JWasm's -zzs option.
linker "-defaultlib" directive in section ".drectve" ( COFF/ELF modules
only ) is able to handle directory names enclosed in double quotes.
linker will understand directive "-import" read from section
".drectve" ( COFF/ELF modules only ).
if the linker finds a directive in section ".drectve" that it doesn't
understand, it will emit warning "unknown directive '-%s' ignored".
for dlls, the base relocation table isn't removed if no relocations
exist. Instead an empty table is written.
if an import library is to be written, format COFF is used now as
default if a PE binary is linked. To actually write the library,
the external tool JWLib is used.
JWlib.exe: if COFF import libraries are to be created, the "short"
format is used now, which reduces the file size significantly.
default base for dlls is 0x10000000 ( MS link compatible ).
new SEGMENT attributes EXECUTABLE and WRITABLE to allow to make data sections executable or code sections writable.
new option NXCompat.
directive ANONYMOUSEXPORT works with PE format.
new option FUZZYEXPORT to allow undecorated names with EXPORT directive.
unused entries in the linker-generated transfer table are no longer written.
ELF binaries:
Support for 64-bit ELF binaries has been added. This format is
automatically enabled when a 64-bit object module is detected.
if no start address has been defined, symbol _start will be set as start address automatically.
It is ensured that file alignment ( option ALIGNMENT ) won't violate segment alignment requirements. Also, default for file alignment is 0 ( means no alignment ). Default for object alignment ( option OBJALIGN ) is still 0x1000.
DOS binaries:
new option KNOWEAS for DOS binaries to make the linker create
full-sized (size >= 0x40) MZ headers for stubs.
no minimum stack size for MZ binaries.
no warning is displayed if a 32bit module is linked into the binary.
Other:
If multiple starting points are defined, JWlink will warn only and use the first that was defined.
File arguments may be enclosed in double quotes.
the rudimentary support for Tenberry's 16-bit extender DOS/16M has been removed.
JWlink is able to handle OMF LIDATA records with relocations.
The EXPORT directive got a new attribute, NONAME, that makes it work similiar to ANONYMOUSEXPORT.

5. Examples

The JWlink commandline options are vast and the syntax, inherited from Wlink, is a bit strange. As a start, here are some examples for the most common cases:
- Win32/Win64 console application,
one object module (sample.obj):
jwlink format windows pe file sample.obj
- Win32/Win64 GUI application,
one object module (sample.obj):
jwlink format windows pe runtime windows file sample.obj
- Win32/Win64 dynamic link library,
one object module (sample.obj):
jwlink format windows pe dll file sample.obj
- Win32/Win64 console application with multiple object modules,
file1.obj and file2.obj, name of the resulting binary will be sample.exe:
jwlink format windows pe dll file file1.obj, file2.obj name sample.exe
- Win32/Win64 console application with one object module,
emit symbolic debugging info and create a map file:
jwlink debug c format windows pe file sample.obj op cvp, map
- Win32/Win64 console application without base relocations: jwlink format windows pe file sample.obj op noreloc
- Win32/Win64 dll and set the preferred base address: jwlink format windows pe dll file sample.obj op offset=0x20000000
- Win32/Win64 dll and write an import library: jwlink format windows pe dll file sample.obj op implib=sample.lib
- Win32 console application compiled with MS VC++: jwlink format windows pe file sample.obj op eliminate, start=_mainCRTStartup, noreloc
- 32- or 64-bit ELF application: jwlink format elf file sample.obj op noreloc