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// getfoo() is in libfoo.dylib and uses a non-lazy pointer to reference foo 9// libfoo.dylib also has weak foo[] 10// getfoo() should be rebound to point into the foo[] in main 11int foo[] = { 5, 6, 7, 8 }; 12extern int* getfoo(); 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[]; 19 20 21int __attribute__((weak)) stuff[] = { 1, 2, 3, 4, 5 }; 22 23 24void realmain() 25{ 26 if ( getfoo()[2] != 7 ) 27 FAIL("weak-non-lazy, getfoo()[2]=%d", getfoo()[2]); 28 else if ( bar[1] != 21 ) 29 FAIL("weak-non-lazy, bar[1]=%d", bar[1]); 30 else if ( stuff[3] != 4 ) 31 FAIL("weak-external-reloc, pstuffr=%d", stuff[3]); 32 else 33 PASS("weak-non-lazy"); 34} 35 36 37