comp.lang.ada
 help / color / mirror / Atom feed
From: "Alex R. Mosteo" <alejandro@mosteo.com>
Subject: Re: Static linking
Date: Wed, 12 Aug 2009 16:20:43 +0200
Date: 2009-08-12T16:20:43+02:00	[thread overview]
Message-ID: <7eg1dsF2g1g4pU1@mid.individual.net> (raw)
In-Reply-To: h5gmio$i2r$1@nntp.ilk.net

Markus Schoepflin wrote:

> Hello,
> 
> up to now (gcc-4.3.x) we have been happily using 'gnatmake ... -largs
> -static' to create statically linked executable. This has stopped working
> with 4.4:
> 
>  > touch foo.adb && gnatmake foo -largs -static
> gcc-4.4 -c foo.adb
> gnatbind -x foo.ali
> gnatlink foo.ali -static
> /usr/bin/ld: cannot find -lgnat-4.4
> collect2: ld returned 1 exit status
> gnatlink: error when calling /usr/bin/gcc-4.4
> gnatmake: *** link failed.
> 
> Now I have been told that -static is a binder, not a linker argument, and
> indeed this works:
> 
>  > touch foo.adb && gnatmake foo -bargs -static
> gcc-4.4 -c foo.adb
> gnatbind -static -x foo.ali
> gnatlink foo.ali
> 
> But this is not a static executable:
> 
>  > ldd foo
> linux-gate.so.1 =>  (0xb7f9e000)
> libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7e2d000)
> /lib/ld-linux.so.2 (0xb7f9f000)
> 
> Looking at the manual for the binder I'm told: '-static Link against a
> static GNAT run time.'. OK, so this works as advertised, no dynamic GNAT
> runtime used.
> 
> Now what is the correct way to created a static executable? This seems to
> work, but is it correct?
> 
>  > touch foo.adb && gnatmake foo -bargs -static -largs -static
> gcc-4.4 -c foo.adb
> gnatbind -static -x foo.ali
> gnatlink foo.ali -static
>  > ldd foo
> not a dynamic executable
> 
> And why did only passing '-largs -static' work for gcc-3.3.x?

Not entirely sure is the same issue, but maybe it helps our understanding. I 
got also different results using some same switches when using GPL2008 and 
GPL2009. I opened a GAP support ticket and their reply was that some 
defaults had changed, but you could force the same results with explicit 
switches. In my case it involved mixed Ada/C++ linking and they also said 
that they were working on some internal cleaning that would improve the 
situation.

There's another confusing issue in which you don't have to check the ld 
documentation but gcc/g++ one, which is the one getting the switches in the 
end.

I don't know if I could quote the support reply I got but, in addition to 
Ludovic comment about "as static as it can be" given the shared libc 
library, the switches I'm using right now to control linking are:

   package Binder is
      for Default_Switches ("Ada") use ("-static");
      --  -static/-shared makes the gnat runtime static or shared
   end Binder;

   package Linker is
      for Default_Switches ("Ada") use
        ("-Wl,-Bstatic",  -- Starts static linking section
         "-lz",           -- Sample libraries that I want statically linked.
         "-lgsl",
         "-lgslcblas",

         "-Wl,-Bdynamic", -- Starts shared linking section
         "-ldl"           -- Sample library dynamically linked in
        );
   end Linker;

Hope this helps,

Alex.

> 
> Markus




  parent reply	other threads:[~2009-08-12 14:20 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-08-07  7:54 Static linking Markus Schoepflin
2009-08-07 10:15 ` Ludovic Brenta
2009-08-07 10:46   ` Markus Schoepflin
2009-08-12 14:20 ` Alex R. Mosteo [this message]
  -- strict thread matches above, loose matches on Subject: below --
2014-10-04  1:19 static linking agent
2014-10-04  7:21 ` Simon Wright
2014-10-04 18:10   ` agent
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox