mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-08-16 04:35:45 +02:00
Bug 409916 - Can not expand Binary with DWARF 4 format, NPE in
DwardReader Change-Id: Iaea9685051d5dd73f8504ea3714ce26198fdac46 Signed-off-by: Serge Beauchamp <sergebeauchamp@mac.com> Reviewed-on: https://git.eclipse.org/r/17542 Reviewed-by: Marc-Andre Laperle <marc-andre.laperle@ericsson.com> Reviewed-by: Jeff Johnston <jjohnstn@redhat.com> IP-Clean: Jeff Johnston <jjohnstn@redhat.com> Tested-by: Jeff Johnston <jjohnstn@redhat.com>
This commit is contained in:
parent
e562b5e204
commit
66acca58ba
2 changed files with 71 additions and 11 deletions
|
@ -1,5 +1,5 @@
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2000, 2012 QNX Software Systems and others.
|
* Copyright (c) 2000, 2013 QNX Software Systems and others.
|
||||||
* All rights reserved. This program and the accompanying materials
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
||||||
|
@ -8,6 +8,7 @@
|
||||||
* Contributors:
|
* Contributors:
|
||||||
* QNX Software Systems - Initial API and implementation
|
* QNX Software Systems - Initial API and implementation
|
||||||
* Salvatore Culcasi - Bug 322475
|
* Salvatore Culcasi - Bug 322475
|
||||||
|
* Serge Beauchamp - Bug 409916
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
package org.eclipse.cdt.utils.debug.dwarf;
|
package org.eclipse.cdt.utils.debug.dwarf;
|
||||||
|
@ -21,8 +22,8 @@ import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import org.eclipse.cdt.core.CCorePlugin;
|
import org.eclipse.cdt.core.CCorePlugin;
|
||||||
import org.eclipse.cdt.utils.coff.PE;
|
|
||||||
import org.eclipse.cdt.utils.coff.Coff.SectionHeader;
|
import org.eclipse.cdt.utils.coff.Coff.SectionHeader;
|
||||||
|
import org.eclipse.cdt.utils.coff.PE;
|
||||||
import org.eclipse.cdt.utils.debug.DebugUnknownType;
|
import org.eclipse.cdt.utils.debug.DebugUnknownType;
|
||||||
import org.eclipse.cdt.utils.debug.IDebugEntryRequestor;
|
import org.eclipse.cdt.utils.debug.IDebugEntryRequestor;
|
||||||
import org.eclipse.cdt.utils.debug.tools.DebugSym;
|
import org.eclipse.cdt.utils.debug.tools.DebugSym;
|
||||||
|
@ -65,10 +66,11 @@ public class Dwarf {
|
||||||
DWARF_DEBUG_MACINFO };
|
DWARF_DEBUG_MACINFO };
|
||||||
|
|
||||||
class CompilationUnitHeader {
|
class CompilationUnitHeader {
|
||||||
int length;
|
long length;
|
||||||
short version;
|
short version;
|
||||||
int abbreviationOffset;
|
int abbreviationOffset;
|
||||||
byte addressSize;
|
byte addressSize;
|
||||||
|
byte offsetSize;
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
StringBuffer sb = new StringBuffer();
|
StringBuffer sb = new StringBuffer();
|
||||||
|
@ -76,6 +78,7 @@ public class Dwarf {
|
||||||
sb.append("Version: " + version).append("\n"); //$NON-NLS-1$ //$NON-NLS-2$
|
sb.append("Version: " + version).append("\n"); //$NON-NLS-1$ //$NON-NLS-2$
|
||||||
sb.append("Abbreviation: " + abbreviationOffset).append("\n"); //$NON-NLS-1$ //$NON-NLS-2$
|
sb.append("Abbreviation: " + abbreviationOffset).append("\n"); //$NON-NLS-1$ //$NON-NLS-2$
|
||||||
sb.append("Address size: " + addressSize).append("\n"); //$NON-NLS-1$ //$NON-NLS-2$
|
sb.append("Address size: " + addressSize).append("\n"); //$NON-NLS-1$ //$NON-NLS-2$
|
||||||
|
sb.append("Offset size: " + offsetSize).append("\n"); //$NON-NLS-1$ //$NON-NLS-2$
|
||||||
return sb.toString();
|
return sb.toString();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -369,7 +372,17 @@ public class Dwarf {
|
||||||
try {
|
try {
|
||||||
while (data.hasRemaining()) {
|
while (data.hasRemaining()) {
|
||||||
CompilationUnitHeader header = new CompilationUnitHeader();
|
CompilationUnitHeader header = new CompilationUnitHeader();
|
||||||
header.length = read_4_bytes(data);
|
header.length = read_4_bytes(data) & 0xffffffffL;
|
||||||
|
|
||||||
|
if (header.length == 0xffffffffL) {
|
||||||
|
header.length = read_8_bytes(data);
|
||||||
|
header.offsetSize = 8;
|
||||||
|
} else if (header.length == 0) { // IRIX
|
||||||
|
header.length = read_8_bytes(data);
|
||||||
|
header.offsetSize = 8;
|
||||||
|
} else
|
||||||
|
header.offsetSize = 4;
|
||||||
|
|
||||||
header.version = read_2_bytes(data);
|
header.version = read_2_bytes(data);
|
||||||
header.abbreviationOffset = read_4_bytes(data);
|
header.abbreviationOffset = read_4_bytes(data);
|
||||||
header.addressSize = data.get();
|
header.addressSize = data.get();
|
||||||
|
@ -383,10 +396,10 @@ public class Dwarf {
|
||||||
Map<Long, AbbreviationEntry> abbrevs = parseDebugAbbreviation(header);
|
Map<Long, AbbreviationEntry> abbrevs = parseDebugAbbreviation(header);
|
||||||
// Note "length+4" is the total size in bytes of the CU data.
|
// Note "length+4" is the total size in bytes of the CU data.
|
||||||
ByteBuffer entryBuffer = data.slice();
|
ByteBuffer entryBuffer = data.slice();
|
||||||
entryBuffer.limit(header.length + 4 - 11);
|
entryBuffer.limit(((int) header.length) + 4 - 11);
|
||||||
parseDebugInfoEntry(requestor, entryBuffer, abbrevs, header);
|
parseDebugInfoEntry(requestor, entryBuffer, abbrevs, header);
|
||||||
|
|
||||||
data.position(data.position() + header.length + 4 - 11);
|
data.position(data.position() + ((int) header.length) + 4 - 11);
|
||||||
|
|
||||||
if (printEnabled)
|
if (printEnabled)
|
||||||
System.out.println();
|
System.out.println();
|
||||||
|
@ -461,8 +474,10 @@ public class Dwarf {
|
||||||
Object obj = null;
|
Object obj = null;
|
||||||
switch (form) {
|
switch (form) {
|
||||||
case DwarfConstants.DW_FORM_addr :
|
case DwarfConstants.DW_FORM_addr :
|
||||||
|
obj = readAddress(in, header, false);
|
||||||
|
break;
|
||||||
case DwarfConstants.DW_FORM_ref_addr :
|
case DwarfConstants.DW_FORM_ref_addr :
|
||||||
obj = readAddress(in, header);
|
obj = readAddress(in, header, true);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DwarfConstants.DW_FORM_block :
|
case DwarfConstants.DW_FORM_block :
|
||||||
|
@ -545,7 +560,12 @@ public class Dwarf {
|
||||||
|
|
||||||
case DwarfConstants.DW_FORM_strp :
|
case DwarfConstants.DW_FORM_strp :
|
||||||
{
|
{
|
||||||
int offset = read_4_bytes(in);
|
long offset;
|
||||||
|
if (header.offsetSize == 8)
|
||||||
|
offset = read_8_bytes(in);
|
||||||
|
else
|
||||||
|
offset = read_4_bytes(in) & 0xffffffffL;
|
||||||
|
|
||||||
ByteBuffer data = dwarfSections.get(DWARF_DEBUG_STR);
|
ByteBuffer data = dwarfSections.get(DWARF_DEBUG_STR);
|
||||||
if (data == null) {
|
if (data == null) {
|
||||||
obj = new String();
|
obj = new String();
|
||||||
|
@ -553,7 +573,7 @@ public class Dwarf {
|
||||||
obj = new String();
|
obj = new String();
|
||||||
} else {
|
} else {
|
||||||
StringBuffer sb = new StringBuffer();
|
StringBuffer sb = new StringBuffer();
|
||||||
data.position(offset);
|
data.position((int) offset);
|
||||||
while (data.hasRemaining()) {
|
while (data.hasRemaining()) {
|
||||||
byte c = data.get();
|
byte c = data.get();
|
||||||
if (c == 0) {
|
if (c == 0) {
|
||||||
|
@ -591,6 +611,25 @@ public class Dwarf {
|
||||||
int f = (int) read_unsigned_leb128(in);
|
int f = (int) read_unsigned_leb128(in);
|
||||||
return readAttribute(f, in, header);
|
return readAttribute(f, in, header);
|
||||||
}
|
}
|
||||||
|
case DwarfConstants.DW_FORM_sec_offset :
|
||||||
|
if (header.offsetSize == 8)
|
||||||
|
obj = new Long(read_8_bytes(in));
|
||||||
|
else
|
||||||
|
obj = new Long(read_4_bytes(in) & 0xffffffffL);
|
||||||
|
break;
|
||||||
|
case DwarfConstants.DW_FORM_exprloc :
|
||||||
|
long size = read_unsigned_leb128(in);
|
||||||
|
byte[] bytes = new byte[(int) size];
|
||||||
|
in.get(bytes);
|
||||||
|
obj = bytes;
|
||||||
|
break;
|
||||||
|
case DwarfConstants.DW_FORM_flag_present :
|
||||||
|
// 0 byte value
|
||||||
|
obj = Byte.valueOf((byte)1);
|
||||||
|
break;
|
||||||
|
case DwarfConstants.DW_FORM_ref_sig8 :
|
||||||
|
obj = new Long(read_8_bytes(in));
|
||||||
|
break;
|
||||||
|
|
||||||
default :
|
default :
|
||||||
break;
|
break;
|
||||||
|
@ -677,10 +716,15 @@ public class Dwarf {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Long readAddress(ByteBuffer in, CompilationUnitHeader header) throws IOException {
|
Long readAddress(ByteBuffer in, CompilationUnitHeader header, boolean reference) throws IOException {
|
||||||
long value = 0;
|
long value = 0;
|
||||||
|
|
||||||
switch (header.addressSize) {
|
int size;
|
||||||
|
if (reference)
|
||||||
|
size = (header.version < 3) ? header.addressSize:header.offsetSize;
|
||||||
|
else
|
||||||
|
size = header.addressSize;
|
||||||
|
switch (size) {
|
||||||
case 2 :
|
case 2 :
|
||||||
value = read_2_bytes(in);
|
value = read_2_bytes(in);
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -187,6 +187,22 @@ public class DwarfConstants {
|
||||||
public final static int DW_FORM_ref8 = 0x14;
|
public final static int DW_FORM_ref8 = 0x14;
|
||||||
public final static int DW_FORM_ref_udata = 0x15;
|
public final static int DW_FORM_ref_udata = 0x15;
|
||||||
public final static int DW_FORM_indirect = 0x16;
|
public final static int DW_FORM_indirect = 0x16;
|
||||||
|
/**
|
||||||
|
* @since 5.6
|
||||||
|
*/
|
||||||
|
public final static int DW_FORM_sec_offset = 0x17;
|
||||||
|
/**
|
||||||
|
* @since 5.6
|
||||||
|
*/
|
||||||
|
public final static int DW_FORM_exprloc = 0x18;
|
||||||
|
/**
|
||||||
|
* @since 5.6
|
||||||
|
*/
|
||||||
|
public final static int DW_FORM_flag_present = 0x19;
|
||||||
|
/**
|
||||||
|
* @since 5.6
|
||||||
|
*/
|
||||||
|
public final static int DW_FORM_ref_sig8 = 0x20;
|
||||||
|
|
||||||
/* DWARF location operation encodings. */
|
/* DWARF location operation encodings. */
|
||||||
public final static int DW_OP_addr = 0x03; /* Constant address. */
|
public final static int DW_OP_addr = 0x03; /* Constant address. */
|
||||||
|
|
Loading…
Add table
Reference in a new issue