Class DWARFUtil
-
Nested Class Summary
Nested Classes -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionstatic void
appendDescription
(DataTypeComponent dtc, String description, String sep) Append a string to a description of a field in a structure.static void
appendDescription
(DataType dt, String description, String sep) Append a string to aDataType
's description.Try to find gnu mangled name nesting info in a DIE's children's linkage strings.static String
Creates a name for anon types based on their position in their parent's childList.static String
Creates a name for anon types based on the names of sibling entries that are using the anon type.static String
Returns a string that describes what kind of object is specified by theDIEAggregate
.static String
Create a name for a lexical block, with "_" separated numbers indicating nesting information of the lexical block.static int
Returns the ordinal position of thisDebugInfoEntry
in it's parent.static DIEAggregate
Returns theDIEAggregate
of a typedef that points to the specified datatype.static Field
getStaticFinalFieldWithValue
(Class<?> clazz, long value) Searches a Class for a final static variable that has a specific numeric value.static String
Creates a fingerprint of the layout of an (anonymous) structure using its size, number of members, and the hashcode of the member field names.static SymbolType
Returns theSymbolType
that corresponds to the specifiedDIEAggregate
.static String
getTemplateBaseName
(String name) Determines if a name is a C++ style templated name.static boolean
isThisParam
(DIEAggregate paramDIEA) A lightweight attempt to get nesting (ie.static 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 String
Converts a integer value to its corresponding symbolic name from the set of "public static final" member variables in a class.static String
Returns the field name of a final static variable in classclazz
which holds a specific value.
-
Constructor Details
-
DWARFUtil
public DWARFUtil()
-
-
Method Details
-
toString
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
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
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
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
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
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
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
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
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
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.
-
getStructLayoutFingerprint
Creates a fingerprint of the layout of an (anonymous) structure using its size, number of members, and the hashcode of the member field names.- Parameters:
diea
- struct/union/class- Returns:
- formatted string, example "80_5_73dc6de9" (80 bytes, 5 fields, hex hash of field names)
-
getLexicalBlockName
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
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
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
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
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:
IOException
- if an I/O error occurs or bad dwarfFormat value
-
readVarSizedULong
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:
IOException
- if error
-
readVarSizedUInt
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:
IOException
- if error
-
readAddress
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:
IOException
- if an I/O error occursIllegalArgumentException
- if an unknown pointer size is given
-
readAddressAsLong
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:
IOException
- if error
-
isThisParam
-
getReferringTypedef
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 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:
IOException
- if io errorDWARFException
- if invalid values
-