Merge remote-tracking branch 'origin/patch'

This commit is contained in:
ghidra1 2023-06-14 15:57:35 -04:00
commit 2a97771c0f
3 changed files with 11 additions and 7 deletions

View file

@ -15,9 +15,8 @@
*/ */
package ghidra.app.util.bin.format.elf; package ghidra.app.util.bin.format.elf;
import java.util.ArrayList;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList;
import javax.help.UnsupportedOperationException; import javax.help.UnsupportedOperationException;
@ -177,7 +176,7 @@ class AndroidElfRelocationGroup extends DynamicDataType {
WrappedMemBuffer cbuf = new WrappedMemBuffer(buf, comps[2].getOffset()); WrappedMemBuffer cbuf = new WrappedMemBuffer(buf, comps[2].getOffset());
s = (Scalar) comps[2].getDataType().getValue(cbuf, null, comps[2].getLength()); s = (Scalar) comps[2].getDataType().getValue(cbuf, null, comps[2].getLength());
long groupOffsetDelta = s.getValue(); long groupOffsetDelta = s.getValue();
return baseRelocOffset + ((groupSize - 1) * groupOffsetDelta); return baseRelocOffset + (groupSize * groupOffsetDelta);
} }
if (lastDtc.getFieldName().startsWith("group_")) { if (lastDtc.getFieldName().startsWith("group_")) {

View file

@ -229,6 +229,11 @@ public class ElfRelocationTable implements ElfFileSection {
long groupRInfo = groupedByInfo ? reader.readNext(LEB128::signed) : 0; long groupRInfo = groupedByInfo ? reader.readNext(LEB128::signed) : 0;
if (groupHasAddend && groupedByAddend) { if (groupHasAddend && groupedByAddend) {
if (!addendTypeReloc) {
elfHeader.logError(
"ELF Android Relocation processing failed. Unexpected r_addend in android.rel section");
return List.of();
}
// group_addend (optional) // group_addend (optional)
addend += reader.readNext(LEB128::signed); addend += reader.readNext(LEB128::signed);
} }
@ -236,16 +241,16 @@ public class ElfRelocationTable implements ElfFileSection {
addend = 0; addend = 0;
} }
// Process all group entries
for (int i = 0; i < groupSize; i++) { for (int i = 0; i < groupSize; i++) {
// reloc_offset (optional) // reloc_offset (optional)
offset += offset += groupedByDelta ? groupOffsetDelta : reader.readNext(LEB128::signed);
groupedByDelta ? groupOffsetDelta : reader.readNext(LEB128::signed);
// reloc_info (optional) // reloc_info (optional)
long info = groupedByInfo ? groupRInfo : reader.readNext(LEB128::signed); long info = groupedByInfo ? groupRInfo : reader.readNext(LEB128::signed);
long rAddend = 0; long rAddend = 0;
if (groupHasAddend) { if (addendTypeReloc && groupHasAddend) {
if (!groupedByAddend) { if (!groupedByAddend) {
// reloc_addend (optional) // reloc_addend (optional)
addend += reader.readNext(LEB128::signed); addend += reader.readNext(LEB128::signed);

View file

@ -95,7 +95,7 @@ public abstract class AbstractLeb128DataType extends BuiltIn implements Dynamic
} }
// approximate bitLength from storage byte length // approximate bitLength from storage byte length
int bitLength = Math.max(64, len * 7); int bitLength = Math.min(64, len * 7);
int mod = bitLength % 8; int mod = bitLength % 8;
if (mod != 0) { if (mod != 0) {
bitLength += (8 - mod); bitLength += (8 - mod);