Re: [patch #10393] Fix shared library support on Android

Bruno Haible <[email protected]> Tue, 16 Jan 2024 21:54:46 +0100
Newsgroups gmane.comp.gnu.libtool.patches
Message-ID <7582086.oDFzTOozpa@nimes>
Roumen Petrov wrote:
> Android and Microsoft windows libraries must not use hard coded paths! Nevertheless what is supported by linker or loader.

Why do you mention Microsoft Windows? The commit 47c71f61df9ace4956cc943f291480315174726b
has no effect on Microsoft Windows.

> When I read commit I agree that is correct do not have RUNPATH!
> The problem is that commit message is not so clear. Actually commit uses rpath flag!
> NO! NO! NO!

Why do you want that executables never have RUNPATH on Android? Just saying
"NO! NO! NO!" is not a justification, and your arguments in [2] were not
sensible either.

If you want a certain binary that you build to have no RUNPATH, use the
Android SDK, not Termux and not libtool. Or use libtool outside of Termux
and don't provide a -R option. It's that easy.

The problem I was encountering, as described in [1], is in the Termux
environment, which uses absolute file names everywhere. In this environment,
the use of RUNPATH is mandatory. Without RUNPATH no executable that uses
a shared library would run. That's why the Termux people added a RUNPATH
value:

$ readelf -d /data/data/com.termux/files/usr/bin/cp | grep '\(RUNPATH\|NEEDED\)'
 0x0000001d (RUNPATH)                    Library runpath: [/data/data/com.termux/files/usr/lib]
 0x00000001 (NEEDED)                     Shared library: [libandroid-support.so]
 0x00000001 (NEEDED)                     Shared library: [libgmp.so]
 0x00000001 (NEEDED)                     Shared library: [libiconv.so]
 0x00000001 (NEEDED)                     Shared library: [libc.so]

$ readelf -d /data/data/com.termux/files/usr/bin/emacs | grep '\(RUNPATH\|NEEDED\)'
 0x0000001d (RUNPATH)                    Library runpath: [/data/data/com.termux/files/usr/lib]
 0x00000001 (NEEDED)                     Shared library: [libxml2.so]
 0x00000001 (NEEDED)                     Shared library: [libncursesw.so.6]
 0x00000001 (NEEDED)                     Shared library: [libgnutls.so]
 0x00000001 (NEEDED)                     Shared library: [libm.so]
 0x00000001 (NEEDED)                     Shared library: [libz.so.1]
 0x00000001 (NEEDED)                     Shared library: [libdl.so]
 0x00000001 (NEEDED)                     Shared library: [libjansson.so]
 0x00000001 (NEEDED)                     Shared library: [libgmp.so]
 0x00000001 (NEEDED)                     Shared library: [libc.so]

The main remaining problem was that if a Termux user configures a
package with a non-default --prefix and that package installs a shared
library, the Termux-provided RUNPATH is insufficient: The program
would always only see the Termux-provided shared libraries. That's
where libtool support for -rpath is necessary.

Bruno

[1] https://lists.gnu.org/archive/html/libtool-patches/2023-09/msg00000.html
[2] https://lists.gnu.org/archive/html/libtool-patches/2023-09/msg00001.html