mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-04 18:29:37 +02:00
Merge remote-tracking branch 'origin/patch'
This commit is contained in:
commit
2a97771c0f
3 changed files with 11 additions and 7 deletions
|
@ -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_")) {
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue