
`patchelf --set-rpath` corrupted executables on mips32el: the dynamic liker crushed with Segmentation fault when loading any executable with RPATH added that way. The problem was around the MIPS-specific mechanism of setting up the debug map pointer. When DT_MIPS_RLD_MAP_REL entry in the dynamic section is present, it holds the relative address of __RLD_MAP -- an offset relative to this dynamic section entry. Dynamic linker puts the pointer to the `r_debug` structure there. When patchelf updates the executable RPATH, it moves the .dynamic section both in the binary and in memory, while __RLD_MAP is not moved in memory, since it belongs to special .rld_map section that has type PROGBITS. So, the offset stored in DT_MIPS_RLD_MAP_REL entry is not valid anymore and should be updated. This commit adds the necessary update. In the corner case when DT_MIPS_RLD_MAP_REL is present, but .rld_map section is not, the dynamic loader writes the debug pointer to some arbitrary bytes in memory. To avoid crushes on otherwise "working" binaries, we set offset to zero so that the dynamic loader would just overwrite the dynamic section. Here we also import DT_MIPS_RLD_MAP_REL definition in elf.h form glibc commit a2057c984e4314c3740f04cf54e36c824e4c8f32. Refs: #82 Signed-off-by: Ivan A. Melnikov <iv@altlinux.org>
PatchELF is a simple utility for modifying existing ELF executables and libraries. In particular, it can do the following:
-
Change the dynamic loader ("ELF interpreter") of executables:
$ patchelf --set-interpreter /lib/my-ld-linux.so.2 my-program
-
Change the
RPATH
of executables and libraries:$ patchelf --set-rpath /opt/my-libs/lib:/other-libs my-program
-
Shrink the
RPATH
of executables and libraries:$ patchelf --shrink-rpath my-program
This removes from the
RPATH
all directories that do not contain a library referenced byDT_NEEDED
fields of the executable or library. For instance, if an executable references one librarylibfoo.so
, has an RPATH/lib:/usr/lib:/foo/lib
, andlibfoo.so
can only be found in/foo/lib
, then the newRPATH
will be/foo/lib
.In addition, the
--allowed-rpath-prefixes
option can be used for further rpath tuning. For instance, if an executable has anRPATH
/tmp/build-foo/.libs:/foo/lib
, it is probably desirable to keep the/foo/lib
reference instead of the/tmp
entry. To accomplish that, use:$ patchelf --shrink-rpath --allowed-rpath-prefixes /usr/lib:/foo/lib my-program
-
Remove declared dependencies on dynamic libraries (
DT_NEEDED
entries):$ patchelf --remove-needed libfoo.so.1 my-program
This option can be given multiple times.
-
Add a declared dependency on a dynamic library (
DT_NEEDED
):$ patchelf --add-needed libfoo.so.1 my-program
This option can be give multiple times.
-
Replace a declared dependency on a dynamic library with another one (
DT_NEEDED
):$ patchelf --replace-needed liboriginal.so.1 libreplacement.so.1 my-program
This option can be give multiple times.
-
Change
SONAME
of a dynamic library:$ patchelf --set-soname libnewname.so.3.4.5 path/to/libmylibrary.so.1.2.3
Compiling and Testing
./bootstrap.sh
./configure
make
make check
sudo make install
Author
Copyright 2004-2019 Eelco Dolstra edolstra@gmail.com.
License
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/.
Release History
0.13 (August 5, 2021):
-
New
--add-rpath
flag. -
Bug fixes.
0.12 (August 27, 2020):
-
New
--clear-symbol-version
flag. -
Better support for relocating NOTE sections/segments.
-
Improved the default section alignment choice.
-
Bug fixes.
0.11 (June 9, 2020):
-
New
--output
flag. -
Some bug fixes.
0.10 (March 28, 2019):
-
Many bug fixes. Please refer to the Git commit log:
https://github.com/NixOS/patchelf/commits/master
This release has contributions from Adam Trhoň, Benjamin Hipple, Bernardo Ramos, Bjørn Forsman, Domen Kožar, Eelco Dolstra, Ezra Cooper, Felipe Sateler, Jakub Wilk, James Le Cuirot, Karl Millar, Linus Heckemann, Nathaniel J. Smith, Richard Purdie, Stanislav Markevich and Tuomas Tynkkynen.
0.9 (February 29, 2016):
-
Lots of new features. Please refer to the Git commit log:
https://github.com/NixOS/patchelf/commits/master
This release has contributions from Aaron D. Marasco, Adrien Devresse, Alexandre Pretyman, Changli Gao, Chingis Dugarzhapov, darealshinji, David Sveningsson, Eelco Dolstra, Felipe Sateler, Jeremy Sanders, Jonas Kuemmerlin, Thomas Tuegel, Tuomas Tynkkynen, Vincent Danjean and Vladimír Čunát.
0.8 (January 15, 2014):
- Fix a segfault caused by certain illegal entries in symbol tables.
0.7 (January 7, 2014):
-
Rewrite section indices in symbol tables. This for instance allows gdb to show proper backtraces.
-
Added `--remove-needed' option.
0.6 (November 7, 2011):
-
Hacky support for executables created by the Gold linker.
-
Support segments with an alignment of 0 (contributed by Zack Weinberg).
-
Added a manual page (contributed by Jeremy Sanders jeremy@jeremysanders.net).
0.5 (November 4, 2009):
-
Various bugfixes.
-
`--force-rpath' now deletes the DT_RUNPATH if it is present.
0.4 (June 4, 2008):
-
Support for growing the RPATH on dynamic libraries.
-
IA-64 support (not tested) and related 64-bit fixes.
-
FreeBSD support.
-
--set-rpath',
--shrink-rpath' and--print-rpath' now prefer DT_RUNPATH over DT_RPATH, which is obsolete. When updating, if both are present, both are updated. If only DT_RPATH is present, it is converted to DT_RUNPATH unless
--force-rpath' is specified. If neither is present, a DT_RUNPATH is added unless `--force-rpath' is specified, in which case a DT_RPATH is added.
0.3 (May 24, 2007):
-
Support for 64-bit ELF binaries (such as on x86_64-linux).
-
Support for big-endian ELF binaries (such as on powerpc-linux).
-
Various bugfixes.
0.2 (January 15, 2007):
- Provides a hack to get certain programs (such as the Belastingaangifte 2005) to work.
0.1 (October 11, 2005):
- Initial release.