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 #include "test_support.h"
15 extern void* __dso_handle
;
32 static int mystaticfoo()
41 int main(int argc
, const char* argv
[], const char* envp
[], const char* apple
[]) {
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 LOG("0x%09llX 0x%08llX %s", (long long)infos
[i
].image
, infos
[i
].offsetInImage
, str
);
67 if ( infos
[0].image
!= infos
[1].image
)
69 else if ( infos
[0].image
!= infos
[2].image
)
71 else if ( infos
[0].image
!= infos
[3].image
)
73 else if ( infos
[0].image
!= infos
[4].image
)
75 else if ( infos
[0].image
!= infos
[5].image
)
77 else if ( infos
[6].image
!= NULL
)
79 else if ( infos
[7].image
!= infos
[8].image
)
81 else if ( infos
[7].image
!= infos
[9].image
)
83 else if ( infos
[0].image
== infos
[7].image
)
85 else if ( infos
[10].image
!= infos
[11].image
)
87 else if ( uuid_compare(infos
[0].uuid
, infos
[1].uuid
) != 0 )
89 else if ( uuid_compare(infos
[0].uuid
, infos
[2].uuid
) != 0 )
91 else if ( uuid_compare(infos
[0].uuid
, infos
[3].uuid
) != 0 )
93 else if ( uuid_compare(infos
[0].uuid
, infos
[4].uuid
) != 0 )
95 else if ( uuid_compare(infos
[0].uuid
, infos
[5].uuid
) != 0 )
97 else if ( uuid_is_null(infos
[6].uuid
) == 0 )
98 FAIL("uuid 6 vs null");
99 else if ( uuid_compare(infos
[7].uuid
, infos
[8].uuid
) != 0 )
101 else if ( uuid_compare(infos
[7].uuid
, infos
[9].uuid
) != 0 )
103 else if ( uuid_compare(infos
[0].uuid
, infos
[7].uuid
) == 0 )
105 else if ( uuid_compare(infos
[10].uuid
, infos
[11].uuid
) != 0 )
106 FAIL("uuid 10 vs 11");