.. role:: switch(samp)

.. -- Non-breaking space in running text
   -- E.g. Ada |nbsp| 95

.. |nbsp| unicode:: 0xA0
   :trim:

.. _Platform_Specific_Information:

*****************************
Platform-Specific Information
*****************************

This appendix contains information relating to the implementation
of run-time libraries on various platforms and also covers
topics related to the GNAT implementation on Windows and Mac OS.

.. _`Run_Time_Libraries`:

Run-Time Libraries
==================

.. index:: Tasking and threads libraries
.. index:: Threads libraries and tasking
.. index:: Run-time libraries (platform-specific information)

The GNAT run-time implementation may vary with respect to both the
underlying threads library and the exception-handling scheme.
For threads support, the default run-time will bind to the thread
package of the underlying operating system.

For exception handling, either or both of two models are supplied:

  .. index:: Zero-Cost Exceptions
  .. index:: ZCX (Zero-Cost Exceptions)

* **Zero-Cost Exceptions** ("ZCX"),
  which uses binder-generated tables that
  are interrogated at run time to locate a handler.

  .. index:: setjmp/longjmp Exception Model
  .. index:: SJLJ (setjmp/longjmp Exception Model)

* **setjmp / longjmp** ('SJLJ'),
  which uses dynamically-set data to establish
  the set of handlers

Most programs should experience a substantial speed improvement by
being compiled with a ZCX run-time.
This is especially true for
tasking applications or applications with many exception handlers.
Note however that the ZCX run-time does not support asynchronous abort
of tasks (``abort`` and ``select-then-abort`` constructs) and will instead
implement abort by polling points in the runtime. You can also add additional
polling points explicitly if needed in your application via ``pragma
Abort_Defer``.

This section summarizes which combinations of threads and exception support
are supplied on various GNAT platforms.

.. _Summary_of_Run-Time_Configurations:

Summary of Run-Time Configurations
----------------------------------

+-----------------+--------------+-------------------------+------------+
| Platform        | Run-Time     | Tasking                 | Exceptions |
+=================+==============+=========================+============+
| GNU/Linux       | rts-native   | pthread library         | ZCX        |
|                 | (default)    |                         |            |
|                 +--------------+-------------------------+------------+
|                 | rts-sjlj     | pthread library         | SJLJ       |
+-----------------+--------------+-------------------------+------------+
| Windows         | rts-native   | native Win32 threads    | ZCX        |
|                 | (default)    |                         |            |
|                 +--------------+-------------------------+------------+
|                 | rts-sjlj     | native Win32 threads    | SJLJ       |
+-----------------+--------------+-------------------------+------------+
| Mac OS          | rts-native   | pthread library         | ZCX        |
+-----------------+--------------+-------------------------+------------+


.. _Specifying_a_Run-Time_Library:

Specifying a Run-Time Library
=============================

The :file:`adainclude` subdirectory containing the sources of the GNAT
run-time library, and the :file:`adalib` subdirectory containing the
:file:`ALI` files and the static and/or shared GNAT library, are located
in the gcc target-dependent area:


  ::

      target=$prefix/lib/gcc/gcc-*dumpmachine*/gcc-*dumpversion*/

As indicated above, on some platforms several run-time libraries are supplied.
These libraries are installed in the target dependent area and
contain a complete source and binary subdirectory. The detailed description
below explains the differences between the different libraries in terms of
their thread support.

The default run-time library (when GNAT is installed) is *rts-native*.
This default run-time is selected by the means of soft links.
For example on x86-linux:

.. --
   --  $(target-dir)
   --      |
   --      +--- adainclude----------+
   --      |                        |
   --      +--- adalib-----------+  |
   --      |                     |  |
   --      +--- rts-native       |  |
   --      |    |                |  |
   --      |    +--- adainclude <---+
   --      |    |                |
   --      |    +--- adalib <----+
   --      |
   --      +--- rts-sjlj
   --           |
   --           +--- adainclude
   --           |
   --           +--- adalib

.. only:: html or latex

  .. image:: rtlibrary-structure.png

.. only:: not (html or latex)

   ::

                      $(target-dir)
                     __/ /      \ \___
             _______/   /        \    \_________________
            /          /          \                     \
           /          /            \                     \
       ADAINCLUDE  ADALIB      rts-native             rts-sjlj
          :          :            /    \                 /   \
          :          :           /      \               /     \
          :          :          /        \             /       \
          :          :         /          \           /         \
          +-------------> adainclude     adalib   adainclude   adalib
                     :                     ^
                     :                     :
                     +---------------------+

                     Run-Time Library Directory Structure
          (Upper-case names and dotted/dashed arrows represent soft links)

If the *rts-sjlj* library is to be selected on a permanent basis,
these soft links can be modified with the following commands:

  ::

    $ cd $target
    $ rm -f adainclude adalib
    $ ln -s rts-sjlj/adainclude adainclude
    $ ln -s rts-sjlj/adalib adalib

Alternatively, you can specify :file:`rts-sjlj/adainclude` in the file
:file:`$target/ada_source_path` and :file:`rts-sjlj/adalib` in
:file:`$target/ada_object_path`.

.. index:: --RTS option

Selecting another run-time library temporarily can be
achieved by using the :switch:`--RTS` switch, e.g., :switch:`--RTS=sjlj`


.. _Choosing_the_Scheduling_Policy:

.. index:: SCHED_FIFO scheduling policy
.. index:: SCHED_RR scheduling policy
.. index:: SCHED_OTHER scheduling policy

Choosing the Scheduling Policy
------------------------------

When using a POSIX threads implementation, you have a choice of several
scheduling policies: ``SCHED_FIFO``, ``SCHED_RR`` and ``SCHED_OTHER``.

Typically, the default is ``SCHED_OTHER``, while using ``SCHED_FIFO``
or ``SCHED_RR`` requires special (e.g., root) privileges.

.. index:: pragma Time_Slice
.. index:: -T0 option
.. index:: pragma Task_Dispatching_Policy


By default, GNAT uses the ``SCHED_OTHER`` policy. To specify
``SCHED_FIFO``,
you can use one of the following:

* ``pragma Time_Slice (0.0)``
* the corresponding binder option :switch:`-T0`
* ``pragma Task_Dispatching_Policy (FIFO_Within_Priorities)``


To specify ``SCHED_RR``,
you should use ``pragma Time_Slice`` with a
value greater than 0.0, or else use the corresponding :switch:`-T`
binder option.


To make sure a program is running as root, you can put something like
this in a library package body in your application:

  .. code-block:: ada

     function geteuid return Integer;
     pragma Import (C, geteuid, "geteuid");
     Ignore : constant Boolean :=
       (if geteuid = 0 then True else raise Program_Error with "must be root");

It gets the effective user id, and if it's not 0 (i.e. root), it raises
Program_Error. Note that if you re running the code in a container, this may
not be sufficient, as you may have sufficient priviledge on the container,
but not on the host machine running the container, so check that you also
have sufficient priviledge for running the container image.

.. index:: Linux
.. index:: GNU/Linux

.. _GNU_Linux_Topics:

GNU/Linux Topics
================

This section describes topics that are specific to GNU/Linux platforms.

.. _Required_packages_on_GNU_Linux:

Required Packages on GNU/Linux
------------------------------

GNAT requires the C library developer's package to be installed.
The name of of that package depends on your GNU/Linux distribution:

* RedHat, SUSE: ``glibc-devel``;
* Debian, Ubuntu: ``libc6-dev`` (normally installed by default).

If using the 32-bit version of GNAT on a 64-bit version of GNU/Linux,
you'll need the 32-bit version of the following packages:

* RedHat, SUSE: ``glibc.i686``, ``glibc-devel.i686``, ``ncurses-libs.i686``
* Debian, Ubuntu: ``libc6:i386``, ``libc6-dev:i386``, ``lib32ncursesw5``

Other GNU/Linux distributions might be choosing a different name
for those packages.

.. index:: Windows

.. _Microsoft_Windows_Topics:

Microsoft Windows Topics
========================

This section describes topics that are specific to the Microsoft Windows
platforms.


