public static DWARFSectionProvider createSectionProviderFor(Program program,
			TaskMonitor monitor) {
		for (BiFunction<Program, TaskMonitor, DWARFSectionProvider> factoryFunc : sectionProviderFactoryFuncs) {
			DWARFSectionProvider sp = factoryFunc.apply(program, monitor);
			if (sp != null) {
				try {
					if (sp.hasSection(DWARFSectionNames.MINIMAL_DWARF_SECTIONS)) {
						return sp;
					}

					// if normal sections were not found, look for compressed sections in the
					// same provider
					sp = new CompressedSectionProvider(sp);
					if (sp.hasSection(DWARFSectionNames.MINIMAL_DWARF_SECTIONS)) {
						return sp;
					}
				}
				catch (Exception e) {
					Msg.warn(DWARFSectionProviderFactory.class,
						"Problem detecting DWARFSectionProvider", e);
				}
				sp.close();
			}
		}
		return null;
	}
Iterates through the statically registered {@link #sectionProviderFactoryFuncs factory funcs},
trying each factory method until one returns a {@link DWARFSectionProvider} 
that can successfully retrieve the {@link DWARFSectionNames#MINIMAL_DWARF_SECTIONS minimal} 
sections we need to do a DWARF import.
<p>
The resulting {@link DWARFSectionProvider} is {@link Closeable} and it is the caller's
responsibility to ensure that the object is closed when done. 

@param program
@param monitor {@link TaskMonitor}
@return {@link DWARFSectionProvider} that should be closed by the caller or NULL if no
section provider types match the specified program.
Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/dwarf/sectionprovider/DWARFSectionProviderFactory.java