Class DWARFUtil
- java.lang.Object
-
- ghidra.app.util.bin.format.dwarf4.DWARFUtil
-
public class DWARFUtil extends java.lang.Object
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static class
DWARFUtil.LengthResult
-
Constructor Summary
Constructors Constructor Description DWARFUtil()
-
Method Summary
All Methods Static Methods Concrete Methods Modifier and Type Method Description static void
appendDescription(DataTypeComponent dtc, java.lang.String description, java.lang.String sep)
Append a string to a description of a field in a structure.static void
appendDescription(DataType dt, java.lang.String description, java.lang.String sep)
Append a string to aDataType
's description.static java.util.List<java.lang.String>
findLinkageNameInChildren(DebugInfoEntry die)
Try to find gnu mangled name nesting info in a DIE's children's linkage strings.static java.lang.String
getAnonNameForMeFromParentContext(DIEAggregate diea)
Creates a name for anon types based on their position in their parent's childList.static java.lang.String
getAnonNameForMeFromParentContext2(DIEAggregate diea)
Creates a name for anon types based on the names of sibling entries that are using the anon type.static java.lang.String
getContainerTypeName(DIEAggregate diea)
Returns a string that describes what kind of object is specified by theDIEAggregate
.static java.lang.String
getLexicalBlockName(DIEAggregate diea)
Create a name for a lexical block, with "_" separated numbers indicating nesting information of the lexical block.static int
getMyPositionInParent(DebugInfoEntry die)
Returns the ordinal position of thisDebugInfoEntry
in it's parent.static DIEAggregate
getReferringTypedef(DIEAggregate diea)
Returns theDIEAggregate
of a typedef that points to the specified datatype.static java.lang.reflect.Field
getStaticFinalFieldWithValue(java.lang.Class<?> clazz, long value)
Searches a Class for a final static variable that has a specific numeric value.static SymbolType
getSymbolTypeFromDIE(DIEAggregate diea)
Returns theSymbolType
that corresponds to the specifiedDIEAggregate
.static java.lang.String
getTemplateBaseName(java.lang.String name)
Determines if a name is a C++ style templated name.static boolean
isThisParam(DIEAggregate paramDIEA)
static java.util.List<java.lang.String>
parseMangledNestings(java.lang.String s)
A lightweight attempt to get nesting (ie.static java.lang.Number
readAddress(BinaryReader reader, byte pointerSize)
Read the value of an address.static long
readAddressAsLong(BinaryReader reader, byte pointerSize)
Reads a variable-sized unsigned 'address' value from aBinaryReader
and returns it as a 64 bit java long.static DWARFUtil.LengthResult
readLength(BinaryReader reader, Program program)
Read a variable-length length value from the stream.static long
readOffsetByDWARFformat(BinaryReader reader, int dwarfFormat)
Read an offset value who's size depends on the DWARF format: 32 vs 64.static int
readVarSizedUInt(BinaryReader reader, int size)
Read a variable-sized unsigned integer and return it as a java signed int.static long
readVarSizedULong(BinaryReader reader, int pointerSize)
Read a variable-sized unsigned integer and return it as a java signed long.static java.lang.String
toString(java.lang.Class<?> clazz, int value)
Converts a integer value to its corresponding symbolic name from the set of "public static final" member variables in a class.static java.lang.String
toString(java.lang.Class<?> clazz, long value)
Returns the field name of a final static variable in classclazz
which holds a specific value.
-
-
-
Method Detail
-
toString
public static java.lang.String toString(java.lang.Class<?> clazz, int value)
Converts a integer value to its corresponding symbolic name from the set of "public static final" member variables in a class.This is a bit of a hack and probably originated from pre-java Enum days.
- Parameters:
clazz
- TheClass
to search for the matching static value.value
- the integer value to search for- Returns:
- the String name of the matching field.
-
toString
public static java.lang.String toString(java.lang.Class<?> clazz, long value)
Returns the field name of a final static variable in classclazz
which holds a specific value.Can be thought of as an enum numeric value to to name lookup.
- Parameters:
clazz
-value
-- Returns:
-
getStaticFinalFieldWithValue
public static java.lang.reflect.Field getStaticFinalFieldWithValue(java.lang.Class<?> clazz, long value)
Searches a Class for a final static variable that has a specific numeric value.- Parameters:
clazz
- Class to search.value
- numeric value to search for- Returns:
- Java reflection
Field
that has the specified value or null
-
getContainerTypeName
public static java.lang.String getContainerTypeName(DIEAggregate diea)
Returns a string that describes what kind of object is specified by theDIEAggregate
.Used to create a name for anonymous types.
- Parameters:
diea
-DIEAggregate
- Returns:
- String describing the type of the DIEA.
-
getSymbolTypeFromDIE
public static SymbolType getSymbolTypeFromDIE(DIEAggregate diea)
Returns theSymbolType
that corresponds to the specifiedDIEAggregate
.The mapping between DIE type and SymbolType is not exact. There is no matching SymbolType for a DWARF static variable, so "LOCAL_VAR" is used currently.
This mainly is used in constructing a NamespacePath, and the only critical usage there is Namespace vs. Class vs. everything else.
- Parameters:
diea
-DIEAggregate
to query- Returns:
SymbolType
-
parseMangledNestings
public static java.util.List<java.lang.String> parseMangledNestings(java.lang.String s)
A lightweight attempt to get nesting (ie. namespaces and such) information from gnu mangled name strings.For example, "_ZN19class1_inline_funcs3fooEv" -> [19 chars]'class1_inline_funcs', [3 chars]'foo'
- Parameters:
s
-- Returns:
-
findLinkageNameInChildren
public static java.util.List<java.lang.String> findLinkageNameInChildren(DebugInfoEntry die)
Try to find gnu mangled name nesting info in a DIE's children's linkage strings.- Parameters:
die
-- Returns:
- a list of string of nesting names, ending with what should be the DIE parameter's name.
-
getTemplateBaseName
public static java.lang.String getTemplateBaseName(java.lang.String name)
Determines if a name is a C++ style templated name. If so, returns just the base portion of the name. The name must have a start and end angle bracket: '<' and '>'.operator<() and operator<<() are handled so their angle brackets don't trigger the template start/end angle bracket incorrectly.
- Parameters:
name
- symbol name with C++ template portions- Returns:
- base portion of the symbol name without template portion
-
getAnonNameForMeFromParentContext
public static java.lang.String getAnonNameForMeFromParentContext(DIEAggregate diea)
Creates a name for anon types based on their position in their parent's childList.- Parameters:
diea
- the die aggregate.- Returns:
- the anonymous name of the die aggregate.
-
getAnonNameForMeFromParentContext2
public static java.lang.String getAnonNameForMeFromParentContext2(DIEAggregate diea)
Creates a name for anon types based on the names of sibling entries that are using the anon type.Example: "anon_struct_for_field1_field2"
Falls back to
getAnonNameForMeFromParentContext(DIEAggregate)
if no siblings found.- Parameters:
diea
- the die aggregate.- Returns:
- the anonymous name of the die aggregate.
-
getLexicalBlockName
public static java.lang.String getLexicalBlockName(DIEAggregate diea)
Create a name for a lexical block, with "_" separated numbers indicating nesting information of the lexical block.- Parameters:
diea
-DIEAggregate
pointing to a lexical block entry.- Returns:
- string, ie. "lexical_block_1_2_3"
-
getMyPositionInParent
public static int getMyPositionInParent(DebugInfoEntry die)
Returns the ordinal position of thisDebugInfoEntry
in it's parent.- Parameters:
die
-DebugInfoEntry
- Returns:
- int index of ourself in our parent, or -1 if not found in parent.
-
appendDescription
public static void appendDescription(DataType dt, java.lang.String description, java.lang.String sep)
Append a string to aDataType
's description.- Parameters:
dt
-DataType
description
- string to append, if null or empty nothing happens.sep
- characters to place after previous description to separate it from the new portion.
-
appendDescription
public static void appendDescription(DataTypeComponent dtc, java.lang.String description, java.lang.String sep)
Append a string to a description of a field in a structure.- Parameters:
dtc
- thefield
in a structdescription
- string to append, if null or empty nothing happens.sep
- characters to place after previous description to separate it from the new portion.
-
readOffsetByDWARFformat
public static long readOffsetByDWARFformat(BinaryReader reader, int dwarfFormat) throws java.io.IOException
Read an offset value who's size depends on the DWARF format: 32 vs 64.- Parameters:
reader
- BinaryReader pointing to the value to readdwarfFormat
- - SeeDWARFCompilationUnit.DWARF_32
andDWARFCompilationUnit.DWARF_64
.- Returns:
- the offset value
- Throws:
java.io.IOException
- if an I/O error occurs or bad dwarfFormat value
-
readVarSizedULong
public static long readVarSizedULong(BinaryReader reader, int pointerSize) throws java.io.IOException
Read a variable-sized unsigned integer and return it as a java signed long.- Parameters:
reader
-BinaryReader
to read the data frompointerSize
- number of bytes the value is stored in, must be 1, 2, 4, or 8.- Returns:
- unsigned long integer value.
- Throws:
java.io.IOException
- if error
-
readVarSizedUInt
public static int readVarSizedUInt(BinaryReader reader, int size) throws java.io.IOException
Read a variable-sized unsigned integer and return it as a java signed int.Unsigned 32 bit int values larger than java's signed Integer.MAX_VALUE are not supported and will throw an IOException.
- Parameters:
reader
-BinaryReader
to read the data fromsize
- number of bytes the integer value is stored in, must be 1, 2 or 4.- Returns:
- unsigned integer value.
- Throws:
java.io.IOException
- if error
-
readAddress
public static java.lang.Number readAddress(BinaryReader reader, byte pointerSize) throws java.io.IOException
Read the value of an address.- Parameters:
reader
- BinaryReader pointing to the value to readpointerSize
- the size of a pointer- Returns:
- the address value
- Throws:
java.io.IOException
- if an I/O error occursjava.lang.IllegalArgumentException
- if an unknown pointer size is given
-
readAddressAsLong
public static long readAddressAsLong(BinaryReader reader, byte pointerSize) throws java.io.IOException
Reads a variable-sized unsigned 'address' value from aBinaryReader
and returns it as a 64 bit java long.The valid pointerSizes are 1, 2, 4, and 8.
- Parameters:
reader
-BinaryReader
to read the data frompointerSize
- number of bytes the value is stored in, must be 1, 2, 4, or 8.- Returns:
- unsigned long value.
- Throws:
java.io.IOException
- if error
-
isThisParam
public static boolean isThisParam(DIEAggregate paramDIEA)
-
getReferringTypedef
public static DIEAggregate getReferringTypedef(DIEAggregate diea)
Returns theDIEAggregate
of a typedef that points to the specified datatype.Returns null if there is no typedef pointing to the specified DIEA or if there are multiple.
- Parameters:
diea
-DIEAggregate
of a data type that might be the target of typedefs.- Returns:
DIEAggregate
of the singular typedef that points to the arg, otherwise null if none or multiple found.
-
readLength
public static DWARFUtil.LengthResult readLength(BinaryReader reader, Program program) throws java.io.IOException, DWARFException
Read a variable-length length value from the stream.- Parameters:
reader
-BinaryReader
stream to read fromprogram
- GhidraProgram
- Returns:
- new
DWARFUtil.LengthResult
, never null; length == 0 should be checked for and treated specially - Throws:
java.io.IOException
- if io errorDWARFException
- if invalid values
-
-