]> git.ipfire.org Git - thirdparty/gcc.git/commit
ada: Implement __gnat_get_executable_load_address for Android
authorOlivier Hainque <hainque@adacore.com>
Sat, 13 Jun 2026 16:56:59 +0000 (16:56 +0000)
committerMarc Poulhiès <dkm@gcc.gnu.org>
Mon, 29 Jun 2026 11:17:09 +0000 (13:17 +0200)
commit07a75dd579e82affded400a9f5edfa24ae4a3bc3
tree15c3940eb931aeebef2d925743ea8bc0f9fc1042
parentc78f1484aeb6b35bf1ae905e664a45a0a33e2fde
ada: Implement __gnat_get_executable_load_address for Android

Even though Android is a variant of Linux, it doesn't expose
a _r_debug struct so handily as with GLIBC.  Program headers
from dl_iterate_phdr show name/addr sequences of pairs such as

   dpli_name                                       dpli_addr
   /system/bin/linker64                            0x720f3d3000
   /data/data/com.arachnoid.sshelper/home/testone  0x64f217f000 (exe)
   [vdso]                                          0x720f3d2000
   /apex/com.android.runtime/lib64/bionic/libc.so  0x720de25000
   /apex/com.android.runtime/lib64/bionic/libdl.so 0x720ddd6000
   /system/lib64/libnetd_client.so                 0x720dc83000
   /system/lib64/libc++.so                         0x720d30b000
   /apex/com.android.runtime/lib64/bionic/libm.so  0x720dcc3000

The name is not empty for the executable and there's no documentation
saying it would always come second or so, so this provides no obvious
reliable means to discriminate the exe load address.

As a variant of linux, the default link policy for Android authorizes
undefined refs when creating shared libs, with resolution deferred at least
until the lib is loaded. "main" will have to be available then, so resort
to dladdr(&main) to figure out the main module load address from here.

gcc/ada/ChangeLog:

* adaint.c (__gnat_get_executable_load_address): Provide
an implementation based on dladdr(&main) and use it for Android.
gcc/ada/adaint.c