PatchELF

From HPCWIKI
Revision as of 12:22, 29 March 2023 by Admin (talk | contribs) (Admin님이 Patchelf 문서를 PatchELF 문서로 이동했습니다: 문자열 찾아 바꾸기 - "Patchelf" 문자열을 "PatchELF" 문자열로)
Jump to navigation Jump to search

What if an application binary app uses glibc version 2.22 and you need to configure it to use glibc 2.25 without recompiling the binary ? PatchELF comes to play with it.

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 * Change the RPATH of executables and libraries * Remove declared dependencies on dynamic libraries (DT_NEEDED entries)

Install patchelf is simple on Ubuntu

sudo apt update
sudo apt install patchelf

Change the dynamic loader ("ELF interpreter") of executables:[1]

$ 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 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. In addition, the --allowed-rpath-prefixes option 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. 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

Reference

https://manpages.ubuntu.com/manpages/bionic/man1/patchelf.1.html

https://anaconda.org/conda-forge/patchelf