Package ghidra.program.database.map
Class AddressMapDB
java.lang.Object
ghidra.program.database.map.AddressMapDB
- All Implemented Interfaces:
AddressMap
Class used to map addresses to longs and longs to addresses. Several different encodings
are depending on the nature of the address to be converted.
The upper 4 bits in the long are used to specify the encoding used. Currently the encoding are:
0 - use the original ghidra encoding - used for backwards compatibility.
1 - absolute encoding - ignores the image base - used only by the memory map.
2 - relocatable - most common encoding - allows address to move with the image base.
3 - register - used to encode register addresses
4 - stack - used to encode stack addresses (includes namespace information to make them unique between functions)
5 - external - used to encode addresses in another program
15 - no address - used to represent the null address or a meaningless address.
-
Field Summary
Fields inherited from interface ghidra.program.database.map.AddressMap
INVALID_ADDRESS_KEY
-
Constructor Summary
ConstructorDescriptionAddressMapDB
(DBHandle handle, OpenMode openMode, AddressFactory factory, long baseImageOffset, TaskMonitor monitor) Constructs a new AddressMapDB object -
Method Summary
Modifier and TypeMethodDescriptiondecodeAddress
(long value) Returns the address that was used to generate the given long key.decodeAddress
(long value, boolean useMemorySegmentation) Returns the address that was used to generate the given long key.void
deleteOverlaySpace
(String name) Delete the specified overlay space from this address map.int
findKeyRange
(List<KeyRange> keyRangeList, Address addr) Search for addr within the "sorted" keyRangeList and return the index of the keyRange which contains the specified addr.long
getAbsoluteEncoding
(Address addr, boolean create) Get the database key associated with the given absolute address.Returns the address factory associated with this map.Returns the current image base setting.long
Get the database key associated with the given relative address.getKeyRanges
(Address start, Address end, boolean create) Generates a properly ordered list of database key ranges for a a specified address range.getKeyRanges
(Address start, Address end, boolean absolute, boolean create) Generates a properly ordered list of database key ranges for a a specified address range.getKeyRanges
(AddressSetView set, boolean create) Generates a properly ordered list of database key ranges for a a specified address set.getKeyRanges
(AddressSetView set, boolean absolute, boolean create) Generates a properly ordered list of database key ranges for a a specified address set.Returns an address map which may be used during the upgrade of old address encodings.void
Clears any cached values.boolean
Returns true if this address map has been upgraded.void
Notification when the memory map changes.void
renameOverlaySpace
(String oldName, String newName) Rename an existing overlay space.void
setImageBase
(Address base) Sets the image base, effectively changing the mapping between addresses and longs.void
setLanguage
(Language newLanguage, ProgramAddressFactory addrFactory, LanguageTranslator translator) Converts the current base addresses to addresses compatible with the new language.
-
Constructor Details
-
AddressMapDB
public AddressMapDB(DBHandle handle, OpenMode openMode, AddressFactory factory, long baseImageOffset, TaskMonitor monitor) throws IOException, VersionException Constructs a new AddressMapDB object- Parameters:
handle
- the handle to the databaseopenMode
- the mode that program was opened.factory
- the address factory containing all the address spaces for the program.baseImageOffset
- the current image base offset.monitor
- the progress monitory used for upgrading.- Throws:
IOException
- thrown if a dabase io error occurs.VersionException
- if the database version does not match the expected version.
-
-
Method Details
-
memoryMapChanged
Notification when the memory map changes. If we are segemented, we need to update our list of address ranges used for address normalization.- Parameters:
mem
- the changed memory map.
-
invalidateCache
Clears any cached values.- Throws:
IOException
- if an IO error occurs
-
getOldAddressMap
Returns an address map which may be used during the upgrade of old address encodings. If the address map is up-to-date, then this method will return this instance of AddressMapDB.- Specified by:
getOldAddressMap
in interfaceAddressMap
-
isUpgraded
public boolean isUpgraded()Description copied from interface:AddressMap
Returns true if this address map has been upgraded.- Specified by:
isUpgraded
in interfaceAddressMap
-
getKey
Description copied from interface:AddressMap
Get the database key associated with the given relative address. This key uniquely identifies a relative location within the program. If the program's image base is moved to another address, this key will map to a new address that is the same distance to the new base as the old address was to the old base. If the requested key does not exist and create is false, INVALID_ADDRESS_KEY will be returned. Note that nothing should ever be stored using the returned key unless create is true.- Specified by:
getKey
in interfaceAddressMap
- Parameters:
addr
- the address for which to get a database key.create
- true if a new key may be generated- Returns:
- the database key for the given address or INVALID_ADDRESS_KEY if create is false and one does not exist for the specified addr.
-
getAbsoluteEncoding
Description copied from interface:AddressMap
Get the database key associated with the given absolute address. This key uniquely identifies an absolute location within the program. If the requested key does not exist and create is false, INVALID_ADDRESS_KEY will be returned. Note that nothing should ever be stored using the returned key unless create is true.- Specified by:
getAbsoluteEncoding
in interfaceAddressMap
- Parameters:
addr
- the address for which to get a database key.create
- true if a new key may be generated- Returns:
- the database key for the given address or INVALID_ADDRESS_KEY if create is false and one does not exist for the specified addr.
-
decodeAddress
Description copied from interface:AddressMap
Returns the address that was used to generate the given long key. (If the image base was moved, then a different address is returned unless the value was encoded using the "absoluteEncoding" method. If the program's default address space is segmented (i.e., SegmentedAddressSpace). the address returned will be always be normalized to defined segmented memory blocks if possible.- Specified by:
decodeAddress
in interfaceAddressMap
- Parameters:
value
- the long value to convert to an address.- Returns:
- address decoded from long
-
decodeAddress
Returns the address that was used to generate the given long key. (If the image base was moved, then a different address is returned unless the value was encoded using the "absoluteEncoding" method- Parameters:
value
- the long value to convert to an address.useMemorySegmentation
- if true and the program's default address space is segmented (i.e., SegmentedAddressSpace). the address returned will be normalized to defined segmented memory blocks if possible. This parameter should generally always be true except when used by the Memory map objects to avoid recursion problems.- Returns:
- decoded address
-
getAddressFactory
Description copied from interface:AddressMap
Returns the address factory associated with this map. Null may be returned if map not associated with a specific address factory.- Specified by:
getAddressFactory
in interfaceAddressMap
- Returns:
- associated
AddressFactory
or null
-
setImageBase
Sets the image base, effectively changing the mapping between addresses and longs.- Parameters:
base
- the new base address.
-
findKeyRange
Description copied from interface:AddressMap
Search for addr within the "sorted" keyRangeList and return the index of the keyRange which contains the specified addr.- Specified by:
findKeyRange
in interfaceAddressMap
- Parameters:
keyRangeList
- key range list to searchaddr
- address or null- Returns:
- index of the keyRange within the keyRangeList which contains addr
if it is contained in the list; otherwise,
(-(insertion point) - 1)
. The insertion point is defined as the point at which the addr would be inserted into the list: the index of the first keyRange greater than addr, orkeyRangeList.size()
, if all keyRanges in the list are less than the specified addr. Note that this guarantees that the return value will be >= 0 if and only if the addr is found within a keyRange. An addr of null will always result in a returned index of -1.
-
getKeyRanges
Description copied from interface:AddressMap
Generates a properly ordered list of database key ranges for a a specified address range. If absolute encodings are requested, only memory addresses will be included. Returned key ranges are generally intended for read-only operations since new keys will never be generated. The returned key ranges will correspond to those key ranges which have previously been created within the specified address range and may represent a much smaller subset of addresses within the specified range. NOTE: if the create parameter is true, the given range must not extend in the upper 32 bits by more than 1 segment. For example, range(0x0000000000000000 - 0x0000000100000000) is acceptable, but the range (0x0000000000000000 - 0x0000000200000000) is not because the upper 32 bits differ by 2.- Specified by:
getKeyRanges
in interfaceAddressMap
- Parameters:
start
- the start address of the rangeend
- maximum address of rangecreate
- true if a new keys may be generated, otherwise returned key-ranges will be limited to those already defined. And if true, the range will be limited to a size of 2^32 so that at most it creates two new address bases- Returns:
- "sorted" list of KeyRange objects
-
getKeyRanges
Description copied from interface:AddressMap
Generates a properly ordered list of database key ranges for a a specified address set. If absolute encodings are requested, only memory addresses will be included.- Specified by:
getKeyRanges
in interfaceAddressMap
- Parameters:
set
- address set or null for all addresses. May not be null ifcreate
is true.create
- true if a new keys may be generated, otherwise returned key-ranges will be limited to those already defined.- Returns:
- "sorted" list of KeyRange objects
-
getKeyRanges
Description copied from interface:AddressMap
Generates a properly ordered list of database key ranges for a a specified address range. If absolute encodings are requested, only memory addresses will be included.- Specified by:
getKeyRanges
in interfaceAddressMap
- Parameters:
start
- minimum address of rangeend
- maximum address of rangeabsolute
- if true, absolute key encodings are returned, otherwise standard/relocatable address key encodings are returned.create
- true if a new keys may be generated, otherwise returned key-ranges will be limited to those already defined.- Returns:
- "sorted" list of KeyRange objects
-
getKeyRanges
Description copied from interface:AddressMap
Generates a properly ordered list of database key ranges for a a specified address set. If absolute encodings are requested, only memory addresses will be included.- Specified by:
getKeyRanges
in interfaceAddressMap
- Parameters:
set
- address set or null for all addresses. May not be null ifcreate
is true.absolute
- if true, absolute key encodings are returned, otherwise standard/relocatable address key encodings are returned.create
- true if a new keys may be generated, otherwise returned key-ranges will be limited to those already defined.- Returns:
- "sorted" list of KeyRange objects
-
getImageBase
Description copied from interface:AddressMap
Returns the current image base setting.- Specified by:
getImageBase
in interfaceAddressMap
-
setLanguage
public void setLanguage(Language newLanguage, ProgramAddressFactory addrFactory, LanguageTranslator translator) throws IOException Converts the current base addresses to addresses compatible with the new language.- Parameters:
newLanguage
- the new language to use.addrFactory
- the new AddressFactory.translator
- translates address spaces from the old language to the new language.- Throws:
IOException
- if IO error occurs
-
renameOverlaySpace
Rename an existing overlay space.- Parameters:
oldName
- old overlay namenewName
- new overlay name (must be unique among all space names within this map)- Throws:
IOException
- if IO error occurs
-
deleteOverlaySpace
Delete the specified overlay space from this address map.- Parameters:
name
- overlay space name (must be unique among all space names within this map)- Throws:
IOException
- if IO error occurs
-