xref: /aosp_15_r20/external/libepoxy/test/dlwrap.h (revision 706d0b42ae4182339789e08d473a0b312ecdc60f)
1*706d0b42SXin Li /* Copyright © 2013, Intel Corporation
2*706d0b42SXin Li  *
3*706d0b42SXin Li  * Permission is hereby granted, free of charge, to any person obtaining a copy
4*706d0b42SXin Li  * of this software and associated documentation files (the "Software"), to deal
5*706d0b42SXin Li  * in the Software without restriction, including without limitation the rights
6*706d0b42SXin Li  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7*706d0b42SXin Li  * copies of the Software, and to permit persons to whom the Software is
8*706d0b42SXin Li  * furnished to do so, subject to the following conditions:
9*706d0b42SXin Li  *
10*706d0b42SXin Li  * The above copyright notice and this permission notice shall be included in
11*706d0b42SXin Li  * all copies or substantial portions of the Software.
12*706d0b42SXin Li  *
13*706d0b42SXin Li  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14*706d0b42SXin Li  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15*706d0b42SXin Li  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16*706d0b42SXin Li  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17*706d0b42SXin Li  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18*706d0b42SXin Li  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19*706d0b42SXin Li  * THE SOFTWARE.
20*706d0b42SXin Li  */
21*706d0b42SXin Li 
22*706d0b42SXin Li #ifndef DLWRAP_H
23*706d0b42SXin Li #define DLWRAP_H
24*706d0b42SXin Li 
25*706d0b42SXin Li #define _GNU_SOURCE
26*706d0b42SXin Li #include <dlfcn.h>
27*706d0b42SXin Li 
28*706d0b42SXin Li /* Call the *real* dlopen. We have our own wrapper for dlopen that, of
29*706d0b42SXin Li  * necessity must use claim the symbol 'dlopen'. So whenever anything
30*706d0b42SXin Li  * internal needs to call the real, underlying dlopen function, the
31*706d0b42SXin Li  * thing to call is dlwrap_real_dlopen.
32*706d0b42SXin Li  */
33*706d0b42SXin Li void *
34*706d0b42SXin Li dlwrap_real_dlopen(const char *filename, int flag);
35*706d0b42SXin Li 
36*706d0b42SXin Li /* Perform a dlopen on the libfips library itself.
37*706d0b42SXin Li  *
38*706d0b42SXin Li  * Many places in fips need to lookup symbols within the libfips
39*706d0b42SXin Li  * library itself, (and not in any other library). This function
40*706d0b42SXin Li  * provides a reliable way to get a handle for performing such
41*706d0b42SXin Li  * lookups.
42*706d0b42SXin Li  *
43*706d0b42SXin Li  * The returned handle can be passed to dlwrap_real_dlsym for the
44*706d0b42SXin Li  * lookups. */
45*706d0b42SXin Li void *
46*706d0b42SXin Li dlwrap_dlopen_libfips(void);
47*706d0b42SXin Li 
48*706d0b42SXin Li /* Call the *real* dlsym. We have our own wrapper for dlsym that, of
49*706d0b42SXin Li  * necessity must use claim the symbol 'dlsym'. So whenever anything
50*706d0b42SXin Li  * internal needs to call the real, underlying dlysm function, the
51*706d0b42SXin Li  * thing to call is dlwrap_real_dlsym.
52*706d0b42SXin Li  */
53*706d0b42SXin Li void *
54*706d0b42SXin Li dlwrap_real_dlsym(void *handle, const char *symbol);
55*706d0b42SXin Li 
56*706d0b42SXin Li #define DEFER_TO_GL(library, func, name, args)                          \
57*706d0b42SXin Li ({                                                                      \
58*706d0b42SXin Li     void *lib = dlwrap_real_dlopen(library, RTLD_LAZY | RTLD_LOCAL);    \
59*706d0b42SXin Li     typeof(&func) real_func = dlwrap_real_dlsym(lib, name);             \
60*706d0b42SXin Li     /* gcc extension -- func's return value is the return value of      \
61*706d0b42SXin Li      * the statement.                                                   \
62*706d0b42SXin Li      */                                                                 \
63*706d0b42SXin Li     real_func args;                                                     \
64*706d0b42SXin Li })
65*706d0b42SXin Li 
66*706d0b42SXin Li #endif
67*706d0b42SXin Li 
68