2 // BUILD: $CC foo.c -dynamiclib -install_name $RUN_DIR/libfoo.dylib -o $BUILD_DIR/libfoo.dylib
3 // BUILD: $CC main.c $BUILD_DIR/libfoo.dylib -o $BUILD_DIR/dyld_images_for_addresses.exe
5 // RUN: ./dyld_images_for_addresses.exe
10 #include <uuid/uuid.h>
11 #include <mach-o/dyld_priv.h>
13 extern void* __dso_handle
;
30 static int mystaticfoo()
41 printf("[BEGIN] _dyld_images_for_addresses\n");
44 const void* addresses
[12];
45 addresses
[0] = &myfunc
;
46 addresses
[1] = &myfunc2
;
47 addresses
[2] = &mystaticfoo
;
48 addresses
[3] = &__dso_handle
;
49 addresses
[4] = &mydata
;
50 addresses
[5] = &myarray
;
51 addresses
[6] = &mylocal
; // not owned by dyld, so coresponding dyld_image_uuid_offset should be all zeros
55 addresses
[10] = &fopen
;
56 addresses
[11] = &fclose
;
58 struct dyld_image_uuid_offset infos
[12];
59 _dyld_images_for_addresses(12, addresses
, infos
);
61 for (int i
=0; i
< 12; ++i
) {
63 uuid_unparse_upper(infos
[i
].uuid
, str
);
64 printf("0x%09llX 0x%08llX %s\n", (long long)infos
[i
].image
, infos
[i
].offsetInImage
, str
);
67 if ( infos
[0].image
!= infos
[1].image
)
68 printf("[FAIL] _dyld_images_for_addresses 0 vs 1\n");
69 else if ( infos
[0].image
!= infos
[2].image
)
70 printf("[FAIL] _dyld_images_for_addresses 0 vs 2\n");
71 else if ( infos
[0].image
!= infos
[3].image
)
72 printf("[FAIL] _dyld_images_for_addresses 0 vs 3\n");
73 else if ( infos
[0].image
!= infos
[4].image
)
74 printf("[FAIL] _dyld_images_for_addresses 0 vs 4\n");
75 else if ( infos
[0].image
!= infos
[5].image
)
76 printf("[FAIL] _dyld_images_for_addresses 0 vs 5\n");
77 else if ( infos
[6].image
!= NULL
)
78 printf("[FAIL] _dyld_images_for_addresses 6 vs null \n");
79 else if ( infos
[7].image
!= infos
[8].image
)
80 printf("[FAIL] _dyld_images_for_addresses 7 vs 8\n");
81 else if ( infos
[7].image
!= infos
[9].image
)
82 printf("[FAIL] _dyld_images_for_addresses 7 vs 9\n");
83 else if ( infos
[0].image
== infos
[7].image
)
84 printf("[FAIL] _dyld_images_for_addresses 0 vs 7\n");
85 else if ( infos
[10].image
!= infos
[11].image
)
86 printf("[FAIL] _dyld_images_for_addresses 10 vs 11\n");
87 else if ( uuid_compare(infos
[0].uuid
, infos
[1].uuid
) != 0 )
88 printf("[FAIL] _dyld_images_for_addresses uuid 0 vs 1\n");
89 else if ( uuid_compare(infos
[0].uuid
, infos
[2].uuid
) != 0 )
90 printf("[FAIL] _dyld_images_for_addresses uuid 0 vs 2\n");
91 else if ( uuid_compare(infos
[0].uuid
, infos
[3].uuid
) != 0 )
92 printf("[FAIL] _dyld_images_for_addresses uuid 0 vs 3\n");
93 else if ( uuid_compare(infos
[0].uuid
, infos
[4].uuid
) != 0 )
94 printf("[FAIL] _dyld_images_for_addresses uuid 0 vs 4\n");
95 else if ( uuid_compare(infos
[0].uuid
, infos
[5].uuid
) != 0 )
96 printf("[FAIL] _dyld_images_for_addresses uuid 0 vs 5\n");
97 else if ( uuid_is_null(infos
[6].uuid
) == 0 )
98 printf("[FAIL] _dyld_images_for_addresses uuid 6 vs null\n");
99 else if ( uuid_compare(infos
[7].uuid
, infos
[8].uuid
) != 0 )
100 printf("[FAIL] _dyld_images_for_addresses uuid 7 vs 8\n");
101 else if ( uuid_compare(infos
[7].uuid
, infos
[9].uuid
) != 0 )
102 printf("[FAIL] _dyld_images_for_addresses uuid 7 vs 9\n");
103 else if ( uuid_compare(infos
[0].uuid
, infos
[7].uuid
) == 0 )
104 printf("[FAIL] _dyld_images_for_addresses uuid 0 vs 7\n");
105 else if ( uuid_compare(infos
[10].uuid
, infos
[11].uuid
) != 0 )
106 printf("[FAIL] _dyld_images_for_addresses uuid 10 vs 11\n");
108 printf("[PASS] _dyld_images_for_addresses\n");