public static Address findPcHeaderAddress(GoRttiMapper programContext, AddressRange range,
			TaskMonitor monitor) throws IOException {
		if (range == null) {
			return null;
		}
		// search for magic signature + padding + wildcard_minLc + ptrSize
		byte[] searchBytes = new byte[] { // 4 + 2 + 1 + 1
			(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, // magic signature
			0, 0,	// padding
			0,	// unknown minLc, masked
			(byte) programContext.getPtrSize()	// ptrSize
		};
		byte[] searchMask = new byte[] { // also 4 + 2 + 1 + 1
			(byte) 0xf0, (byte) 0xff, (byte) 0xff, (byte) 0xf0, // magic, first byte nibble and last byte nibble is wildcard to handle either endian matching
			(byte) 0xff, (byte) 0xff,	// padding 
			0,	// unknown minLc - wildcarded
			(byte) 0xff // ptrSize 
		};
		Memory memory = programContext.getProgram().getMemory();
		Address pcHeaderAddr;
		while ((pcHeaderAddr = memory.findBytes(range.getMinAddress(), range.getMaxAddress(),
			searchBytes, searchMask, true, monitor)) != null) {
			try (MemoryByteProvider bp =
				new MemoryByteProvider(memory, pcHeaderAddr, range.getMaxAddress())) {
				if (isPcHeader(bp)) {
					return pcHeaderAddr;
				}
			}
			range = new AddressRangeImpl(pcHeaderAddr.next(), range.getMaxAddress());
		}
		return null;
	}
Searches (possibly slowly) for a pclntab/pcHeader structure in the specified memory range,
which is typically necessary in stripped PE binaries.

@param programContext {@link GoRttiMapper} 
@param range memory range to search (typically .rdata or .noptrdata sections)
@param monitor {@link TaskMonitor} that will let the user cancel
@return {@link Address} of the found pcHeader structure, or null if not found
@throws IOException if error reading
Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/golang/rtti/GoPcHeader.java