]> git.saurik.com Git - apple/dyld.git/blobdiff - unit-tests/test-cases/bundle-v-dylib/main.c
dyld-353.2.1.tar.gz
[apple/dyld.git] / unit-tests / test-cases / bundle-v-dylib / main.c
index 4f0e3a90f2efd19ea84165b066f59a21cb7d7e5b..aea5c6f6ca6462b4fe2aaef22b4859a5e02dfbd6 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (c) 2005 Apple Computer, Inc. All rights reserved.
+ * Copyright (c) 2005-2009 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
 #include <stdbool.h>
 #include <stdlib.h>
 #include <mach-o/dyld.h>
 #include <stdbool.h>
 #include <stdlib.h>
 #include <mach-o/dyld.h>
+#include <sys/types.h>
+#include <sys/stat.h> 
+#include <sys/mman.h> 
+#include <unistd.h>
+#include <fcntl.h>
+#include <Availability.h>
 
 #include "test.h" // PASS(), FAIL()
 
 
 #include "test.h" // PASS(), FAIL()
 
+extern void bar();
+
+
+// NSCreateObjectFileImageFromMemory is only available on Mac OS X - not iPhone OS
+#if __MAC_OS_X_VERSION_MIN_REQUIRED
+
+void loadAsBundleFromMemory(const char* path)
+{
+       int fd = open(path, O_RDONLY, 0);
+       if ( fd == -1 ) {
+               FAIL("bundle-v-dylib: open() failed");
+               exit(0);
+       }
+
+       struct stat stat_buf;
+       if ( fstat(fd, &stat_buf) == -1) {
+               FAIL("bundle-v-dylib: fstat() failed");
+               exit(0);
+       }
+
+       void* loadAddress = mmap(NULL, stat_buf.st_size, PROT_READ, MAP_FILE | MAP_PRIVATE, fd, 0);
+       if ( loadAddress == ((void*)(-1)) ) {
+               FAIL("bundle-v-dylib: mmap() failed");
+               exit(0);
+       }
+
+       close(fd);
+
+       NSObjectFileImage ofi;
+       if ( NSCreateObjectFileImageFromMemory(loadAddress, stat_buf.st_size, &ofi) == NSObjectFileImageSuccess ) {
+               FAIL("bundle-v-dylib: NSCreateObjectFileImageFromMemory() incorrectly allowed %s to be loaded", path);
+               exit(0);
+       }
+}
 
 void loadAsBundle(const char* path)
 {
        NSObjectFileImage ofi;
        if ( NSCreateObjectFileImageFromFile(path, &ofi) == NSObjectFileImageSuccess ) {
 
 void loadAsBundle(const char* path)
 {
        NSObjectFileImage ofi;
        if ( NSCreateObjectFileImageFromFile(path, &ofi) == NSObjectFileImageSuccess ) {
-               FAIL("NSCreateObjectFileImageFromFile() incorrectly allowed %s to be loaded", path);
-               exit(1);
+               FAIL("bundle-v-dylib: NSCreateObjectFileImageFromFile() incorrectly allowed %s to be loaded", path);
+               exit(0);
        }
 }
 
 void loadAsDylib(const char* path)
 {
        if ( NSAddImage(path, NSADDIMAGE_OPTION_RETURN_ON_ERROR) != NULL ) {
        }
 }
 
 void loadAsDylib(const char* path)
 {
        if ( NSAddImage(path, NSADDIMAGE_OPTION_RETURN_ON_ERROR) != NULL ) {
-               FAIL("NSAddImage() incorrectly allowed %s to be loaded", path);
-               exit(1);
+               FAIL("bundle-v-dylib: NSAddImage() incorrectly allowed %s to be loaded", path);
+               exit(0);
        }
 }
 
        }
 }
 
-
-extern void bar();
+#endif
 
 int main()
 {
 
 int main()
 {
+#if __MAC_OS_X_VERSION_MIN_REQUIRED
+       int dummy; 
+       
        // verify that NSAddImage fails to load MH_BUNDLE
        loadAsDylib("foo.bundle");
 
        // verify that NSAddImage fails to load MH_BUNDLE
        loadAsDylib("foo.bundle");
 
@@ -58,9 +100,16 @@ int main()
 
        // verify that NSCreateObjectFileImageFromFile fails to load MH_DYLIB already linked against main
        loadAsBundle("bar.dylib");
 
        // verify that NSCreateObjectFileImageFromFile fails to load MH_DYLIB already linked against main
        loadAsBundle("bar.dylib");
+       
        // verify that bar.dylib was not unloaded when above failed
        bar();
        
        // verify that bar.dylib was not unloaded when above failed
        bar();
        
+       // try loading a dylib from memory using bundle API's
+       loadAsBundleFromMemory("foo2.dylib");
+       
+       // verify that dyld data structures are not wanked by scanning all images
+       _dyld_get_image_header_containing_address(&dummy);
+#endif
        PASS("bundle-v-dylib");
        return 0;
 }
\ No newline at end of file
        PASS("bundle-v-dylib");
        return 0;
 }
\ No newline at end of file