#include #include /* These numbers need to be coordinated with the offsets passed to make the combined .so. */ int offa = 64; int offb = 128; int offc = 192; int do_test (void) { void *p1 = __google_dlopen_with_offset ("$ORIGIN/tst-dlopen-offset-comb.so", offa * 1024, RTLD_LAZY); if (!p1) { puts (dlerror ()); return 1; } int (*f) (void) = dlsym (p1, "foo"); if (f) { (*f)(); } else { puts (dlerror ()); return 1; } void *p2 = __google_dlopen_with_offset ("$ORIGIN/tst-dlopen-offset-comb.so", offb * 1024, RTLD_LAZY); int (*bar) (void) = dlsym (p2, "bar"); if (bar) { (*bar)(); } else { puts (dlerror ()); return 1; } void *p3 = __google_dlopen_with_offset ("$ORIGIN/tst-dlopen-offset-comb.so", offc * 1024, RTLD_LAZY); int (*xyzzy) (void) = dlsym (p3, "xyzzy"); if (xyzzy) { (*xyzzy)(); } else { puts (dlerror ()); return 1; } if (p1) dlclose (p1); p1 = __google_dlopen_with_offset ("$ORIGIN/tst-dlopen-offset-comb.so", offa * 1024, RTLD_LAZY); f = dlsym (p1, "someothersym"); if (!f) { puts (dlerror ()); puts (" (expected)"); } else { puts ("Symbol found unexpectedly"); return 1; } f = dlsym (p1, "xyzzy"); if (!f) { puts (dlerror ()); puts (" (expected)"); } else { puts ("Symbol found unexpectedly"); return 1; } p1 = __google_dlopen_with_offset ("$ORIGIN/tst-dlopen-offset-comb.so", offa * 1024, RTLD_LAZY); f = dlsym (p1, "foo"); if (f) { (*f)(); } else { puts (dlerror ()); return 1; } void *px = __google_dlopen_with_offset ("$ORIGIN/tst-dlopen-offset-comb.so", 0, RTLD_LAZY); if (!px) { puts (dlerror ()); puts (" (expected)"); } else { puts ("dlopen_with_offset succeeded unexpectedly"); return 1; } px = __google_dlopen_with_offset ("$ORIGIN/tst-dlopen-offset-mod1.so", 0, RTLD_LAZY); f = dlsym (px, "foo"); if (f) { (*f)(); } else { puts (dlerror ()); return 1; } px = __google_dlopen_with_offset ("$ORIGIN/nonexistent.so", 0, RTLD_LAZY); if (!px) { puts (dlerror ()); puts (" (expected)"); } else { puts ("dlopen_with_offset succeeded unexpectedly"); return 1; } return 0; } #define TIMEOUT 100 #define TEST_FUNCTION do_test () #include "../test-skeleton.c"