Teach sys::Path how to recognize different kinds of object files for ELF
authorReid Spencer <rspencer@reidspencer.com>
Wed, 11 Apr 2007 02:02:09 +0000 (02:02 +0000)
committerReid Spencer <rspencer@reidspencer.com>
Wed, 11 Apr 2007 02:02:09 +0000 (02:02 +0000)
and Mach-O systems. Additionally, correct the Mach-O logic code to look at
byte 12 not byte 15. Hopefully this fixes the llvm-ld warning on Darwin.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@35876 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/System/Path.h
lib/System/Path.cpp

index 6c9ab94579c55a44abbb796af28ca4f481dda213..84d99122b1ec674d810a35b0eaf0a94dd662c246 100644 (file)
@@ -597,13 +597,24 @@ namespace sys {
 
   /// This enumeration delineates the kinds of files that LLVM knows about.
   enum LLVMFileType {
-    Unknown_FileType = 0,            ///< Unrecognized file
-    Bytecode_FileType = 1,           ///< Uncompressed bytecode file
-    CompressedBytecode_FileType = 2, ///< Compressed bytecode file
-    Archive_FileType = 3,            ///< ar style archive file
-    ELF_FileType = 4,                ///< Native ELF object file or lib
-    Mach_O_FileType = 5,             ///< Native Mach-O object file or lib
-    COFF_FileType = 6                ///< COFF object file or lib
+    Unknown_FileType = 0,              ///< Unrecognized file
+    Bytecode_FileType,                 ///< Uncompressed bytecode file
+    CompressedBytecode_FileType,       ///< Compressed bytecode file
+    Archive_FileType,                  ///< ar style archive file
+    ELF_Relocatable_FileType,          ///< ELF Relocatable object file
+    ELF_Executable_FileType,           ///< ELF Executable image
+    ELF_SharedObject_FileType,         ///< ELF dynamically linked shared lib
+    ELF_Core_FileType,                 ///< ELF core image
+    Mach_O_Object_FileType,            ///< Mach-O Object file
+    Mach_O_Executable_FileType,        ///< Mach-O Executable
+    Mach_O_FixedVirtualMemorySharedLib_FileType, ///< Mach-O Shared Lib, FVM
+    Mach_O_Core_FileType,              ///< Mach-O Core File
+    Mach_O_PreloadExectuable_FileType, ///< Mach-O Preloaded Executable
+    Mach_O_DynamicallyLinkedSharedLib_FileType, ///< Mach-O dynlinked shared lib
+    Mach_O_DynamicLinker_FileType,     ///< The Mach-O dynamic linker
+    Mach_O_Bundle_FileType,            ///< Mach-O Bundle file
+    Mach_O_DynamicallyLinkedSharedLibStub_FileType, ///< Mach-O Shared lib stub
+    COFF_FileType                      ///< COFF object file or lib
   };
 
   /// This utility function allows any memory block to be examined in order
index 0bd48490bb5298b347a4206b865aaf39c530b567..a028696c1394b590bdd0686f56d750db673d119a 100644 (file)
@@ -58,7 +58,14 @@ sys::IdentifyFileType(const char*magic, unsigned length) {
       
     case '\177':
       if (magic[1] == 'E' && magic[2] == 'L' && magic[3] == 'F')
-        return ELF_FileType;
+        if (length >= 18 && magic[17] == 0)
+          switch (magic[16]) {
+            default: break;
+            case 1: return ELF_Relocatable_FileType;
+            case 2: return ELF_Executable_FileType;
+            case 3: return ELF_SharedObject_FileType;
+            case 4: return ELF_Core_FileType;
+          }
       break;
 
     case 0xCE:
@@ -67,10 +74,19 @@ sys::IdentifyFileType(const char*magic, unsigned length) {
       // See the Mach-O section in /usr/share/file/magic for details.
       if (magic[1] == char(0xFA) && magic[2] == char(0xED) && 
           magic[3] == char(0xFE))
-        if (length >= 15)
-          if (magic[15] == 1 || magic[15] == 3 || magic[15] == 6 || 
-              magic[15] == 9)
-            return Mach_O_FileType;
+        if (length >= 14 && magic[13] == 0)
+          switch (magic[12]) {
+            default: break;
+            case 1: return Mach_O_Object_FileType;
+            case 2: return Mach_O_Executable_FileType;
+            case 3: return Mach_O_FixedVirtualMemorySharedLib_FileType;
+            case 4: return Mach_O_Core_FileType;
+            case 5: return Mach_O_PreloadExectuable_FileType;
+            case 6: return Mach_O_DynamicallyLinkedSharedLib_FileType;
+            case 7: return Mach_O_DynamicLinker_FileType;
+            case 8: return Mach_O_Bundle_FileType;
+            case 9: return Mach_O_DynamicallyLinkedSharedLibStub_FileType;
+          }
       break;
 
     case 0xF0: // PowerPC Windows
@@ -108,8 +124,10 @@ Path::isDynamicLibrary() const {
     if (getMagicNumber(Magic, 64))
       switch (IdentifyFileType(Magic.c_str(), Magic.length())) {
         default: return false;
-        case ELF_FileType:
-        case Mach_O_FileType:
+        case Mach_O_FixedVirtualMemorySharedLib_FileType:
+        case Mach_O_DynamicallyLinkedSharedLib_FileType:
+        case Mach_O_DynamicallyLinkedSharedLibStub_FileType:
+        case ELF_SharedObject_FileType:
         case COFF_FileType:  return true;
       }
   }