Skip to content

Commit 62a62d2

Browse files
committed
Add setting argv0 for interpreter
Add the ability to use .preload file
1 parent 2a23962 commit 62a62d2

File tree

3 files changed

+62
-32
lines changed

3 files changed

+62
-32
lines changed

Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "sharun"
3-
version = "0.2.6"
3+
version = "0.2.7"
44
readme = "README.md"
55
license = "MIT"
66
repository = "https://github.com/VHSgunzo/sharun"

README.md

+39-30
Original file line numberDiff line numberDiff line change
@@ -91,42 +91,49 @@ cp ./target/$(uname -m)-unknown-linux-musl/release/sharun .
9191

9292
* Additional env var can be specified in the `.env` file (see [dotenv](https://crates.io/crates/dotenv)). Env var can also be deleted using `unset ENV_VAR` in the end of the `.env` file.
9393

94+
* You can preload libraries using `.preload` file. Specify the necessary libraries in it from a new line. You can use the full paths to libraries or only their names if they are located in `shared/{lib,lib32}/`
95+
This can be useful, for example, to use [ld-preload-open](https://github.com/fritzw/ld-preload-open) library to reassign paths.
96+
9497
* Also you can package the `sharun directory` with your applications into a single executable file using [wrappe](https://github.com/Systemcluster/wrappe)
9598

9699
## Screenshots:
97100
![tree](img/tree.png)
98101

99102
## Environment variables that are set if sharun finds a directory or file:
100-
* `PATH` -- `${SHARUN_DIR}/bin`
101-
* `PYTHONHOME` and `PYTHONDONTWRITEBYTECODE` -- `${SHARUN_DIR}/shared/$LIB/python*`
102-
* `PERLLIB` -- `${SHARUN_DIR}/shared/$LIB/perl*`
103-
* `GCONV_PATH` -- `${SHARUN_DIR}/shared/$LIB/gconv`
104-
* `GIO_MODULE_DIR` -- `${SHARUN_DIR}/shared/$LIB/gio/modules`
105-
* `GTK_PATH`, `GTK_EXE_PREFIX` and `GTK_DATA_PREFIX` -- `${SHARUN_DIR}/shared/$LIB/gtk-*`
106-
* `QT_PLUGIN_PATH` -- `${SHARUN_DIR}/shared/$LIB/qt*/plugins`
107-
* `BABL_PATH` -- `${SHARUN_DIR}/shared/$LIB/babl-*`
108-
* `GEGL_PATH` -- `${SHARUN_DIR}/shared/$LIB/gegl-*`
109-
* `GIMP2_PLUGINDIR` -- `${SHARUN_DIR}/shared/$LIB/gimp/2.0`
110-
* `TCL_LIBRARY` -- `${SHARUN_DIR}/shared/$LIB/tcl*`
111-
* `TK_LIBRARY` -- `${SHARUN_DIR}/shared/$LIB/tk*`
112-
* `GST_PLUGIN_PATH`, `GST_PLUGIN_SYSTEM_PATH`, `GST_PLUGIN_SYSTEM_PATH_1_0`, and `GST_PLUGIN_SCANNER` -- `${SHARUN_DIR}/shared/$LIB/gstreamer-*`
113-
* `GDK_PIXBUF_MODULEDIR` and `GDK_PIXBUF_MODULE_FILE` -- `${SHARUN_DIR}/shared/$LIB/gdk-pixbuf-*`
114-
* `LIBDECOR_PLUGIN_DIR` -- `${SHARUN_DIR}/shared/$LIB/libdecor/plugins-1`
115-
* `GTK_IM_MODULE_FILE` -- `${SHARUN_DIR}/shared/$LIB/gtk-*/*/immodules.cache`
116-
* `LIBGL_DRIVERS_PATH` -- `${SHARUN_DIR}/shared/$LIB/dri`
117-
* `SPA_PLUGIN_DIR` -- `${SHARUN_DIR}/shared/$LIB/spa-*`
118-
* `PIPEWIRE_MODULE_DIR` -- `${SHARUN_DIR}/shared/$LIB/pipewire-*`
119-
120-
* `XDG_DATA_DIRS` -- `${SHARUN_DIR}/share`
121-
* `VK_DRIVER_FILES` -- `${SHARUN_DIR}/share/vulkan/icd.d`
122-
* `__EGL_VENDOR_LIBRARY_DIRS` -- `${SHARUN_DIR}/share/glvnd/egl_vendor.d`
123-
* `XKB_CONFIG_ROOT` -- `${SHARUN_DIR}/share/X11/xkb`
124-
* `GSETTINGS_SCHEMA_DIR` -- `${SHARUN_DIR}/share/glib-2.0/schemas`
125-
* `GIMP2_DATADIR` -- `${SHARUN_DIR}/share/gimp/2.0`
126-
* `TERMINFO` -- `${SHARUN_DIR}/share/terminfo`
127-
128-
* `FONTCONFIG_FILE` -- `${SHARUN_DIR}/etc/fonts/fonts.conf`
129-
* `GIMP2_SYSCONFDIR` -- `${SHARUN_DIR}/etc/gimp/2.0`
103+
|||
104+
|---|---|
105+
|`PATH` | `${SHARUN_DIR}/bin` |
106+
|`PYTHONHOME` and `PYTHONDONTWRITEBYTECODE` | `${SHARUN_DIR}/shared/$LIB/python*` |
107+
|`PERLLIB` | `${SHARUN_DIR}/shared/$LIB/perl*` |
108+
|`GCONV_PATH` | `${SHARUN_DIR}/shared/$LIB/gconv` |
109+
|`GIO_MODULE_DIR` | `${SHARUN_DIR}/shared/$LIB/gio/modules`|
110+
|`GTK_PATH`, `GTK_EXE_PREFIX` and `GTK_DATA_PREFIX` | `${SHARUN_DIR}/shared/$LIB/gtk-*`|
111+
|`QT_PLUGIN_PATH` | `${SHARUN_DIR}/shared/$LIB/qt*/plugins`|
112+
|`BABL_PATH` | `${SHARUN_DIR}/shared/$LIB/babl-*`|
113+
|`GEGL_PATH` | `${SHARUN_DIR}/shared/$LIB/gegl-*`|
114+
|`GIMP2_PLUGINDIR` | `${SHARUN_DIR}/shared/$LIB/gimp/2.0`|
115+
|`TCL_LIBRARY` | `${SHARUN_DIR}/shared/$LIB/tcl*`|
116+
|`TK_LIBRARY` | `${SHARUN_DIR}/shared/$LIB/tk*`|
117+
|`GST_PLUGIN_PATH`, `GST_PLUGIN_SYSTEM_PATH`, `GST_PLUGIN_SYSTEM_PATH_1_0`, and `GST_PLUGIN_SCANNER` | `${SHARUN_DIR}/shared/$LIB/gstreamer-*`|
118+
|`GDK_PIXBUF_MODULEDIR` and `GDK_PIXBUF_MODULE_FILE` | `${SHARUN_DIR}/shared/$LIB/gdk-pixbuf-*`|
119+
|`LIBDECOR_PLUGIN_DIR` | `${SHARUN_DIR}/shared/$LIB/libdecor/plugins-1`|
120+
|`GTK_IM_MODULE_FILE` | `${SHARUN_DIR}/shared/$LIB/gtk-*/*/immodules.cache`|
121+
|`LIBGL_DRIVERS_PATH` | `${SHARUN_DIR}/shared/$LIB/dri`|
122+
|`SPA_PLUGIN_DIR` | `${SHARUN_DIR}/shared/$LIB/spa-*`|
123+
|`PIPEWIRE_MODULE_DIR` | `${SHARUN_DIR}/shared/$LIB/pipewire-*`|
124+
|||
125+
|---|---|
126+
|`XDG_DATA_DIRS` | `${SHARUN_DIR}/share`|
127+
|`VK_DRIVER_FILES` | `${SHARUN_DIR}/share/vulkan/icd.d`|
128+
|`__EGL_VENDOR_LIBRARY_DIRS` | `${SHARUN_DIR}/share/glvnd/egl_vendor.d`|
129+
|`XKB_CONFIG_ROOT` | `${SHARUN_DIR}/share/X11/xkb`|
130+
|`GSETTINGS_SCHEMA_DIR` | `${SHARUN_DIR}/share/glib-2.0/schemas`|
131+
|`GIMP2_DATADIR` | `${SHARUN_DIR}/share/gimp/2.0`|
132+
|`TERMINFO` | `${SHARUN_DIR}/share/terminfo`|
133+
|||
134+
|---|---|
135+
|`FONTCONFIG_FILE` | `${SHARUN_DIR}/etc/fonts/fonts.conf`|
136+
|`GIMP2_SYSCONFDIR` | `${SHARUN_DIR}/etc/gimp/2.0`|
130137

131138
## Projects that use sharun:
132139
* [pelfCreator](https://github.com/xplshn/pelf/blob/pelf-ng/pelfCreator)
@@ -137,6 +144,8 @@ cp ./target/$(uname -m)-unknown-linux-musl/release/sharun .
137144
* [mpv-AppImage](https://github.com/Samueru-sama/mpv-AppImage)
138145
* [OBS-Studio-AppImage](https://github.com/Samueru-sama/OBS-Studio-AppImage)
139146
* [GIMP-AppImage](https://github.com/Samueru-sama/GIMP-AppImage)
147+
* [RMG](https://github.com/Rosalie241/RMG)
148+
* [PrusaSlicer](https://github.com/probonopd/PrusaSlicer)
140149

141150
## References
142151
* [userland-execve](https://crates.io/crates/userland-execve)

src/main.rs

+22-1
Original file line numberDiff line numberDiff line change
@@ -595,8 +595,29 @@ fn main() {
595595
CString::from_str(&interpreter.to_string_lossy()).unwrap(),
596596
CString::new("--library-path").unwrap(),
597597
CString::new(library_path).unwrap(),
598-
CString::new(bin).unwrap()
598+
CString::new("--argv0").unwrap(),
599+
CString::new(arg0_path.to_str().unwrap()).unwrap()
599600
];
601+
602+
let preload_path = PathBuf::from(format!("{sharun_dir}/.preload"));
603+
if preload_path.exists() {
604+
let data = read_to_string(&preload_path).unwrap_or_else(|err|{
605+
eprintln!("Failed to read .preload file: {}: {err}", preload_path.display());
606+
exit(1)
607+
});
608+
let mut preload: Vec<String> = vec![];
609+
for string in data.trim().split("\n") {
610+
preload.push(string.trim().into());
611+
}
612+
if !preload.is_empty() {
613+
interpreter_args.append(&mut vec![
614+
CString::new("--preload").unwrap(),
615+
CString::new(preload.join(" ")).unwrap()
616+
])
617+
}
618+
}
619+
620+
interpreter_args.push(CString::new(bin).unwrap());
600621
for arg in exec_args {
601622
interpreter_args.push(CString::from_str(&arg).unwrap())
602623
}

0 commit comments

Comments
 (0)