diff --git a/src/linker.cpp b/src/linker.cpp index db96851..931ec6e 100644 --- a/src/linker.cpp +++ b/src/linker.cpp @@ -28,14 +28,23 @@ constexpr bool remove_dynamic_linker = false; constexpr nonstd::string_view dynamic_linker = ""; #endif +void maybeFilterLinking(std::vector &new_args, + nonstd::span old_args, bool is_linking) { + if (!is_linking) + args::filterLinking(new_args, old_args); + else + for (auto arg : old_args) + new_args.push_back(arg); +} + int main(const bins::Info &info, nonstd::span args) { - std::vector combined_args; + std::vector combined_args, combined_args_begin; if (!dynamic_linker.empty() && args::hasDynamicLinker(args)) { - combined_args.push_back("-dynamic-linker"); - combined_args.push_back(dynamic_linker); + combined_args_begin.push_back("-dynamic-linker"); + combined_args_begin.push_back(dynamic_linker); } - flags::appendFromString(combined_args, WRAPPER_LDFLAGS_BEFORE); - flags::appendFromVar(combined_args, VAR_PREFIX "_LDFLAGS_BEFORE"); + flags::appendFromString(combined_args_begin, WRAPPER_LDFLAGS_BEFORE); + flags::appendFromVar(combined_args_begin, VAR_PREFIX "_LDFLAGS_BEFORE"); std::vector initial_args; compiler::filterFlags(initial_args, args, remove_dynamic_linker); @@ -50,14 +59,18 @@ int main(const bins::Info &info, nonstd::span args) { flags::appendFromVar(combined_args, VAR_PREFIX "_LDFLAGS_DYNAMIC"); } - std::vector filtered_args; + std::vector filtered_args, filtered_args_begin; + path::appendGood(filtered_args_begin, combined_args_begin, env::purePrefixes()); path::appendGood(filtered_args, combined_args, env::purePrefixes()); + const bool is_linking = args::isLinking(args); std::vector final_args; + maybeFilterLinking(final_args, filtered_args_begin, is_linking); state::Libs libs; const bool add_rpath = util::getenv(VAR_PREFIX "_LD_ADD_RPATH").value_or("1") == "1"; if (dynamic && add_rpath) { + args::parseLibs(libs, filtered_args_begin); args::parseLibs(libs, filtered_args); #ifdef BUILD_DIR_ENV_VAR auto build_dir = util::getenv(BUILD_DIR_ENV_VAR); @@ -72,11 +85,7 @@ int main(const bins::Info &info, nonstd::span args) { final_args.push_back(rpath); } } - if (!args::isLinking(args)) - args::filterLinking(final_args, filtered_args); - else - for (auto arg : filtered_args) - final_args.push_back(arg); + maybeFilterLinking(final_args, filtered_args, is_linking); return generic::main(info, final_args); }