1. About JWlink
JWlink is a linker for x86 that can create 16-, 32- and 64-bit binaries.
It's a modified 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;
JWlib[.exe]: this tool is launched by JWlink when it has to create an
import library. It's an improved version of OW's WLib.
cvpack[.exe]: this tool is launched by JWlink when the CVPACK option
has been set.
Note: the names of the DOS versions of those binaries have a 'd' suffix
(JWlibd.exe, cvpackd.exe). This suffix must be removed.
3. Changes in Detail
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:MyFunc1=_MyFunc1@4"
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.
4. How to create the JWlink binaries
You'll need:
- the JWlink source package
- Open Watcom (v1.8 or newer)
- if the 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'.
5. Examples
The JWlink commandline options are vast and the syntax, which is 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