https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87936
Bug ID: 87936
Summary: gnatlink fails with -pie
Product: gcc
Version: 8.2.1
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: ada
Assignee: unassigned at gcc dot gnu.org
Reporter: vries at gcc dot gnu.org
Target Milestone: ---
Consider the following testcase:
...
$ cat hello.adb
with Ada.Text_IO;
procedure Hello is
begin
Ada.Text_IO.Put_Line("Hello, world!");
end Hello;
...
It compiles without problems:
...
$ rm -f hello.ali hello.o hello ; gnatmake hello.adb
gcc -c hello.adb
gnatbind -x hello.ali
gnatlink hello.ali
...
and works fine:
...
delia:~ # ./hello
Hello, world!
...
However, when we try to compile with -fPIE -pie, we get:
...
$ rm -f hello.ali hello.o hello ; gnatmake -fPIE hello.adb -largs -pie
gcc -c -fPIE hello.adb
gnatbind -x hello.ali
gnatlink hello.ali -fPIE -pie
/usr/lib64/gcc/x86_64-suse-linux/8/../../../../x86_64-suse-linux/bin/ld:
/usr/lib64/gcc/x86_64-suse-linux/8/adalib/libgnat.a(a-contai.o): relocation
R_X86_64_32 against symbol `ada__containers__capacity_error' can not be used
when making a PIE object; recompile with -fPIC
...
/usr/lib64/gcc/x86_64-suse-linux/8/../../../../x86_64-suse-linux/bin/ld: final
link failed: nonrepresentable section on output
collect2: error: ld returned 1 exit status
gnatlink: error when calling /usr/bin/gcc
gnatmake: *** link failed.
...
The problem is that libgnat.a is picked up instead of libgnat_pic.a, so a
workaround is to add -lgnat_pic:
...
$ rm -f hello.ali hello.o hello ; gnatmake -fPIE hello.adb -largs -pie
-lgnat_pic
$ ./hello
Hello, world!
...
AFAIU, gnatlink should include libgnat_pic.a instead of libgnat.a when passed
the -pie option.