---
name: "patchelf"
section: "1"
platform: "linux"
package: "patchelf"
version: "0.19.3-1"
release: "Arch Linux 2026-11-01"
platforms: ["linux"]
url: "https://new.carta.tech/patchelf"
---

# patchelf(1)

Modify ELF files

## NAME

patchelf - Modify ELF files

## SYNOPSIS

**patchelf** *OPTION* *FILE* ...

## DESCRIPTION

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.

## OPTIONS

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.

- \--build-resolution-cache

  Resolves each DT\_NEEDED dependency against the object's run path at patch time and records the result in a **.note.nixos.ldcache** note, so that a loader which understands the note can skip the run-path search at startup. Directories that cannot be resolved ahead of time (empty or relative components, those containing dynamic-string tokens such as **$ORIGIN** or a **glibc-hwcaps** subdirectory, and paths that cannot be searched at patch time because they are missing, not a directory, or not accessible) are stored as a search hint instead of an exact path. The cache is built once from an unpatched binary; this option cannot be combined with **--force-rpath**.

- \--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.

- \--no-clobber-old-sections

  Do not clobber old section values.

  patchelf defaults to overwriting replaced header sections with garbage to ensure they are not used accidentally. This option allows to opt out of that behavior, so that binaries that attempt to read their own headers from a fixed offset (e.g. Firefox) continue working.

  Use sparingly and with caution.

- \--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.

## EXAMPLES

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

## AUTHOR

Eelco Dolstra \<e.dolstra@tudelft.nl\>

## SEE ALSO

[**elf**(5)](/elf/5.md), [**ld.so**(8)](/ld.so/8.md)
