static GoModuledata findFirstModule(GoRttiMapper context,
			Address pcHeaderAddress, GoPcHeader pcHeader, AddressRange range, TaskMonitor monitor)
			throws IOException {
		if (range == null) {
			return null;
		}

		Program program = context.getProgram();
		Memory memory = program.getMemory();

		// Search memory for a pointer to the pclntab struct.  The result should be the first
		// field of the GoModuledata structure.
		int ptrSize = context.getPtrSize();
		byte[] searchBytes = new byte[ptrSize];
		context.getDataConverter().putValue(pcHeaderAddress.getOffset(), ptrSize, searchBytes, 0);

		Address moduleAddr;
		while ((moduleAddr = memory.findBytes(range.getMinAddress(), range.getMaxAddress(),
			searchBytes, null, true, monitor)) != null) {

			GoModuledata moduleData = context.readStructure(GoModuledata.class, moduleAddr);

			// Verify that we read a good GoModuledata struct by comparing some of its values to
			// the pclntab structure.
			if (moduleData.matchesPcHeader(pcHeader)) {
				return moduleData;
			}
			range = new AddressRangeImpl(moduleAddr.next(), range.getMaxAddress());
		}
		return null;
	}
Searches memory for a likely GoModuledata structure.

@param context already initialized {@link GoRttiMapper}
@param pcHeaderAddress address of an already found {@link GoPcHeader}
@param pcHeader the {@link GoPcHeader}
@param range memory range to search.  Will be different for different types of binaries
@param monitor {@link TaskMonitor} 
@return new GoModuledata instance, or null if not found
@throws IOException if error reading found structure
Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/golang/rtti/GoModuledata.java