diff options
| author | ruki <[email protected]> | 2026-01-30 22:39:36 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2026-01-30 22:39:36 +0800 |
| commit | 9b87a6b6885d004d445f021b9536d08a18225351 (patch) | |
| tree | 6c2a84c75566e37157b91363ece45dd5f5ca9faa /core/src | |
| parent | c50a3cb891f78c187c8bd862a7e0c3ee9b65d1c4 (diff) | |
detect shebang format
Diffstat (limited to 'core/src')
| -rw-r--r-- | core/src/xmake/binutils/format.c | 18 | ||||
| -rw-r--r-- | core/src/xmake/binutils/prefix.h | 1 |
2 files changed, 19 insertions, 0 deletions
diff --git a/core/src/xmake/binutils/format.c b/core/src/xmake/binutils/format.c index 4decff29f..670dec46b 100644 --- a/core/src/xmake/binutils/format.c +++ b/core/src/xmake/binutils/format.c @@ -84,6 +84,10 @@ static __tb_inline__ tb_bool_t xm_binutils_format_is_ar(tb_byte_t const* first8) (first8[7] == '\n' || first8[7] == '\r'); } +static __tb_inline__ tb_bool_t xm_binutils_format_is_shebang(tb_byte_t const* first2) { + return first2[0] == '#' && first2[1] == '!'; +} + static __tb_inline__ tb_bool_t xm_binutils_format_is_elf(tb_byte_t const* first8) { return first8[0] == 0x7f && first8[1] == 'E' && first8[2] == 'L' && first8[3] == 'F'; } @@ -125,6 +129,19 @@ tb_int_t xm_binutils_format_detect(tb_stream_ref_t istream) { tb_int_t format = -1; do { + tb_byte_t* p2 = tb_null; + if (!tb_stream_peek(istream, &p2, 2)) { + tb_hong_t size = tb_stream_size(istream); + if (size > 0 && size < 2) { + format = XM_BINUTILS_FORMAT_UNKNOWN; + } + break; + } + if (xm_binutils_format_is_shebang(p2)) { + format = XM_BINUTILS_FORMAT_SHEBANG; + break; + } + tb_byte_t* p = tb_null; if (!tb_stream_peek(istream, &p, 8)) { tb_hong_t size = tb_stream_size(istream); @@ -210,6 +227,7 @@ tb_int_t xm_binutils_format(lua_State *lua) { case XM_BINUTILS_FORMAT_MACHO: lua_pushliteral(lua, "macho"); break; case XM_BINUTILS_FORMAT_AR: lua_pushliteral(lua, "ar"); break; case XM_BINUTILS_FORMAT_PE: lua_pushliteral(lua, "pe"); break; + case XM_BINUTILS_FORMAT_SHEBANG: lua_pushliteral(lua, "shebang"); break; default: lua_pushliteral(lua, "unknown"); break; } diff --git a/core/src/xmake/binutils/prefix.h b/core/src/xmake/binutils/prefix.h index a38eef658..482895c22 100644 --- a/core/src/xmake/binutils/prefix.h +++ b/core/src/xmake/binutils/prefix.h @@ -34,6 +34,7 @@ #define XM_BINUTILS_FORMAT_MACHO 3 #define XM_BINUTILS_FORMAT_AR 4 #define XM_BINUTILS_FORMAT_PE 5 +#define XM_BINUTILS_FORMAT_SHEBANG 6 #define XM_BINUTILS_FORMAT_UNKNOWN 0 // COFF machine types (for format detection) |
