Skip to content

Commit 8fa7eda

Browse files
dannotedoawoo
authored andcommitted
Set LD_LIBRARY_PATH on Linux for NIF shared library resolution
When using custom_erts with a glibc-linked ERTS (e.g. from builds.hex.pm), NIF .so files may depend on system shared libraries like libgcc_s.so.1. The BEAM process doesn't search standard system library paths by default, causing dlopen to fail. Add common system library paths to LD_LIBRARY_PATH so NIF shared objects can find their dependencies.
1 parent e85ec0c commit 8fa7eda

1 file changed

Lines changed: 10 additions & 0 deletions

File tree

src/erlang_launcher.zig

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,16 @@ pub fn launch(install_dir: []const u8, env_map: *EnvMap, meta: *const MetaStruct
118118
try erl_env_map.put("__BURRITO", "1");
119119
try erl_env_map.put("__BURRITO_BIN_PATH", self_path);
120120

121+
// Extend LD_LIBRARY_PATH so NIF .so files can find system shared
122+
// libraries (e.g. libgcc_s.so.1) when using a custom glibc ERTS
123+
const system_lib_paths = "/lib/x86_64-linux-gnu:/usr/lib/x86_64-linux-gnu:/lib:/usr/lib";
124+
if (erl_env_map.get("LD_LIBRARY_PATH")) |existing| {
125+
const combined = try std.fmt.allocPrint(allocator, "{s}:{s}", .{ existing, system_lib_paths });
126+
try erl_env_map.put("LD_LIBRARY_PATH", combined);
127+
} else {
128+
try erl_env_map.put("LD_LIBRARY_PATH", system_lib_paths);
129+
}
130+
121131
return std.process.execve(allocator, final_args, &erl_env_map);
122132
}
123133
}

0 commit comments

Comments
 (0)