I’ve been grappling with link options automatically generated when building with gprbuild
. All of this occurs using a cross-toolchain for Linux AArch64 targets, so gnatlink
, default.gpr
and default.cgpr
are invariant.
I first noticed a problem when I tried to cross-compile an Ada program calling subprograms from libnng.so
on a Debian 12 development machine, using the native gprbuild
. It failed to link. The final link command, which was helpfully included in the error output, failed because it included a -static
link option. A lot of third party Linux libraries fail to link statically, so no surprise there. The problem is that my cross-compiled Ada programs are always supposed to be linked dynamically.
I instrumented the build with strace
and it seems that the erroneous -static
link option is being generated by gnatbind
. Which is weird because:
My main build server is still Debian 11. The cross-toolchain packages are bit-for-bit exactly the same on all of my various Debian 11 and Debian 12 machines. I tried compiling the same program on the Debian 11 machine, using the Debian 11 native gprbuild
(now with -v
to see what is going on), and the same cross-toolchain, .gpr
and .cgpr
files, and the build succeeded. I did notice -static-libgcc
(which should be -shared-libgcc
) in the link options.
So then I uninstalled the Debian 12 native gprbuild
and (painfully) copied the Debian 11 native gprbuild
and its dependencies to the Debian 12 machine and tried again. The result was -static-libgcc
, which indicates that the different outcomes depend on gprbuild
rather than gnatbind
, which is part of the cross-toolchain and invariant across all this testing.
Next I tried using Alire gprbuild
versions 22.0.1 and 25.0.1. The four different versions of gprbuild
I tried on the same Debian 12 build machine using the same cross-toolchain produced wildly varying sets of link options (-static
, -static-libgcc
, -shared-libgcc
or nothing at all, as well as dynamic -lgnat
/-lgnarl
vs static libgnat.a
/libgnarl.a
). What I want is -shared-libgcc
, libgnat.a
, and libgnarl.a
. Only one combination of gprbuild
and Debian produces what I want: Alire gprbuild
22.0.1 on Debian 12.
What I need to figure out is how to coerce what I want from the other combinations, especially since Alire gprbuild
version 22.0.1 is not available for the 64-bit Raspberry Pi. Can somebody explain how the link options are generated and aggregated when building with gprbuild
?