code: private OptionalHeader reloadOptionalHeader(PESignature pesig,
              MemoryMappedPE mmBytes, PEData data) throws IOException {
          logger.info("reloading optional header");
          // offset right after the eCOFF File Header
          long offset = pesig.getOffset() + PESignature.PE_SIG.length
                  + COFFFileHeader.HEADER_SIZE;
          logger.info("Optional Header offset: " + offset);
          int size = getOptHeaderSize(offset);
          // read bytes and construct header
          long sizeOfHeaders = data.getOptionalHeader().get(
                  WindowsEntryKey.SIZE_OF_HEADERS);
          // virtual end of header mapping marked by VA of first section
          long vEnd = data.getSectionTable().getSectionHeader(1)
                  .getAlignedVirtualAddress() - 1;
          // virtual start of headers TODO test
          long vStart = vEnd - sizeOfHeaders;
          long sliceStart = vStart + COFFFileHeader.HEADER_SIZE
                  + PESignature.PE_SIG.length;
          logger.debug("reading opt at start: " + sliceStart);
          byte[] headerbytes = mmBytes.slice(sliceStart, sliceStart + size);
          logger.debug("array size: " + headerbytes.length);
          logger.debug(ByteArrayUtil.byteToHex(headerbytes));
          return OptionalHeader.newInstance(headerbytes, offset);
      }
docs: FIXME