]>
git.saurik.com Git - apple/dyld.git/blob - testing/test-cases/dlsym-RTLD_NEXT.dtest/main.c
2 // BUILD: $CC foo.c -dynamiclib -install_name $RUN_DIR/libfoo-static.dylib -o $BUILD_DIR/libfoo-static.dylib
3 // BUILD: $CC foo.c -dynamiclib -install_name $RUN_DIR/libfoo-dynamic.dylib -o $BUILD_DIR/libfoo-dynamic.dylib -DDYN
4 // BUILD: $CC main.c $BUILD_DIR/libfoo-static.dylib -o $BUILD_DIR/dlsym-RTLD_NEXT.exe -DRUN_DIR="$RUN_DIR"
6 // RUN: ./dlsym-RTLD_NEXT.exe
10 #include <mach-o/dyld_priv.h>
13 // verify RTLD_NEXT search order
18 // my local implemention of free
19 void free(void* p
) { }
22 static bool symbolInImage(const char* symName
, const char* image
)
24 void* sym
= dlsym(RTLD_NEXT
, symName
);
27 const char* imagePath
= dyld_image_path_containing_address(sym
);
28 if ( imagePath
== NULL
)
30 return (strstr(imagePath
, image
) != NULL
);
38 printf("[BEGIN] dlsym-RTLD_NEXT\n");
40 // verify mainSymbol is not found
41 if ( dlsym(RTLD_NEXT
, "mainSymbol") != NULL
) {
42 printf("[FAIL] dlsym-RTLD_NEXT: mainSymbol should not have been found\n");
46 // verify free is found in OS (not local one)
47 if ( !symbolInImage("free", "/usr/lib/") ) {
48 printf("[FAIL] dlsym-RTLD_NEXT: free\n");
52 // verify foo is found in libfoo-static.dylib
53 if ( !symbolInImage("foo", "libfoo-static.dylib") ) {
54 printf("[FAIL] dlsym-RTLD_NEXT: foo not in libfoo-static.dylib\n");
58 void* handle
= dlopen(RUN_DIR
"/libfoo-dynamic.dylib", RTLD_LAZY
);
59 if ( handle
== NULL
) {
60 printf("[FAIL] dlsym-RTLD_NEXT: libfoo-dynamic.dylib could not be loaded\n");
64 // verify foo is still found in statically linked lib
65 if ( !symbolInImage("foo", "libfoo-static.dylib") ) {
66 printf("[FAIL] dlsym-RTLD_NEXT: foo not in libfoo-static.dylib\n");
70 // verify foo2 is not found in libfoo-dynamic.dylib", because RTLD_NEXT only searches thing this image would have seen
71 if ( symbolInImage("foo2", "libfoo-dynamic.dylib") ) {
72 printf("[FAIL] dlsym-RTLD_NEXT: foo2 found but should not have been\n");
76 printf("[PASS] dlsym-RTLD_NEXT\n");