Class MachoLoader
- All Implemented Interfaces:
Loader,ExtensionPoint,Comparable<Loader>
Loader for Mach-O files.-
Nested Class Summary
Nested classes/interfaces inherited from class ghidra.app.util.opinion.AbstractLibrarySupportLoader
AbstractLibrarySupportLoader.LibrarySearchPath, AbstractLibrarySupportLoader.UnprocessedLibraryNested classes/interfaces inherited from interface ghidra.app.util.opinion.Loader
Loader.ImporterSettings -
Field Summary
FieldsFields inherited from class ghidra.app.util.opinion.AbstractLibrarySupportLoader
DEPTH_OPTION_NAME, LIBRARY_DEST_FOLDER_OPTION_NAME, LIBRARY_SEARCH_PATH_DUMMY_OPTION_NAME, LINK_EXISTING_OPTION_NAME, LINK_SEARCH_FOLDER_OPTION_NAME, LOAD_LIBRARY_OPTION_NAME, LOAD_ONLY_LIBRARIES_OPTION_NAME, MIRROR_LAYOUT_OPTION_NAMEFields inherited from class ghidra.app.util.opinion.AbstractProgramLoader
ANCHOR_LABELS_OPTION_NAME, APPLY_LABELS_OPTION_NAMEFields inherited from interface ghidra.app.util.opinion.Loader
COMMAND_LINE_ARG_PREFIX, loggingDisabled, OPTIONS_PROJECT_SAVE_STATE_KEY -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionprotected ByteProvidercreateLibraryByteProvider(FSRL libFsrl, LoadSpec loadSpec, MessageLog log, TaskMonitor monitor) Overrides the default implementation to account for Universal Binary (UBI) files.findSupportedLoadSpecs(ByteProvider provider) If thisLoadersupports loading the givenByteProvider, this methods returns aCollectionof all supportedLoadSpecs that contain discovered load specification information that thisLoaderwill need to load.getDefaultOptions(ByteProvider provider, LoadSpec loadSpec, DomainObject domainObject, boolean loadIntoProgram, boolean mirrorFsLayout) Gets the defaultLoaderoptions.protected Comparator<String> Special Mach-O libraryComparatorto account for a "Versions" subdirectory being inserted in the library lookup path.getName()protected booleanisValidSearchPath(FSRL fsrl, Loader.ImporterSettings settings) Checks to make sure the given search pathFSRLis valid before processing it.voidload(Program program, Loader.ImporterSettings settings) Loads bytes in a particular format into the givenProgram.protected DomainFilelookupLibraryInFolder(String libraryName, DomainFolder folder) Special Mach-O library file resolver to account for a "Versions" subdirectory being inserted in the library lookup path.protected GFilelookupLibraryInFs(String library, GFileSystem fs) Special Mach-O library file resolver to account for a "Versions" subdirectory being inserted in the library lookup path.protected voidpostLoadProgramFixups(List<Loaded<Program>> loadedPrograms, Loader.ImporterSettings settings) This gets called after the given list ofloaded programss is finished loading.protected voidprocessLibrary(Program lib, String libName, FSRL libFsrl, Queue<AbstractLibrarySupportLoader.UnprocessedLibrary> unprocessed, int depth, Loader.ImporterSettings settings) Performs optional follow-on actions after an the given library has been loadedprotected booleanshouldSearchAllPaths(Program program, Loader.ImporterSettings settings) Checks whether or not to search for libraries using all possible search paths, regardless of what options are setvalidateOptions(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 ghidra.app.util.opinion.AbstractLibrarySupportLoader
findLibraryInLoadedList, findLibraryInProject, getCustomLibrarySearchPaths, getLibraryDestinationFolderPath, getLibraryDestinationSearchFolder, getLibraryLoadDepth, getLibrarySearchFolders, getLibrarySearchPaths, getLinkSearchFolder, getTier, getTierPriority, isLinkExistingLibraries, isLoadLibraries, isMirroredLayout, loadProgram, loadProgramInto, matchSupportedLoadSpec, shouldLoadOnlyLibrariesMethods inherited from class ghidra.app.util.opinion.AbstractProgramLoader
addExternalBlock, createDefaultMemoryBlocks, createProgram, createProgram, generateBlockName, getLanguageService, load, loadInto, markAsFunction, postLoadCleanup, setProgramProperties, shouldApplyProcessorLabelsByDefaultMethods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, waitMethods inherited from interface ghidra.app.util.opinion.Loader
compareTo, getPreferredFileName, loadsIntoNewFolder, supportsLoadIntoProgram, supportsLoadIntoProgram
-
Field Details
-
MACH_O_NAME
- See Also:
-
REEXPORT_OPTION_NAME
- See Also:
-
-
Constructor Details
-
MachoLoader
public MachoLoader()
-
-
Method Details
-
findSupportedLoadSpecs
Description copied from interface:LoaderIf thisLoadersupports loading the givenByteProvider, this methods returns aCollectionof all supportedLoadSpecs that contain discovered load specification information that thisLoaderwill need to load. If thisLoadercannot support loading the givenByteProvider, an emptyCollectionis returned.- Parameters:
provider- The bytes being loaded.- Returns:
- A
CollectionofLoadSpecs that thisLoadersupports loading, or an emptyCollectionif thisLoaderdoesn't support loading the givenByteProvider. - Throws:
IOException- if there was an IO-related issue finding theLoadSpecs.
-
load
Description copied from class:AbstractLibrarySupportLoaderLoads bytes in a particular format into the givenProgram.- Specified by:
loadin classAbstractLibrarySupportLoader- Parameters:
program- TheProgramto load into.settings- TheLoader.ImporterSettings- Throws:
IOException- if there was an IO-related problem loading.
-
getDefaultOptions
public List<Option> getDefaultOptions(ByteProvider provider, LoadSpec loadSpec, DomainObject domainObject, boolean loadIntoProgram, boolean mirrorFsLayout) Description copied from interface:LoaderGets the defaultLoaderoptions.- Specified by:
getDefaultOptionsin interfaceLoader- Overrides:
getDefaultOptionsin classAbstractLibrarySupportLoader- Parameters:
provider- The bytes of the thing being loaded.loadSpec- TheLoadSpec.domainObject- TheDomainObjectbeing loaded.loadIntoProgram- True if the load is adding to an existingDomainObject; otherwise, false.mirrorFsLayout- True if the filesystem layout should be mirrored when loading; 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:LoaderValidates theLoader's options and returns null if all options are valid; otherwise, an error message describing the problem is returned.- Specified by:
validateOptionsin interfaceLoader- Overrides:
validateOptionsin classAbstractLibrarySupportLoader- Parameters:
provider- The bytes of the thing being loaded.loadSpec- The proposedLoadSpec.options- The list ofOptions 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
Options are valid; otherwise, an error message describing the problem is returned.
-
getName
Description copied from interface:LoaderGets theLoader's name, which is used both for display purposes, and to identify theLoaderin the opinion files.- Returns:
- The
Loader's name.
-
isValidSearchPath
protected boolean isValidSearchPath(FSRL fsrl, Loader.ImporterSettings settings) throws CancelledException Description copied from class:AbstractLibrarySupportLoaderChecks to make sure the given search pathFSRLis valid before processing it. Subclasses can override it as needed.- Overrides:
isValidSearchPathin classAbstractLibrarySupportLoader- Parameters:
fsrl- The search pathFSRLsettings- TheLoader.ImporterSettings- Returns:
- True is the search path is valid; otherwise, false
- Throws:
CancelledException- if the user cancelled the load
-
createLibraryByteProvider
protected ByteProvider createLibraryByteProvider(FSRL libFsrl, LoadSpec loadSpec, MessageLog log, TaskMonitor monitor) throws IOException, CancelledException Overrides the default implementation to account for Universal Binary (UBI) files. These must be specially parsed to find the internal file matching the current architecture.FatHeaderis used to parse the file to determine if it is a UBI. If so, each file within the archive is run through the import process until one is found that is successful (meaning it matches the correct architecture). Only one file in the UBI will ever be imported. If the provided file is NOT a UBI, default import method will be invoked.
Creates aByteProviderfor the given libraryFSRL- Overrides:
createLibraryByteProviderin classAbstractLibrarySupportLoader- Parameters:
libFsrl- The libraryFSRLto get aByteProviderforloadSpec- An optionalLoadSpectheByteProvidershould conform tolog- The logmonitor- A cancellable monitor- Returns:
- A
ByteProviderfor the given libraryFSRL, or null if one could not be created that matches the givenLoadSpec - Throws:
IOException- If there was an IO-related issueCancelledException- If the user cancelled the operation
-
lookupLibraryInFs
Special Mach-O library file resolver to account for a "Versions" subdirectory being inserted in the library lookup path. For example, a reference to:/System/Library/Frameworks/Foundation.framework/Foundationmight be found at:
/System/Library/Frameworks/Foundation.framework/Versions/C/Foundation
Looks in the givenGFileSystemfor the given library using the loader'slibrary name comparator- Overrides:
lookupLibraryInFsin classAbstractLibrarySupportLoader- Parameters:
library- The library. Depending on the type of library, this could be a simple filename or an absolute path.fs- Thefile systemto look in in- Returns:
- A matching library
GFile, ornullif one was not found - Throws:
IOException- If an IO-related problem occurred
-
lookupLibraryInFolder
Special Mach-O library file resolver to account for a "Versions" subdirectory being inserted in the library lookup path. For example, a reference to:/System/Library/Frameworks/Foundation.framework/Foundationmight be found at:
/System/Library/Frameworks/Foundation.framework/Versions/C/Foundation
Looks in the givenDomainFolderfor the given name using the loader'slibrary name comparator- Overrides:
lookupLibraryInFolderin classAbstractLibrarySupportLoader- Parameters:
libraryName- The library name to search for (no path included)folder- TheDomainFolderto search in- Returns:
- A matching library
DomainFile, ornullif one was not found
-
getLibraryNameComparator
Special Mach-O libraryComparatorto account for a "Versions" subdirectory being inserted in the library lookup path. For example, a reference to:/System/Library/Frameworks/Foundation.framework/Foundationmight be found at:
/System/Library/Frameworks/Foundation.framework/Versions/C/Foundation
Returns aComparatorfor comparing library names.No assumptions should be made about whether the library name includes path information or not.
- Overrides:
getLibraryNameComparatorin classAbstractLibrarySupportLoader- Returns:
- a
Comparatorfor comparing library names
-
shouldSearchAllPaths
Checks whether or not to search for libraries using all possible search paths, regardless of what options are setIf we aren't loading libraries, we still want to search all paths if the reexport option is set and the Mach-O actually has
LC_REEXPORT_DYLIBentries.- Overrides:
shouldSearchAllPathsin classAbstractLibrarySupportLoader- Parameters:
program- TheProgrambeing loadedsettings- TheLoader.ImporterSettings- Returns:
- True if all possible search paths should be used, regardless of what options are set
-
processLibrary
protected void processLibrary(Program lib, String libName, FSRL libFsrl, Queue<AbstractLibrarySupportLoader.UnprocessedLibrary> unprocessed, int depth, Loader.ImporterSettings settings) throws IOException, CancelledException Performs optional follow-on actions after an the given library has been loadedThe goal here is to add each reexported library to the
unprocessedlist at the currentdepthto be sure they get loaded. However, if the current depth is 1, we need to marked them as "discard" so we know not to save them in the end (since their actual depth would have prevented their save as a normal library)- Overrides:
processLibraryin classAbstractLibrarySupportLoader- Parameters:
lib- The loaded libraryProgramlibName- The name of the librarylibFsrl- The libraryFSRLunprocessed- TheQueueofunprocessed librariesdepth- The load depth of the library to loadsettings- TheLoader.ImporterSettings- Throws:
IOException- If an IO-related error occurredCancelledException- If the user cancelled the action
-
postLoadProgramFixups
protected void postLoadProgramFixups(List<Loaded<Program>> loadedPrograms, Loader.ImporterSettings settings) throws CancelledException, IOException This gets called after the given list ofloaded programss is finished loading. It provides subclasses an opportunity to do follow-on actions to the load.Fix up program's external library entries so that they point to a path in the project.
- Overrides:
postLoadProgramFixupsin classAbstractLibrarySupportLoader- Parameters:
loadedPrograms- Theloaded programsto be fixed up.settings- TheLoader.ImporterSettings.- Throws:
CancelledException- if the user cancelled the load.IOException- if there was an IO-related problem loading.
-