]>
git.saurik.com Git - apple/dyld.git/blob - testing/test-cases/_dyld_is_memory_immutable.dtest/main.c
2 // BUILD: $CC foo.c -dynamiclib -install_name $RUN_DIR/libfoo.dylib -o $BUILD_DIR/libfoo.dylib
3 // BUILD: $CC bar.c -dynamiclib -install_name $RUN_DIR/libbar.dylib -o $BUILD_DIR/libbar.dylib
4 // BUILD: $CC main.c -DRUN_DIR="$RUN_DIR" $BUILD_DIR/libfoo.dylib -o $BUILD_DIR/dyld_immutable_test.exe
6 // RUN: ./dyld_immutable_test.exe
12 #include <mach-o/dyld.h>
13 #include <mach-o/dyld_priv.h>
15 #if __has_feature(ptrauth_calls)
19 #include "test_support.h"
21 static const void* stripPointer(const void* ptr
)
23 #if __has_feature(ptrauth_calls)
24 return __builtin_ptrauth_strip(ptr
, ptrauth_key_asia
);
31 typedef const char* (*BarProc
)(void);
33 extern uint32_t _cpu_capabilities
;
34 extern const char* foo();
36 const char* myStr
= "myStr";
41 int main(int argc
, const char* argv
[], const char* envp
[], const char* apple
[]) {
42 if ( !_dyld_is_memory_immutable(myStr
, 6) ) {
43 FAIL("returned false for string in main executable");
46 if ( _dyld_is_memory_immutable(strdup("hello"), 6) ) {
47 FAIL("returned true for result from strdup()");
50 if ( _dyld_is_memory_immutable(&myInt
, 4) ) {
51 FAIL("returned true for global variabe in main executable");
54 if ( !_dyld_is_memory_immutable(foo(), 4) ) {
55 FAIL("returned false for string in statically linked dylib");
58 if ( !_dyld_is_memory_immutable(stripPointer((void*)&strcpy
), 4) ) {
59 FAIL("returned false for strcpy function in dyld shared cache");
62 if ( _dyld_is_memory_immutable(&_cpu_capabilities
, 4) ) {
63 FAIL("returned true for global variable in shared cache");
66 void* handle
= dlopen(RUN_DIR
"/libbar.dylib", RTLD_FIRST
);
67 if ( handle
== NULL
) {
68 FAIL("dlopen(libbar.dylib) failed"); }
70 BarProc proc
= dlsym(handle
, "bar");
72 FAIL("dlsym(bar) failed");
74 const char* barStr
= (*proc
)();
75 if ( _dyld_is_memory_immutable(barStr
, 4) ) {
76 FAIL("returned true for string in unloadable dylib");