1/*      $OpenBSD: test1.c,v 1.3 2017/08/07 16:33:52 bluhm Exp $       */
2
3/*
4 * Copyright (c) 2007 Kurt Miller <kurt@openbsd.org>
5 *
6 * Permission to use, copy, modify, and distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18
19#include <dlfcn.h>
20#include <err.h>
21#include <stdio.h>
22
23void *hidden_check = NULL;
24__asm(".hidden hidden_check");
25
26void *libaa_hidden_val = NULL;
27void *libab_hidden_val = NULL;
28
29int
30main()
31{
32	void *libaa, *libab;
33	void (*hidden_test)();
34
35	libaa = dlopen(LIBAA, RTLD_LAZY);
36	libab = dlopen(LIBAB, RTLD_LAZY);
37	if (libaa == NULL)
38               	errx(1, "dlopen(%s, RTLD_LAZY) FAILED\n", LIBAA);
39	if (libab == NULL)
40               	errx(1, "dlopen(%s, RTLD_LAZY) FAILED\n", LIBAB);
41
42       	hidden_test = (void (*)())dlsym(libaa, "test_aa");
43	if (hidden_test == NULL)
44		errx(1, "dlsym(libaa, \"test_aa\") FAILED\n");
45
46	(*hidden_test)();
47
48       	hidden_test = (void (*)())dlsym(libab, "test_ab");
49	if (hidden_test == NULL)
50		errx(1, "dlsym(libab, \"test_ab\") FAILED\n");
51
52	(*hidden_test)();
53
54	if (hidden_check != NULL)
55		errx(1, "hidden_check != NULL in main prog\n");
56
57	if (libaa_hidden_val == NULL || libab_hidden_val == NULL ||
58	    libaa_hidden_val == libab_hidden_val)
59		errx(1, "incorrect hidden_check detected in libs\n");
60
61	dlclose(libaa);
62	dlclose(libab);
63
64	return (0);
65}
66