An execve() wrapper that allows executing binaries using a glibc installed in a non-standard location.
Find a file
2023-06-14 03:25:32 -03:00
src Exclude binaries installed in system directories from being intercepted 2023-06-14 03:25:32 -03:00
.editorconfig Initial commit 2023-05-31 20:48:51 -03:00
.gitattributes Initial commit 2023-05-31 20:48:51 -03:00
CMakeLists.txt Initial commit 2023-05-31 20:48:51 -03:00
LICENSE Initial commit 2023-05-31 20:48:51 -03:00
README.md Add README 2023-06-06 14:35:59 -03:00

GLibc preload

An execve() wrapper that allows executing binaries using a glibc installed in a non-standard location.

How does it work?

Sometimes you may want to run a binary using a different version of glibc instead of using the one installed on your machine, either to test a new implementation of a newer version or simply to use binaries that were linked on a system with a newer glibc than yours.

The libglibc_preload.so library uses the LD_PRELOAD trick to replace calls to the execve() function with an alternative version that replaces the default interpreter with one installed in a non-standard location.

Install

Build glibc and install on a non-standard location.

$ git clone --depth='1' 'https://sourceware.org/git/glibc.git'
$ cd glibc
$ mkdir build; cd build
$ ../configure \
    --prefix="${HOME}/.local" \
    --with-headers=/usr/include \
    --enable-bind-now \
    --enable-cet \
    --enable-multi-arch \
    --enable-stack-protector=strong \
    --enable-systemtap \
    --disable-crypt \
    --disable-profile \
    --disable-werror \
    CFLAGS='-Os' \
    LDFLAGS='-s'
$ make all
$ make install

Build glibc_preload and install

$ git clone --depth='1' 'https://github.com/AmanoTeam/glibc_preload.git'
$ cd glibc_preload
$ mkdir build; cd build
$ cmake \
    -DCMAKE_INSTALL_PREFIX="${HOME}/.local" \
    -DCMAKE_BUILD_TYPE='MinSizeRel' \
    ./
$ cmake --install ./

Usage

LD_PRELOAD="${HOME}/.local/lib/libglibc_preload.so" command ...

Limitations

  • This won't work with statically linked binaries.
  • This won't work with binaries that call execve() using syscalls instead of relying on the glibc implementation.