diff options
| author | ruki <[email protected]> | 2026-02-12 00:55:56 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2026-02-12 00:55:56 +0800 |
| commit | b445dc4e25b5acceacaabcea627fba3703050e15 (patch) | |
| tree | a91b74bd762e157bf9566faa783154655f9563fe /core/src | |
| parent | af7720f0b49e91bae20648f49133c6eef8f9e003 (diff) | |
improve readsyms for wasm/.a
Diffstat (limited to 'core/src')
| -rw-r--r-- | core/src/xmake/binutils/ar/prefix.h | 14 | ||||
| -rw-r--r-- | core/src/xmake/binutils/ar/readsyms.c | 28 |
2 files changed, 41 insertions, 1 deletions
diff --git a/core/src/xmake/binutils/ar/prefix.h b/core/src/xmake/binutils/ar/prefix.h index 53df74e5d..c474eefa6 100644 --- a/core/src/xmake/binutils/ar/prefix.h +++ b/core/src/xmake/binutils/ar/prefix.h @@ -28,6 +28,7 @@ #include "../coff/prefix.h" #include "../elf/prefix.h" #include "../macho/prefix.h" +#include "../wasm/prefix.h" /* ////////////////////////////////////////////////////////////////////////////////////// * forward declarations @@ -35,6 +36,7 @@ extern tb_bool_t xm_binutils_coff_read_symbols(tb_stream_ref_t istream, tb_hize_t base_offset, lua_State *lua); extern tb_bool_t xm_binutils_elf_read_symbols(tb_stream_ref_t istream, tb_hize_t base_offset, lua_State *lua); extern tb_bool_t xm_binutils_macho_read_symbols(tb_stream_ref_t istream, tb_hize_t base_offset, lua_State *lua); +extern tb_bool_t xm_binutils_wasm_read_symbols(tb_stream_ref_t istream, tb_hize_t base_offset, lua_State *lua); /* ////////////////////////////////////////////////////////////////////////////////////// * types @@ -157,6 +159,18 @@ static __tb_inline__ tb_bool_t xm_binutils_ar_get_member_name(tb_stream_ref_t is } } + if (header->name[0] == '/') { + if (header->name[1] == '/') { + tb_strlcpy(name, "//", name_size); + *name_len = 2; + } else { + tb_strlcpy(name, "/", name_size); + *name_len = 1; + } + *bytes_read = 0; + return tb_true; + } + // regular name (null-terminated or space-padded) tb_size_t i = 0; for (i = 0; i < 16 && i < name_size - 1; i++) { diff --git a/core/src/xmake/binutils/ar/readsyms.c b/core/src/xmake/binutils/ar/readsyms.c index 1a0d3b540..3af3f8a62 100644 --- a/core/src/xmake/binutils/ar/readsyms.c +++ b/core/src/xmake/binutils/ar/readsyms.c @@ -30,6 +30,30 @@ /* ////////////////////////////////////////////////////////////////////////////////////// * implementation */ +static tb_int_t xm_binutils_ar_detect_member_format(tb_stream_ref_t istream, tb_hize_t base_offset) { + tb_uint8_t magic[8] = {0}; + if (!tb_stream_seek(istream, base_offset)) { + return -1; + } + if (!tb_stream_bread(istream, magic, 8)) { + tb_stream_seek(istream, base_offset); + return -1; + } + tb_stream_seek(istream, base_offset); + + if (magic[0] == 0x00 && magic[1] == 0x61 && magic[2] == 0x73 && magic[3] == 0x6d) { + return XM_BINUTILS_FORMAT_WASM; + } + if (magic[0] == 0x7f && magic[1] == 'E' && magic[2] == 'L' && magic[3] == 'F') { + return XM_BINUTILS_FORMAT_ELF; + } + if ((magic[0] == 0xfe && magic[1] == 0xed && magic[2] == 0xfa && (magic[3] == 0xce || magic[3] == 0xcf)) || + (magic[0] == 0xce && magic[1] == 0xfa && magic[2] == 0xed && magic[3] == 0xfe) || + (magic[0] == 0xcf && magic[1] == 0xfa && magic[2] == 0xed && magic[3] == 0xfe)) { + return XM_BINUTILS_FORMAT_MACHO; + } + return XM_BINUTILS_FORMAT_UNKNOWN; +} /* parse BSD symbol table (__.SYMDEF or __.SYMDEF SORTED) * @@ -346,7 +370,7 @@ tb_bool_t xm_binutils_ar_read_symbols(tb_stream_ref_t istream, tb_hize_t base_of tb_hize_t current_pos = tb_stream_offset(istream); // detect format - tb_int_t format = xm_binutils_format_detect(istream); + tb_int_t format = xm_binutils_ar_detect_member_format(istream, current_pos); if (format != XM_BINUTILS_FORMAT_AR) { // create entry table lua_newtable(lua); @@ -365,6 +389,8 @@ tb_bool_t xm_binutils_ar_read_symbols(tb_stream_ref_t istream, tb_hize_t base_of read_ok = xm_binutils_elf_read_symbols(istream, current_pos, lua); } else if (format == XM_BINUTILS_FORMAT_MACHO) { read_ok = xm_binutils_macho_read_symbols(istream, current_pos, lua); + } else if (format == XM_BINUTILS_FORMAT_WASM) { + read_ok = xm_binutils_wasm_read_symbols(istream, current_pos, lua); } if (!read_ok) { |
