Package ghidra.app.util.opinion

# Class MachoLoader

java.lang.Object
ghidra.app.util.opinion.AbstractProgramLoader
ghidra.app.util.opinion.AbstractLibrarySupportLoader
ghidra.app.util.opinion.MachoLoader

All Implemented Interfaces:
  `Loader`, `ExtensionPoint`, `Comparable<Loader>`

public class MachoLoader extends AbstractLibrarySupportLoader
A `Loader` for Mach-O files.

- ## Nested Class Summary

  ## Nested classes/interfaces inherited from class ghidra.app.util.opinion.AbstractLibrarySupportLoader

  `AbstractLibrarySupportLoader.FileSystemSearchPath`

- ## Field Summary

  Fields
  Modifier and Type
  Field
  Description
  `static final String`
  `MACH_O_NAME`

  ### Fields inherited from class ghidra.app.util.opinion.AbstractLibrarySupportLoader

  `DEPTH_OPTION_NAME, LIBRARY_DEST_FOLDER_OPTION_NAME, LINK_EXISTING_OPTION_NAME, LINK_SEARCH_FOLDER_OPTION_NAME, LOCAL_LIBRARY_OPTION_NAME, SYSTEM_LIBRARY_OPTION_NAME`

  ### Fields inherited from class ghidra.app.util.opinion.AbstractProgramLoader

  `ANCHOR_LABELS_OPTION_NAME, APPLY_LABELS_OPTION_NAME`

  ### Fields inherited from interface ghidra.app.util.opinion.Loader

  `COMMAND_LINE_ARG_PREFIX, OPTIONS_PROJECT_SAVE_STATE_KEY`

- ## Constructor Summary

  Constructors
  Constructor
  Description
  `MachoLoader()`

- ## Method Summary

  Modifier and Type
  Method
  Description
  `protected ByteProvider`
  `createLibraryByteProvider(FSRL libFsrl, LoadSpec loadSpec, MessageLog log, TaskMonitor monitor)`
  Overrides the default implementation to account for Universal Binary (UBI) files.
  `Collection<LoadSpec>`
  `findSupportedLoadSpecs(ByteProvider provider)`
  If this `Loader` supports loading the given `ByteProvider`, this methods returns a `Collection` of all supported `LoadSpec`s that contain discovered load specification information that this `Loader` will need to load.
  `String`
  `getName()`
  Gets the `Loader`'s name, which is used both for display purposes, and to identify the `Loader` in the opinion files.
  `void`
  `load(ByteProvider provider, LoadSpec loadSpec, List<Option> options, Program program, TaskMonitor monitor, MessageLog log)`
  Loads bytes in a particular format into the given `Program`.
  `protected FSRL`
  `resolveLibraryFile(GFileSystem fs, Path libraryParentPath, String libraryName)`
  Special Mach-O library file resolver to account for a "Versions" subdirectory being inserted in the library lookup path.

  ### Methods inherited from class ghidra.app.util.opinion.AbstractLibrarySupportLoader

  `getCustomLibrarySearchPaths, getDefaultOptions, getLibraryDestinationFolderPath, getLibraryDestinationSearchFolder, getLibraryLoadDepth, getLinkSearchFolder, getTier, getTierPriority, isCaseInsensitiveLibraryFilenames, isLinkExistingLibraries, isLoadLocalLibraries, isLoadSystemLibraries, isOptionalLibraryFilenameExtensions, loadProgram, loadProgramInto, matchSupportedLoadSpec, postLoadProgramFixups, processLibrary, shouldLoadLibrary, shouldSearchAllPaths, validateOptions`

  ### Methods inherited from class ghidra.app.util.opinion.AbstractProgramLoader

  `concatenatePaths, createDefaultMemoryBlocks, createProgram, generateBlockName, getLanguageService, load, loadInto, markAsFunction, postLoadCleanup, release, setProgramProperties, shouldApplyProcessorLabelsByDefault`

  ### 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, getPreferredFileName, loadsIntoNewFolder, supportsLoadIntoProgram, supportsLoadIntoProgram`

- ## Field Details

  - ### MACH_O_NAME

    public static final String MACH_O_NAME
    See Also:
      - Constant Field Values

- ## Constructor Details

  - ### MachoLoader

    public MachoLoader()

- ## Method Details

  - ### findSupportedLoadSpecs

    public Collection<LoadSpec> findSupportedLoadSpecs(ByteProvider provider) throws IOException
    Description copied from interface: `Loader`
    If this `Loader` supports loading the given `ByteProvider`, this methods returns a `Collection` of all supported `LoadSpec`s that contain discovered load specification information that this `Loader` will need to load. If this `Loader` cannot support loading the given `ByteProvider`, an empty `Collection` is returned.
    Parameters:
      `provider` - The bytes being loaded.
    Returns:
      A `Collection` of `LoadSpec`s that this `Loader` supports loading, or an empty `Collection` if this `Loader` doesn't support loading the given `ByteProvider`.
    Throws:
      `IOException` - if there was an IO-related issue finding the `LoadSpec`s.

  - ### load

    public void load(ByteProvider provider, LoadSpec loadSpec, List<Option> options, Program program, TaskMonitor monitor, MessageLog log) throws IOException
    Description copied from class: `AbstractLibrarySupportLoader`
    Loads bytes in a particular format into the given `Program`.
    Specified by:
      `load` in class `AbstractLibrarySupportLoader`
    Parameters:
      `provider` - The bytes to load.
      `loadSpec` - The `LoadSpec` to use during load.
      `options` - The load options.
      `program` - The `Program` to load into.
      `monitor` - A cancelable task monitor.
      `log` - The message log.
    Throws:
      `IOException` - if there was an IO-related problem loading.

  - ### getName

    public String getName()
    Description copied from interface: `Loader`
    Gets the `Loader`'s name, which is used both for display purposes, and to identify the `Loader` in the opinion files.
    Returns:
      The `Loader`'s name.

  - ### 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.

    `FatHeader` is 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 a `ByteProvider` for the given library `FSRL`
    Overrides:
      `createLibraryByteProvider` in class `AbstractLibrarySupportLoader`
    Parameters:
      `libFsrl` - The library `FSRL` to get a `ByteProvider` for
      `loadSpec` - An optional `LoadSpec` the `ByteProvider` should conform to
      `log` - The log
      `monitor` - A cancellable monitor
    Returns:
      A `ByteProvider` for the given library `FSRL`, or null if one could not be created that matches the given `LoadSpec`
    Throws:
      `IOException` - If there was an IO-related issue
      `CancelledException` - If the user cancelled the operation

  - ### resolveLibraryFile

    protected FSRL resolveLibraryFile(GFileSystem fs, Path libraryParentPath, String libraryName) throws IOException
    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/Foundation`

    might be found at:

    `/System/Library/Frameworks/Foundation.framework//Versions/C/Foundation`

    Resolves the given library path to an existing `FSRL`. Some `Loader`s have relaxed requirements on what counts as a valid library filename match. For example, case-insensitive lookup may be allowed, and filename extensions may be optional.
    Overrides:
      `resolveLibraryFile` in class `AbstractLibrarySupportLoader`
    Parameters:
      `fs` - The `file system` to resolve in
      `libraryParentPath` - The `Path` of the libraries parent directory, relative to the given file system (could be null)
      `libraryName` - The library name
    Returns:
      The library resolved to an existing `FSRL`, or null if it did not resolve
    Throws:
      `IOException` - If an IO-related problem occurred