]>
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 extern char tzname
[]; // a char array in libSystem.dylib
15 #define VERIFY(a,b) assert(a==b)
19 uint8_t* const rebasedPtrs
[] = { NULL
, NULL
, &a
, &a
+1, &a
+16, &a
+1023, NULL
, &a
-1 };
23 VERIFY(rebasedPtrs
[0], NULL
);
24 VERIFY(rebasedPtrs
[1], NULL
);
25 VERIFY(rebasedPtrs
[2], &a
);
26 VERIFY(rebasedPtrs
[3], &a
+1);
27 VERIFY(rebasedPtrs
[4], &a
+16);
28 VERIFY(rebasedPtrs
[5], &a
+1023);
29 VERIFY(rebasedPtrs
[6], NULL
);
30 VERIFY(rebasedPtrs
[7], &a
-1);
34 static char* const bindPtrs
[] = { NULL
, NULL
, tzname
, tzname
+1, &tzname
[16], &tzname
[1023], NULL
, &tzname
[-1], (char*)&malloc
, (char*)&free
};
38 VERIFY(bindPtrs
[0], NULL
);
39 VERIFY(bindPtrs
[1], NULL
);
40 VERIFY(bindPtrs
[2], tzname
);
41 VERIFY(bindPtrs
[3], tzname
+1);
42 VERIFY(bindPtrs
[4], tzname
+16);
43 VERIFY(bindPtrs
[5], tzname
+1023);
44 VERIFY(bindPtrs
[6], NULL
);
45 VERIFY(bindPtrs
[7], tzname
-1);
46 VERIFY(bindPtrs
[8], (char*)&malloc
);
47 VERIFY(bindPtrs
[9], (char*)&free
);
51 #define JUNK ((uint8_t*)0x12345678)
52 uint8_t* const otherPtrs
[] = {
54 // far enough apart to require co-opting a NULL
55 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
,
56 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
,
57 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
,
58 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
,
59 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
,
61 // far enough apart to require co-opting two NULLs
62 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
,
63 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
,
64 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, 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
,
70 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
,
71 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
,
73 // far apart and intermediate values are not co-optable
74 // so a new chain must be used
75 JUNK
, JUNK
, JUNK
, JUNK
, JUNK
, JUNK
, JUNK
, JUNK
,
76 JUNK
, JUNK
, JUNK
, JUNK
, JUNK
, JUNK
, JUNK
, JUNK
,
77 JUNK
, JUNK
, JUNK
, JUNK
, JUNK
, JUNK
, JUNK
, JUNK
,
78 JUNK
, JUNK
, JUNK
, JUNK
, JUNK
, JUNK
, JUNK
, JUNK
,
79 JUNK
, JUNK
, JUNK
, JUNK
, JUNK
, JUNK
, JUNK
, JUNK
,
84 void verifyLongChains()
86 VERIFY(otherPtrs
[0], &a
);
87 VERIFY(otherPtrs
[41], &a
+1);
88 VERIFY(otherPtrs
[122], &a
);
89 VERIFY(otherPtrs
[163], &a
);
90 VERIFY(otherPtrs
[164], &a
);
96 printf("[BEGIN] bind-rebase\n");
104 printf("[PASS] bind-rebase\n");