summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2025-12-07 12:06:33 +0800
committerruki <[email protected]>2025-12-07 17:15:59 +0800
commit774c5110ef60f2878d3a2f503c7a55db4943a1cb (patch)
tree4991d0e5e2c860db91ce5add1791942973c53674
parent582aeb5720c2a75b7dd231c68403976db8123c4a (diff)
add zeroend
-rw-r--r--core/src/xmake/utils/bin2coff.c25
-rw-r--r--core/src/xmake/utils/bin2macho.c27
-rw-r--r--tests/projects/other/bin2obj/xmake.lua1
-rw-r--r--xmake/core/sandbox/modules/utils.lua8
-rw-r--r--xmake/modules/private/utils/bin2obj.lua13
-rw-r--r--xmake/rules/utils/bin2obj/xmake.lua6
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