public long getOffset(long virtualAddress) { // TODO: addressable unit size to byte offset may be a problem
		if (p_type != ElfProgramHeaderConstants.PT_LOAD || p_filesz == 0 || p_memsz == 0) {
			throw new UnsupportedOperationException("virtualAddress not loaded by this segment");
		}
		if (getMemorySize() != getAdjustedMemorySize()) {
			// TODO: unsure if we will encounter this situation 
			throw new UnsupportedOperationException("unsupported use of filtered load segment");
		}
		// TODO: additional validation of this approach is needed
		long addressableUnitSize = p_filesz / getAdjustedLoadSize();
		return (addressableUnitSize * (virtualAddress - getVirtualAddress())) + p_offset;
	}
Compute the file offset associated with the specified loaded virtual address 
defined by this PT_LOAD program header.  This can be useful when attempting to locate
addresses defined by the PT_DYNAMIC section.
@param virtualAddress a memory address which has already had the PRElink adjustment applied
@return computed file offset or -1 if virtual address not contained within this header
@see ElfHeader#getProgramLoadHeaderContaining(long) for obtaining PT_LOAD segment which contains
virtualAddress
Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/elf/ElfProgramHeader.java