#include <dlfcn.h>
#include <err.h>
#include <stdio.h>
void *hidden_check = NULL;
__asm(".hidden hidden_check");
void *libaa_hidden_val = NULL;
void *libab_hidden_val = NULL;
int
main()
{
void *libaa, *libab;
void (*hidden_test)();
libaa = dlopen(LIBAA, RTLD_LAZY);
libab = dlopen(LIBAB, RTLD_LAZY);
if (libaa == NULL)
errx(1, "dlopen(%s, RTLD_LAZY) FAILED", LIBAA);
if (libab == NULL)
errx(1, "dlopen(%s, RTLD_LAZY) FAILED", LIBAB);
hidden_test = (void (*)())dlsym(libaa, "test_aa");
if (hidden_test == NULL)
errx(1, "dlsym(libaa, \"test_aa\") FAILED");
(*hidden_test)();
hidden_test = (void (*)())dlsym(libab, "test_ab");
if (hidden_test == NULL)
errx(1, "dlsym(libab, \"test_ab\") FAILED");
(*hidden_test)();
if (hidden_check != NULL)
errx(1, "hidden_check != NULL in main prog");
if (libaa_hidden_val == NULL || libab_hidden_val == NULL ||
libaa_hidden_val == libab_hidden_val)
errx(1, "incorrect hidden_check detected in libs");
dlclose(libaa);
dlclose(libab);
return (0);
}