def c2mpt_local_run(input_file, arguments): """ :param input_file: :type input_file: :param arguments: :type arguments: """ print_info("Compiling program for host") cprog = arguments["host_c_compiler"] cflags = " -std=c99" cflags += " -DMPT_BASE_ADDRESS=%d" % arguments.get("host_displacement", 0) cflags += " ".join( [" -I \"" + elem + "\"" for elem in MICROPROBE_RC['template_paths']]) cflags += " \"%s\"" % findfiles(MICROPROBE_RC['template_paths'], "c2mpt.c$")[0] cflags += " -Wl,--section-start,microprobe.text=" cflags += hex(arguments["default_code_address"]) cflags += " -Wl,--section-start,microprobe.data=" cflags += hex(arguments["default_data_address"]) cflags += " " + arguments["host_c_compiler_flags"] suffix = ".host.bin" if "save_temps" in arguments: compile_file = input_file.rstrip(".c") + suffix else: compile_file = _temp_file(suffix=suffix) _RM_FILES.append(compile_file) cmd = "\"%s\" %s \"%s\" -o \"%s\"" % (cprog, cflags, input_file, compile_file) print_info("Executing compilation command") run_cmd(cmd) print_info("Executing the compiled program") vardefinitions = run_cmd_output("%s" % compile_file) return vardefinitions
def dump_bin(target, arguments): """ :param target: :type target: :param arguments: :type arguments: """ print_info("Parsing input file...") cmd = "od -Ax -tx1 -v '%s'" % arguments['input_bin_file'] text_string = run_cmd_output(cmd) bintext = [] for line in text_string.split('\n'): if line == "": continue bintext.append("".join(line.split(' ')[1:])) instrs = interpret_bin("".join(bintext), target, safe=arguments['safe']) for instr in instrs: print(instruction_from_definition(instr).assembly())
def dump_objdump(target, arguments): """ :param target: :type target: :param arguments: :type arguments: """ cmd = "'%s' -Ax -tx1 -v '%s'" % (arguments['od_bin'], arguments['input_bin_file']) text_string = run_cmd_output(cmd) bintext = [] for line in text_string.split('\n'): if line == "": continue bintext.append("".join(line.split(' ')[1:])) instrs = interpret_bin("".join(bintext), target) print("") print("%s:\tfile format raw %s" % (os.path.basename(arguments['input_bin_file']), target.isa.name)) print("") print("") print("Disassembly of section .raw:") print("") maxlen = max(len(instr.asm[2:]) for instr in instrs) if maxlen % 2 != 0: maxlen = maxlen + 1 maxlen += maxlen // 2 counter = arguments['start_address'] label_dict = RejectingOrderedDict() instr_dict = RejectingOrderedDict() for instr_def in instrs: instr = instruction_from_definition(instr_def, fix_relative=False) asm = instr.assembly().lower() relative = None absolute = None if instr.branch: for memoperand in instr.memory_operands(): if not memoperand.descriptor.is_branch_target: continue for operand in memoperand.operands: if operand.type.address_relative: relative = operand.value if operand.type.address_absolute: absolute = operand.value masm = instr_def.asm[2:] if len(masm) % 2 != 0: masm = "0" + masm binary = " ".join([str(masm)[i:i + 2] for i in range(0, len(masm), 2)]) label = None if counter == 0: label = ".raw" label_dict[counter] = label elif counter in label_dict: label = label_dict[counter] rtarget = None atarget = None if relative is not None or absolute is not None: if relative is not None: assert absolute is None if isinstance(relative, six.integer_types): target_addr = counter + relative rtarget = relative elif isinstance(relative, Address): target_addr = counter + relative.displacement rtarget = relative.displacement else: raise NotImplementedError if absolute is not None: assert relative is None if isinstance(absolute, six.integer_types): target_addr = absolute atarget = absolute elif isinstance(absolute, Address): target_addr = absolute.displacement atarget = absolute.displacement else: raise NotImplementedError if target_addr not in label_dict: label_dict[target_addr] = "branch_%x" % target_addr if target_addr in instr_dict: instr_dict[target_addr][2] = label_dict[target_addr] instr_dict[counter] = [binary, asm, label, rtarget, atarget] counter = counter + len(masm) // 2 str_format = "%8s:\t%-" + str(maxlen) + "s\t%s" addresses = [] for counter, values in instr_dict.items(): binary, asm, label, rtarget, atarget = values if label is not None: print("%016x <%s>:" % (counter, label)) cformat = str_format if rtarget is not None: cformat = str_format + "\t <%s>" % (label_dict[counter + rtarget]) elif atarget is not None: cformat = str_format + "\t <%s>" % (label_dict[atarget]) print(cformat % (hex(counter)[2:], binary, asm)) addresses.append(counter) error = False for key in label_dict.keys(): if key not in addresses: print_warning("Target address '%s' not in the objdump" % hex(key)) error = True if error and arguments['strict']: print_error("Check target addresses of relative branches") exit(-1)