gnatdll is a tool to automate the DLL build process once all the Ada and non-Ada sources that make up your DLL have been compiled. gnatdll is actually in charge of two distinct tasks: build the static import library for the DLL and the actual DLL. The form of the gnatdll command is
$ gnatdll [`switches`] `list-of-files` [-largs `opts`]
where list-of-files is a list of ALI and object files. The object file list must be the exact list of objects corresponding to the non-Ada sources whose services are to be included in the DLL. The ALI file list must be the exact list of ALI files for the corresponding Ada sources whose services are to be included in the DLL. If list-of-files is missing, only the static import library is generated.
You may specify any of the following switches to gnatdll:
-a[`address']
-b `address'
-bargs `opts'
-d `dllfile'
-e `deffile'
-g
-h
-I`dir'
-k
@`nn'
suffix from the import library's exported
names, but keeps them for the link names. You must specify this
option if you want to use a Stdcall function in a DLL for which
the @`nn'
suffix has been removed. This is the case for most
of the Windows NT DLL for example. This option has no effect when
`-n' option is specified.
-l `file'
-n
-q
-v
-largs `opts'
As an example the command to build a relocatable DLL from api.adb
once api.adb
has been compiled and api.def
created is
$ gnatdll -d api.dll api.ali
The above command creates two files: libapi.dll.a
(the import
library) and api.dll
(the actual DLL). If you want to create
only the DLL, just type:
$ gnatdll -d api.dll -n api.ali
Alternatively if you want to create just the import library, type:
$ gnatdll -d api.dll
This section details the steps involved in creating a DLL. gnatdll does these steps for you. Unless you are interested in understanding what goes on behind the scenes, you should skip this section.
We use the previous example of a DLL containing the Ada package API,
to illustrate the steps necessary to build a DLL. The starting point is a
set of objects that will make up the DLL and the corresponding ALI
files. In the case of this example this means that api.o
and
api.ali
are available. To build a relocatable DLL, gnatdll does
the following:
api.base
). A base file gives
the information necessary to generate relocation information for the
DLL.
$ gnatbind -n api $ gnatlink api -o api.jnk -mdll -Wl,--base-file,api.base
In addition to the base file, the `gnatlink' command generates an
output file api.jnk
which can be discarded. The `-mdll' switch
asks `gnatlink' to generate the routines DllMain and
DllMainCRTStartup that are called by the Windows loader when the DLL
is loaded into memory.
api.exp
). The export table contains the relocation
information in a form which can be used during the final link to ensure
that the Windows loader is able to place the DLL anywhere in memory.
$ dlltool --dllname api.dll --def api.def --base-file api.base \\ --output-exp api.exp
$ gnatbind -n api $ gnatlink api -o api.jnk api.exp -mdll -Wl,--base-file,api.base
libAPI.dll.a
.
$ dlltool --dllname api.dll --def api.def --base-file api.base \\ --output-exp api.exp --output-lib libAPI.a
$ gnatbind -n api $ gnatlink api api.exp -o api.dll -mdll
dlltool is the low-level tool used by gnatdll to build DLLs and static import libraries. This section summarizes the most common dlltool switches. The form of the dlltool command is
$ dlltool [`switches`]
dlltool switches include:
--base-file `basefile'
--def `deffile'
--dllname `name'
-k
@`nn'
from exported names
(Windows Calling Conventions
for a discussion about Stdcall-style symbols.
--help
--output-exp `exportfile'
--output-lib `libfile'
-v
--as `assembler-name'