.. only:: PRO

  .. rubric:: Installing from the Command Line

  By default the GNAT installers display a GUI that prompts you to enter
  the installation path and similar information, and then guides you through the
  installation process. It is also possible to perform silent installations
  using the command-line interface.

  In order to install one of the GNAT installers from the command
  line you should pass parameter :switch:`/S` (and, optionally,
  :switch:`/D=<directory>`) as command-line arguments.

   For example, for an unattended installation of
   GNAT 19.2 into the default directory :file:`C:\\GNATPRO\\19.2` you
   would run::

        gnatpro-19.2-x86-windows-bin /S

   To install into a custom directory, say, :file:`C:\\TOOLS\\GNATPRO\\19.2`::

        gnatpro-19.2-x86-windows-bin /S /D=C:\TOOLS\GNATPRO\19.2

   You can use the same syntax for all installers.

   Note that unattended installations don't modify system path, nor create file
   associations, so such activities need to be done by hand.


.. _Using_GNAT_on_Windows:

Using GNAT on Windows
---------------------

One of the strengths of the GNAT technology is that its tool set
(``gcc``, ``gnatbind``, ``gnatlink``, ``gnatmake``, the
``gdb`` debugger, etc.) is used in the same way regardless of the
platform.

On Windows this tool set is complemented by a number of Microsoft-specific
tools that have been provided to facilitate interoperability with Windows
when this is required. With these tools:


* You can build applications using the ``CONSOLE`` or ``WINDOWS``
  subsystems.

* You can use any Dynamically Linked Library (DLL) in your Ada code (both
  relocatable and non-relocatable DLLs are supported).

* You can build Ada DLLs for use in other applications. These applications
  can be written in a language other than Ada (e.g., C, C++, etc). Again both
  relocatable and non-relocatable Ada DLLs are supported.

* You can include Windows resources in your Ada application.

* You can use or create COM/DCOM objects.

Immediately below are listed all known general GNAT-for-Windows restrictions.
Other restrictions about specific features like Windows Resources and DLLs
are listed in separate sections below.


* It is not possible to use ``GetLastError`` and ``SetLastError``
  when tasking, protected records, or exceptions are used. In these
  cases, in order to implement Ada semantics, the GNAT run-time system
  calls certain Win32 routines that set the last error variable to 0 upon
  success. It should be possible to use ``GetLastError`` and
  ``SetLastError`` when tasking, protected record, and exception
  features are not used, but it is not guaranteed to work.

* It is not possible to link against Microsoft C++ libraries except for
  import libraries. Interfacing must be done by the mean of DLLs.

* It is possible to link against Microsoft C libraries. Yet the preferred
  solution is to use C/C++ compiler that comes with GNAT, since it
  doesn't require having two different development environments and makes the
  inter-language debugging experience smoother.

* When the compilation environment is located on FAT32 drives, users may
  experience recompilations of the source files that have not changed if
  Daylight Saving Time (DST) state has changed since the last time files
  were compiled. NTFS drives do not have this problem.

* No components of the GNAT toolset use any entries in the Windows
  registry. The only entries that can be created are file associations and
  PATH settings, provided the user has chosen to create them at installation
  time, as well as some minimal book-keeping information needed to correctly
  uninstall or integrate different GNAT products.


.. _Using_a_network_installation_of_GNAT:

Using a network installation of GNAT
------------------------------------

Make sure the system on which GNAT is installed is accessible from the
current machine, i.e., the install location is shared over the network.
Shared resources are accessed on Windows by means of UNC paths, which
have the format ``\\\\server\\sharename\\path``

