diff --git a/baksmali/src/main/java/org/jf/baksmali/Adaptors/MethodDefinition.java b/baksmali/src/main/java/org/jf/baksmali/Adaptors/MethodDefinition.java index 08151a90..8d6bfbfd 100644 --- a/baksmali/src/main/java/org/jf/baksmali/Adaptors/MethodDefinition.java +++ b/baksmali/src/main/java/org/jf/baksmali/Adaptors/MethodDefinition.java @@ -41,6 +41,7 @@ import org.jf.dexlib.Debug.DebugInstructionIterator; import org.jf.dexlib.Util.AccessFlags; import org.antlr.stringtemplate.StringTemplateGroup; import org.antlr.stringtemplate.StringTemplate; +import org.jf.dexlib.Util.Hex; import org.jf.dexlib.Util.SparseIntArray; import java.util.*; @@ -274,6 +275,11 @@ public class MethodDefinition { methodItems.add(new BlankMethodItem(stg, currentCodeAddress)); } + if (baksmali.addCodeOffsets) { + methodItems.add(new CommentMethodItem(stg, String.format("@%x", currentCodeAddress), + currentCodeAddress, -1000)); + } + if (baksmali.registerInfo != 0 && !instruction.instruction.getFormat().variableSizeFormat) { printPreRegister.clear(); printPostRegister.clear(); diff --git a/baksmali/src/main/java/org/jf/baksmali/baksmali.java b/baksmali/src/main/java/org/jf/baksmali/baksmali.java index 4db32b0a..7b42551e 100644 --- a/baksmali/src/main/java/org/jf/baksmali/baksmali.java +++ b/baksmali/src/main/java/org/jf/baksmali/baksmali.java @@ -45,6 +45,7 @@ public class baksmali { public static boolean useLocalsDirective = false; public static boolean useSequentialLabels = false; public static boolean outputDebugInfo = true; + public static boolean addCodeOffsets = false; public static int registerInfo = 0; public static String bootClassPath; public static DeodexUtil deodexUtil = null; @@ -52,12 +53,13 @@ public class baksmali { public static void disassembleDexFile(DexFile dexFile, Deodexerant deodexerant, String outputDirectory, String bootClassPathDir, String bootClassPath, boolean noParameterRegisters, boolean useLocalsDirective, boolean useSequentialLabels, - boolean outputDebugInfo, int registerInfo) + boolean outputDebugInfo, boolean addCodeOffsets, int registerInfo) { baksmali.noParameterRegisters = noParameterRegisters; baksmali.useLocalsDirective = useLocalsDirective; baksmali.useSequentialLabels = useSequentialLabels; baksmali.outputDebugInfo = outputDebugInfo; + baksmali.addCodeOffsets = addCodeOffsets; baksmali.registerInfo = registerInfo; baksmali.bootClassPath = bootClassPath; diff --git a/baksmali/src/main/java/org/jf/baksmali/main.java b/baksmali/src/main/java/org/jf/baksmali/main.java index 158ea6ca..d54af11b 100644 --- a/baksmali/src/main/java/org/jf/baksmali/main.java +++ b/baksmali/src/main/java/org/jf/baksmali/main.java @@ -87,6 +87,7 @@ public class main { boolean useLocalsDirective = false; boolean useSequentialLabels = false; boolean outputDebugInfo = true; + boolean addCodeOffsets = false; int registerInfo = 0; @@ -138,6 +139,9 @@ public class main { case 'd': bootClassPathDir = commandLine.getOptionValue("d"); break; + case 'f': + addCodeOffsets = true; + break; case 'r': String[] values = commandLine.getOptionValues('r'); @@ -262,7 +266,8 @@ public class main { if (disassemble) { baksmali.disassembleDexFile(dexFile, deodexerant, outputDirectory, bootClassPathDir, bootClassPath, - noParameterRegisters, useLocalsDirective, useSequentialLabels, outputDebugInfo, registerInfo); + noParameterRegisters, useLocalsDirective, useSequentialLabels, outputDebugInfo, addCodeOffsets, + registerInfo); } if ((doDump || write) && !dexFile.isOdex()) { @@ -415,6 +420,10 @@ public class main { .withArgName("DIR") .create("d"); + Option codeOffsetOption = OptionBuilder.withLongOpt("code-offsets") + .withDescription("add comments to the disassembly containing the code offset for each address") + .create("f"); + basicOptions.addOption(versionOption); basicOptions.addOption(helpOption); basicOptions.addOption(outputDirOption); @@ -426,6 +435,7 @@ public class main { basicOptions.addOption(registerInfoOption); basicOptions.addOption(classPathOption); basicOptions.addOption(classPathDirOption); + basicOptions.addOption(codeOffsetOption); debugOptions.addOption(dumpOption); debugOptions.addOption(noDisassemblyOption); @@ -439,6 +449,6 @@ public class main { } for (Object option: debugOptions.getOptions()) { options.addOption((Option)option); - } + } } } \ No newline at end of file