* fix a dumb linking problem with the order of the libs on the command line

* add a premake override to allow specifying whole archives (even when not static)
This commit is contained in:
otavepto 2024-05-29 21:09:58 +03:00
parent 89f4c7bb62
commit 5c1a1d9075

View File

@ -10,6 +10,7 @@ premake.override(premake.tools.gcc, "getlinks", function(originalFn, cfg, system
-- https://github.com/premake/premake-core/blob/d842e671c7bc7e09f2eeaafd199fd01e48b87ee7/src/tools/gcc.lua#L568C15-L568C22 -- https://github.com/premake/premake-core/blob/d842e671c7bc7e09f2eeaafd199fd01e48b87ee7/src/tools/gcc.lua#L568C15-L568C22
local result = originalFn(cfg, systemonly, nogroups) local result = originalFn(cfg, systemonly, nogroups)
local whole_syslibs = {"-Wl,--whole-archive"}
local static_whole_syslibs = {"-Wl,--whole-archive -Wl,-Bstatic"} local static_whole_syslibs = {"-Wl,--whole-archive -Wl,-Bstatic"}
local endswith = function(s, ptrn) local endswith = function(s, ptrn)
@ -22,6 +23,10 @@ premake.override(premake.tools.gcc, "getlinks", function(originalFn, cfg, system
name = string.sub(name, 0, -14) name = string.sub(name, 0, -14)
table.insert(static_whole_syslibs, name) -- it already includes '-l' table.insert(static_whole_syslibs, name) -- it already includes '-l'
table.insert(idx_to_remove, idx) table.insert(idx_to_remove, idx)
elseif endswith(name, ":whole_archive") then
name = string.sub(name, 0, -15)
table.insert(whole_syslibs, name) -- it already includes '-l'
table.insert(idx_to_remove, idx)
end end
end end
@ -35,12 +40,24 @@ premake.override(premake.tools.gcc, "getlinks", function(originalFn, cfg, system
for i = 1, #a1 do a2[t + i] = a1[i] end for i = 1, #a1 do a2[t + i] = a1[i] end
end end
local new_result = {}
if #whole_syslibs > 1 then
table.insert(whole_syslibs, "-Wl,--no-whole-archive")
move(whole_syslibs, new_result)
end
if #static_whole_syslibs > 1 then if #static_whole_syslibs > 1 then
table.insert(static_whole_syslibs, "-Wl,-Bdynamic -Wl,--no-whole-archive") table.insert(static_whole_syslibs, "-Wl,-Bdynamic -Wl,--no-whole-archive")
move(static_whole_syslibs, result) move(static_whole_syslibs, new_result)
end end
return result -- https://stackoverflow.com/a/71719579
-- because of the dumb way linux handles linking, the order becomes important
-- I've encountered a problem with linking and it was failing with error "undefined reference to `__imp_WSACloseEvent'"
-- despite 'Ws2_32' being added to the list of libraries, turns out some symbols from 'Ws2_32' were being stripped,
-- because no library before it (on the command line) mentioned any of its symbols, the static libs were being appended afterwards on the command line,
-- and they were mentioning some of the now-stripped symbols
move(result, new_result)
return new_result
end) end)