From b2d8a4917a656c83d01a1d791434204fdd3d0444 Mon Sep 17 00:00:00 2001 From: pancake Date: Tue, 8 Sep 2026 07:23:27 +0000 Subject: [PATCH] Fix the windows build by avoiding posix-only apis and translating the r2 flags for msvc --- meson.build | 29 ++++++++++++++++++++++++++--- src/lib/dart_app.c | 15 +++++++++++++-- src/lib/dart_pool_names.c | 2 +- 3 files changed, 40 insertions(+), 6 deletions(-) diff --git a/meson.build b/meson.build index 57d56e6..5eb89c3 100644 --- a/meson.build +++ b/meson.build @@ -2,17 +2,40 @@ project( 'r2flutter', 'c', version : '0.3.2', - meson_version : '>=0.55.0', + meson_version : '>=0.56.0', default_options : ['warning_level=2', 'werror=false'] ) +cc = meson.get_compiler('c') + r2 = find_program('r2', required: true) r2_cflags_res = run_command(r2, '-H', 'R2_CFLAGS', check: true) r2_ldflags_res = run_command(r2, '-H', 'R2_LDFLAGS', check: true) r2_libs_res = run_command(r2, '-H', 'R2_LIBS', check: true) + +r2_compile_args = r2_cflags_res.stdout().strip().split() +r2_link_args = r2_ldflags_res.stdout().strip().split() + r2_libs_res.stdout().strip().split() + +# r2 -H always reports gcc style flags, msvc needs its own spelling for them +if cc.get_argument_syntax() == 'msvc' + msvc_link_args = [] + foreach flag : r2_link_args + if flag.startswith('-L') + msvc_link_args += '/LIBPATH:' + flag.substring(2) + elif flag.startswith('-l') + msvc_link_args += flag.substring(2) + '.lib' + else + msvc_link_args += flag + endif + endforeach + r2_link_args = msvc_link_args + # posix names like strdup are available, just noisy without this + r2_compile_args += ['-D_CRT_SECURE_NO_WARNINGS', '-D_CRT_NONSTDC_NO_DEPRECATE'] +endif + r_core_dep = declare_dependency( - compile_args: r2_cflags_res.stdout().strip().split(), - link_args: r2_ldflags_res.stdout().strip().split() + r2_libs_res.stdout().strip().split(), + compile_args: r2_compile_args, + link_args: r2_link_args, ) r2flutter_inc = include_directories('include') diff --git a/src/lib/dart_app.c b/src/lib/dart_app.c index fe668f2..91005c5 100644 --- a/src/lib/dart_app.c +++ b/src/lib/dart_app.c @@ -179,13 +179,24 @@ static FILE *open_payload_temp(char **out_path) { FILE *out = try_open_temp_path (r_file_temp ("r2flutter-dart-app-snap"), out_path); if (!out) { char *name = r_str_newf ("r2flutter-dart-app-snap.%" PFMT64x, (ut64)r_time_now ()); - char *path = name? r_file_new (P_tmpdir, name, NULL): NULL; + char *tmpdir = r_file_tmpdir (); + char *path = (name && tmpdir)? r_file_new (tmpdir, name, NULL): NULL; + free (tmpdir); free (name); out = try_open_temp_path (path, out_path); } return out; } +// msvc has no fseeko, but it ships an equivalent 64bit seek +static bool payload_seek(FILE *f, ut64 off) { +#if defined(_MSC_VER) + return _fseeki64 (f, (__int64)off, SEEK_SET) == 0; +#else + return fseeko (f, (off_t)off, SEEK_SET) == 0; +#endif +} + char *dart_app_extract_payload(const char *path, const DartAppEmbeddedPayload *payload) { if (R_STR_ISEMPTY (path) || !payload || !payload->payload_size) { return NULL; @@ -202,7 +213,7 @@ char *dart_app_extract_payload(const char *path, const DartAppEmbeddedPayload *p fclose (in); return NULL; } - bool ok = fseeko (in, (off_t)payload->payload_offset, SEEK_SET) == 0; + bool ok = payload_seek (in, payload->payload_offset); ut64 remaining = payload->payload_size; ut8 buf[65536]; while (ok && remaining > 0) { diff --git a/src/lib/dart_pool_names.c b/src/lib/dart_pool_names.c index c3466c2..6fd4d44 100644 --- a/src/lib/dart_pool_names.c +++ b/src/lib/dart_pool_names.c @@ -377,7 +377,7 @@ void collect_data_names_with_r2(DartCtx *ctx, ut64 data_image_base, ut64 data_im continue; } char *line, *saveptr = NULL; - for (line = strtok_r (out, "\n", &saveptr); line; line = strtok_r (NULL, "\n", &saveptr)) { + for (line = r_str_tok_r (out, "\n", &saveptr); line; line = r_str_tok_r (NULL, "\n", &saveptr)) { if (!r_str_startswith (line, "0x")) { continue; }