diff --git a/src/radcon/radcon.c b/src/radcon/radcon.c index 9688340c..ac6335dc 100644 --- a/src/radcon/radcon.c +++ b/src/radcon/radcon.c @@ -72,6 +72,22 @@ rc_context_from_cmd_line(Arena *arena, CmdLine *cmdl) is_elf_debug_present = 1; } + // + // Pick conversion driver + // + RC_Driver driver = RC_Driver_Null; + if (cmd_line_has_flag(cmdl, str8_lit("driver"))) { + String8 driver_name = cmd_line_string(cmdl, str8_lit("driver")); + if (str8_match(driver_name, str8_lit("dwarf"), StringMatchFlag_CaseInsensitive)) { + driver = RC_Driver_Dwarf; + } else if (str8_match(driver_name, str8_lit("pdb"), StringMatchFlag_CaseInsensitive)) { + driver = RC_Driver_Pdb; + } else { + fprintf(stderr, "error: unknown driver \"%.*s\"\n", str8_varg(driver_name)); + os_abort(1); + } + } + // // Load inputs // @@ -144,36 +160,30 @@ rc_context_from_cmd_line(Arena *arena, CmdLine *cmdl) os_abort(1); } - // - // Pick conversion driver - // - RC_Driver driver = RC_Driver_Null; - if (cmd_line_has_flag(cmdl, str8_lit("driver"))) { - String8 driver_name = cmd_line_string(cmdl, str8_lit("driver")); - if (str8_match(driver_name, str8_lit("dwarf"), StringMatchFlag_CaseInsensitive)) { - driver = RC_Driver_Dwarf; - } else if (str8_match(driver_name, str8_lit("pdb"), StringMatchFlag_CaseInsensitive)) { - driver = RC_Driver_Pdb; - } else { - fprintf(stderr, "error: unknown driver %.*s\n", str8_varg(driver_name)); - os_abort(1); - } + if (is_pe_present && (is_elf_present || is_elf_debug_present)) { + fprintf(stderr, "error: command line has too many image types specified.\n"); + os_abort(1); } + ImageType image = Image_Null; String8 image_name = {0}; String8 image_data = {0}; String8 debug_name = {0}; String8 debug_data = {0}; + // - // Input is PE/COFF + // Input has PE/COFF // B32 check_guid = 0; Guid pe_pdb_guid = {0}; if (is_pe_present) { - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, pe_data); + image = Image_CoffPe; + image_name = pe_name; + image_data = pe_data; + PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, pe_data); String8 raw_debug_dir = str8_substr(pe_data, pe.data_dir_franges[PE_DataDirectoryIndex_DEBUG]); PE_DebugInfoList debug_dir = pe_parse_debug_directory(scratch.arena, pe_data, raw_debug_dir); for (PE_DebugInfoNode *debug_n = debug_dir.first; debug_n != 0; debug_n = debug_n->next) { @@ -194,48 +204,28 @@ rc_context_from_cmd_line(Arena *arena, CmdLine *cmdl) } } - if (driver == RC_Driver_Dwarf || driver == RC_Driver_Null) { + if (driver == RC_Driver_Null || driver == RC_Driver_Dwarf) { + PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, pe_data); String8 raw_sections = str8_substr(pe_data, rng_1u64(pe.section_array_off, pe.section_array_off+sizeof(COFF_SectionHeader)*pe.section_count)); U64 section_count = raw_sections.size / sizeof(COFF_SectionHeader); COFF_SectionHeader *section_array = (COFF_SectionHeader *)raw_sections.str; if (dw_is_dwarf_present_coff_section_table(pe_data, pe.string_table_off, section_count, section_array)) { driver = RC_Driver_Dwarf; - image = Image_CoffPe; - image_name = pe_name; - image_data = pe_data; debug_name = pe_name; debug_data = pe_data; goto driver_found; - } else { - if (driver == RC_Driver_Dwarf) { - fprintf(stderr, "error: image doesn't have DWARF debug sections.\n"); - os_abort(1); - } + } else if (driver == RC_Driver_Dwarf) { + fprintf(stderr, "error: image doesn't have DWARF debug sections.\n"); + os_abort(1); } } } - - // - // Input is PDB - // - if (driver == RC_Driver_Null && is_pdb_present) { - if (is_pe_present) { - image = Image_CoffPe; - image_name = pe_name; - image_data = pe_data; - } - driver = RC_Driver_Pdb; - debug_name = pdb_name; - debug_data = pdb_data; - goto driver_found; - } - B32 elf_has_debug_link = 0; ELF_GnuDebugLink debug_link = {0}; if (is_elf_present || is_elf_debug_present) { if (driver != RC_Driver_Null && driver != RC_Driver_Dwarf) { - fprintf(stderr, "ELF inputs are only supported when using DWARF driver.\n"); + fprintf(stderr, "error: ELF inputs are only supported when using DWARF driver.\n"); os_abort(1); } @@ -304,6 +294,23 @@ rc_context_from_cmd_line(Arena *arena, CmdLine *cmdl) } } + // + // Input is PDB + // + if (is_pdb_present) { + if (driver == RC_Driver_Null || driver == RC_Driver_Pdb) { + driver = RC_Driver_Pdb; + debug_name = pdb_name; + debug_data = pdb_data; + goto driver_found; + } else if (driver == RC_Driver_Dwarf) { + fprintf(stderr, "error: unable to select DWARF conversion driver because convert doesn't support PDB as input format.\n"); + os_abort(1); + } else { + InvalidPath; + } + } + driver_found:; // @@ -342,6 +349,24 @@ rc_context_from_cmd_line(Arena *arena, CmdLine *cmdl) ctx.image_data = image_data; ctx.debug_name = debug_name; ctx.debug_data = debug_data; + ctx.flags = RC_Flag_Strings| + RC_Flag_IndexRuns| + RC_Flag_BinarySections| + RC_Flag_Units| + RC_Flag_Procedures| + RC_Flag_GlobalVariables| + RC_Flag_ThreadVariables| + RC_Flag_Scopes| + RC_Flag_Locals| + RC_Flag_Types| + RC_Flag_UDTs| + RC_Flag_LineInfo| + RC_Flag_GlobalVariableNameMap| + RC_Flag_ThreadVariableNameMap| + RC_Flag_ProcedureNameMap| + RC_Flag_TypeNameMap| + RC_Flag_LinkNameProcedureNameMap| + RC_Flag_NormalSourcePathNameMap; if (check_guid) { ctx.flags |= RC_Flag_CheckPdbGuid; ctx.guid = pe_pdb_guid; diff --git a/src/radcon/radcon_pdb.c b/src/radcon/radcon_pdb.c index ca7cdf33..4b395510 100644 --- a/src/radcon/radcon_pdb.c +++ b/src/radcon/radcon_pdb.c @@ -2355,7 +2355,7 @@ p2r_convert(Arena *arena, RDIM_LocalState *local_state, RC_Context *in) ////////////////////////////////////////////////////////////// //- rjf: determine architecture // - RDI_Arch arch = cv2r_rdi_arch_from_cv_arch(dbi->machine_type); + RDI_Arch arch = c2r_rdi_arch_from_coff_machine(dbi->machine_type); U64 arch_addr_size = rdi_addr_size_from_arch(arch); //////////////////////////////////////////////////////////////