diff options
| author | ruki <[email protected]> | 2025-12-07 12:06:33 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2025-12-07 17:15:59 +0800 |
| commit | 774c5110ef60f2878d3a2f503c7a55db4943a1cb (patch) | |
| tree | 4991d0e5e2c860db91ce5add1791942973c53674 | |
| parent | 582aeb5720c2a75b7dd231c68403976db8123c4a (diff) | |
add zeroend
| -rw-r--r-- | core/src/xmake/utils/bin2coff.c | 25 | ||||
| -rw-r--r-- | core/src/xmake/utils/bin2macho.c | 27 | ||||
| -rw-r--r-- | tests/projects/other/bin2obj/xmake.lua | 1 | ||||
| -rw-r--r-- | xmake/core/sandbox/modules/utils.lua | 8 | ||||
| -rw-r--r-- | xmake/modules/private/utils/bin2obj.lua | 13 | ||||
| -rw-r--r-- | xmake/rules/utils/bin2obj/xmake.lua | 6 |
6 files changed, 66 insertions, 14 deletions
diff --git a/core/src/xmake/utils/bin2coff.c b/core/src/xmake/utils/bin2coff.c index be8a313ad..58c05cd33 100644 --- a/core/src/xmake/utils/bin2coff.c +++ b/core/src/xmake/utils/bin2coff.c @@ -155,7 +155,8 @@ static tb_bool_t xm_utils_bin2coff_dump(tb_stream_ref_t istream, tb_stream_ref_t ostream, tb_char_t const *symbol_prefix, tb_char_t const *arch, - tb_char_t const *basename) { + tb_char_t const *basename, + tb_bool_t zeroend) { tb_assert_and_check_return_val(istream && ostream, tb_false); // get file size @@ -164,6 +165,13 @@ static tb_bool_t xm_utils_bin2coff_dump(tb_stream_ref_t istream, return tb_false; } tb_uint32_t datasize = (tb_uint32_t)filesize; + // add null terminator if zeroend is true + if (zeroend) { + if (datasize >= 0xffffffffU) { + return tb_false; // would overflow + } + datasize++; + } // generate symbol names from filename tb_char_t symbol_name[256] = {0}; @@ -254,6 +262,13 @@ static tb_bool_t xm_utils_bin2coff_dump(tb_stream_ref_t istream, } left -= to_read; } + // append null terminator if zeroend is true + if (zeroend) { + tb_byte_t zero = 0; + if (!tb_stream_bwrit(ostream, &zero, 1)) { + return tb_false; + } + } // align to 4 bytes tb_uint32_t padding = (4 - (section_data_size & 3)) & 3; @@ -351,6 +366,12 @@ tb_int_t xm_utils_bin2coff(lua_State *lua) { // get basename (optional) tb_char_t const *basename = lua_isstring(lua, 5) ? lua_tostring(lua, 5) : tb_null; + // get platform (optional, not used but passed for consistency) + tb_char_t const *plat = lua_isstring(lua, 6) ? lua_tostring(lua, 6) : tb_null; + + // get zeroend (optional, default: false) + tb_bool_t zeroend = lua_toboolean(lua, 7); + // do dump tb_bool_t ok = tb_false; tb_stream_ref_t istream = tb_stream_init_from_file(binaryfile, TB_FILE_MODE_RO); @@ -369,7 +390,7 @@ tb_int_t xm_utils_bin2coff(lua_State *lua) { break; } - if (!xm_utils_bin2coff_dump(istream, ostream, symbol_prefix, arch, basename)) { + if (!xm_utils_bin2coff_dump(istream, ostream, symbol_prefix, arch, basename, zeroend)) { lua_pushboolean(lua, tb_false); lua_pushfstring(lua, "bin2coff: dump data failed"); break; diff --git a/core/src/xmake/utils/bin2macho.c b/core/src/xmake/utils/bin2macho.c index 5499ee103..c0798fa02 100644 --- a/core/src/xmake/utils/bin2macho.c +++ b/core/src/xmake/utils/bin2macho.c @@ -300,7 +300,8 @@ static tb_bool_t xm_utils_bin2macho_dump_64(tb_stream_ref_t istream, tb_char_t const *arch, tb_char_t const *basename, tb_uint32_t minos, - tb_uint32_t sdk) { + tb_uint32_t sdk, + tb_bool_t zeroend) { tb_assert_and_check_return_val(istream && ostream, tb_false); // get file size @@ -309,6 +310,13 @@ static tb_bool_t xm_utils_bin2macho_dump_64(tb_stream_ref_t istream, return tb_false; } tb_uint32_t datasize = (tb_uint32_t)filesize; + // add null terminator if zeroend is true + if (zeroend) { + if (datasize >= 0xffffffffU) { + return tb_false; // would overflow + } + datasize++; + } // generate symbol names from filename tb_char_t symbol_name[256] = {0}; @@ -458,6 +466,13 @@ static tb_bool_t xm_utils_bin2macho_dump_64(tb_stream_ref_t istream, } left -= to_read; } + // append null terminator if zeroend is true + if (zeroend) { + tb_byte_t zero = 0; + if (!tb_stream_bwrit(ostream, &zero, 1)) { + return tb_false; + } + } // align to 8 bytes padding = symtab_offset - data_end_offset; @@ -539,9 +554,10 @@ static tb_bool_t xm_utils_bin2macho_dump(tb_stream_ref_t istream, tb_char_t const *arch, tb_char_t const *basename, tb_uint32_t minos, - tb_uint32_t sdk) { + tb_uint32_t sdk, + tb_bool_t zeroend) { if (xm_utils_bin2macho_is_64bit(arch)) { - return xm_utils_bin2macho_dump_64(istream, ostream, symbol_prefix, plat, arch, basename, minos, sdk); + return xm_utils_bin2macho_dump_64(istream, ostream, symbol_prefix, plat, arch, basename, minos, sdk, zeroend); } else { // 32-bit not implemented yet return tb_false; @@ -587,6 +603,9 @@ tb_int_t xm_utils_bin2macho(lua_State *lua) { tb_char_t const *sdk_str = lua_isstring(lua, 8) ? lua_tostring(lua, 8) : tb_null; tb_uint32_t sdk = xm_utils_bin2macho_parse_version(sdk_str); + // get zeroend (optional, default: false) + tb_bool_t zeroend = lua_toboolean(lua, 9); + // do dump tb_bool_t ok = tb_false; tb_stream_ref_t istream = tb_stream_init_from_file(binaryfile, TB_FILE_MODE_RO); @@ -605,7 +624,7 @@ tb_int_t xm_utils_bin2macho(lua_State *lua) { break; } - if (!xm_utils_bin2macho_dump(istream, ostream, symbol_prefix, plat, arch, basename, minos, sdk)) { + if (!xm_utils_bin2macho_dump(istream, ostream, symbol_prefix, plat, arch, basename, minos, sdk, zeroend)) { lua_pushboolean(lua, tb_false); lua_pushfstring(lua, "bin2macho: dump data failed"); break; diff --git a/tests/projects/other/bin2obj/xmake.lua b/tests/projects/other/bin2obj/xmake.lua index bcd64fff5..e20a329e1 100644 --- a/tests/projects/other/bin2obj/xmake.lua +++ b/tests/projects/other/bin2obj/xmake.lua @@ -6,4 +6,3 @@ target("test") add_files("src/*.c") add_files("src/*.bin") add_files("src/*.png") - diff --git a/xmake/core/sandbox/modules/utils.lua b/xmake/core/sandbox/modules/utils.lua index b3453cb92..3601c1470 100644 --- a/xmake/core/sandbox/modules/utils.lua +++ b/xmake/core/sandbox/modules/utils.lua @@ -160,8 +160,8 @@ end -- generate COFF object file from the binary file if utils.bin2coff then - function sandbox_utils.bin2coff(binaryfile, outputfile, symbol_prefix, arch, basename) - local ok, errors = utils.bin2coff(binaryfile, outputfile, symbol_prefix, arch, basename) + function sandbox_utils.bin2coff(binaryfile, outputfile, symbol_prefix, arch, basename, plat, zeroend) + local ok, errors = utils.bin2coff(binaryfile, outputfile, symbol_prefix, arch, basename, plat, zeroend) if not ok then os.raise(errors) end @@ -170,8 +170,8 @@ end -- generate Mach-O object file from the binary file if utils.bin2macho then - function sandbox_utils.bin2macho(binaryfile, outputfile, symbol_prefix, plat, arch, basename, target_minver, xcode_sdkver) - local ok, errors = utils.bin2macho(binaryfile, outputfile, symbol_prefix, plat, arch, basename, target_minver, xcode_sdkver) + function sandbox_utils.bin2macho(binaryfile, outputfile, symbol_prefix, plat, arch, basename, target_minver, xcode_sdkver, zeroend) + local ok, errors = utils.bin2macho(binaryfile, outputfile, symbol_prefix, plat, arch, basename, target_minver, xcode_sdkver, zeroend) if not ok then os.raise(errors) end diff --git a/xmake/modules/private/utils/bin2obj.lua b/xmake/modules/private/utils/bin2obj.lua index a41c919fe..2e2e4bd94 100644 --- a/xmake/modules/private/utils/bin2obj.lua +++ b/xmake/modules/private/utils/bin2obj.lua @@ -29,7 +29,8 @@ local options = { {'a', "arch", "kv", nil, "Set the target architecture."}, {'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, "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."} } function _do_bin2obj_coff(binarypath, outputpath, opt) @@ -42,6 +43,9 @@ function _do_bin2obj_coff(binarypath, outputpath, opt) -- get platform (not used for COFF, but passed for consistency) local platform = opt.plat + -- get zeroend (default: false) + local zeroend = opt.zeroend or false + -- get filename from binary path (with extension, dots replaced with underscores) local filename = path.filename(binarypath) -- replace dots with underscores for symbol name (e.g., data.bin -> data_bin) @@ -52,7 +56,7 @@ function _do_bin2obj_coff(binarypath, outputpath, opt) -- do dump if utils.bin2coff then - utils.bin2coff(binarypath, outputpath, symbol_prefix, arch, basename) + utils.bin2coff(binarypath, outputpath, symbol_prefix, arch, basename, platform, zeroend) else raise("bin2obj: utils.bin2coff not available (C implementation not compiled)") end @@ -81,6 +85,9 @@ function _do_bin2obj_macho(binarypath, outputpath, opt) -- get xcode sdk version (default: nil, will use default 10.0.0 in C) local xcode_sdkver = opt.xcode_sdkver + -- get zeroend (default: false) + local zeroend = opt.zeroend or false + -- get filename from binary path (with extension, dots replaced with underscores) local filename = path.filename(binarypath) -- replace dots with underscores for symbol name (e.g., data.bin -> data_bin) @@ -91,7 +98,7 @@ function _do_bin2obj_macho(binarypath, outputpath, opt) -- do dump if utils.bin2macho then - utils.bin2macho(binarypath, outputpath, symbol_prefix, plat, arch, basename, target_minver, xcode_sdkver) + utils.bin2macho(binarypath, outputpath, symbol_prefix, plat, arch, basename, target_minver, xcode_sdkver, zeroend) else raise("bin2obj: utils.bin2macho not available (C implementation not compiled)") end diff --git a/xmake/rules/utils/bin2obj/xmake.lua b/xmake/rules/utils/bin2obj/xmake.lua index 1f8e6e0b2..53ceb6a51 100644 --- a/xmake/rules/utils/bin2obj/xmake.lua +++ b/xmake/rules/utils/bin2obj/xmake.lua @@ -47,6 +47,9 @@ rule("utils.bin2obj") -- get symbol prefix (default: _binary_) local symbol_prefix = target:extraconf("rules", "utils.bin2obj", "symbol_prefix") or "_binary_" + -- get zeroend (default: false) + local zeroend = target:extraconf("rules", "utils.bin2obj", "zeroend") or false + -- get architecture local arch = target:arch() @@ -81,6 +84,9 @@ rule("utils.bin2obj") if xcode_sdkver then table.insert(argv, "--xcode_sdkver=" .. xcode_sdkver) end + if zeroend then + table.insert(argv, "--zeroend") + end batchcmds:vlua("private.utils.bin2obj", argv) -- add deps |
