xref: /freebsd/libexec/rtld-elf/tests/dlopen_hash_test.c (revision 72252591ac01037fa53501adb88f00d5d3cc09ed)
1*72252591SKonstantin Belousov /*-
2*72252591SKonstantin Belousov  * SPDX-License-Identifier: BSD-2-Clause
3*72252591SKonstantin Belousov  *
4*72252591SKonstantin Belousov  * Copyright (c) 2026 Alex S <iwtcex@gmail.com>
5*72252591SKonstantin Belousov  * Copyright 2026 The FreeBSD Foundation
6*72252591SKonstantin Belousov  *
7*72252591SKonstantin Belousov  * Portions of this software were developed by
8*72252591SKonstantin Belousov  * Konstantin Belousov <kib@FreeBSD.org> under sponsorship from
9*72252591SKonstantin Belousov  * the FreeBSD Foundation.
10*72252591SKonstantin Belousov  */
11*72252591SKonstantin Belousov 
12*72252591SKonstantin Belousov #include <atf-c.h>
13*72252591SKonstantin Belousov #include <dlfcn.h>
14*72252591SKonstantin Belousov #include <fcntl.h>
15*72252591SKonstantin Belousov #include <link.h>
16*72252591SKonstantin Belousov #include <stdio.h>
17*72252591SKonstantin Belousov 
18*72252591SKonstantin Belousov ATF_TC_WITHOUT_HEAD(dlopen_hash);
ATF_TC_BODY(dlopen_hash,tc)19*72252591SKonstantin Belousov ATF_TC_BODY(dlopen_hash, tc)
20*72252591SKonstantin Belousov {
21*72252591SKonstantin Belousov 	void *handle;
22*72252591SKonstantin Belousov 	char *pathfds;
23*72252591SKonstantin Belousov 	char *name;
24*72252591SKonstantin Belousov 	int testdir;
25*72252591SKonstantin Belousov 
26*72252591SKonstantin Belousov 	handle = dlopen("libpythagoras.so.0", RTLD_LAZY);
27*72252591SKonstantin Belousov 	ATF_REQUIRE(handle == NULL);
28*72252591SKonstantin Belousov 
29*72252591SKonstantin Belousov 	testdir = open(atf_tc_get_config_var(tc, "srcdir"),
30*72252591SKonstantin Belousov 	    O_RDONLY | O_DIRECTORY);
31*72252591SKonstantin Belousov 	ATF_REQUIRE(testdir >= 0);
32*72252591SKonstantin Belousov 
33*72252591SKonstantin Belousov 	ATF_REQUIRE(asprintf(&pathfds, "%d", testdir) > 0);
34*72252591SKonstantin Belousov 	ATF_REQUIRE(rtld_set_var("LIBRARY_PATH_FDS", pathfds) == 0);
35*72252591SKonstantin Belousov 
36*72252591SKonstantin Belousov 	ATF_REQUIRE(asprintf(&name, "#%d/libpythagoras.so.0", testdir) > 0);
37*72252591SKonstantin Belousov 	handle = dlopen(name,  RTLD_LAZY);
38*72252591SKonstantin Belousov 	ATF_REQUIRE(handle != NULL);
39*72252591SKonstantin Belousov }
40*72252591SKonstantin Belousov 
ATF_TP_ADD_TCS(tp)41*72252591SKonstantin Belousov ATF_TP_ADD_TCS(tp)
42*72252591SKonstantin Belousov {
43*72252591SKonstantin Belousov 	ATF_TP_ADD_TC(tp, dlopen_hash);
44*72252591SKonstantin Belousov 	return atf_no_error();
45*72252591SKonstantin Belousov }
46