From 0edd8ff4b884eebc30ab04870ab0ea2bb9e4bb60 Mon Sep 17 00:00:00 2001 From: ruki Date: Mon, 15 Dec 2025 22:41:55 +0800 Subject: improve cosmocc for binutils --- xmake/modules/cli/binutils/bin2obj.lua | 3 ++- xmake/modules/utils/binary/bin2obj.lua | 29 +++++++++++++++++++++++++++++ xmake/rules/utils/bin2obj/utils.lua | 32 ++------------------------------ 3 files changed, 33 insertions(+), 31 deletions(-) diff --git a/xmake/modules/cli/binutils/bin2obj.lua b/xmake/modules/cli/binutils/bin2obj.lua index 6ee6c2158..06493143a 100644 --- a/xmake/modules/cli/binutils/bin2obj.lua +++ b/xmake/modules/cli/binutils/bin2obj.lua @@ -31,7 +31,8 @@ local options = { {'p', "plat", "kv", nil, "Set the target platform (macosx, iphoneos, etc.)."}, {nil, "target_minver", "kv", nil, "Set the target minimum version (e.g., 10.0, 18.2)."}, {nil, "xcode_sdkver", "kv", nil, "Set the Xcode SDK version (e.g., 10.0, 18.2)."}, - {nil, "zeroend", "k", nil, "Append a null terminator ('\\0') at the end of data."} + {nil, "zeroend", "k", nil, "Append a null terminator ('\\0') at the end of data."}, + {nil, "cosmocc", "k", nil, "Enable cosmocc support (generate concomitant object file)."} } function main(...) diff --git a/xmake/modules/utils/binary/bin2obj.lua b/xmake/modules/utils/binary/bin2obj.lua index 13ff633e1..e77cfad6f 100644 --- a/xmake/modules/utils/binary/bin2obj.lua +++ b/xmake/modules/utils/binary/bin2obj.lua @@ -49,6 +49,35 @@ function main(binarypath, outputpath, opt) -- do conversion binutils.bin2obj(binarypath, outputpath, opt) + -- generate concomitant object file for cosmocc + if opt.cosmocc then + local arch = opt.arch or "x86_64" + local arch_concomitant + local objectfile_concomitant + if arch == "x86_64" or arch == "x64" then + arch_concomitant = "aarch64" + objectfile_concomitant = path.join(path.directory(outputpath), ".aarch64", path.filename(outputpath)) + elseif arch == "aarch64" or arch == "arm64" then + arch_concomitant = "x86_64" + objectfile_concomitant = path.join(path.directory(outputpath), ".x86_64", path.filename(outputpath)) + end + + if arch_concomitant and objectfile_concomitant then + + -- clone options for concomitant + local opt_concomitant = table.clone(opt) + opt_concomitant.arch = arch_concomitant + opt_concomitant.cosmocc = false + + -- trace + print("converting binary file %s to %s object file %s ..", binarypath, format or "coff", objectfile_concomitant) + + -- do conversion + os.mkdir(path.directory(objectfile_concomitant)) + binutils.bin2obj(binarypath, objectfile_concomitant, opt_concomitant) + end + end + -- trace cprint("${bright}%s generated!", outputpath) end diff --git a/xmake/rules/utils/bin2obj/utils.lua b/xmake/rules/utils/bin2obj/utils.lua index 7149a72a6..3e8802e97 100644 --- a/xmake/rules/utils/bin2obj/utils.lua +++ b/xmake/rules/utils/bin2obj/utils.lua @@ -113,38 +113,10 @@ function generate_objectfile(target, batchcmds, binaryfile, opt) if zeroend then table.insert(argv, "--zeroend") end - batchcmds:vlua("cli.binutils.bin2obj", argv) - - -- generate concomitant object file for cosmocc if is_cosmocc then - local arch_concomitant - local objectfile_concomitant - if arch == "x86_64" or arch == "x64" then - arch_concomitant = "aarch64" - objectfile_concomitant = path.join(path.directory(objectfile), ".aarch64", path.filename(objectfile)) - elseif arch == "aarch64" or arch == "arm64" then - arch_concomitant = "x86_64" - objectfile_concomitant = path.join(path.directory(objectfile), ".x86_64", path.filename(objectfile)) - end - - if arch_concomitant and objectfile_concomitant then - batchcmds:mkdir(path.directory(objectfile_concomitant)) - local argv_concomitant = { - "-i", path(binaryfile), - "-o", path(objectfile_concomitant), - "-f", format, - "-a", arch_concomitant, - "-p", plat - } - if symbol_prefix ~= "_binary_" then - table.insert(argv_concomitant, "--symbol_prefix=" .. symbol_prefix) - end - if zeroend then - table.insert(argv_concomitant, "--zeroend") - end - batchcmds:vlua("cli.binutils.bin2obj", argv_concomitant) - end + table.insert(argv, "--cosmocc") end + batchcmds:vlua("cli.binutils.bin2obj", argv) return objectfile end -- cgit v1.3.1