diff --git a/src/linker/lnk_config.c b/src/linker/lnk_config.c index f4dc456e..16132546 100644 --- a/src/linker/lnk_config.c +++ b/src/linker/lnk_config.c @@ -711,6 +711,18 @@ lnk_parse_export_directive(Arena *arena, String8 directive, LNK_Obj *obj, PE_Exp return is_parsed; } +internal String8 +lnk_text_file_string_from_data(Arena *arena, String8 data) +{ + String8 result = data; + if (data.size >= 2 && data.str[0] == 0xff && data.str[1] == 0xfe) { + result = str8_from_16(arena, str16((U16 *)(data.str + 2), (data.size - 2) / sizeof(U16))); + } else if (data.size >= 3 && data.str[0] == 0xef && data.str[1] == 0xbb && data.str[2] == 0xbf) { + result = str8_skip(data, 3); + } + return result; +} + internal B32 lnk_parse_merge_directive(String8 string, LNK_Obj *obj, LNK_MergeDirective *out) { @@ -1091,6 +1103,7 @@ lnk_unwrap_rsp(Arena *arena, String8List arg_list) if (file_path_exists(name)) { // read rsp from disk String8 file = lnk_read_data_from_file_path(scratch.arena, 0, name); + file = lnk_text_file_string_from_data(scratch.arena, file); // parse rsp String8List rsp_args = lnk_arg_list_parse_windows_rules(scratch.arena, file); diff --git a/src/linker/tests/linker_tests.c b/src/linker/tests/linker_tests.c index bd1c8d56..80f4d52a 100644 --- a/src/linker/tests/linker_tests.c +++ b/src/linker/tests/linker_tests.c @@ -2791,6 +2791,19 @@ TEST(import_export) //T_Ok(t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe /delayload:export.dll /export:entry kernel32.Lib delayimp.lib libcmt.lib export.lib import.obj entry.obj") == 0); // TODO: check import table } + +TEST(utf16_rsp) +{ + T_Ok(t_write_entry_obj()); + + String8 rsp_text = str8_lit("/subsystem:console /entry:entry /out:a.exe entry.obj\n"); + String16 rsp16 = str16_from_8(arena, rsp_text); + String8 rsp_file = str8_cat(arena, str8_lit("\xff\xfe"), str8_array(rsp16.str, rsp16.size)); + T_Ok(t_write_file(str8_lit("args.rsp"), rsp_file)); + + t_invoke_linkerf("@args.rsp"); + T_Ok(g_last_exit_code == 0); +} #endif TEST(image_base)