mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-11-03 14:21:30 +00:00 
			
		
		
		
	llvm-readobj: Add support for dumping the DOS header in PE files
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@221333 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
		@@ -572,20 +572,20 @@ COFFObjectFile::COFFObjectFile(MemoryBufferRef Object, std::error_code &EC)
 | 
			
		||||
  bool HasPEHeader = false;
 | 
			
		||||
 | 
			
		||||
  // Check if this is a PE/COFF file.
 | 
			
		||||
  if (base()[0] == 0x4d && base()[1] == 0x5a) {
 | 
			
		||||
  if (checkSize(Data, EC, sizeof(dos_header) + sizeof(COFF::PEMagic))) {
 | 
			
		||||
    // PE/COFF, seek through MS-DOS compatibility stub and 4-byte
 | 
			
		||||
    // PE signature to find 'normal' COFF header.
 | 
			
		||||
    if (!checkSize(Data, EC, 0x3c + 8))
 | 
			
		||||
      return;
 | 
			
		||||
    CurPtr = *reinterpret_cast<const ulittle16_t *>(base() + 0x3c);
 | 
			
		||||
    // Check the PE magic bytes. ("PE\0\0")
 | 
			
		||||
    if (std::memcmp(base() + CurPtr, COFF::PEMagic, sizeof(COFF::PEMagic)) !=
 | 
			
		||||
        0) {
 | 
			
		||||
      EC = object_error::parse_failed;
 | 
			
		||||
      return;
 | 
			
		||||
    const auto *DH = reinterpret_cast<const dos_header *>(base());
 | 
			
		||||
    if (DH->Magic[0] == 'M' && DH->Magic[1] == 'Z') {
 | 
			
		||||
      CurPtr = DH->AddressOfNewExeHeader;
 | 
			
		||||
      // Check the PE magic bytes. ("PE\0\0")
 | 
			
		||||
      if (memcmp(base() + CurPtr, COFF::PEMagic, sizeof(COFF::PEMagic)) != 0) {
 | 
			
		||||
        EC = object_error::parse_failed;
 | 
			
		||||
        return;
 | 
			
		||||
      }
 | 
			
		||||
      CurPtr += sizeof(COFF::PEMagic); // Skip the PE magic bytes.
 | 
			
		||||
      HasPEHeader = true;
 | 
			
		||||
    }
 | 
			
		||||
    CurPtr += sizeof(COFF::PEMagic); // Skip the PE magic bytes.
 | 
			
		||||
    HasPEHeader = true;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if ((EC = getObject(COFFHeader, Data, base() + CurPtr)))
 | 
			
		||||
@@ -627,11 +627,11 @@ COFFObjectFile::COFFObjectFile(MemoryBufferRef Object, std::error_code &EC)
 | 
			
		||||
 | 
			
		||||
    const uint8_t *DataDirAddr;
 | 
			
		||||
    uint64_t DataDirSize;
 | 
			
		||||
    if (Header->Magic == 0x10b) {
 | 
			
		||||
    if (Header->Magic == COFF::PE32Header::PE32) {
 | 
			
		||||
      PE32Header = Header;
 | 
			
		||||
      DataDirAddr = base() + CurPtr + sizeof(pe32_header);
 | 
			
		||||
      DataDirSize = sizeof(data_directory) * PE32Header->NumberOfRvaAndSize;
 | 
			
		||||
    } else if (Header->Magic == 0x20b) {
 | 
			
		||||
    } else if (Header->Magic == COFF::PE32Header::PE32_PLUS) {
 | 
			
		||||
      PE32PlusHeader = reinterpret_cast<const pe32plus_header *>(Header);
 | 
			
		||||
      DataDirAddr = base() + CurPtr + sizeof(pe32plus_header);
 | 
			
		||||
      DataDirSize = sizeof(data_directory) * PE32PlusHeader->NumberOfRvaAndSize;
 | 
			
		||||
 
 | 
			
		||||
@@ -1020,12 +1020,13 @@ file_magic identify_magic(StringRef Magic) {
 | 
			
		||||
        return file_magic::coff_object;
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
    case 0x4d: // Possible MS-DOS stub on Windows PE file
 | 
			
		||||
      if (Magic[1] == 0x5a) {
 | 
			
		||||
    case 'M': // Possible MS-DOS stub on Windows PE file
 | 
			
		||||
      if (Magic[1] == 'Z') {
 | 
			
		||||
        uint32_t off =
 | 
			
		||||
          *reinterpret_cast<const support::ulittle32_t*>(Magic.data() + 0x3c);
 | 
			
		||||
        // PE/COFF file, either EXE or DLL.
 | 
			
		||||
        if (off < Magic.size() && memcmp(Magic.data() + off, "PE\0\0",4) == 0)
 | 
			
		||||
        if (off < Magic.size() &&
 | 
			
		||||
            memcmp(Magic.data()+off, COFF::PEMagic, sizeof(COFF::PEMagic)) == 0)
 | 
			
		||||
          return file_magic::pecoff_executable;
 | 
			
		||||
      }
 | 
			
		||||
      break;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user