Run dynamically linked ELF binaries everywhere (musl and glibc are supported).
bin
, shared/{bin,lib,lib32}
directories (see screenshots) and generate a file shared/{lib,lib32}/lib.path
with a list of all directories that contain libraries for pass it to interpreter --library-path
. The paths in this file are specified on a new line with a +
at the beginning and relative to the directory in which it is located.Download the latest revision
git clone https://github.com/VHSgunzo/sharun.git && cd sharun
Compile a binary
rustup default nightly
rustup target add $(uname -m)-unknown-linux-musl
rustup component add rust-src --toolchain nightly
cargo build --release
cp ./target/$(uname -m)-unknown-linux-musl/release/sharun .
./sharun --help
./sharun lib4bin --help
Or take an already precompiled binary file from the releases
[ Usage ]: sharun [OPTIONS] [EXEC ARGS]...
Use lib4bin for create 'bin' and 'shared' dirs
[ Arguments ]:
[EXEC ARGS]... Command line arguments for execution
[ Options ]:
l, lib4bin [ARGS] Launch the built-in lib4bin
-g, --gen-lib-path Generate library path file
-v, --version Print version
-h, --help Print help
[ Environments ]:
SHARUN_WORKING_DIR=/path Specifies the path to the working directory
SHARUN_LDNAME=ld.so Specifies the name of the interpreter
SHARUN_DIR Sharun directory
[ Usage ]: lib4bin [OPTIONS] /path/executable -- [STRACE CMD ARGS]
[ Options ]:
-a, --any-executable Pack any executable (env: ANY_EXECUTABLE=1)
-d, --dst-dir '/path' Destination directory (env: DST_DIR=/path)
-e, --strace-mode Use strace for get libs (env: STRACE_MODE=1, STRACE_TIME=5)
-g, --gen-lib-path Generate a lib.path file (env: GEN_LIB_PATH=1)
-h, --help Show this message
-i, --patch-interpreter Patch INTERPRETER to a relative path (env: PATCH_INTERPRETER=1)
-l, --libs-only Pack only libraries (env: LIBS_ONLY=1)
-n, --not-one-dir Separate directories for each executable (env: ONE_DIR=0)
-p, --hard-links Pack sharun and create hard links (env: HARD_LINKS=1)
-q, --quiet-mode Show only errors (env: QUIET_MODE=1)
-r, --patch-rpath Patch RPATH to a relative path (env: PATCH_RPATH=1)
-s, --strip Strip binaries and libraries (env: STRIP=1)
-v, --verbose Verbose mode (env: VERBOSE=1)
-w, --with-sharun Pack sharun from PATH or env or download
(env: WITH_SHARUN=1, SHARUN=/path|URL, SHARUN_URL=URL, UPX_SHARUN=1)
# run lib4bin with the paths to the binary files that you want to make portable
./sharun lib4bin --with-sharun --dst-dir test /bin/bash
# or for correct /proc/self/exe you can use --hard-links flag
./sharun lib4bin --hard-links --dst-dir test /bin/bash
# this will create hard links from 'test/sharun' in the 'test/bin' directory
# now you can move 'test' dir to other linux system and run binaries from the 'bin' dir
./test/bin/bash --version
# or specify them as an argument to 'sharun'
./test/sharun bash --version
You can create a hard link from sharun
to AppRun
and write the name of the executable file from the bin
directory to the .app
file for compatibility with AppImage AppDir
. If the .app
file does not exist, the *.desktop
file will be used.
Additional env var can be specified in the .env
file (see dotenv). Env var can also be deleted using unset ENV_VAR
in the end of the .env
file.
Also you can package the sharun directory
with your applications into a single executable file using wrappe
PATH
-- ${SHARUN_DIR}/bin
PYTHONHOME
and PYTHONDONTWRITEBYTECODE
-- ${SHARUN_DIR}/shared/$LIB/python*
PERLLIB
-- ${SHARUN_DIR}/shared/$LIB/perl*
GCONV_PATH
-- ${SHARUN_DIR}/shared/$LIB/gconv
GIO_MODULE_DIR
-- ${SHARUN_DIR}/shared/$LIB/gio/modules
GTK_PATH
, GTK_EXE_PREFIX
and GTK_DATA_PREFIX
-- ${SHARUN_DIR}/shared/$LIB/gtk-*
QT_PLUGIN_PATH
-- ${SHARUN_DIR}/shared/$LIB/qt*/plugins
BABL_PATH
-- ${SHARUN_DIR}/shared/$LIB/babl-*
GEGL_PATH
-- ${SHARUN_DIR}/shared/$LIB/gegl-*
GIMP2_PLUGINDIR
-- ${SHARUN_DIR}/shared/$LIB/gimp/2.0
TCL_LIBRARY
-- ${SHARUN_DIR}/shared/$LIB/tcl*
TK_LIBRARY
-- ${SHARUN_DIR}/shared/$LIB/tk*
GST_PLUGIN_PATH
, GST_PLUGIN_SYSTEM_PATH
, GST_PLUGIN_SYSTEM_PATH_1_0
, and GST_PLUGIN_SCANNER
-- ${SHARUN_DIR}/shared/$LIB/gstreamer-*
GDK_PIXBUF_MODULEDIR
and GDK_PIXBUF_MODULE_FILE
-- ${SHARUN_DIR}/shared/$LIB/gdk-pixbuf-*
XDG_DATA_DIRS
-- ${SHARUN_DIR}/share
VK_DRIVER_FILES
-- ${SHARUN_DIR}/share/vulkan/icd.d
__EGL_VENDOR_LIBRARY_DIRS
-- ${SHARUN_DIR}/share/glvnd/egl_vendor.d
XKB_CONFIG_ROOT
-- ${SHARUN_DIR}/share/X11/xkb
GSETTINGS_SCHEMA_DIR
-- ${SHARUN_DIR}/share/glib-2.0/schemas
GIMP2_DATADIR
-- ${SHARUN_DIR}/share/gimp/2.0
FONTCONFIG_FILE
-- ${SHARUN_DIR}/etc/fonts/fonts.conf
GIMP2_SYSCONFDIR
-- ${SHARUN_DIR}/etc/gimp/2.0