The External Symbol Naming Scheme of GNAT (GNAT User’s Guide for Native Platforms)

#### 3.13.2 The External Symbol Naming Scheme of GNAT ¶

To interpret the output from GNAT when using tools that are originally intended for use with other languages, you need to understand the conventions used to generate link names from the Ada entity names.

All link names are in all lowercase. With the exception of library procedure names, the mechanism used is simply to use the full expanded Ada name with dots replaced by double underscores. For example, suppose we have the following package spec:

    package QRS is
       MN : Integer;
    end QRS;

The variable `MN` has a full expanded Ada name of `QRS.MN`, so the corresponding link name is `qrs__mn`. Of course if you use a pragma `Export`, you maye override this:

    package Exports is
       Var1 : Integer;
       pragma Export (Var1, C, External_Name => "var1_name");
       Var2 : Integer;
       pragma Export (Var2, C, Link_Name => "var2_link_name");
    end Exports;

In this case, the link name for `Var1` is whatever link name the C compiler would assign for the C function `var1_name`. This typically would be either `var1_name` or `_var1_name`, depending on operating system conventions, but other possibilities exist. The link name for `Var2` is `var2_link_name`, and this is not operating system dependent.

One exception occurs for library level procedures. A potential ambiguity arises between the required name `_main` for the C main program, and the name we would otherwise assign to an Ada library level procedure called `Main` (which might well not be the main program).

To avoid this ambiguity, GNAT adds the prefix `_ada_` to such names. So if we have a library level procedure such as:

    procedure Hello (S : String);

the external name of this procedure is `_ada_hello`.