From b1a620218e48d928fb117cb4f58512c6eeb299ce Mon Sep 17 00:00:00 2001 From: "JesusFreke@JesusFreke.com" Date: Sun, 21 Jun 2009 06:21:45 +0000 Subject: [PATCH] Fixed some issues regarding how the header and map section were being writter git-svn-id: https://smali.googlecode.com/svn/trunk@198 55b6fa8a-2a1e-11de-a435-ffa8d773f76a --- .../src/main/java/org/jf/dexlib/DexFile.java | 7 +++++- .../src/main/java/org/jf/dexlib/MapField.java | 4 ++++ .../src/main/java/org/jf/dexlib/MapItem.java | 22 ++++++++++++------- .../java/org/jf/dexlib/SectionHeaderInfo.java | 11 +++++----- 4 files changed, 29 insertions(+), 15 deletions(-) diff --git a/dexlib/src/main/java/org/jf/dexlib/DexFile.java b/dexlib/src/main/java/org/jf/dexlib/DexFile.java index cb07690a..b4caeb11 100644 --- a/dexlib/src/main/java/org/jf/dexlib/DexFile.java +++ b/dexlib/src/main/java/org/jf/dexlib/DexFile.java @@ -194,7 +194,7 @@ public class DexFile public void place() { int offset = 0; - offset = HeaderItemSection.place(offset); + offset = 0x70; for (IndexedSection indexedSection: indexedSections) { indexedSection.unplace(); offset = indexedSection.place(offset); @@ -208,6 +208,11 @@ public class DexFile offset = offsettedSection.place(offset); } + HeaderItemSection.place(0); + + if (offset % 4 != 0) { + offset += (4 - (offset % 4)); + } offset = MapSection.place(offset); dataSize = offset - dataOffset; diff --git a/dexlib/src/main/java/org/jf/dexlib/MapField.java b/dexlib/src/main/java/org/jf/dexlib/MapField.java index c5e45894..bf1ac1da 100644 --- a/dexlib/src/main/java/org/jf/dexlib/MapField.java +++ b/dexlib/src/main/java/org/jf/dexlib/MapField.java @@ -56,6 +56,10 @@ public class MapField extends CompositeField { return ItemType.fromInt(sectionTypeField.getCachedValue()); } + public Section getSection() { + return sectionInfoField.getSection(); + } + public int getSectionSize() { return sectionInfoField.getSectionSize(); } diff --git a/dexlib/src/main/java/org/jf/dexlib/MapItem.java b/dexlib/src/main/java/org/jf/dexlib/MapItem.java index bd79de3c..e3729250 100644 --- a/dexlib/src/main/java/org/jf/dexlib/MapItem.java +++ b/dexlib/src/main/java/org/jf/dexlib/MapItem.java @@ -52,21 +52,27 @@ public class MapItem extends IndexedItem { } public int place(int index, int offset) { - Collections.sort(mapEntries, new Comparator() { - public int compare(MapField o1, MapField o2) { - return ((Integer)o1.getSectionOffset()).compareTo(o2.getSectionOffset()); - } - }); + //we have to check if there are any empty sections before we place this item, + //because we need to remove the empty sections, which will change the size of + //this item for (int i=0; i 0x06*/) { + if (mapField.getSection().size() == 0) { mapEntries.remove(i--); } } + + offset = super.place(index, offset); - return super.place(index, offset); + //make sure the map items are in the same order as the corresponding sections + Collections.sort(mapEntries, new Comparator() { + public int compare(MapField o1, MapField o2) { + return ((Integer)o1.getSection().getOffset()).compareTo(o2.getSection().getOffset()); + } + }); + + return offset; } public static MapItem makeBlankMapItem(DexFile dexFile) { diff --git a/dexlib/src/main/java/org/jf/dexlib/SectionHeaderInfo.java b/dexlib/src/main/java/org/jf/dexlib/SectionHeaderInfo.java index a4ef82ad..d98582ef 100644 --- a/dexlib/src/main/java/org/jf/dexlib/SectionHeaderInfo.java +++ b/dexlib/src/main/java/org/jf/dexlib/SectionHeaderInfo.java @@ -54,23 +54,22 @@ public abstract class SectionHeaderInfo extends CompositeField