diff options
| author | gingerBill <gingerBill@users.noreply.github.com> | 2024-09-10 21:59:21 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-09-10 21:59:21 +0100 |
| commit | b442ea86012fb4d07c79bcc6debbd79bd047b63e (patch) | |
| tree | 31b4df188f579fad73746ea0e27236e9541be7e9 /src/linker.cpp | |
| parent | 309ea50a7cb93a3e84098b9312b7ef94feeff8ee (diff) | |
| parent | 6778598bc648a4c605fb1b488185fad59668185a (diff) | |
Merge pull request #4206 from laytan/improve-linking-shared-libraries
Improve linking shared libraries
Diffstat (limited to 'src/linker.cpp')
| -rw-r--r-- | src/linker.cpp | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/src/linker.cpp b/src/linker.cpp index faca28932..500fead69 100644 --- a/src/linker.cpp +++ b/src/linker.cpp @@ -548,14 +548,8 @@ gb_internal i32 linker_stage(LinkerData *gen) { // available at runtime wherever the executable is run, so we make require those to be // local to the executable (unless the system collection is used, in which case we search // the system library paths for the library file). - if (string_ends_with(lib, str_lit(".a")) || string_ends_with(lib, str_lit(".o"))) { - // static libs and object files, absolute full path relative to the file in which the lib was imported from + if (string_ends_with(lib, str_lit(".a")) || string_ends_with(lib, str_lit(".o")) || string_ends_with(lib, str_lit(".so")) || string_contains_string(lib, str_lit(".so."))) { lib_str = gb_string_append_fmt(lib_str, " -l:\"%.*s\" ", LIT(lib)); - } else if (string_ends_with(lib, str_lit(".so")) || string_contains_string(lib, str_lit(".so."))) { - // dynamic lib, relative path to executable - // NOTE(vassvik): it is the user's responsibility to make sure the shared library files are visible - // at runtime to the executable - lib_str = gb_string_append_fmt(lib_str, " -l:\"%s/%.*s\" ", cwd, LIT(lib)); } else { // dynamic or static system lib, just link regularly searching system library paths lib_str = gb_string_append_fmt(lib_str, " -l%.*s ", LIT(lib)); @@ -643,6 +637,16 @@ gb_internal i32 linker_stage(LinkerData *gen) { } } + if (!build_context.no_rpath) { + // Set the rpath to the $ORIGIN/@loader_path (the path of the executable), + // so that dynamic libraries are looked for at that path. + if (build_context.metrics.os == TargetOs_darwin) { + link_settings = gb_string_appendc(link_settings, "-Wl,-rpath,@loader_path "); + } else { + link_settings = gb_string_appendc(link_settings, "-Wl,-rpath,\\$ORIGIN "); + } + } + if (!build_context.no_crt) { platform_lib_str = gb_string_appendc(platform_lib_str, "-lm "); if (build_context.metrics.os == TargetOs_darwin) { |