]>
git.saurik.com Git - apple/dyld.git/blob - testing/test-cases/bind-rebase.dtest/main.c
2 // BUILD: $CC main.c -Wl,-fixup_chains -o $BUILD_DIR/bind-rebase.exe
4 // RUN: ./bind-rebase.exe
12 #include "test_support.h"
14 extern char tzname
[]; // a char array in libSystem.dylib
17 #define VERIFY(a,b) assert(a==(b))
21 uint8_t* const rebasedPtrs
[] = { NULL
, NULL
, &a
, &a
+1, &a
+16, &a
+1023, NULL
, &a
-1 };
24 uint8_t* const tbiPointers
[] = { &a
+0x8000000000000000, &a
, &a
+0x9000000000000000 };
29 VERIFY(rebasedPtrs
[0], NULL
);
30 VERIFY(rebasedPtrs
[1], NULL
);
31 VERIFY(rebasedPtrs
[2], &a
);
32 VERIFY(rebasedPtrs
[3], &a
+1);
33 VERIFY(rebasedPtrs
[4], &a
+16);
34 VERIFY(rebasedPtrs
[5], &a
+1023);
35 VERIFY(rebasedPtrs
[6], NULL
);
36 VERIFY(rebasedPtrs
[7], &a
-1);
38 VERIFY(tbiPointers
[0], &a
+ 0x8000000000000000);
39 VERIFY(tbiPointers
[2], &a
+ 0x9000000000000000);
44 static char* const bindPtrs
[] = { NULL
, NULL
, tzname
, tzname
+1, &tzname
[16], &tzname
[1023], NULL
, &tzname
[-1], (char*)&malloc
, (char*)&free
};
48 VERIFY(bindPtrs
[0], NULL
);
49 VERIFY(bindPtrs
[1], NULL
);
50 VERIFY(bindPtrs
[2], tzname
);
51 VERIFY(bindPtrs
[3], tzname
+1);
52 VERIFY(bindPtrs
[4], tzname
+16);
53 VERIFY(bindPtrs
[5], tzname
+1023);
54 VERIFY(bindPtrs
[6], NULL
);
55 VERIFY(bindPtrs
[7], tzname
-1);
56 VERIFY(bindPtrs
[8], (char*)&malloc
);
57 VERIFY(bindPtrs
[9], (char*)&free
);
61 #define JUNK ((uint8_t*)0x12345678)
62 uint8_t* const otherPtrs
[] = {
64 // far enough apart to require co-opting a NULL
65 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
,
66 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
,
67 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
,
68 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
,
69 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
,
71 // far enough apart to require co-opting two NULLs
72 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
,
73 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
,
74 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
,
75 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
,
76 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
,
77 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
,
78 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
,
79 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
,
80 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
,
81 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
,
83 // far apart and intermediate values are not co-optable
84 // so a new chain must be used
85 JUNK
, JUNK
, JUNK
, JUNK
, JUNK
, JUNK
, JUNK
, JUNK
,
86 JUNK
, JUNK
, JUNK
, JUNK
, JUNK
, JUNK
, JUNK
, JUNK
,
87 JUNK
, JUNK
, JUNK
, JUNK
, JUNK
, JUNK
, JUNK
, JUNK
,
88 JUNK
, JUNK
, JUNK
, JUNK
, JUNK
, JUNK
, JUNK
, JUNK
,
89 JUNK
, JUNK
, JUNK
, JUNK
, JUNK
, JUNK
, JUNK
, JUNK
,
94 void verifyLongChains()
96 VERIFY(otherPtrs
[0], &a
);
97 VERIFY(otherPtrs
[41], &a
+1);
98 VERIFY(otherPtrs
[122], &a
);
99 VERIFY(otherPtrs
[163], &a
);
100 VERIFY(otherPtrs
[164], &a
);
104 int main(int argc
, const char* argv
[], const char* envp
[], const char* apple
[]) {