Class AbstractProgramLoader
- All Implemented Interfaces:
Loader
,ExtensionPoint
,Comparable<Loader>
- Direct Known Subclasses:
AbstractLibrarySupportLoader
,AbstractProgramWrapperLoader
,BinaryLoader
,IntelHexLoader
,MotorolaHexLoader
,XmlLoader
-
Field Summary
Fields inherited from interface ghidra.app.util.opinion.Loader
COMMAND_LINE_ARG_PREFIX, loggingDisabled, OPTIONS_PROJECT_SAVE_STATE_KEY
-
Constructor Summary
-
Method Summary
Modifier and TypeMethodDescriptionprotected String
concatenatePaths
(String... pathElements) Concatenates the given path elements to form a single path.protected void
createDefaultMemoryBlocks
(Program program, Language language, MessageLog log) Creates default memory blocks for the givenProgram
.protected Program
createProgram
(ByteProvider provider, String domainFileName, Address imageBase, String executableFormatName, Language language, CompilerSpec compilerSpec, Object consumer) Creates aProgram
with the specified attributes.protected String
generateBlockName
(Program program, boolean isOverlay, AddressSpace space) Generates a block name.getDefaultOptions
(ByteProvider provider, LoadSpec loadSpec, DomainObject domainObject, boolean isLoadIntoProgram) Gets the defaultLoader
options.protected LanguageService
Gets theLoader
's language service.final LoadResults
<? extends DomainObject> load
(ByteProvider provider, String loadedName, Project project, String projectFolderPath, LoadSpec loadSpec, List<Option> options, MessageLog messageLog, Object consumer, TaskMonitor monitor) Loads bytes in a particular format as a newLoaded
DomainObject
.final void
loadInto
(ByteProvider provider, LoadSpec loadSpec, List<Option> options, MessageLog messageLog, Program program, TaskMonitor monitor) Loads bytes into the specifiedProgram
.loadProgram
(ByteProvider provider, String loadedName, Project project, String projectFolderPath, LoadSpec loadSpec, List<Option> options, MessageLog log, Object consumer, TaskMonitor monitor) protected abstract void
loadProgramInto
(ByteProvider provider, LoadSpec loadSpec, List<Option> options, MessageLog messageLog, Program program, TaskMonitor monitor) Loads program bytes into the specifiedProgram
.static void
markAsFunction
(Program program, String name, Address funcStart) Mark this address as a function by creating a one byte function.protected void
postLoadCleanup
(boolean success) This gets called as the final step of the load process.protected void
postLoadProgramFixups
(List<Loaded<Program>> loadedPrograms, Project project, List<Option> options, MessageLog messageLog, TaskMonitor monitor) This gets called after the given list ofloaded programs
s is finished loading.protected final void
Releases the given consumer from each of the providedloaded programs
static void
setProgramProperties
(Program prog, ByteProvider provider, String executableFormatName) Sets a program's Executable Path, Executable Format, MD5, SHA256, and FSRL properties.protected boolean
Returns whether or not processor labels should be applied by default.validateOptions
(ByteProvider provider, LoadSpec loadSpec, List<Option> options, Program program) Validates theLoader
's options and returns null if all options are valid; otherwise, an error message describing the problem is returned.Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
Methods inherited from interface ghidra.app.util.opinion.Loader
compareTo, findSupportedLoadSpecs, getName, getPreferredFileName, getTier, getTierPriority, loadsIntoNewFolder, supportsLoadIntoProgram, supportsLoadIntoProgram
-
Field Details
-
APPLY_LABELS_OPTION_NAME
- See Also:
-
ANCHOR_LABELS_OPTION_NAME
- See Also:
-
-
Constructor Details
-
AbstractProgramLoader
public AbstractProgramLoader()
-
-
Method Details
-
loadProgram
protected abstract List<Loaded<Program>> loadProgram(ByteProvider provider, String loadedName, Project project, String projectFolderPath, LoadSpec loadSpec, List<Option> options, MessageLog log, Object consumer, TaskMonitor monitor) throws IOException, LoadException, CancelledException Loads bytes in a particular format as a newLoaded
Program
. MultipleProgram
s may end up getting created, depending on the nature of the format.Note that when the load completes, the returned
Loaded
Program
s are not saved to a project. That is the responsibility of the caller (seeLoaded.save(Project, MessageLog, TaskMonitor)
).It is also the responsibility of the caller to release the returned
Loaded
Program
s withLoaded.release(Object)
when they are no longer needed.- Parameters:
provider
- The bytes to load.loadedName
- A suggested name for the primaryLoaded
Program
. This is just a suggestion, and aLoader
implementation reserves the right to change it. TheLoaded
Program
s should be queried for their true names usingLoaded.getName()
.project
- TheProject
. Loaders can use this to take advantage of existingDomainFolder
s andDomainFile
s to do custom behaviors such as loading libraries. Could be null if there is no project.projectFolderPath
- A suggested project folder path for theLoaded
Program
s. This is just a suggestion, and aLoader
implementation reserves the right to change it for eachLoaded
result. TheLoaded
Program
s should be queried for their true project folder paths usingLoaded.getProjectFolderPath()
.loadSpec
- TheLoadSpec
to use during load.options
- The load options.log
- The message log.consumer
- A consumer object for generatedProgram
s.monitor
- A task monitor.- Returns:
- A
List
of one or moreLoaded
Program
s (created but not saved). - Throws:
LoadException
- if the load failed in an expected way.IOException
- if there was an IO-related problem loading.CancelledException
- if the user cancelled the load.
-
loadProgramInto
protected abstract void loadProgramInto(ByteProvider provider, LoadSpec loadSpec, List<Option> options, MessageLog messageLog, Program program, TaskMonitor monitor) throws IOException, LoadException, CancelledException Loads program bytes into the specifiedProgram
. This method will not create any newProgram
s. It is only for adding to an existingProgram
.NOTE: The loading that occurs in this method will automatically be done in a transaction.
- Parameters:
provider
- The bytes to load into theProgram
.loadSpec
- TheLoadSpec
to use during load.options
- The load options.messageLog
- The message log.program
- TheProgram
to load into.monitor
- A cancelable task monitor.- Throws:
LoadException
- if the load failed in an expected way.IOException
- if there was an IO-related problem loading.CancelledException
- if the user cancelled the load.
-
load
public final LoadResults<? extends DomainObject> load(ByteProvider provider, String loadedName, Project project, String projectFolderPath, LoadSpec loadSpec, List<Option> options, MessageLog messageLog, Object consumer, TaskMonitor monitor) throws IOException, CancelledException, VersionException, LoadException Description copied from interface:Loader
Loads bytes in a particular format as a newLoaded
DomainObject
. MultipleDomainObject
s may end up getting created, depending on the nature of the format. TheLoaded
DomainObject
s are bundled together in aLoadResults
object which provides convenience methods to operate on the entire group ofLoaded
DomainObject
s.Note that when the load completes, the returned
Loaded
DomainObject
s are not saved to a project. That is the responsibility of the caller (seeLoadResults.save(Project, Object, MessageLog, TaskMonitor)
).It is also the responsibility of the caller to release the returned
Loaded
DomainObject
s withLoadResults.release(Object)
when they are no longer needed.- Specified by:
load
in interfaceLoader
- Parameters:
provider
- The bytes to load.loadedName
- A suggested name for the primaryLoaded
DomainObject
. This is just a suggestion, and aLoader
implementation reserves the right to change it. TheLoadResults
should be queried for their true names usingLoaded.getName()
.project
- TheProject
. Loaders can use this to take advantage of existingDomainFolder
s andDomainFile
s to do custom behaviors such as loading libraries. Could be null if there is no project.projectFolderPath
- A suggested project folder path for theLoaded
DomainObject
s. This is just a suggestion, and aLoader
implementation reserves the right to change it for eachLoaded
result. TheLoadResults
should be queried for their true project folder paths usingLoaded.getProjectFolderPath()
.loadSpec
- TheLoadSpec
to use during load.options
- The load options.messageLog
- The message log.consumer
- A consumer object for generatedDomainObject
s.monitor
- A task monitor.- Returns:
- The
LoadResults
which contains one or moreLoaded
DomainObject
s (created but not saved). - Throws:
IOException
- if there was an IO-related problem loading.CancelledException
- if the user cancelled the load.VersionException
- if the load process tried to open an existingDomainFile
which was created with a newer or unsupported version of GhidraLoadException
- if the load failed in an expected way
-
loadInto
public final void loadInto(ByteProvider provider, LoadSpec loadSpec, List<Option> options, MessageLog messageLog, Program program, TaskMonitor monitor) throws IOException, LoadException, CancelledException Description copied from interface:Loader
Loads bytes into the specifiedProgram
. This method will not create any newProgram
s. It is only for adding to an existingProgram
.- Specified by:
loadInto
in interfaceLoader
- Parameters:
provider
- The bytes to load into theProgram
.loadSpec
- TheLoadSpec
to use during load.options
- The load options.messageLog
- The message log.program
- TheProgram
to load into.monitor
- A cancelable task monitor.- Throws:
IOException
- if there was an IO-related problem loading.LoadException
- if the load failed in an expected way.CancelledException
- if the user cancelled the load.
-
getDefaultOptions
public List<Option> getDefaultOptions(ByteProvider provider, LoadSpec loadSpec, DomainObject domainObject, boolean isLoadIntoProgram) Description copied from interface:Loader
Gets the defaultLoader
options.- Specified by:
getDefaultOptions
in interfaceLoader
- Parameters:
provider
- The bytes of the thing being loaded.loadSpec
- TheLoadSpec
.domainObject
- TheDomainObject
being loaded.isLoadIntoProgram
- True if the load is adding to an existingDomainObject
; otherwise, false.- Returns:
- A list of the
Loader
's default options.
-
validateOptions
public String validateOptions(ByteProvider provider, LoadSpec loadSpec, List<Option> options, Program program) Description copied from interface:Loader
Validates theLoader
's options and returns null if all options are valid; otherwise, an error message describing the problem is returned.- Specified by:
validateOptions
in interfaceLoader
- Parameters:
provider
- The bytes of the thing being loaded.loadSpec
- The proposedLoadSpec
.options
- The list ofOption
s to validate.program
- existing program if the loader is adding to an existing program. If it is a fresh import, then this will be null.- Returns:
- null if all
Option
s are valid; otherwise, an error message describing the problem is returned.
-
postLoadProgramFixups
protected void postLoadProgramFixups(List<Loaded<Program>> loadedPrograms, Project project, List<Option> options, MessageLog messageLog, TaskMonitor monitor) throws CancelledException, IOException This gets called after the given list ofloaded programs
s is finished loading. It provides subclasses an opportunity to do follow-on actions to the load.- Parameters:
loadedPrograms
- Theloaded programs
to be fixed up.project
- TheProject
to load into. Could be null if there is no project.options
- The load options.messageLog
- The message log.monitor
- A cancelable task monitor.- Throws:
IOException
- if there was an IO-related problem loading.CancelledException
- if the user cancelled the load.
-
postLoadCleanup
protected void postLoadCleanup(boolean success) This gets called as the final step of the load process. Subclasses may override it to ensure any resources they created can be cleaned up after the load finishes.NOTE: Subclasses should not use this method to release any
Program
s they created when failure occurs. That should be done by the subclass as soon as it detects failure has occurred.- Parameters:
success
- True if the load completed successfully; otherwise, false
-
shouldApplyProcessorLabelsByDefault
protected boolean shouldApplyProcessorLabelsByDefault()Returns whether or not processor labels should be applied by default. Most loaders will not need to override this method because they will not want the labels applied by default.- Returns:
- Whether or not processor labels should be applied by default.
-
concatenatePaths
Concatenates the given path elements to form a single path. Empty and null path elements are ignored.- Parameters:
pathElements
- The path elements to append to one another- Returns:
- A single path consisting of the given path elements appended together
-
generateBlockName
Generates a block name.- Parameters:
program
- TheProgram
for the block.isOverlay
- true if the block is an overlay; use "ov" in the name.space
- TheAddressSpace
for the block.- Returns:
- The generated block name.
-
createProgram
protected Program createProgram(ByteProvider provider, String domainFileName, Address imageBase, String executableFormatName, Language language, CompilerSpec compilerSpec, Object consumer) throws IOException Creates aProgram
with the specified attributes.- Parameters:
provider
- The bytes that will make up theProgram
.domainFileName
- The name for the DomainFile that will store theProgram
.imageBase
- The image base address of theProgram
.executableFormatName
- The file format name of theProgram
. Typically this will be theLoader
name.language
- TheLanguage
of theProgram
.compilerSpec
- TheCompilerSpec
of theProgram
.consumer
- A consumer object for theProgram
generated.- Returns:
- The newly created
Program
. - Throws:
IOException
- if there was an IO-related problem with creating theProgram
.
-
setProgramProperties
public static void setProgramProperties(Program prog, ByteProvider provider, String executableFormatName) throws IOException Sets a program's Executable Path, Executable Format, MD5, SHA256, and FSRL properties.- Parameters:
prog
-Program
(with active transaction)provider
-ByteProvider
that the program was created fromexecutableFormatName
- executable format string- Throws:
IOException
- if error reading from ByteProvider
-
createDefaultMemoryBlocks
Creates default memory blocks for the givenProgram
. -
markAsFunction
Mark this address as a function by creating a one byte function. The single byte body function is picked up by the function analyzer, disassembled, and the body fixed. Marking the function this way keeps disassembly and follow on analysis out of the loaders.- Parameters:
program
- the programname
- name of function, null if name not knownfuncStart
- starting address of the function
-
getLanguageService
Gets theLoader
's language service.The default behavior of this method is to return the
DefaultLanguageService
.- Returns:
- The
Loader
's language service.
-
release
Releases the given consumer from each of the providedloaded programs
- Parameters:
loadedPrograms
- A list ofloaded programs
which are no longer being usedconsumer
- The consumer that was marking theProgram
s as being used
-