Class DWARFProgram

java.lang.Object
ghidra.app.util.bin.format.dwarf4.next.DWARFProgram
All Implemented Interfaces:
Closeable, AutoCloseable

public class DWARFProgram extends Object implements Closeable
DWARFProgram encapsulates a Ghidra program with DWARF specific reference data used by DWARFDataTypeImporter and DWARFFunctionImporter, along with some helper functions.
  • Field Details

  • Constructor Details

  • Method Details

    • isDWARF

      public static boolean isDWARF(Program program)
      Returns true if the program probably has DWARF information, without doing all the work that querying all registered DWARFSectionProviders would take.

      If the program is an Elf binary, it must have (at least) ".debug_info" and ".debug_abbr", program sections, or their compressed "z" versions.

      If the program is a MachO binary (ie. Mac), it must have a ".dSYM" directory co-located next to the original binary file on the native filesystem. (lie. outside of Ghidra). See the DSymSectionProvider for more info.

      Parameters:
      program - Program to test
      Returns:
      boolean true if program probably has DWARF info, false if not
    • hasDWARFData

      public static boolean hasDWARFData(Program program, TaskMonitor monitor)
      Returns true if the specified program has DWARF information.

      This is similar to isDWARF(Program), but is a stronger check that is more expensive as it could involve searching for external files.

      Parameters:
      program - Program to test
      monitor - TaskMonitor that can be used to cancel
      Returns:
      boolean true if the program has DWARF info, false if not
    • close

      public void close() throws IOException
      Specified by:
      close in interface AutoCloseable
      Specified by:
      close in interface Closeable
      Throws:
      IOException
    • getImportOptions

      public DWARFImportOptions getImportOptions()
    • getImportSummary

      public DWARFImportSummary getImportSummary()
    • getGhidraProgram

      public Program getGhidraProgram()
    • getDwarfDTM

      public DWARFDataTypeManager getDwarfDTM()
    • isBigEndian

      public boolean isBigEndian()
    • isLittleEndian

      public boolean isLittleEndian()
    • getEntryName

      public String getEntryName(DIEAggregate diea)
    • getName

      public DWARFNameInfo getName(DIEAggregate diea)
    • lookupDNIByOffset

      public DWARFNameInfo lookupDNIByOffset(long offset)
    • cacheDNIByOffset

      public void cacheDNIByOffset(long offset, DWARFNameInfo dni)
    • getAggregate

      public DIEAggregate getAggregate(DebugInfoEntry die)
      Returns the DIEAggregate that contains the specified DebugInfoEntry.
      Parameters:
      die - DebugInfoEntry or null
      Returns:
      DIEAggregate that contains the specified DIE, or null if DIE null or the aggregate was not found.
    • getAggregate

      public DIEAggregate getAggregate(long offset)
      Returns the DIEAggregate that contains the DebugInfoEntry specified by the offset.
      Parameters:
      offset - offset of a DIE record
      Returns:
      DIEAggregate that contains the DIE record specified, or null if bad offset.
    • getAggregates

      public List<DIEAggregate> getAggregates()
      Returns the list of all currently loaded DIEAggregates, which will be either just the DIEA of the current CU, or all DIEA if DWARFImportOptions.isPreloadAllDIEs().
      Returns:
      List of DIEAggregate.
    • getTotalDIECount

      public int getTotalDIECount()
      Returns the total number of DIE records in the entire program.
      Returns:
      the total number of DIE records in the entire program.
    • getTotalAggregateCount

      public int getTotalAggregateCount()
      Returns the total number of DIEAggregate objects in the entire program.
      Returns:
      the total number of DIEAggregate objects in the entire program.
    • setCurrentCompilationUnit

      public void setCurrentCompilationUnit(DWARFCompilationUnit cu, TaskMonitor monitor) throws CancelledException, IOException, DWARFException
      Sets the currently active compilation unit. Used when 'paging' through the DIE records in a compilation-unit-at-a-time manner, vs the DWARFImportOptions.isPreloadAllDIEs() where all DIE/DIEA records are loaded at once.
      Parameters:
      cu - DWARFCompilationUnit to set as the active element and load it's DIE records.
      monitor - TaskMonitor to update with status and check for cancelation.
      Throws:
      CancelledException - if user cancels
      IOException - if error reading data
      DWARFException - if error in DWARF record structure
    • getCompilationUnits

      public List<DWARFCompilationUnit> getCompilationUnits()
    • getCompilationUnitFor

      public DWARFCompilationUnit getCompilationUnitFor(long offset)
    • getDebugLocation

      public BinaryReader getDebugLocation()
    • getDebugRanges

      public BinaryReader getDebugRanges()
    • getDebugInfo

      public BinaryReader getDebugInfo()
    • getDebugLine

      public BinaryReader getDebugLine()
    • getRegisterMappings

      public DWARFRegisterMappings getRegisterMappings()
    • getRootDNI

      public DWARFNameInfo getRootDNI()
    • getUncategorizedRootDNI

      public DWARFNameInfo getUncategorizedRootDNI()
    • getDebugStrings

      public StringTable getDebugStrings()
    • getStackSpace

      public AddressSpace getStackSpace()
    • getAttributeFactory

      public DWARFAttributeFactory getAttributeFactory()
    • setAttributeFactory

      public void setAttributeFactory(DWARFAttributeFactory attributeFactory)
    • getFoundCrossCURefs

      public boolean getFoundCrossCURefs()
    • setFoundCrossCURefs

      public void setFoundCrossCURefs(boolean b)
    • internAttributeSpec

      public DWARFAttributeSpecification internAttributeSpec(DWARFAttributeSpecification das)
    • getEntries

      public List<DebugInfoEntry> getEntries()
      Returns:
      the entries list
    • getDIECount

      public int getDIECount() throws IOException, CancelledException
      Returns the count of the DIE records in this compilation unit.

      Only valid if called after checkPreconditions(TaskMonitor) and before clearDIEIndexes().

      Returns:
      number of DIE records in the compunit.
      Throws:
      IOException
      CancelledException
    • clearDIEIndexes

      public void clearDIEIndexes()
      Releases the memory used by the DIE entries read when invoking checkPreconditions(TaskMonitor).
    • getEntryAtByteOffsetUnchecked

      public DebugInfoEntry getEntryAtByteOffsetUnchecked(long byteOffset)
      Returns the entry with the given byte offset.

      The byte offset corresponds to the byte index in the original file where the entry was defined.

      Returns null if the requested entry does not exist.

      Parameters:
      byteOffset - the byte offset
      Returns:
      the entry with the given byte offset
    • getTypeReferers

      public List<DIEAggregate> getTypeReferers(DIEAggregate targetDIEA, int tag)
      Returns a list of DIEAggregates that refer to the targetDIEA via an attribute of the specified tag type.
      Parameters:
      targetDIEA - DIEAggregate that might be pointed to by other DIEAs.
      tag - the DWARFTag attribute type that is pointing DIEAs are using to refer to the target DIEA.
      Returns:
      list of DIEAs that point to the target, empty list if nothing found.
    • checkPreconditions

      public void checkPreconditions(TaskMonitor monitor) throws DWARFPreconditionException, DWARFException, CancelledException, IOException
      Iterates over all the DWARF DIE records in the program and checks for some pre-known issues, throwing an exception if there is a problem that would prevent a successful run.
      Parameters:
      monitor - TaskMonitor to check for cancel and upate with status.
      Throws:
      DWARFException - if DWARF structure error.
      CancelledException - if user cancels.
      IOException - if error reading data.
      DWARFPreconditionException
    • setNameLengthCutoff

      public void setNameLengthCutoff(int nameLenCutoff)
      Sets the maximum length of symbols and datatypes created during import.
      Parameters:
      nameLenCutoff - int, should not be more than SymbolUtilities.MAX_SYMBOL_NAME_LENGTH.
    • getProgramBaseAddressFixup

      public long getProgramBaseAddressFixup()
      A fixup value that needs to be applied to static addresses of the program.

      This value is necessary if the program's built-in base address is overridden at import time.

      Returns:
      long value to add to static addresses discovered in DWARF to make it agree with Ghidra's imported program.
    • getCodeAddress

      public Address getCodeAddress(Number offset)
    • getDataAddress

      public Address getDataAddress(Number offset)
    • stackGrowsNegative

      public boolean stackGrowsNegative()
    • getOpaqueProperty

      public <T> T getOpaqueProperty(Object key, T defaultValue, Class<T> valueClass)
    • setOpaqueProperty

      public void setOpaqueProperty(Object key, Object value)