1*2ef9079eSKyle Evans /*-
2*2ef9079eSKyle Evans *
3*2ef9079eSKyle Evans * Copyright (C) 2023 NetApp, Inc.
4*2ef9079eSKyle Evans *
5*2ef9079eSKyle Evans * SPDX-License-Identifier: BSD-2-Clause
6*2ef9079eSKyle Evans *
7*2ef9079eSKyle Evans */
8*2ef9079eSKyle Evans
9*2ef9079eSKyle Evans #include <dlfcn.h>
10*2ef9079eSKyle Evans
11*2ef9079eSKyle Evans #include <atf-c.h>
12*2ef9079eSKyle Evans
13*2ef9079eSKyle Evans int get_value(void);
14*2ef9079eSKyle Evans void set_value(int);
15*2ef9079eSKyle Evans
16*2ef9079eSKyle Evans #define APP_VALUE 5
17*2ef9079eSKyle Evans #define LIB_VALUE 20
18*2ef9079eSKyle Evans
19*2ef9079eSKyle Evans ATF_TC_WITHOUT_HEAD(deepbind_simple);
ATF_TC_BODY(deepbind_simple,tc)20*2ef9079eSKyle Evans ATF_TC_BODY(deepbind_simple, tc)
21*2ef9079eSKyle Evans {
22*2ef9079eSKyle Evans void *hdl;
23*2ef9079eSKyle Evans void (*proxy_set_value)(int);
24*2ef9079eSKyle Evans int (*proxy_get_value)(void);
25*2ef9079eSKyle Evans int app_value, lib_value;
26*2ef9079eSKyle Evans
27*2ef9079eSKyle Evans set_value(APP_VALUE);
28*2ef9079eSKyle Evans
29*2ef9079eSKyle Evans /*
30*2ef9079eSKyle Evans * libdeep has a dependency on libval2.so, which is a rebuild of
31*2ef9079eSKyle Evans * libval.so that provides get_value() and set_value() for both us and
32*2ef9079eSKyle Evans * the lib. The lib's get_value() and set_value() should bind to the
33*2ef9079eSKyle Evans * versions in libval2 instead of libval with RTLD_DEEPBIND.
34*2ef9079eSKyle Evans */
35*2ef9079eSKyle Evans hdl = dlopen("$ORIGIN/libdeep.so", RTLD_LAZY | RTLD_DEEPBIND);
36*2ef9079eSKyle Evans ATF_REQUIRE(hdl != NULL);
37*2ef9079eSKyle Evans
38*2ef9079eSKyle Evans proxy_set_value = dlsym(hdl, "proxy_set_value");
39*2ef9079eSKyle Evans ATF_REQUIRE(proxy_set_value != NULL);
40*2ef9079eSKyle Evans
41*2ef9079eSKyle Evans proxy_get_value = dlsym(hdl, "proxy_get_value");
42*2ef9079eSKyle Evans ATF_REQUIRE(proxy_get_value != NULL);
43*2ef9079eSKyle Evans
44*2ef9079eSKyle Evans (*proxy_set_value)(LIB_VALUE);
45*2ef9079eSKyle Evans
46*2ef9079eSKyle Evans lib_value = (*proxy_get_value)();
47*2ef9079eSKyle Evans app_value = get_value();
48*2ef9079eSKyle Evans
49*2ef9079eSKyle Evans /*
50*2ef9079eSKyle Evans * In the initial implementation or if libdeep.so is *not* linked
51*2ef9079eSKyle Evans * against its own libval2, then these both return the later set
52*2ef9079eSKyle Evans * LIB_VALUE (20) as they bind to the symbol provided by libval and
53*2ef9079eSKyle Evans * use its .bss val.
54*2ef9079eSKyle Evans */
55*2ef9079eSKyle Evans ATF_REQUIRE_INTEQ(lib_value, LIB_VALUE);
56*2ef9079eSKyle Evans ATF_REQUIRE_INTEQ(app_value, APP_VALUE);
57*2ef9079eSKyle Evans }
58*2ef9079eSKyle Evans
ATF_TP_ADD_TCS(tp)59*2ef9079eSKyle Evans ATF_TP_ADD_TCS(tp)
60*2ef9079eSKyle Evans {
61*2ef9079eSKyle Evans
62*2ef9079eSKyle Evans ATF_TP_ADD_TC(tp, deepbind_simple);
63*2ef9079eSKyle Evans
64*2ef9079eSKyle Evans return atf_no_error();
65*2ef9079eSKyle Evans }
66