Package ghidra.program.database.symbol

# Class SymbolDB

java.lang.Object
ghidra.program.database.DatabaseObject
ghidra.program.database.symbol.SymbolDB

All Implemented Interfaces:
  `Symbol`

Direct Known Subclasses:
  `ClassSymbol`, `CodeSymbol`, `FunctionSymbol`, `LibrarySymbol`, `NamespaceSymbol`, `VariableSymbolDB`

public abstract class SymbolDB extends DatabaseObject implements Symbol
Base class for symbols

- ## Field Summary

  Fields
  Modifier and Type
  Field
  Description
  `protected Address`
  `address`
  `protected Lock`
  `lock`
  `protected SymbolManager`
  `symbolMgr`

  ### Fields inherited from class ghidra.program.database.DatabaseObject

  `key`

- ## Method Summary

  Modifier and Type
  Method
  Description
  `protected void`
  `checkDeleted()`
  Checks if this object has been deleted, in which case any use of the object is not allowed.
  `boolean`
  `delete()`
  Delete the symbol and its associated resources.
  `protected boolean`
  `doCheckIsPrimary()`
  `protected String`
  `doGetName()`
  The code for creating the name content for this symbol.
  `protected Namespace`
  `doGetParentNamespace()`
  `protected boolean`
  `doIsPinned()`
  `void`
  `doSetNameAndNamespace(String newName, Namespace newNamespace, SourceType source, boolean checkForDuplicates)`
  `protected void`
  `doSetPinned(boolean pinned)`
  `protected void`
  `doSetPrimary(boolean primary)`
  `boolean`
  `equals(Object obj)`
  `Address`
  `getAddress()`
  `long`
  `getDataTypeId()`
  `long`
  `getID()`
  `final String`
  `getName()`
  `String`
  `getName(boolean includeNamespace)`
  Returns the symbol name, optionally prepended with the namespace path.
  `Namespace`
  `getParentNamespace()`
  Return the parent namespace for this symbol.
  `Symbol`
  `getParentSymbol()`
  Returns namespace symbol of the namespace containing this symbol
  `String[]`
  `getPath()`
  Gets the full path name for this symbol as an ordered array of strings ending with the symbol name.
  `Program`
  `getProgram()`
  Get the program associated with this symbol
  `int`
  `getReferenceCount()`
  `Reference[]`
  `getReferences()`
  Returns all memory references to the address of this symbol.
  `Reference[]`
  `getReferences(TaskMonitor monitor)`
  Returns all memory references to the address of this symbol.
  `SourceType`
  `getSource()`
  Gets the source of this symbol.
  `protected List<SymbolDB>`
  `getSymbolsDynamicallyRenamedByMyRename()`
  `String`
  `getSymbolStringData()`
  Returns the symbol's string data which has different meanings depending on the symbol type and whether or not it is external
  `protected int`
  `getVariableOffset()`
  gets the generic symbol data 2 data.
  `int`
  `hashCode()`
  `boolean`
  `hasMultipleReferences()`
  `boolean`
  `hasReferences()`
  `boolean`
  `isDeleted()`
  Determine if this symbol object has been deleted.
  `boolean`
  `isDeleting()`
  `boolean`
  `isDescendant(Namespace namespace)`
  Returns true if the given namespace symbol is a descendant of this symbol.
  `boolean`
  `isDynamic()`
  `boolean`
  `isExternalEntryPoint()`
  `boolean`
  `isGlobal()`
  `boolean`
  `isPinned()`
  Returns true if the symbol is pinned to its current address.
  `abstract boolean`
  `isPrimary()`
  `boolean`
  `isValidParent(Namespace parent)`
  Determines if the given parent is valid for this Symbol.
  `protected void`
  `moveLowLevel(Address newAddress, String newName, Namespace newNamespace, SourceType newSource, boolean pinned)`
  low level record adjustment to move a symbol.
  `protected boolean`
  `refresh()`
  Tells the object to refresh its state from the database.
  `protected boolean`
  `refresh(DBRecord rec)`
  Tells the object to refresh its state from the database using the specified record if not null.
  `protected void`
  `setAddress(Address addr)`
  `void`
  `setDataTypeId(long value)`
  Sets the generic symbol data 1.
  `void`
  `setName(String newName, SourceType source)`
  Sets the name this symbol.
  `void`
  `setNameAndNamespace(String newName, Namespace newNamespace, SourceType source)`
  Sets the symbols name and namespace.
  `void`
  `setNamespace(Namespace newNamespace)`
  Sets the symbols namespace
  `void`
  `setPinned(boolean pinned)`
  Sets whether or not this symbol is pinned to its associated address.
  `boolean`
  `setPrimary()`
  Sets this symbol to be primary.
  `void`
  `setSource(SourceType newSource)`
  Sets this symbol's source as specified.
  `void`
  `setSymbolStringData(String stringData)`
  Sets the symbol's string data field.
  `void`
  `setVariableOffset(int offset)`
  Sets the symbol's variable offset.
  `String`
  `toString()`
  `protected SourceType`
  `validateNameSource(String newName, SourceType source)`
  Allow symbol implementations to validate the source when setting the name of this symbol

  ### Methods inherited from class ghidra.program.database.DatabaseObject

  `checkIsValid, checkIsValid, getKey, isDeleted, isInvalid, keyChanged, setDeleted, setInvalid, validate`

  ### Methods inherited from class java.lang.Object

  `clone, finalize, getClass, notify, notifyAll, wait, wait, wait`

  ### Methods inherited from interface ghidra.program.model.symbol.Symbol

  `getObject, getProgramLocation, getSymbolType, isExternal`

