patchelf - Modify ELF files
PatchELF is a simple utility for modifying existing ELF
executables and libraries. It can change the dynamic loader ("ELF
interpreter") of executables and change the RPATH of executables and
libraries.
The single option given operates on each FILE, editing in
place.
Any option taking a string argument can also take a file by
prefixing the argument with the @ symbol. See EXAMPLES
- --page-size
SIZE
- Uses the given page size instead of the default.
- --set-interpreter
INTERPRETER
- Change the dynamic loader ("ELF interpreter") of executable
given to INTERPRETER.
- --print-interpreter
- Prints the ELF interpreter of the executable.
- --print-os-abi
- Prints the OS ABI of the executable (EI_OSABI field of an ELF file).
- --set-os-abi
ABI
- Changes the OS ABI of the executable (EI_OSABI field of an ELF file). The
ABI parameter is pretty flexible. For example, you can specify it as a
"Linux", "linux", or even "lInUx" - all
those names will set EI_OSABI field of the ELF header to the value
"3", which corresponds to Linux OS ABI. The same applies to
other ABI names - System V, FreeBSD, Solaris, etc.
- --print-soname
- Prints DT_SONAME entry of .dynamic section. Raises an error if DT_SONAME
doesn't exist.
- --set-soname
SONAME
- Sets DT_SONAME entry of a library to SONAME.
- --set-rpath
RUNPATH
- Change the DT_RUNPATH of the executable or library to RUNPATH.
- --add-rpath
RUNPATH
- Add RUNPATH to the existing DT_RUNPATH of the executable or library.
- --remove-rpath
- Removes the DT_RPATH or DT_RUNPATH entry of the executable or library.
- --shrink-rpath
- Remove from the DT_RUNPATH or DT_RPATH all directories that do not contain
a library referenced by DT_NEEDED fields of the executable or library.
For instance, if an executable references one library
libfoo.so, has an RPATH "/lib:/usr/lib:/foo/lib", and
libfoo.so can only be found in /foo/lib, then the new RPATH will be
"/foo/lib".
- --allowed-rpath-prefixes
PREFIXES
- Combined with the "--shrink-rpath" option, this can be used for
further rpath tuning. For instance, if an executable has an RPATH
"/tmp/build-foo/.libs:/foo/lib", it is probably desirable to
keep the "/foo/lib" reference instead of the "/tmp"
entry.
- --print-rpath
- Prints the DT_RUNPATH or DT_RPATH for an executable or library.
- --force-rpath
- Forces the use of the obsolete DT_RPATH in the file instead of DT_RUNPATH.
By default DT_RPATH is converted to DT_RUNPATH.
- --add-needed
LIBRARY
- Adds a declared dependency on a dynamic library (DT_NEEDED). This option
can be given multiple times.
- --replace-needed
LIB_ORIG LIB_NEW
- Replaces a declared dependency on a dynamic library with another one
(DT_NEEDED). This option can be given multiple times.
- --remove-needed
LIBRARY
- Removes a declared dependency on LIBRARY (DT_NEEDED entry). This option
can be given multiple times.
- --print-needed
- Prints all DT_NEEDED entries of the executable.
- --no-default-lib
- Marks the object so that the search for dependencies of this object will
ignore any default library search paths.
- --no-sort
- Do not sort program headers or section headers. This is useful when
debugging patchelf, because it makes it easier to read diffs of the output
of "readelf -a".
- --add-debug-tag
- Adds DT_DEBUG tag to the .dynamic section if not yet present in an ELF
object. A shared library (-shared) by default does not receive DT_DEBUG
tag. This means that when a shared library has an entry point (so that it
can be run as an executable), the debugger does not connect to it
correctly and symbols are not resolved.
- --print-execstack
- Prints the state of the executable flag of the GNU_STACK program header,
if present.
- --clear-execstack
- Clears the executable flag of the GNU_STACK program header, or adds a new
header.
- --set-execstack
- Sets the executable flag of the GNU_STACK program header, or adds a new
header.
- --rename-dynamic-symbols
NAME_MAP_FILE
- Renames dynamic symbols. The name map file should contain lines with the
old and the new name separated by spaces like this:
old_name new_name
Symbol names do not contain version specifier that are also
shown in the output of the nm -D command from binutils. So instead of
the name write@GLIBC_2.2.5 it is just write.
- --output FILE
- Set the output file name. If not specified, the input will be modified in
place.
- --debug
- Prints details of the changes made to the input file.
- --version
- Shows the version of patchelf.
To use the contents on an external file as a parameter:
$ patchelf a.out --add-rpath
@/tmp/generated-rpath.bin
To change the RPATH of a binary. Note that $ORIGIN is a
special symbol used by the loader, so must be quoted.
patchelf --set-rpath '$ORIGIN/../lib64' a.out
Eelco Dolstra <e.dolstra@tudelft.nl>