23.2 The External Symbol Naming Scheme of GNAT

In order to interpret the output from GNAT, when using tools that are
originally intended for use with other languages, it is useful to
understand the conventions used to generate link names from the Ada
entity names.

All link names are in all lowercase letters. 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 a pragma Export is used this may be overridden:

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, we attach the prefix _ada_ to such
names. So if we have a library level procedure such as