2  * Copyright (c) 2005 Apple Computer, Inc. All rights reserved. 
   4  * @APPLE_LICENSE_HEADER_START@ 
   6  * This file contains Original Code and/or Modifications of Original Code 
   7  * as defined in and that are subject to the Apple Public Source License 
   8  * Version 2.0 (the 'License'). You may not use this file except in 
   9  * compliance with the License. Please obtain a copy of the License at 
  10  * http://www.opensource.apple.com/apsl/ and read it before using this 
  13  * The Original Code and all software distributed under the License are 
  14  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  15  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  16  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 
  17  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  18  * Please see the License for the specific language governing rights and 
  19  * limitations under the License. 
  21  * @APPLE_LICENSE_HEADER_END@ 
  23 #include <stdbool.h>  // fprintf(), NULL 
  24 #include <stdio.h>  // fprintf(), NULL 
  25 #include <stdlib.h> // exit(), EXIT_SUCCESS 
  28 #include <mach-o/dyld.h>   
  29 #include <mach-o/dyld_priv.h>   
  32 #include "test.h" // PASS(), FAIL(), XPASS(), XFAIL() 
  34 static bool doneRegistering 
= false; 
  38 // By returning a string, we prevent that image from loading. 
  39 // We just prevent any image with "bar" in its name from loading. 
  42 static const char* batchMappedHandler(enum dyld_image_states state
, uint32_t infoCount
, const struct dyld_image_info info
[]) 
  44         for (uint32_t i
=0; i 
< infoCount
; ++i
) { 
  45                 //fprintf(stderr, "batch mapped: %d %s\n", i, info[i].imageFilePath); 
  46                 if ( strstr(info
[i
].imageFilePath
, "bar") != NULL 
) 
  47                         return "can't load bar"; 
  52 static const char* singleMappedHandler(enum dyld_image_states state
, uint32_t infoCount
, const struct dyld_image_info info
[]) 
  54         //fprintf(stderr, "single mapped: %s\n", info[0].imageFilePath); 
  55         if ( strstr(info
[0].imageFilePath
, "bar") != NULL 
) 
  56                 return "can't load bar"; 
  62 static const char* singleInitializedHandler(enum dyld_image_states state
, uint32_t infoCount
, const struct dyld_image_info info
[]) 
  64         //fprintf(stderr, "singleInitializedHandler(%s)\n", info[0].imageFilePath); 
  65         if ( doneRegistering 
) { 
  66                 FAIL("image-state-deny something loaded"); 
  72 //static const char* batchBoundHandler(enum dyld_image_states state, uint32_t infoCount, const struct dyld_image_info info[]) 
  74 //      //for (uint32_t i=0; i < infoCount; ++i)  
  75 //      //      fprintf(stderr, "bound: %u %s\n", i, info[i].imageFilePath); 
  79 static void load(const char* name
) 
  81         void* handle 
= dlopen(name
, RTLD_LAZY
); 
  82         if ( handle 
!= NULL 
) { 
  83                 FAIL("image-state-deny: dlopen(%s) should have failed", name
); 
  89 int main(int argc
, const char* argv
[]) 
  91         // tell dyld we want to know when images successfully loaded 
  92         dyld_register_image_state_change_handler(dyld_image_state_initialized
, false, singleInitializedHandler
); 
  93         doneRegistering 
= true; 
  95         // tell dyld we want to know when images successfully loaded 
  96         //dyld_register_image_state_change_handler(dyld_image_state_bound, true, batchBoundHandler); 
  98         // tell dyld we want to know when images are mapped 
 100                 dyld_register_image_state_change_handler(dyld_image_state_dependents_mapped
, true, batchMappedHandler
); 
 102                 dyld_register_image_state_change_handler(dyld_image_state_mapped
, false, singleMappedHandler
); 
 108         //dlopen("/usr/lib/libz.1.2.3.dylib", RTLD_LAZY); 
 110         PASS("image-state-deny");