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
[10];
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
56 struct dyld_image_uuid_offset infos
[10];
57 _dyld_images_for_addresses(10, addresses
, infos
);
59 for (int i
=0; i
< 10; ++i
) {
61 uuid_unparse_upper(infos
[i
].uuid
, str
);
62 printf("0x%09llX 0x%08llX %s\n", (long long)infos
[i
].image
, infos
[i
].offsetInImage
, str
);
65 if ( infos
[0].image
!= infos
[1].image
)
66 printf("[FAIL] _dyld_images_for_addresses 1\n");
67 else if ( infos
[0].image
!= infos
[2].image
)
68 printf("[FAIL] _dyld_images_for_addresses 2\n");
69 else if ( infos
[0].image
!= infos
[3].image
)
70 printf("[FAIL] _dyld_images_for_addresses 3\n");
71 else if ( infos
[0].image
!= infos
[4].image
)
72 printf("[FAIL] _dyld_images_for_addresses 4\n");
73 else if ( infos
[0].image
!= infos
[5].image
)
74 printf("[FAIL] _dyld_images_for_addresses 5\n");
75 else if ( infos
[6].image
!= NULL
)
76 printf("[FAIL] _dyld_images_for_addresses 6\n");
77 else if ( infos
[7].image
!= infos
[8].image
)
78 printf("[FAIL] _dyld_images_for_addresses 7\n");
79 else if ( infos
[7].image
!= infos
[9].image
)
80 printf("[FAIL] _dyld_images_for_addresses 8\n");
81 else if ( infos
[0].image
== infos
[7].image
)
82 printf("[FAIL] _dyld_images_for_addresses 9\n");
83 else if ( uuid_compare(infos
[0].uuid
, infos
[1].uuid
) != 0 )
84 printf("[FAIL] _dyld_images_for_addresses 10\n");
85 else if ( uuid_compare(infos
[0].uuid
, infos
[2].uuid
) != 0 )
86 printf("[FAIL] _dyld_images_for_addresses 11\n");
87 else if ( uuid_compare(infos
[0].uuid
, infos
[3].uuid
) != 0 )
88 printf("[FAIL] _dyld_images_for_addresses 12\n");
89 else if ( uuid_compare(infos
[0].uuid
, infos
[4].uuid
) != 0 )
90 printf("[FAIL] _dyld_images_for_addresses 13\n");
91 else if ( uuid_compare(infos
[0].uuid
, infos
[5].uuid
) != 0 )
92 printf("[FAIL] _dyld_images_for_addresses 14\n");
93 else if ( uuid_is_null(infos
[6].uuid
) == 0 )
94 printf("[FAIL] _dyld_images_for_addresses 15\n");
95 else if ( uuid_compare(infos
[7].uuid
, infos
[8].uuid
) != 0 )
96 printf("[FAIL] _dyld_images_for_addresses 16\n");
97 else if ( uuid_compare(infos
[7].uuid
, infos
[9].uuid
) != 0 )
98 printf("[FAIL] _dyld_images_for_addresses 17\n");
99 else if ( uuid_compare(infos
[0].uuid
, infos
[7].uuid
) == 0 )
100 printf("[FAIL] _dyld_images_for_addresses 18\n");
102 printf("[PASS] _dyld_images_for_addresses\n");