1
2
3#include <stdio.h>  // fprintf(), NULL
4#include <stdlib.h> // exit(), EXIT_SUCCESS
5
6#include "test.h" // PASS(), FAIL(), XPASS(), XFAIL()
7
8// pfoo is in libfoo.dylib
9// libfoo.dylib also has weak foo[]
10// pfoo should be rebound to point into the foo[] in main
11int foo[] = { 5, 6, 7, 8 };
12extern int* pfoo;
13
14// libfoo.dylib has a weak bar[]
15// libbar.dylib has a strong bar[]
16// at build  time linker  only sees weak bar in libfoo.dylib
17// at runtime, dyld uses strong bar in libbar.dylib
18extern int bar[];
19int* pbar = &bar[1];
20
21// there is only one stuff, but it is weak
22// so we are testing the case when stuff is not overridden
23int __attribute__((weak)) stuff[] = { 1, 2, 3, 4, 5 };
24int* pstuff = &stuff[3];
25
26
27void realmain()
28{
29	if ( *pfoo != 7 )
30		FAIL("weak-external-reloc, pfoo=%d", *pfoo);
31	else if ( *pbar != 21 )
32		FAIL("weak-external-reloc, pbar=%d", *pbar);
33	else if ( *pstuff != 4 )
34		FAIL("weak-external-reloc, pstuffr=%d", *pstuff);
35	else
36		PASS("weak-external-reloc");
37}
38
39
40