-
-
Notifications
You must be signed in to change notification settings - Fork 3.1k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
ld: set --enable-new-dtags by default #2255
Conversation
The --enable-new-dtags option to ld causes it to emit a RUNPATH rather than RPATH entry in the elf header. Because the Android linker supports RUNPATH but not RPATH, this means many things can now Just Work. This should (eventually) eliminate the need to set LD_LIBRARY_PATH. Prior art: This [became the default for Linux in 2013](https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;a=commitdiff;h=822b8bf) but I think termux isn't getting it because it reports "Android" instead of "Linux"? Or maybe the way it works changed since then. Regardless, [Debian has been using RUNPATH by default since December 2016.](https://sources.debian.org/src/binutils/2.27.90.20161231-1/debian/patches/ld-new-dtags-by-default.diff/?hl=27#L27) Their [newest configuration](https://sources.debian.org/src/binutils/2.30-7/debian/rules/#L362) uses the newer configuration option seen in this patch. The [suse and gentoo](https://web.archive.org/web/20160101182307/http://comments.gmane.org/gmane.comp.gnu.binutils/57379) maintainers said they did the same in 2004 and 2005, respectively. So it seems well battle-tested, to me. For the curious: This came up because I'm working on [getting Homebrew working under Termux](Linuxbrew/brew#621).
Thanks - the updated package is now available at version
Interesting! Let us know how it goes (I guess #2071 is the best location to post progress)! |
❯❯❯ echo 'int main() { return 0; }' >hello.c
❯❯❯ gcc -Wl,-rpath=/foo -o hello hello.c
❯❯❯ readelf -d hello | egrep 'RPATH|RUNPATH'
0x000000000000000f (RPATH) Library rpath: [/foo]
❯❯❯ gcc -Wl,-rpath=/foo -Wl,--enable-new-dtags -o hello hello.c
❯❯❯ readelf -d hello | egrep 'RPATH|RUNPATH'
0x000000000000001d (RUNPATH) Library runpath: [/foo] |
I believe the change happened in binutils 2.27. For comparison:
|
@fornwall I'm most interested to see if this eases my pain when clang is compiled using this. |
Good to know! |
The --enable-new-dtags option to ld causes it to emit a RUNPATH rather than RPATH entry in the elf header. Because the Android linker supports RUNPATH but not RPATH, this means many things can now Just Work. This should (eventually) eliminate the need to set LD_LIBRARY_PATH.
Prior art:
This became the default for Linux in 2013 but I think termux isn't getting it because it reports "Android" instead of "Linux"? Or maybe the way it works changed since then. Regardless, Debian has been using RUNPATH by default since December 2016. Their newest configuration uses the newer configuration option seen in this patch. The suse and gentoo maintainers said they did the same in 2004 and 2005, respectively. So it seems well battle-tested, to me.
For the curious:
This came up because I'm working on getting Homebrew working under Termux.