In order to use such a network installation, simply add the UNC path of the
:file:`bin` directory of your GNAT installation in front of your PATH. For
example, if GNAT is installed in :file:`\\GNAT` directory of a share location
called :file:`c-drive` on a machine :file:`LOKI`, the following command will
make it available:

  ::

      $ path \\loki\c-drive\gnat\bin;%path%`

Be aware that every compilation using the network installation results in the
transfer of large amounts of data across the network and will likely cause
serious performance penalty.

.. _CONSOLE_and_WINDOWS_subsystems:

CONSOLE and WINDOWS subsystems
------------------------------

.. index:: CONSOLE Subsystem
.. index:: WINDOWS Subsystem
.. index:: -mwindows

There are two main subsystems under Windows. The ``CONSOLE`` subsystem
(which is the default subsystem) will always create a console when
launching the application. This is not something desirable when the
application has a Windows GUI. To get rid of this console the
application must be using the ``WINDOWS`` subsystem. To do so
the :switch:`-mwindows` linker option must be specified.

   ::

      $ gnatmake winprog -largs -mwindows

.. _Temporary_Files:

Temporary Files
---------------

.. index:: Temporary files

It is possible to control where temporary files gets created by setting
the :envvar:`TMP` environment variable. The file will be created:

* Under the directory pointed to by the :envvar:`TMP` environment variable if
  this directory exists.

* Under :file:`c:\\temp`, if the :envvar:`TMP` environment variable is not
  set (or not pointing to a directory) and if this directory exists.

* Under the current working directory otherwise.

This allows you to determine exactly where the temporary
file will be created. This is particularly useful in networked
environments where you may not have write access to some
directories.

Disabling Command Line Argument Expansion
-----------------------------------------

.. index:: Command Line Argument Expansion

By default, an executable compiled for the Windows platform will do
the following postprocessing on the arguments passed on the command
line:

* If the argument contains the characters ``*`` and/or ``?``, then
  file expansion will be attempted. For example, if the current directory
  contains :file:`a.txt` and :file:`b.txt`, then when calling::

      $ my_ada_program *.txt

  The following arguments will effectively be passed to the main program
  (for example when using ``Ada.Command_Line.Argument``)::

      Ada.Command_Line.Argument (1) -> "a.txt"
      Ada.Command_Line.Argument (2) -> "b.txt"

* Filename expansion can be disabled for a given argument by using single
  quotes. Thus, calling::

      $ my_ada_program '*.txt'

  will result in::

      Ada.Command_Line.Argument (1) -> "*.txt"

Note that if the program is launched from a shell such as Cygwin Bash
then quote removal might be performed by the shell.

In some contexts it might be useful to disable this feature (for example if
the program performs its own argument expansion). In order to do this, a C
symbol needs to be defined and set to ``0``. You can do this by
adding the following code fragment in one of your Ada units:

.. code-block:: ada

   Do_Argv_Expansion : Integer := 0;
   pragma Export (C, Do_Argv_Expansion, "__gnat_do_argv_expansion");

The results of previous examples will be respectively::

   Ada.Command_Line.Argument (1) -> "*.txt"

and::

   Ada.Command_Line.Argument (1) -> "'*.txt'"


Windows Socket Timeouts
-----------------------

Microsoft Windows desktops older than ``8.0`` and Microsoft Windows Servers
older than ``2019`` set a socket timeout 500 milliseconds longer than the value
set by setsockopt with ``SO_RCVTIMEO`` and ``SO_SNDTIMEO`` options. The GNAT
runtime makes a correction for the difference in the corresponding Windows
versions. For Windows Server starting with version ``2019``, the user must
provide a manifest file for the GNAT runtime to be able to recognize that
the Windows version does not need the timeout correction. The manifest file
should be located in the same directory as the executable file, and its file
name must match the executable name suffixed by ``.manifest``. For example,
if the executable name is :file:`sock_wto.exe`, then the manifest file name
has to be :file:`sock_wto.exe.manifest`. The manifest file must contain at
least the following data::

   <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
   <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
   <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
   <application>
      <!-- Windows Vista -->
      <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
      <!-- Windows 7 -->
      <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
      <!-- Windows 8 -->
      <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
      <!-- Windows 8.1 -->
      <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
      <!-- Windows 10 -->
      <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
   </application>
   </compatibility>
   </assembly>

Without the manifest file, the socket timeout is going to be overcorrected on
these Windows Server versions and the actual time is going to be 500
milliseconds shorter than what was set with GNAT.Sockets.Set_Socket_Option.
Note that on Microsoft Windows versions where correction is necessary, there
is no way to set a socket timeout shorter than 500 ms. If a socket timeout
shorter than 500 ms is needed on these Windows versions, a call to
Check_Selector should be added before any socket read or write operations.


.. _Mixed-Language_Programming_on_Windows:

Mixed-Language Programming on Windows
-------------------------------------

Developing pure Ada applications on Windows is no different than on
other GNAT-supported platforms. However, when developing or porting an
application that contains a mix of Ada and C/C++, the choice of your
Windows C/C++ development environment conditions your overall
interoperability strategy.

If you use ``gcc`` or Microsoft C to compile the non-Ada part of
your application, there are no Windows-specific restrictions that
affect the overall interoperability with your Ada code. If you do want
to use the Microsoft tools for your C++ code, you have two choices:

* Encapsulate your C++ code in a DLL to be linked with your Ada
  application. In this case, use the Microsoft or whatever environment to
  build the DLL and use GNAT to build your executable
  (:ref:`Using_DLLs_with_GNAT`).

* Or you can encapsulate your Ada code in a DLL to be linked with the
  other part of your application. In this case, use GNAT to build the DLL
  (:ref:`Building_DLLs_with_GNAT_Project_files`) and use the Microsoft
  or whatever environment to build your executable.

In addition to the description about C main in
:ref:`Mixed_Language_Programming` section, if the C main uses a
stand-alone library it is required on x86-windows to
setup the SEH context. For this the C main must looks like this:


  .. code-block:: c

      /* main.c */
      extern void adainit (void);
      extern void adafinal (void);
      extern void __gnat_initialize(void*);
      extern void call_to_ada (void);

      int main (int argc, char *argv[])
      {
        int SEH [2];

        /* Initialize the SEH context */
        __gnat_initialize (&SEH);

        adainit();

        /* Then call Ada services in the stand-alone library */

        call_to_ada();

        adafinal();
      }

Note that this is not needed on x86_64-windows where the Windows
native SEH support is used.


.. _Windows_Calling_Conventions:

Windows Calling Conventions
^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. index:: Stdcall
.. index:: APIENTRY

This section pertain only to Win32. On Win64 there is a single native
calling convention. All convention specifiers are ignored on this
platform.

When a subprogram ``F`` (caller) calls a subprogram ``G``
(callee), there are several ways to push ``G``\ 's parameters on the
stack and there are several possible scenarios to clean up the stack
upon ``G``\ 's return. A calling convention is an agreed upon software
protocol whereby the responsibilities between the caller (``F``) and
the callee (``G``) are clearly defined. Several calling conventions
are available for Windows:

* ``C`` (Microsoft defined)

* ``Stdcall`` (Microsoft defined)

* ``Win32`` (GNAT specific)

* ``DLL`` (GNAT specific)


.. _C_Calling_Convention:

``C`` Calling Convention
""""""""""""""""""""""""

This is the default calling convention used when interfacing to C/C++
routines compiled with either ``gcc`` or Microsoft Visual C++.

In the ``C`` calling convention subprogram parameters are pushed on the
stack by the caller from right to left. The caller itself is in charge of
cleaning up the stack after the call. In addition, the name of a routine
with ``C`` calling convention is mangled by adding a leading underscore.

The name to use on the Ada side when importing (or exporting) a routine
with ``C`` calling convention is the name of the routine. For
instance the C function:

   ::

       int get_val (long);

should be imported from Ada as follows:

  .. code-block:: ada

     function Get_Val (V : Interfaces.C.long) return Interfaces.C.int;
     pragma Import (C, Get_Val, External_Name => "get_val");

Note that in this particular case the ``External_Name`` parameter could
have been omitted since, when missing, this parameter is taken to be the
name of the Ada entity in lower case. When the ``Link_Name`` parameter
is missing, as in the above example, this parameter is set to be the
``External_Name`` with a leading underscore.

When importing a variable defined in C, you should always use the ``C``
calling convention unless the object containing the variable is part of a
DLL (in which case you should use the ``Stdcall`` calling
convention, :ref:`Stdcall_Calling_Convention`).


.. _Stdcall_Calling_Convention:

``Stdcall`` Calling Convention
""""""""""""""""""""""""""""""

This convention, which was the calling convention used for Pascal
programs, is used by Microsoft for all the routines in the Win32 API for
efficiency reasons. It must be used to import any routine for which this
convention was specified.

In the ``Stdcall`` calling convention subprogram parameters are pushed
on the stack by the caller from right to left. The callee (and not the
caller) is in charge of cleaning the stack on routine exit. In addition,
the name of a routine with ``Stdcall`` calling convention is mangled by
adding a leading underscore (as for the ``C`` calling convention) and a
trailing :samp:`@{nn}`, where ``nn`` is the overall size (in
bytes) of the parameters passed to the routine.

The name to use on the Ada side when importing a C routine with a
``Stdcall`` calling convention is the name of the C routine. The leading
underscore and trailing :samp:`@{nn}` are added automatically by
the compiler. For instance the Win32 function:

  ::

      APIENTRY int get_val (long);

should be imported from Ada as follows:

  .. code-block:: ada

     function Get_Val (V : Interfaces.C.long) return Interfaces.C.int;
     pragma Import (Stdcall, Get_Val);
     --  On the x86 a long is 4 bytes, so the Link_Name is "_get_val@4"

As for the ``C`` calling convention, when the ``External_Name``
parameter is missing, it is taken to be the name of the Ada entity in lower
case. If instead of writing the above import pragma you write:

  .. code-block:: ada

     function Get_Val (V : Interfaces.C.long) return Interfaces.C.int;
     pragma Import (Stdcall, Get_Val, External_Name => "retrieve_val");

then the imported routine is ``_retrieve_val@4``. However, if instead
of specifying the ``External_Name`` parameter you specify the
``Link_Name`` as in the following example:

  .. code-block:: ada

     function Get_Val (V : Interfaces.C.long) return Interfaces.C.int;
     pragma Import (Stdcall, Get_Val, Link_Name => "retrieve_val");

then the imported routine is ``retrieve_val``, that is, there is no
decoration at all. No leading underscore and no Stdcall suffix
:samp:`@{nn}`.

This is especially important as in some special cases a DLL's entry
point name lacks a trailing :samp:`@{nn}` while the exported
name generated for a call has it.

It is also possible to import variables defined in a DLL by using an
import pragma for a variable. As an example, if a DLL contains a
variable defined as:

  .. code-block:: c

     int my_var;

then, to access this variable from Ada you should write:

  .. code-block:: ada

      My_Var : Interfaces.C.int;
      pragma Import (Stdcall, My_Var);

Note that to ease building cross-platform bindings this convention
will be handled as a ``C`` calling convention on non-Windows platforms.


.. _Win32_Calling_Convention:

``Win32`` Calling Convention
""""""""""""""""""""""""""""

This convention, which is GNAT-specific is fully equivalent to the
``Stdcall`` calling convention described above.


.. _DLL_Calling_Convention:

``DLL`` Calling Convention
""""""""""""""""""""""""""

This convention, which is GNAT-specific is fully equivalent to the
``Stdcall`` calling convention described above.


.. _Introduction_to_Dynamic_Link_Libraries_DLLs:

Introduction to Dynamic Link Libraries (DLLs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. index:: DLL

A Dynamically Linked Library (DLL) is a library that can be shared by
several applications running under Windows. A DLL can contain any number of
routines and variables.

One advantage of DLLs is that you can change and enhance them without
forcing all the applications that depend on them to be relinked or
recompiled. However, you should be aware than all calls to DLL routines are
slower since, as you will understand below, such calls are indirect.

To illustrate the remainder of this section, suppose that an application
wants to use the services of a DLL :file:`API.dll`. To use the services
provided by :file:`API.dll` you must statically link against the DLL or
an import library which contains a jump table with an entry for each
routine and variable exported by the DLL. In the Microsoft world this
import library is called :file:`API.lib`. When using GNAT this import
library is called either :file:`libAPI.dll.a`, :file:`libapi.dll.a`,
:file:`libAPI.a` or :file:`libapi.a` (names are case insensitive).

After you have linked your application with the DLL or the import library
and you run your application, here is what happens:

* Your application is loaded into memory.

* The DLL :file:`API.dll` is mapped into the address space of your
  application. This means that:

  - The DLL will use the stack of the calling thread.

  - The DLL will use the virtual address space of the calling process.

  - The DLL will allocate memory from the virtual address space of the calling
    process.

  - Handles (pointers) can be safely exchanged between routines in the DLL
    routines and routines in the application using the DLL.

* The entries in the jump table (from the import library :file:`libAPI.dll.a`
  or :file:`API.lib` or automatically created when linking against a DLL)
  which is part of your application are initialized with the addresses
  of the routines and variables in :file:`API.dll`.

* If present in :file:`API.dll`, routines ``DllMain`` or
  ``DllMainCRTStartup`` are invoked. These routines typically contain
  the initialization code needed for the well-being of the routines and
  variables exported by the DLL.

There is an additional point which is worth mentioning. In the Windows
world there are two kind of DLLs: relocatable and non-relocatable
DLLs. Non-relocatable DLLs can only be loaded at a very specific address
in the target application address space. If the addresses of two
non-relocatable DLLs overlap and these happen to be used by the same
application, a conflict will occur and the application will run
incorrectly. Hence, when possible, it is always preferable to use and
build relocatable DLLs. Both relocatable and non-relocatable DLLs are
supported by GNAT. Note that the :switch:`-s` linker option (see GNU Linker
User's Guide) removes the debugging symbols from the DLL but the DLL can
still be relocated.

As a side note, an interesting difference between Microsoft DLLs and
Unix shared libraries, is the fact that on most Unix systems all public
routines are exported by default in a Unix shared library, while under
Windows it is possible (but not required) to list exported routines in
a definition file (see :ref:`The Definition File <The_Definition_File>`).


.. _Using_DLLs_with_GNAT:

Using DLLs with GNAT
^^^^^^^^^^^^^^^^^^^^

To use the services of a DLL, say :file:`API.dll`, in your Ada application
you must have:

* The Ada spec for the routines and/or variables you want to access in
  :file:`API.dll`. If not available this Ada spec must be built from the C/C++
  header files provided with the DLL.

* The import library (:file:`libAPI.dll.a` or :file:`API.lib`). As previously
  mentioned an import library is a statically linked library containing the
  import table which will be filled at load time to point to the actual
  :file:`API.dll` routines. Sometimes you don't have an import library for the
  DLL you want to use. The following sections will explain how to build
  one. Note that this is optional.

* The actual DLL, :file:`API.dll`.

Once you have all the above, to compile an Ada application that uses the
services of :file:`API.dll` and whose main subprogram is ``My_Ada_App``,
you simply issue the command

  ::

      $ gnatmake my_ada_app -largs -lAPI

The argument :switch:`-largs -lAPI` at the end of the ``gnatmake`` command
tells the GNAT linker to look for an import library. The linker will
look for a library name in this specific order:

* :file:`libAPI.dll.a`
* :file:`API.dll.a`
* :file:`libAPI.a`
* :file:`API.lib`
* :file:`libAPI.dll`
* :file:`API.dll`

The first three are the GNU style import libraries. The third is the
Microsoft style import libraries. The last two are the actual DLL names.

Note that if the Ada package spec for :file:`API.dll` contains the
following pragma

  .. code-block:: ada

      pragma Linker_Options ("-lAPI");

you do not have to add :switch:`-largs -lAPI` at the end of the
``gnatmake`` command.

If any one of the items above is missing you will have to create it
yourself. The following sections explain how to do so using as an
example a fictitious DLL called :file:`API.dll`.


.. _Creating_an_Ada_Spec_for_the_DLL_Services:

Creating an Ada Spec for the DLL Services
"""""""""""""""""""""""""""""""""""""""""

A DLL typically comes with a C/C++ header file which provides the
definitions of the routines and variables exported by the DLL. The Ada
equivalent of this header file is a package spec that contains definitions
for the imported entities. If the DLL you intend to use does not come with
an Ada spec you have to generate one such spec yourself. For example if
the header file of :file:`API.dll` is a file :file:`api.h` containing the
following two definitions:

  .. code-block:: c

      int some_var;
      int get (char *);

then the equivalent Ada spec could be:

  .. code-block:: ada

      with Interfaces.C.Strings;
      package API is
         use Interfaces;

         Some_Var : C.int;
         function Get (Str : C.Strings.Chars_Ptr) return C.int;

      private
         pragma Import (C, Get);
         pragma Import (DLL, Some_Var);
      end API;


.. _Creating_an_Import_Library:

Creating an Import Library
""""""""""""""""""""""""""

.. index:: Import library

If a Microsoft-style import library :file:`API.lib` or a GNAT-style
import library :file:`libAPI.dll.a` or :file:`libAPI.a` is available
with :file:`API.dll` you can skip this section. You can also skip this
section if :file:`API.dll` or :file:`libAPI.dll` is built with GNU tools
as in this case it is possible to link directly against the
DLL. Otherwise read on.


.. index:: Definition file

.. _The_Definition_File:

.. rubric:: The Definition File

As previously mentioned, and unlike Unix systems, the list of symbols
that are exported from a DLL must be provided explicitly in Windows.
The main goal of a definition file is precisely that: list the symbols
exported by a DLL. A definition file (usually a file with a ``.def``
suffix) has the following structure:

  ::

      [LIBRARY ``name``]
      [DESCRIPTION ``string``]
      EXPORTS
         ``symbol1``
         ``symbol2``
         ...

*LIBRARY name*
  This section, which is optional, gives the name of the DLL.


*DESCRIPTION string*
  This section, which is optional, gives a description string that will be
  embedded in the import library.


*EXPORTS*
  This section gives the list of exported symbols (procedures, functions or
  variables). For instance in the case of :file:`API.dll` the ``EXPORTS``
  section of :file:`API.def` looks like:

  ::

      EXPORTS
         some_var
         get

Note that you must specify the correct suffix (:samp:`@{nn}`)
(see :ref:`Windows_Calling_Conventions`) for a Stdcall
calling convention function in the exported symbols list.

There can actually be other sections in a definition file, but these
sections are not relevant to the discussion at hand.


.. _Create_Def_File_Automatically:

.. rubric:: Creating a Definition File Automatically

You can automatically create the definition file :file:`API.def`
(see :ref:`The Definition File <The_Definition_File>`) from a DLL.
For that use the ``dlltool`` program as follows:

  ::

      $ dlltool API.dll -z API.def --export-all-symbols

  Note that if some routines in the DLL have the ``Stdcall`` convention
  (:ref:`Windows_Calling_Conventions`) with stripped :samp:`@{nn}`
  suffix then you'll have to edit :file:`api.def` to add it, and specify
  :switch:`-k` to ``gnatdll`` when creating the import library.

  Here are some hints to find the right :samp:`@{nn}` suffix.

  - If you have the Microsoft import library (.lib), it is possible to get
    the right symbols by using Microsoft ``dumpbin`` tool (see the
    corresponding Microsoft documentation for further details).

    ::

        $ dumpbin /exports api.lib

  - If you have a message about a missing symbol at link time the compiler
    tells you what symbol is expected. You just have to go back to the
    definition file and add the right suffix.


.. _GNAT-Style_Import_Library:

.. rubric:: GNAT-Style Import Library

To create a static import library from :file:`API.dll` with the GNAT tools
you should create the .def file, then use ``gnatdll`` tool
(see :ref:`Using_gnatdll`) as follows:

  ::

      $ gnatdll -e API.def -d API.dll

  ``gnatdll`` takes as input a definition file :file:`API.def` and the
  name of the DLL containing the services listed in the definition file
  :file:`API.dll`. The name of the static import library generated is
  computed from the name of the definition file as follows: if the
  definition file name is :file:`xyz.def`, the import library name will
  be :file:`libxyz.a`. Note that in the previous example option
  :switch:`-e` could have been removed because the name of the definition
  file (before the ``.def`` suffix) is the same as the name of the
  DLL (:ref:`Using_gnatdll` for more information about ``gnatdll``).


.. _MSVS-Style_Import_Library:

.. rubric:: Microsoft-Style Import Library

A Microsoft import library is needed only if you plan to make an
Ada DLL available to applications developed with Microsoft
tools (:ref:`Mixed-Language_Programming_on_Windows`).

To create a Microsoft-style import library for :file:`API.dll` you
should create the .def file, then build the actual import library using
Microsoft's ``lib`` utility:

  ::

      $ lib -machine:IX86 -def:API.def -out:API.lib

  If you use the above command the definition file :file:`API.def` must
  contain a line giving the name of the DLL:

  ::

      LIBRARY      "API"

  See the Microsoft documentation for further details about the usage of
  ``lib``.


.. _Building_DLLs_with_GNAT_Project_files:

Building DLLs with GNAT Project files
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. index:: DLLs, building

There is nothing specific to Windows in the build process.
See the *Library Projects* section in the *GNAT Project Manager*
chapter of the *GPRbuild User's Guide*.

Due to a system limitation, it is not possible under Windows to create threads
when inside the ``DllMain`` routine which is used for auto-initialization
of shared libraries, so it is not possible to have library level tasks in SALs.


.. _Building_DLLs_with_GNAT:

Building DLLs with GNAT
^^^^^^^^^^^^^^^^^^^^^^^

.. index:: DLLs, building

This section explain how to build DLLs using the GNAT built-in DLL
support. With the following procedure it is straight forward to build
and use DLLs with GNAT.


* Building object files.
  The first step is to build all objects files that are to be included
  into the DLL. This is done by using the standard ``gnatmake`` tool.

* Building the DLL.
  To build the DLL you must use the ``gcc`` :switch:`-shared` and
  :switch:`-shared-libgcc` options. It is quite simple to use this method:

  ::

      $ gcc -shared -shared-libgcc -o api.dll obj1.o obj2.o ...

  It is important to note that in this case all symbols found in the
  object files are automatically exported. It is possible to restrict
  the set of symbols to export by passing to ``gcc`` a definition
  file (see :ref:`The Definition File <The_Definition_File>`).
  For example:

  ::

      $ gcc -shared -shared-libgcc -o api.dll api.def obj1.o obj2.o ...

  If you use a definition file you must export the elaboration procedures
  for every package that required one. Elaboration procedures are named
  using the package name followed by "_E".

* Preparing DLL to be used.
  For the DLL to be used by client programs the bodies must be hidden
  from it and the .ali set with read-only attribute. This is very important
  otherwise GNAT will recompile all packages and will not actually use
  the code in the DLL. For example:

  ::

      $ mkdir apilib
      $ copy *.ads *.ali api.dll apilib
      $ attrib +R apilib\\*.ali

At this point it is possible to use the DLL by directly linking
against it. Note that you must use the GNAT shared runtime when using
GNAT shared libraries. This is achieved by using the :switch:`-shared` binder
option.

  ::

     $ gnatmake main -Iapilib -bargs -shared -largs -Lapilib -lAPI


.. _Building_DLLs_with_gnatdll:

Building DLLs with gnatdll
^^^^^^^^^^^^^^^^^^^^^^^^^^

.. index:: DLLs, building

Note that it is preferred to use GNAT Project files
(:ref:`Building_DLLs_with_GNAT_Project_files`) or the built-in GNAT
DLL support (:ref:`Building_DLLs_with_GNAT`) or to build DLLs.

This section explains how to build DLLs containing Ada code using
``gnatdll``. These DLLs will be referred to as Ada DLLs in the
remainder of this section.

The steps required to build an Ada DLL that is to be used by Ada as well as
non-Ada applications are as follows:

* You need to mark each Ada entity exported by the DLL with a ``C`` or
  ``Stdcall`` calling convention to avoid any Ada name mangling for the
  entities exported by the DLL
  (see :ref:`Exporting Ada Entities <Exporting_Ada_Entities>`). You can
  skip this step if you plan to use the Ada DLL only from Ada applications.

* Your Ada code must export an initialization routine which calls the routine
  ``adainit`` generated by ``gnatbind`` to perform the elaboration of
  the Ada code in the DLL (:ref:`Ada_DLLs_and_Elaboration`). The initialization
  routine exported by the Ada DLL must be invoked by the clients of the DLL
  to initialize the DLL.

* When useful, the DLL should also export a finalization routine which calls
  routine ``adafinal`` generated by ``gnatbind`` to perform the
  finalization of the Ada code in the DLL (:ref:`Ada_DLLs_and_Finalization`).
  The finalization routine exported by the Ada DLL must be invoked by the
  clients of the DLL when the DLL services are no further needed.

* You must provide a spec for the services exported by the Ada DLL in each
  of the programming languages to which you plan to make the DLL available.

* You must provide a definition file listing the exported entities
  (:ref:`The Definition File <The_Definition_File>`).

* Finally you must use ``gnatdll`` to produce the DLL and the import
  library (:ref:`Using_gnatdll`).

Note that a relocatable DLL stripped using the ``strip``
binutils tool will not be relocatable anymore. To build a DLL without
debug information pass :switch:`-largs -s` to ``gnatdll``. This
restriction does not apply to a DLL built using a Library Project.
See the *Library Projects* section in the *GNAT Project Manager*
chapter of the *GPRbuild User's Guide*.


.. Limitations_When_Using_Ada_DLLs_from Ada:

Limitations When Using Ada DLLs from Ada
""""""""""""""""""""""""""""""""""""""""

When using Ada DLLs from Ada applications there is a limitation users
should be aware of. Because on Windows the GNAT run-time is not in a DLL of
its own, each Ada DLL includes a part of the GNAT run-time. Specifically,
each Ada DLL includes the services of the GNAT run-time that are necessary
to the Ada code inside the DLL. As a result, when an Ada program uses an
Ada DLL there are two independent GNAT run-times: one in the Ada DLL and
one in the main program.

It is therefore not possible to exchange GNAT run-time objects between the
Ada DLL and the main Ada program. Example of GNAT run-time objects are file
handles (e.g., ``Text_IO.File_Type``), tasks types, protected objects
types, etc.

It is completely safe to exchange plain elementary, array or record types,
Windows object handles, etc.


.. _Exporting_Ada_Entities:

Exporting Ada Entities
""""""""""""""""""""""

.. index:: Export table

Building a DLL is a way to encapsulate a set of services usable from any
application. As a result, the Ada entities exported by a DLL should be
exported with the ``C`` or ``Stdcall`` calling conventions to avoid
any Ada name mangling. As an example here is an Ada package
``API``, spec and body, exporting two procedures, a function, and a
variable:


  .. code-block:: ada

     with Interfaces.C; use Interfaces;
     package API is
        Count : C.int := 0;
        function Factorial (Val : C.int) return C.int;

        procedure Initialize_API;
        procedure Finalize_API;
        --  Initialization & Finalization routines. More in the next section.
     private
        pragma Export (C, Initialize_API);
        pragma Export (C, Finalize_API);
        pragma Export (C, Count);
        pragma Export (C, Factorial);
     end API;

  .. code-block:: ada

     package body API is
        function Factorial (Val : C.int) return C.int is
           Fact : C.int := 1;
        begin
           Count := Count + 1;
           for K in 1 .. Val loop
              Fact := Fact * K;
           end loop;
           return Fact;
        end Factorial;

        procedure Initialize_API is
           procedure Adainit;
           pragma Import (C, Adainit);
        begin
           Adainit;
        end Initialize_API;

        procedure Finalize_API is
           procedure Adafinal;
           pragma Import (C, Adafinal);
        begin
           Adafinal;
        end Finalize_API;
     end API;

If the Ada DLL you are building will only be used by Ada applications
you do not have to export Ada entities with a ``C`` or ``Stdcall``
convention. As an example, the previous package could be written as
follows:

  .. code-block:: ada

     package API is
        Count : Integer := 0;
        function Factorial (Val : Integer) return Integer;

        procedure Initialize_API;
        procedure Finalize_API;
        --  Initialization and Finalization routines.
     end API;

  .. code-block:: ada

     package body API is
        function Factorial (Val : Integer) return Integer is
           Fact : Integer := 1;
        begin
           Count := Count + 1;
           for K in 1 .. Val loop
              Fact := Fact * K;
           end loop;
           return Fact;
        end Factorial;

        ...
        --  The remainder of this package body is unchanged.
     end API;

Note that if you do not export the Ada entities with a ``C`` or
``Stdcall`` convention you will have to provide the mangled Ada names
in the definition file of the Ada DLL
(:ref:`Creating_the_Definition_File`).


.. _Ada_DLLs_and_Elaboration:

Ada DLLs and Elaboration
""""""""""""""""""""""""

.. index:: DLLs and elaboration

The DLL that you are building contains your Ada code as well as all the
routines in the Ada library that are needed by it. The first thing a
user of your DLL must do is elaborate the Ada code
(:ref:`Elaboration_Order_Handling_in_GNAT`).

To achieve this you must export an initialization routine
(``Initialize_API`` in the previous example), which must be invoked
before using any of the DLL services. This elaboration routine must call
the Ada elaboration routine ``adainit`` generated by the GNAT binder
(:ref:`Binding_with_Non-Ada_Main_Programs`). See the body of
``Initialize_Api`` for an example. Note that the GNAT binder is
automatically invoked during the DLL build process by the ``gnatdll``
tool (:ref:`Using_gnatdll`).

When a DLL is loaded, Windows systematically invokes a routine called
``DllMain``. It would therefore be possible to call ``adainit``
directly from ``DllMain`` without having to provide an explicit
initialization routine. Unfortunately, it is not possible to call
``adainit`` from the ``DllMain`` if your program has library level
tasks because access to the ``DllMain`` entry point is serialized by
the system (that is, only a single thread can execute 'through' it at a
time), which means that the GNAT run-time will deadlock waiting for the
newly created task to complete its initialization.


.. _Ada_DLLs_and_Finalization:

Ada DLLs and Finalization
^^^^^^^^^^^^^^^^^^^^^^^^^

.. index:: DLLs and finalization

When the services of an Ada DLL are no longer needed, the client code should
invoke the DLL finalization routine, if available. The DLL finalization
routine is in charge of releasing all resources acquired by the DLL. In the
case of the Ada code contained in the DLL, this is achieved by calling
routine ``adafinal`` generated by the GNAT binder
(:ref:`Binding_with_Non-Ada_Main_Programs`).
See the body of ``Finalize_Api`` for an
example. As already pointed out the GNAT binder is automatically invoked
during the DLL build process by the ``gnatdll`` tool
(:ref:`Using_gnatdll`).


.. _Creating_a_Spec_for_Ada_DLLs:

Creating a Spec for Ada DLLs
^^^^^^^^^^^^^^^^^^^^^^^^^^^^

To use the services exported by the Ada DLL from another programming
language (e.g., C), you have to translate the specs of the exported Ada
entities in that language. For instance in the case of ``API.dll``,
the corresponding C header file could look like:

  .. code-block:: c

     extern int *_imp__count;
     #define count (*_imp__count)
     int factorial (int);

It is important to understand that when building an Ada DLL to be used by
other Ada applications, you need two different specs for the packages
contained in the DLL: one for building the DLL and the other for using
the DLL. This is because the ``DLL`` calling convention is needed to
use a variable defined in a DLL, but when building the DLL, the variable
must have either the ``Ada`` or ``C`` calling convention. As an
example consider a DLL comprising the following package ``API``:

  .. code-block:: ada

     package API is
        Count : Integer := 0;
        ...
        --  Remainder of the package omitted.
     end API;

After producing a DLL containing package ``API``, the spec that
must be used to import ``API.Count`` from Ada code outside of the
DLL is:

  .. code-block:: ada

     package API is
        Count : Integer;
        pragma Import (DLL, Count);
     end API;


.. _Creating_the_Definition_File:

Creating the Definition File
""""""""""""""""""""""""""""

The definition file is the last file needed to build the DLL. It lists
the exported symbols. As an example, the definition file for a DLL
containing only package ``API`` (where all the entities are exported
with a ``C`` calling convention) is:

  ::

    EXPORTS
        count
        factorial
        finalize_api
        initialize_api

If the ``C`` calling convention is missing from package ``API``,
then the definition file contains the mangled Ada names of the above
entities, which in this case are:

  ::

    EXPORTS
        api__count
        api__factorial
        api__finalize_api
        api__initialize_api


.. _Using_gnatdll:

Using ``gnatdll``
"""""""""""""""""

.. index:: gnatdll

``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``:


  .. index:: -a (gnatdll)

:switch:`-a[{address}]`
  Build a non-relocatable DLL at ``address``. If ``address`` is not
  specified the default address ``0x11000000`` will be used. By default,
  when this switch is missing, ``gnatdll`` builds relocatable DLL. We
  advise the reader to build relocatable DLL.


  .. index:: -b (gnatdll)

:switch:`-b {address}`
  Set the relocatable DLL base address. By default the address is
  ``0x11000000``.


  .. index:: -bargs (gnatdll)

:switch:`-bargs {opts}`
  Binder options. Pass ``opts`` to the binder.


  .. index:: -d (gnatdll)

:switch:`-d {dllfile}`
  ``dllfile`` is the name of the DLL. This switch must be present for
  ``gnatdll`` to do anything. The name of the generated import library is
  obtained algorithmically from ``dllfile`` as shown in the following
  example: if ``dllfile`` is :file:`xyz.dll`, the import library name is
  :file:`libxyz.dll.a`. The name of the definition file to use (if not specified
  by option :switch:`-e`) is obtained algorithmically from ``dllfile``
  as shown in the following example:
  if ``dllfile`` is :file:`xyz.dll`, the definition
  file used is :file:`xyz.def`.


  .. index:: -e (gnatdll)

:switch:`-e {deffile}`
  ``deffile`` is the name of the definition file.


  .. index:: -g (gnatdll)

:switch:`-g`
  Generate debugging information. This information is stored in the object
  file and copied from there to the final DLL file by the linker,
  where it can be read by the debugger. You must use the
  :switch:`-g` switch if you plan on using the debugger or the symbolic
  stack traceback.


  .. index:: -h (gnatdll)

:switch:`-h`
  Help mode. Displays ``gnatdll`` switch usage information.


  .. index:: -I (gnatdll)

:switch:`-I{dir}`
  Direct ``gnatdll`` to search the ``dir`` directory for source and
  object files needed to build the DLL.
  (:ref:`Search_Paths_and_the_Run-Time_Library_RTL`).


  .. index:: -k (gnatdll)

:switch:`-k`
  Removes the :samp:`@{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 :samp:`@{nn}` suffix has been removed. This is the case for most
  of the Windows NT DLL for example. This option has no effect when
  :switch:`-n` option is specified.


  .. index:: -l (gnatdll)

:switch:`-l {file}`
  The list of ALI and object files used to build the DLL are listed in
  ``file``, instead of being given in the command line. Each line in
  ``file`` contains the name of an ALI or object file.


  .. index:: -n (gnatdll)

:switch:`-n`
  No Import. Do not create the import library.


  .. index:: -q (gnatdll)

:switch:`-q`
  Quiet mode. Do not display unnecessary messages.


  .. index:: -v (gnatdll)

:switch:`-v`
  Verbose mode. Display extra information.


  .. index:: -largs (gnatdll)

:switch:`-largs {opts}`
  Linker options. Pass ``opts`` to the linker.


.. rubric:: ``gnatdll`` Example

As an example the command to build a relocatable DLL from :file:`api.adb`
once :file:`api.adb` has been compiled and :file:`api.def` created is

  ::

     $ gnatdll -d api.dll api.ali

The above command creates two files: :file:`libapi.dll.a` (the import
library) and :file:`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


.. rubric:: ``gnatdll`` behind the Scenes

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 :file:`api.o` and
:file:`api.ali` are available. To build a relocatable DLL, ``gnatdll`` does
the following:

* ``gnatdll`` builds the base file (:file:`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 :file:`api.jnk` which can be discarded. The :switch:`-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.

* ``gnatdll`` uses ``dlltool`` (see :ref:`Using dlltool <Using_dlltool>`) to build the
  export table (:file:`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

* ``gnatdll`` builds the base file using the new export table. Note that
  ``gnatbind`` must be called once again since the binder generated file
  has been deleted during the previous call to ``gnatlink``.

  ::

      $ gnatbind -n api
      $ gnatlink api -o api.jnk api.exp -mdll
            -Wl,--base-file,api.base


* ``gnatdll`` builds the new export table using the new base file and
  generates the DLL import library :file:`libAPI.dll.a`.


  ::

      $ dlltool --dllname api.dll --def api.def --base-file api.base \\
                --output-exp api.exp --output-lib libAPI.a

* Finally ``gnatdll`` builds the relocatable DLL using the final export
  table.

  ::

      $ gnatbind -n api
      $ gnatlink api api.exp -o api.dll -mdll


.. _Using_dlltool:

.. rubric:: Using ``dlltool``

``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:


.. index:: --base-file (dlltool)

:switch:`--base-file {basefile}`
  Read the base file ``basefile`` generated by the linker. This switch
  is used to create a relocatable DLL.


.. index:: --def (dlltool)

:switch:`--def {deffile}`
  Read the definition file.


.. index:: --dllname (dlltool)

:switch:`--dllname {name}`
  Gives the name of the DLL. This switch is used to embed the name of the
  DLL in the static import library generated by ``dlltool`` with switch
  :switch:`--output-lib`.


.. index:: -k (dlltool)

:switch:`-k`
  Kill :samp:`@{nn}` from exported names
  (:ref:`Windows_Calling_Conventions`
  for a discussion about ``Stdcall``-style symbols.


.. index:: --help (dlltool)

:switch:`--help`
  Prints the ``dlltool`` switches with a concise description.


.. index:: --output-exp (dlltool)

:switch:`--output-exp {exportfile}`
  Generate an export file ``exportfile``. The export file contains the
  export table (list of symbols in the DLL) and is used to create the DLL.


.. index:: --output-lib (dlltool)

:switch:`--output-lib {libfile}`
  Generate a static import library ``libfile``.


.. index:: -v (dlltool)

:switch:`-v`
  Verbose mode.


.. index:: --as (dlltool)

:switch:`--as {assembler-name}`
  Use ``assembler-name`` as the assembler. The default is ``as``.


.. _GNAT_and_Windows_Resources:

GNAT and Windows Resources
^^^^^^^^^^^^^^^^^^^^^^^^^^

.. index:: Resources, windows

Resources are an easy way to add Windows specific objects to your
application. The objects that can be added as resources include:

* menus

* accelerators

* dialog boxes

* string tables

* bitmaps

* cursors

* icons

* fonts

* version information

For example, a version information resource can be defined as follow and
embedded into an executable or DLL:

A version information resource can be used to embed information into an
executable or a DLL. These information can be viewed using the file properties
from the Windows Explorer. Here is an example of a version information
resource:

  ::

     1 VERSIONINFO
     FILEVERSION     1,0,0,0
     PRODUCTVERSION  1,0,0,0
     BEGIN
       BLOCK "StringFileInfo"
       BEGIN
         BLOCK "080904E4"
         BEGIN
           VALUE "CompanyName", "My Company Name"
           VALUE "FileDescription", "My application"
           VALUE "FileVersion", "1.0"
           VALUE "InternalName", "my_app"
           VALUE "LegalCopyright", "My Name"
           VALUE "OriginalFilename", "my_app.exe"
           VALUE "ProductName", "My App"
           VALUE "ProductVersion", "1.0"
         END
       END

       BLOCK "VarFileInfo"
       BEGIN
         VALUE "Translation", 0x809, 1252
       END
     END

The value ``0809`` (langID) is for the U.K English language and
``04E4`` (charsetID), which is equal to ``1252`` decimal, for
multilingual.

This section explains how to build, compile and use resources. Note that this
section does not cover all resource objects, for a complete description see
the corresponding Microsoft documentation.


.. _Building_Resources:

Building Resources
""""""""""""""""""

.. index:: Resources, building

A resource file is an ASCII file. By convention resource files have an
:file:`.rc` extension.
The easiest way to build a resource file is to use Microsoft tools
such as ``imagedit.exe`` to build bitmaps, icons and cursors and
``dlgedit.exe`` to build dialogs.
It is always possible to build an :file:`.rc` file yourself by writing a
resource script.

It is not our objective to explain how to write a resource file. A
complete description of the resource script language can be found in the
Microsoft documentation.


.. _Compiling_Resources:

Compiling Resources
"""""""""""""""""""

.. index:: rc
.. index:: windres
.. index:: Resources, compiling

This section describes how to build a GNAT-compatible (COFF) object file
containing the resources. This is done using the Resource Compiler
``windres`` as follows:

  ::

     $ windres -i myres.rc -o myres.o

By default ``windres`` will run ``gcc`` to preprocess the :file:`.rc`
file. You can specify an alternate preprocessor (usually named
:file:`cpp.exe`) using the ``windres`` :switch:`--preprocessor`
parameter. A list of all possible options may be obtained by entering
the command ``windres`` :switch:`--help`.

It is also possible to use the Microsoft resource compiler ``rc.exe``
to produce a :file:`.res` file (binary resource file). See the
corresponding Microsoft documentation for further details. In this case
you need to use ``windres`` to translate the :file:`.res` file to a
GNAT-compatible object file as follows:

  ::

     $ windres -i myres.res -o myres.o


.. _Using_Resources:

Using Resources
"""""""""""""""

.. index:: Resources, using

To include the resource file in your program just add the
GNAT-compatible object file for the resource(s) to the linker
arguments. With ``gnatmake`` this is done by using the :switch:`-largs`
option:

  ::

    $ gnatmake myprog -largs myres.o


.. _Using_GNAT_DLL_from_MSVS:

Using GNAT DLLs from Microsoft Visual Studio Applications
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. index:: Microsoft Visual Studio, use with GNAT DLLs

This section describes a common case of mixed GNAT/Microsoft Visual Studio
application development, where the main program is developed using MSVS, and
is linked with a DLL developed using GNAT. Such a mixed application should
be developed following the general guidelines outlined above; below is the
cookbook-style sequence of steps to follow:

1. First develop and build the GNAT shared library using a library project
   (let's assume the project is :file:`mylib.gpr`, producing the library :file:`libmylib.dll`):

  ::

     $ gprbuild -p mylib.gpr

2. Produce a .def file for the symbols you need to interface with, either by
   hand or automatically with possibly some manual adjustments
   (see :ref:`Creating Definition File Automatically <Create_Def_File_Automatically>`):

  ::

     $ dlltool libmylib.dll -z libmylib.def --export-all-symbols

3. Make sure that MSVS command-line tools are accessible on the path.

4. Create the Microsoft-style import library (see :ref:`MSVS-Style Import Library <MSVS-Style_Import_Library>`):

  ::

     $ lib -machine:IX86 -def:libmylib.def -out:libmylib.lib

If you are using a 64-bit toolchain, the above becomes...

  ::

     $ lib -machine:X64 -def:libmylib.def -out:libmylib.lib

5. Build the C main

  ::

     $ cl /O2 /MD main.c libmylib.lib

6. Before running the executable, make sure you have set the PATH to the DLL,
   or copy the DLL into into the directory containing the .exe.


.. _Debugging_a_DLL:

Debugging a DLL
^^^^^^^^^^^^^^^

.. index:: DLL debugging

Debugging a DLL is similar to debugging a standard program. But
we have to deal with two different executable parts: the DLL and the
program that uses it. We have the following four possibilities:

* The program and the DLL are built with GCC/GNAT.
* The program is built with foreign tools and the DLL is built with
  GCC/GNAT.
* The program is built with GCC/GNAT and the DLL is built with
  foreign tools.

In this section we address only cases one and two above.
There is no point in trying to debug
a DLL with GNU/GDB, if there is no GDB-compatible debugging
information in it. To do so you must use a debugger compatible with the
tools suite used to build the DLL.

.. _Program_and_DLL_Both_Built_with_GCC/GNAT:

Program and DLL Both Built with GCC/GNAT
""""""""""""""""""""""""""""""""""""""""

This is the simplest case. Both the DLL and the program have ``GDB``
compatible debugging information. It is then possible to break anywhere in
the process. Let's suppose here that the main procedure is named
``ada_main`` and that in the DLL there is an entry point named
``ada_dll``.

The DLL (:ref:`Introduction_to_Dynamic_Link_Libraries_DLLs`) and
program must have been built with the debugging information (see GNAT -g
switch). Here are the step-by-step instructions for debugging it:

* Launch ``GDB`` on the main program.

  ::

     $ gdb -nw ada_main

* Start the program and stop at the beginning of the main procedure

  ::

      (gdb) start

  This step is required to be able to set a breakpoint inside the DLL. As long
  as the program is not run, the DLL is not loaded. This has the
  consequence that the DLL debugging information is also not loaded, so it is not
  possible to set a breakpoint in the DLL.

* Set a breakpoint inside the DLL

  ::

      (gdb) break ada_dll
      (gdb) cont

At this stage a breakpoint is set inside the DLL. From there on
you can use the standard approach to debug the whole program
(:ref:`Running_and_Debugging_Ada_Programs`).


.. _Program_Built_with_Foreign_Tools_and_DLL_Built_with_GCC/GNAT:

Program Built with Foreign Tools and DLL Built with GCC/GNAT
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

In this case things are slightly more complex because it is not possible to
start the main program and then break at the beginning to load the DLL and the
associated DLL debugging information. It is not possible to break at the
beginning of the program because there is no ``GDB`` debugging information,
and therefore there is no direct way of getting initial control. This
section addresses this issue by describing some methods that can be used
to break somewhere in the DLL to debug it.

First suppose that the main procedure is named ``main`` (this is for
example some C code built with Microsoft Visual C) and that there is a
DLL named ``test.dll`` containing an Ada entry point named
``ada_dll``.

The DLL (see :ref:`Introduction_to_Dynamic_Link_Libraries_DLLs`) must have
been built with debugging information (see the GNAT :switch:`-g` option).


.. rubric:: Debugging the DLL Directly

* Find out the executable starting address

  ::

      $ objdump --file-header main.exe

  The starting address is reported on the last line. For example:

  ::

      main.exe:     file format pei-i386
      architecture: i386, flags 0x0000010a:
      EXEC_P, HAS_DEBUG, D_PAGED
      start address 0x00401010

* Launch the debugger on the executable.

  ::

      $ gdb main.exe

* Set a breakpoint at the starting address, and launch the program.

  ::

      $ (gdb) break *0x00401010
      $ (gdb) run

  The program will stop at the given address.

* Set a breakpoint on a DLL subroutine.

  ::

    (gdb) break ada_dll.adb:45

  Or if you want to break using a symbol on the DLL, you need first to
  select the Ada language (language used by the DLL).

  ::

      (gdb) set language ada
      (gdb) break ada_dll

* Continue the program.

  ::

      (gdb) cont

  This will run the program until it reaches the breakpoint that has been
  set. From that point you can use the standard way to debug a program
  as described in (:ref:`Running_and_Debugging_Ada_Programs`).

It is also possible to debug the DLL by attaching to a running process.


.. rubric:: Attaching to a Running Process

.. index:: DLL debugging, attach to process

With ``GDB`` it is always possible to debug a running process by
attaching to it. It is possible to debug a DLL this way. The limitation
of this approach is that the DLL must run long enough to perform the
attach operation. It may be useful for instance to insert a time wasting
loop in the code of the DLL to meet this criterion.

* Launch the main program :file:`main.exe`.

  ::

      $ main

* Use the Windows *Task Manager* to find the process ID. Let's say
  that the process PID for :file:`main.exe` is 208.

* Launch gdb.

  ::

      $ gdb

* Attach to the running process to be debugged.

  ::

      (gdb) attach 208

* Load the process debugging information.

  ::

      (gdb) symbol-file main.exe

* Break somewhere in the DLL.

  ::

      (gdb) break ada_dll

* Continue process execution.

  ::

      (gdb) cont

This last step will resume the process execution, and stop at
the breakpoint we have set. From there you can use the standard
approach to debug a program as described in
:ref:`Running_and_Debugging_Ada_Programs`.


.. _Setting_Stack_Size_from_gnatlink:

Setting Stack Size from ``gnatlink``
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

It is possible to specify the program stack size at link time. On modern
versions of Windows, starting with XP, this is mostly useful to set the size of
the main stack (environment task). The other task stacks are set with pragma
Storage_Size or with the *gnatbind -d* command.

Since older versions of Windows (2000, NT4, etc.) do not allow setting the
reserve size of individual tasks, the link-time stack size applies to all
tasks, and pragma Storage_Size has no effect.
In particular, Stack Overflow checks are made against this
link-time specified size.

This setting can be done with ``gnatlink`` using either of the following:


* :switch:`-Xlinker` linker option

  ::

      $ gnatlink hello -Xlinker --stack=0x10000,0x1000


  This sets the stack reserve size to 0x10000 bytes and the stack commit
  size to 0x1000 bytes.

* :switch:`-Wl` linker option

  ::

    $ gnatlink hello -Wl,--stack=0x1000000

  This sets the stack reserve size to 0x1000000 bytes. Note that with
  :switch:`-Wl` option it is not possible to set the stack commit size
  because the comma is a separator for this option.


.. _Setting_Heap_Size_from_gnatlink:

Setting Heap Size from ``gnatlink``
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Under Windows systems, it is possible to specify the program heap size from
``gnatlink`` using either of the following:

* :switch:`-Xlinker` linker option

  ::

      $ gnatlink hello -Xlinker --heap=0x10000,0x1000

  This sets the heap reserve size to 0x10000 bytes and the heap commit
  size to 0x1000 bytes.

* :switch:`-Wl` linker option

  ::

      $ gnatlink hello -Wl,--heap=0x1000000


  This sets the heap reserve size to 0x1000000 bytes. Note that with
  :switch:`-Wl` option it is not possible to set the heap commit size
  because the comma is a separator for this option.


.. _Win32_Specific_Addons:

Windows Specific Add-Ons
-------------------------

This section describes the Windows specific add-ons.

.. _Win32Ada:

Win32Ada
^^^^^^^^

Win32Ada is a binding for the Microsoft Win32 API. This binding can be
easily installed from the provided installer. To use the Win32Ada
binding you need to use a project file, and adding a single with_clause
will give you full access to the Win32Ada binding sources and ensure
that the proper libraries are passed to the linker.

  .. code-block:: gpr

      with "win32ada";
      project P is
         for Sources use ...;
      end P;

To build the application you just need to call gprbuild for the
application's project, here p.gpr:

  .. code-block:: sh

      gprbuild p.gpr

.. _wPOSIX:

wPOSIX
^^^^^^

wPOSIX is a minimal POSIX binding whose goal is to help with building
cross-platforms applications. This binding is not complete though, as
the Win32 API does not provide the necessary support for all POSIX APIs.

To use the wPOSIX binding you need to use a project file, and adding
a single with_clause will give you full access to the wPOSIX binding
sources and ensure that the proper libraries are passed to the linker.

  .. code-block:: gpr

      with "wposix";
      project P is
         for Sources use ...;
      end P;

To build the application you just need to call gprbuild for the
application's project, here p.gpr:

  .. code-block:: sh

      gprbuild p.gpr


.. _Mac_OS_Topics:

Mac OS Topics
=============

.. index:: OS X

This section describes topics that are specific to Apple's OS X
platform.

Codesigning the Debugger
------------------------

The Darwin Kernel requires the debugger to have special permissions
before it is allowed to control other processes. These permissions
are granted by codesigning the GDB executable. Without these
permissions, the debugger will report error messages such as::

   Starting program: /x/y/foo
   Unable to find Mach task port for process-id 28885: (os/kern) failure (0x5).
   (please check gdb is codesigned - see taskgated(8))

Codesigning requires a certificate.  The following procedure explains
how to create one:

* Start the Keychain Access application (in
  /Applications/Utilities/Keychain Access.app)

* Select the Keychain Access -> Certificate Assistant ->
  Create a Certificate... menu

* Then:

  * Choose a name for the new certificate (this procedure will use
    "gdb-cert" as an example)

  * Set "Identity Type" to "Self Signed Root"

  * Set "Certificate Type" to "Code Signing"

  * Activate the "Let me override defaults" option


* Click several times on "Continue" until the "Specify a Location
  For The Certificate" screen appears, then set "Keychain" to "System"

* Click on "Continue" until the certificate is created

* Finally, in the view, double-click on the new certificate,
  and set "When using this certificate" to "Always Trust"

* Exit the Keychain Access application and restart the computer
  (this is unfortunately required)


Once a certificate has been created, the debugger can be codesigned
as follow. In a Terminal, run the following command:

  ::

     $ codesign -f -s  "gdb-cert"  <gnat_install_prefix>/bin/gdb

where "gdb-cert" should be replaced by the actual certificate
name chosen above, and <gnat_install_prefix> should be replaced by
the location where you installed GNAT.  Also, be sure that users are
in the Unix group ``_developer``.
