]> git.saurik.com Git - apple/dyld.git/blob - testing/test-cases/dlsym-RTLD_SELF.dtest/main.c
5af0e2fdf4b8281d77e5bbcfdcf334ad7e876782
[apple/dyld.git] / testing / test-cases / dlsym-RTLD_SELF.dtest / main.c
1
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_SELF.exe -DRUN_DIR="$RUN_DIR"
5
6 // RUN: ./dlsym-RTLD_SELF.exe
7
8 #include <stdio.h>
9 #include <dlfcn.h>
10 #include <string.h>
11 #include <mach-o/dyld_priv.h>
12
13
14 // verify RTLD_SELF search order
15
16 int mainSymbol = 4;
17
18
19 // my local implemention of free
20 void free(void* p) { }
21
22
23 static bool symbolInImage(const char* symName, const char* image)
24 {
25 void* sym = dlsym(RTLD_SELF, symName);
26 if ( sym == NULL )
27 return false;
28 const char* imagePath = dyld_image_path_containing_address(sym);
29 if ( imagePath == NULL )
30 return false;
31 return (strstr(imagePath, image) != NULL);
32 }
33
34
35
36
37 int main()
38 {
39 printf("[BEGIN] dlsym-RTLD_SELF\n");
40
41 // verify mainSymbol is found
42 if ( dlsym(RTLD_SELF, "mainSymbol") == NULL ) {
43 printf("[FAIL] dlsym-RTLD_SELF: mainSymbol should have been found\n");
44 return 0;
45 }
46
47 // verify free is found in this program - not in OS
48 if ( !symbolInImage("free", "dlsym-RTLD_SELF") ) {
49 printf("[FAIL] dlsym-RTLD_SELF: free\n");
50 return 0;
51 }
52
53 // verify foo is found in libfoo-static.dylib
54 if ( !symbolInImage("foo", "libfoo-static.dylib") ) {
55 printf("[FAIL] dlsym-RTLD_SELF: foo not in libfoo-static.dylib\n");
56 return 0;
57 }
58
59 void* handle = dlopen(RUN_DIR "/libfoo-dynamic.dylib", RTLD_LAZY);
60 if ( handle == NULL ) {
61 printf("[FAIL] dlsym-RTLD_SELF: libfoo-dynamic.dylib could not be loaded\n");
62 return 0;
63 }
64
65 // verify foo is still found in statically linked lib
66 if ( !symbolInImage("foo", "libfoo-static.dylib") ) {
67 printf("[FAIL] dlsym-RTLD_SELF: foo not in libfoo-static.dylib\n");
68 return 0;
69 }
70
71 // verify foo2 is not found in libfoo-dynamic.dylib", because RTLD_SELF only searches thing this image would have seen
72 if ( symbolInImage("foo2", "libfoo-dynamic.dylib") ) {
73 printf("[FAIL] dlsym-RTLD_SELF: foo2 found but should not have been\n");
74 return 0;
75 }
76
77 printf("[PASS] dlsym-RTLD_SELF\n");
78 return 0;
79 }
80