- ## Field Details

  - ### address

    protected Address address

  - ### symbolMgr

    protected SymbolManager symbolMgr

  - ### lock

    protected Lock lock

- ## Method Details

  - ### isDeleted

    public boolean isDeleted()
    Description copied from interface: `Symbol`
    Determine if this symbol object has been deleted. NOTE: the symbol could be deleted at anytime due to asynchronous activity.
    Specified by:
      `isDeleted` in interface `Symbol`
    Returns:
      true if symbol has been deleted, false if not.

  - ### checkDeleted

    protected void checkDeleted()
    Description copied from class: `DatabaseObject`
    Checks if this object has been deleted, in which case any use of the object is not allowed. This method should be invoked before any modifications to the object are performed to ensure it still exists and is in a valid state.
    Overrides:
      `checkDeleted` in class `DatabaseObject`

  - ### toString

    public String toString()
    Overrides:
      `toString` in class `Object`

  - ### refresh

    protected boolean refresh()
    Description copied from class: `DatabaseObject`
    Tells the object to refresh its state from the database.
    Specified by:
      `refresh` in class `DatabaseObject`
    Returns:
      true if the object was able to refresh itself. Return false if the object was deleted. Objects that extend this class must implement a refresh method. If an object can never refresh itself, then it should always return false.

  - ### refresh

    protected boolean refresh(DBRecord rec)
    Description copied from class: `DatabaseObject`
    Tells the object to refresh its state from the database using the specified record if not null. NOTE: The default implementation ignores the record and invokes refresh(). Implementations of this method must take care if multiple database tables are used since the record supplied could correspond to another object. In some cases it may be best not to override this method or ignore the record provided.
    Overrides:
      `refresh` in class `DatabaseObject`
    Parameters:
      `rec` - valid record associated with object's key (optional, may be null to force record lookup or other refresh technique)
    Returns:
      true if the object was able to refresh itself. Return false if record is null and object was deleted. Objects that extend this class must implement a refresh method. If an object can never refresh itself, then it should always return false.

  - ### getAddress

    public Address getAddress()
    Specified by:
      `getAddress` in interface `Symbol`
    Returns:
      the address for the symbol.

  - ### setAddress

    protected void setAddress(Address addr)

  - ### moveLowLevel

    protected void moveLowLevel(Address newAddress, String newName, Namespace newNamespace, SourceType newSource, boolean pinned)
    low level record adjustment to move a symbol. Used only when moving a memory block or changing the image base.
    Parameters:
      `newAddress` - the new address for the symbol
      `newName` - the new name for the symbol (or null if the name should stay the same)
      `newNamespace` - the new namespace for the symbol (or null if it should stay the same)
      `newSource` - the new SourceType for the symbol (or null if it should stay the same)
      `pinned` - the new pinned state

  - ### getName

    public final String getName()
    Specified by:
      `getName` in interface `Symbol`
    Returns:
      the name of this symbol.

  - ### doGetName

    protected String doGetName()
    The code for creating the name content for this symbol. This code will be called with the symbol's lock.
    Returns:
      the name

  - ### getProgram

    public Program getProgram()
    Description copied from interface: `Symbol`
    Get the program associated with this symbol
    Specified by:
      `getProgram` in interface `Symbol`
    Returns:
      the program associated with this symbol.

  - ### getName

    public String getName(boolean includeNamespace)
    Description copied from interface: `Symbol`
    Returns the symbol name, optionally prepended with the namespace path.
    Specified by:
      `getName` in interface `Symbol`
    Parameters:
      `includeNamespace` - if true, the namespace path is prepended to the name.
    Returns:
      formatted name

  - ### getPath

    public String[] getPath()
    Description copied from interface: `Symbol`
    Gets the full path name for this symbol as an ordered array of strings ending with the symbol name. The global symbol will return an empty array.
    Specified by:
      `getPath` in interface `Symbol`
    Returns:
      the array indicating the full path name for this symbol.

  - ### getReferenceCount

    public int getReferenceCount()
    Specified by:
      `getReferenceCount` in interface `Symbol`
    Returns:
      the number of References to this symbol.

  - ### getReferences

    public Reference[] getReferences(TaskMonitor monitor)
    Description copied from interface: `Symbol`
    Returns all memory references to the address of this symbol. If you do not have a `TaskMonitor` instance, then you can pass `TaskMonitor.DUMMY` or `null`.
    Specified by:
      `getReferences` in interface `Symbol`
    Parameters:
      `monitor` - the monitor that is used to report progress and to cancel this potentially long-running call
    Returns:
      all memory references to the address of this symbol.

  - ### getReferences

    public Reference[] getReferences()
    Description copied from interface: `Symbol`
    Returns all memory references to the address of this symbol.
    Specified by:
      `getReferences` in interface `Symbol`
    Returns:
      all memory references to the address of this symbol
    See Also:
      - `Symbol.getReferences(TaskMonitor)`

  - ### hasMultipleReferences

    public boolean hasMultipleReferences()
    Specified by:
      `hasMultipleReferences` in interface `Symbol`
    Returns:
      true if this symbol has more than one reference to it.

  - ### hasReferences

    public boolean hasReferences()
    Specified by:
      `hasReferences` in interface `Symbol`
    Returns:
      true if this symbol has at least one reference to it.

  - ### isDynamic

    public boolean isDynamic()
    Specified by:
      `isDynamic` in interface `Symbol`
    Returns:
      true if this symbol is a dynamic symbol (not actually defined in the database).

  - ### isExternalEntryPoint

    public boolean isExternalEntryPoint()
    Specified by:
      `isExternalEntryPoint` in interface `Symbol`
    Returns:
      true if the symbol is at an address set as a external entry point.

  - ### isPrimary

    public abstract boolean isPrimary()
    Specified by:
      `isPrimary` in interface `Symbol`
    Returns:
      true if this symbol is primary

  - ### setSource

    public void setSource(SourceType newSource)
    Sets this symbol's source as specified.
    Specified by:
      `setSource` in interface `Symbol`
    Parameters:
      `newSource` - the new source type (IMPORTED, ANALYSIS, USER_DEFINED)
    Throws:
      `IllegalArgumentException` - if you try to change the source from default or to default

  - ### getSource

    public SourceType getSource()
    Description copied from interface: `Symbol`
    Gets the source of this symbol. `SourceType`
    Specified by:
      `getSource` in interface `Symbol`
    Returns:
      the source of this symbol

  - ### isPinned

    public boolean isPinned()
    Description copied from interface: `Symbol`
    Returns true if the symbol is pinned to its current address. If it is pinned, then moving or removing the memory associated with that address will not affect this symbol.
    Specified by:
      `isPinned` in interface `Symbol`
    Returns:
      true if the symbol is pinned to its current address.

  - ### doIsPinned

    protected boolean doIsPinned()

  - ### setPinned

    public void setPinned(boolean pinned)
    Description copied from interface: `Symbol`

    Sets whether or not this symbol is pinned to its associated address.

    If the symbol is pinned then moving or removing the memory associated with its address will not cause this symbol to be removed and will not cause its address to change. If the symbol is not pinned, then removing the memory at its address will also remove this symbol.

    Likewise, moving a memory block containing a symbol that is not anchored will change the address for that symbol to keep it associated with the same byte in the memory block.

    Specified by:
      `setPinned` in interface `Symbol`
    Parameters:
      `pinned` - true indicates this symbol is anchored to its address. false indicates this symbol is not anchored to its address.

  - ### doSetPinned

    protected void doSetPinned(boolean pinned)

  - ### setName

    public void setName(String newName, SourceType source) throws DuplicateNameException, InvalidInputException
    Description copied from interface: `Symbol`
    Sets the name this symbol. If this symbol is dynamic, then the name is set and the symbol is no longer dynamic.
    Specified by:
      `setName` in interface `Symbol`
    Parameters:
      `newName` - the new name for this symbol.
      `source` - the source of this symbol
      Some symbol types, such as function symbols, can set the source to Symbol.DEFAULT.
    Throws:
      `DuplicateNameException` - if name already exists as the name of another symbol or alias.
      `InvalidInputException` - if alias contains blank characters, is zero length, or is null

  - ### setNamespace

    public void setNamespace(Namespace newNamespace) throws DuplicateNameException, InvalidInputException, CircularDependencyException
    Description copied from interface: `Symbol`
    Sets the symbols namespace
    Specified by:
      `setNamespace` in interface `Symbol`
    Parameters:
      `newNamespace` - new parent namespace
    Throws:
      `DuplicateNameException` - if newNamespace already contains a symbol with this symbol's name
      `InvalidInputException` - is newNamespace is not a valid parent for this symbol
      `CircularDependencyException` - if this symbol is an ancestor of newNamespace

  - ### validateNameSource

    protected SourceType validateNameSource(String newName, SourceType source)
    Allow symbol implementations to validate the source when setting the name of this symbol
    Parameters:
      `newName` - the new name
      `source` - the source type
    Returns:
      the validated source type

  - ### doSetNameAndNamespace

    public void doSetNameAndNamespace(String newName, Namespace newNamespace, SourceType source, boolean checkForDuplicates) throws DuplicateNameException, InvalidInputException, CircularDependencyException
    Throws:
      `DuplicateNameException`
      `InvalidInputException`
      `CircularDependencyException`

  - ### setNameAndNamespace

    public void setNameAndNamespace(String newName, Namespace newNamespace, SourceType source) throws DuplicateNameException, InvalidInputException, CircularDependencyException
    Description copied from interface: `Symbol`
    Sets the symbols name and namespace. This is provided to allow the caller to avoid a name conflict by creating an autonomous action.
    Specified by:
      `setNameAndNamespace` in interface `Symbol`
    Parameters:
      `newName` - new symbol name
      `newNamespace` - new parent namespace
      `source` - the source of this symbol
      Some symbol types, such as function symbols, can set the source to Symbol.DEFAULT.
    Throws:
      `DuplicateNameException` - if newNamespace already contains a symbol with this symbol's name
      `InvalidInputException` - is newNamespace is not a valid parent for this symbol
      `CircularDependencyException` - if this symbol is an ancestor of newNamespace

  - ### getSymbolsDynamicallyRenamedByMyRename

    protected List<SymbolDB> getSymbolsDynamicallyRenamedByMyRename()

  - ### setPrimary

    public boolean setPrimary()
    Description copied from interface: `Symbol`
    Sets this symbol to be primary. All other symbols at the same address will be set to !primary. Only applies to non-function symbols.
    Specified by:
      `setPrimary` in interface `Symbol`
    Returns:
      returns true if the symbol was not primary and now it is, otherwise false
    See Also:
      - `Symbol.setPrimary()`

  - ### getID

    public long getID()
    Specified by:
      `getID` in interface `Symbol`
    Returns:
      this symbol's ID.

  - ### equals

    public boolean equals(Object obj)
    Overrides:
      `equals` in class `Object`

  - ### hashCode

    public int hashCode()
    Overrides:
      `hashCode` in class `Object`

  - ### getParentNamespace

    public Namespace getParentNamespace()
    Description copied from interface: `Symbol`
    Return the parent namespace for this symbol.
    Specified by:
      `getParentNamespace` in interface `Symbol`
    Returns:
      the namespace that contains this symbol.

  - ### doGetParentNamespace

    protected Namespace doGetParentNamespace()

  - ### getParentSymbol

    public Symbol getParentSymbol()
    Description copied from interface: `Symbol`
    Returns namespace symbol of the namespace containing this symbol
    Specified by:
      `getParentSymbol` in interface `Symbol`
    Returns:
      parent namespace symbol

  - ### isGlobal

    public boolean isGlobal()
    Specified by:
      `isGlobal` in interface `Symbol`
    Returns:
      true if the symbol is global

  - ### getSymbolStringData

    public String getSymbolStringData()
    Returns the symbol's string data which has different meanings depending on the symbol type and whether or not it is external
    Returns:
      the symbol's string data

  - ### setSymbolStringData

    public void setSymbolStringData(String stringData)
    Sets the symbol's string data field. This field's data has different uses depending on the symbol type and whether or not it is external.
    Parameters:
      `stringData` - the string to store in the string data field

  - ### getDataTypeId

    public long getDataTypeId()

  - ### setDataTypeId

    public void setDataTypeId(long value)
    Sets the generic symbol data 1.
    Parameters:
      `value` - the value to set as symbol data 1.

  - ### getVariableOffset

    protected int getVariableOffset()
    gets the generic symbol data 2 data.
    Returns:
      the symbol data

  - ### setVariableOffset

    public void setVariableOffset(int offset)
    Sets the symbol's variable offset. For parameters, this is the ordinal, for locals, it is the first use offset
    Parameters:
      `offset` - the value to set as the symbols variable offset.

  - ### doSetPrimary

    protected void doSetPrimary(boolean primary)

  - ### doCheckIsPrimary

    protected boolean doCheckIsPrimary()

  - ### delete

    public boolean delete()
    Description copied from interface: `Symbol`
    Delete the symbol and its associated resources. Any references symbol associations will be discarded.
    Specified by:
      `delete` in interface `Symbol`
    Returns:
      true if successful

  - ### isDeleting

    public boolean isDeleting()

  - ### isDescendant

    public boolean isDescendant(Namespace namespace)
    Description copied from interface: `Symbol`
    Returns true if the given namespace symbol is a descendant of this symbol.
    Specified by:
      `isDescendant` in interface `Symbol`
    Parameters:
      `namespace` - to test as descendant symbol of this Symbol
    Returns:
      true if this symbol is an ancestor of the given namespace symbol

  - ### isValidParent

    public boolean isValidParent(Namespace parent)
    Description copied from interface: `Symbol`
    Determines if the given parent is valid for this Symbol. Specified namespace must belong to the same symbol table as this symbol.
    Specified by:
      `isValidParent` in interface `Symbol`
    Parameters:
      `parent` - prospective parent namespace for this symbol
    Returns:
      true if parent is valid