aboutsummaryrefslogtreecommitdiffstats
path: root/lib/System/Path.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2008-06-26 05:17:18 +0000
committerChris Lattner <sabre@nondot.org>2008-06-26 05:17:18 +0000
commit59ca90916a6a7da0db8a3cc1d7f75e4a253b7de4 (patch)
tree787fc1b1c8da253b9f2e082c3926e64f18b4696e /lib/System/Path.cpp
parent75da7af896306d98973451d61e56d39746695098 (diff)
downloadexternal_llvm-59ca90916a6a7da0db8a3cc1d7f75e4a253b7de4.zip
external_llvm-59ca90916a6a7da0db8a3cc1d7f75e4a253b7de4.tar.gz
external_llvm-59ca90916a6a7da0db8a3cc1d7f75e4a253b7de4.tar.bz2
"An improved Mach-O file type detection for sys::IdentifyFileType()
This patch add supports for single architecture mach-o files (the current implementation only support Universal Binary), and solve the signature conflict between java class and Universal Binary magics. Note that this function will always returned dynamic library for Universal Binaries (like the current implementation) because the binary type is not include in the file header." Patch by Jean-Daniel Dupas! git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@52766 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/System/Path.cpp')
-rw-r--r--lib/System/Path.cpp50
1 files changed, 32 insertions, 18 deletions
diff --git a/lib/System/Path.cpp b/lib/System/Path.cpp
index af400e9..baaa310 100644
--- a/lib/System/Path.cpp
+++ b/lib/System/Path.cpp
@@ -80,26 +80,40 @@ sys::IdentifyFileType(const char*magic, unsigned length) {
break;
case 0xCA:
- // This is complicated by an overlap with Java class files.
- // See the Mach-O section in /usr/share/file/magic for details.
if (magic[1] == char(0xFE) && magic[2] == char(0xBA) &&
magic[3] == char(0xBE)) {
- return Mach_O_DynamicallyLinkedSharedLib_FileType;
-
- // FIXME: How does this work?
- 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;
- }
+ // This is complicated by an overlap with Java class files.
+ // See the Mach-O section in /usr/share/file/magic for details.
+ if (length >= 8 && magic[7] < 43)
+ // FIXME: Universal Binary of any type.
+ return Mach_O_DynamicallyLinkedSharedLib_FileType;
+ }
+ break;
+
+ case 0xFE:
+ case 0xCE:
+ uint16_t type;
+ if (magic[0] == char(0xFE) && magic[1] == char(0xED) &&
+ magic[2] == char(0xFA) && magic[3] == char(0xCE)) {
+ /* Native endian */
+ if (length >= 16) type = magic[14] << 8 | magic[15];
+ } else if (magic[0] == char(0xCE) && magic[1] == char(0xFA) &&
+ magic[2] == char(0xED) && magic[3] == char(0xFE)) {
+ /* Reverse endian */
+ if (length >= 14) type = magic[13] << 8 | magic[12];
+ }
+ switch (type) {
+ 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;
+ case 10: break; // FIXME: MH_DSYM companion file with only debug.
}
break;