xref: /aosp_15_r20/bionic/linker/linker_globals.h (revision 8d67ca893c1523eb926b9080dbe4e2ffd2a27ba1)
1*8d67ca89SAndroid Build Coastguard Worker /*
2*8d67ca89SAndroid Build Coastguard Worker  * Copyright (C) 2016 The Android Open Source Project
3*8d67ca89SAndroid Build Coastguard Worker  * All rights reserved.
4*8d67ca89SAndroid Build Coastguard Worker  *
5*8d67ca89SAndroid Build Coastguard Worker  * Redistribution and use in source and binary forms, with or without
6*8d67ca89SAndroid Build Coastguard Worker  * modification, are permitted provided that the following conditions
7*8d67ca89SAndroid Build Coastguard Worker  * are met:
8*8d67ca89SAndroid Build Coastguard Worker  *  * Redistributions of source code must retain the above copyright
9*8d67ca89SAndroid Build Coastguard Worker  *    notice, this list of conditions and the following disclaimer.
10*8d67ca89SAndroid Build Coastguard Worker  *  * Redistributions in binary form must reproduce the above copyright
11*8d67ca89SAndroid Build Coastguard Worker  *    notice, this list of conditions and the following disclaimer in
12*8d67ca89SAndroid Build Coastguard Worker  *    the documentation and/or other materials provided with the
13*8d67ca89SAndroid Build Coastguard Worker  *    distribution.
14*8d67ca89SAndroid Build Coastguard Worker  *
15*8d67ca89SAndroid Build Coastguard Worker  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16*8d67ca89SAndroid Build Coastguard Worker  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17*8d67ca89SAndroid Build Coastguard Worker  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
18*8d67ca89SAndroid Build Coastguard Worker  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
19*8d67ca89SAndroid Build Coastguard Worker  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
20*8d67ca89SAndroid Build Coastguard Worker  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
21*8d67ca89SAndroid Build Coastguard Worker  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
22*8d67ca89SAndroid Build Coastguard Worker  * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
23*8d67ca89SAndroid Build Coastguard Worker  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24*8d67ca89SAndroid Build Coastguard Worker  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
25*8d67ca89SAndroid Build Coastguard Worker  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26*8d67ca89SAndroid Build Coastguard Worker  * SUCH DAMAGE.
27*8d67ca89SAndroid Build Coastguard Worker  */
28*8d67ca89SAndroid Build Coastguard Worker 
29*8d67ca89SAndroid Build Coastguard Worker #pragma once
30*8d67ca89SAndroid Build Coastguard Worker 
31*8d67ca89SAndroid Build Coastguard Worker #include <link.h>
32*8d67ca89SAndroid Build Coastguard Worker #include <stddef.h>
33*8d67ca89SAndroid Build Coastguard Worker 
34*8d67ca89SAndroid Build Coastguard Worker #include <string>
35*8d67ca89SAndroid Build Coastguard Worker #include <unordered_map>
36*8d67ca89SAndroid Build Coastguard Worker 
37*8d67ca89SAndroid Build Coastguard Worker #include <async_safe/log.h>
38*8d67ca89SAndroid Build Coastguard Worker 
39*8d67ca89SAndroid Build Coastguard Worker #define DL_ERR(fmt, x...) \
40*8d67ca89SAndroid Build Coastguard Worker     do { \
41*8d67ca89SAndroid Build Coastguard Worker       async_safe_format_buffer(linker_get_error_buffer(), linker_get_error_buffer_size(), fmt, ##x); \
42*8d67ca89SAndroid Build Coastguard Worker     } while (false)
43*8d67ca89SAndroid Build Coastguard Worker 
44*8d67ca89SAndroid Build Coastguard Worker #define DL_WARN(fmt, x...) \
45*8d67ca89SAndroid Build Coastguard Worker     do { \
46*8d67ca89SAndroid Build Coastguard Worker       async_safe_format_log(ANDROID_LOG_WARN, "linker", fmt, ##x); \
47*8d67ca89SAndroid Build Coastguard Worker       async_safe_format_fd(2, "WARNING: linker: "); \
48*8d67ca89SAndroid Build Coastguard Worker       async_safe_format_fd(2, fmt, ##x); \
49*8d67ca89SAndroid Build Coastguard Worker       async_safe_format_fd(2, "\n"); \
50*8d67ca89SAndroid Build Coastguard Worker     } while (false)
51*8d67ca89SAndroid Build Coastguard Worker 
52*8d67ca89SAndroid Build Coastguard Worker void DL_WARN_documented_change(int api_level, const char* doc_link, const char* fmt, ...);
53*8d67ca89SAndroid Build Coastguard Worker 
54*8d67ca89SAndroid Build Coastguard Worker #define DL_ERR_AND_LOG(fmt, x...) \
55*8d67ca89SAndroid Build Coastguard Worker   do { \
56*8d67ca89SAndroid Build Coastguard Worker     DL_ERR(fmt, ##x); \
57*8d67ca89SAndroid Build Coastguard Worker     __linker_log(ANDROID_LOG_ERROR, fmt, ##x); \
58*8d67ca89SAndroid Build Coastguard Worker   } while (false)
59*8d67ca89SAndroid Build Coastguard Worker 
60*8d67ca89SAndroid Build Coastguard Worker #define DL_OPEN_ERR(fmt, x...) \
61*8d67ca89SAndroid Build Coastguard Worker   do { \
62*8d67ca89SAndroid Build Coastguard Worker     DL_ERR(fmt, ##x); \
63*8d67ca89SAndroid Build Coastguard Worker     LD_LOG(kLogDlopen, fmt, ##x); \
64*8d67ca89SAndroid Build Coastguard Worker   } while (false)
65*8d67ca89SAndroid Build Coastguard Worker 
66*8d67ca89SAndroid Build Coastguard Worker #define DL_SYM_ERR(fmt, x...) \
67*8d67ca89SAndroid Build Coastguard Worker   do { \
68*8d67ca89SAndroid Build Coastguard Worker     DL_ERR(fmt, ##x); \
69*8d67ca89SAndroid Build Coastguard Worker     LD_LOG(kLogDlsym, fmt, ##x); \
70*8d67ca89SAndroid Build Coastguard Worker   } while (false)
71*8d67ca89SAndroid Build Coastguard Worker 
72*8d67ca89SAndroid Build Coastguard Worker constexpr ElfW(Versym) kVersymNotNeeded = 0;
73*8d67ca89SAndroid Build Coastguard Worker constexpr ElfW(Versym) kVersymGlobal = 1;
74*8d67ca89SAndroid Build Coastguard Worker 
75*8d67ca89SAndroid Build Coastguard Worker // These values are used to call constructors for .init_array && .preinit_array
76*8d67ca89SAndroid Build Coastguard Worker extern int g_argc;
77*8d67ca89SAndroid Build Coastguard Worker extern char** g_argv;
78*8d67ca89SAndroid Build Coastguard Worker extern char** g_envp;
79*8d67ca89SAndroid Build Coastguard Worker 
80*8d67ca89SAndroid Build Coastguard Worker struct soinfo;
81*8d67ca89SAndroid Build Coastguard Worker struct android_namespace_t;
82*8d67ca89SAndroid Build Coastguard Worker struct platform_properties;
83*8d67ca89SAndroid Build Coastguard Worker 
84*8d67ca89SAndroid Build Coastguard Worker extern android_namespace_t g_default_namespace;
85*8d67ca89SAndroid Build Coastguard Worker 
86*8d67ca89SAndroid Build Coastguard Worker extern std::unordered_map<uintptr_t, soinfo*> g_soinfo_handles_map;
87*8d67ca89SAndroid Build Coastguard Worker 
88*8d67ca89SAndroid Build Coastguard Worker extern platform_properties g_platform_properties;
89*8d67ca89SAndroid Build Coastguard Worker 
90*8d67ca89SAndroid Build Coastguard Worker // Error buffer "variable"
91*8d67ca89SAndroid Build Coastguard Worker char* linker_get_error_buffer();
92*8d67ca89SAndroid Build Coastguard Worker size_t linker_get_error_buffer_size();
93*8d67ca89SAndroid Build Coastguard Worker 
94*8d67ca89SAndroid Build Coastguard Worker class DlErrorRestorer {
95*8d67ca89SAndroid Build Coastguard Worker  public:
DlErrorRestorer()96*8d67ca89SAndroid Build Coastguard Worker   DlErrorRestorer() {
97*8d67ca89SAndroid Build Coastguard Worker     saved_error_msg_ = linker_get_error_buffer();
98*8d67ca89SAndroid Build Coastguard Worker   }
~DlErrorRestorer()99*8d67ca89SAndroid Build Coastguard Worker   ~DlErrorRestorer() {
100*8d67ca89SAndroid Build Coastguard Worker     strlcpy(linker_get_error_buffer(), saved_error_msg_.c_str(), linker_get_error_buffer_size());
101*8d67ca89SAndroid Build Coastguard Worker   }
102*8d67ca89SAndroid Build Coastguard Worker  private:
103*8d67ca89SAndroid Build Coastguard Worker   std::string saved_error_msg_;
104*8d67ca89SAndroid Build Coastguard Worker };
105*8d67ca89SAndroid Build Coastguard Worker 
106*8d67ca89SAndroid Build Coastguard Worker __LIBC_HIDDEN__ extern bool g_is_ldd;
107*8d67ca89SAndroid Build Coastguard Worker __LIBC_HIDDEN__ extern pthread_mutex_t g_dl_mutex;
108