blob: 777e7b8b0837ef1f93194b615f4b1d6552a73f2f [file] [log] [blame]
Dimitry Ivanov48ec2882016-08-04 11:50:36 -07001/*
2 * Copyright (C) 2016 The Android Open Source Project
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in
12 * the documentation and/or other materials provided with the
13 * distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
18 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
19 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
20 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
21 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
22 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
23 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
25 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE.
27 */
28
Elliott Hughescbc80ba2018-02-13 14:26:29 -080029#pragma once
Dimitry Ivanov48ec2882016-08-04 11:50:36 -070030
Elliott Hughesc14f5452025-01-30 13:33:04 -080031#include "linker_debug.h"
32
Dimitry Ivanov48ec2882016-08-04 11:50:36 -070033#include <link.h>
34#include <stddef.h>
35
dimitry8db36a52017-10-23 15:10:10 +020036#include <string>
Dimitry Ivanov48ec2882016-08-04 11:50:36 -070037#include <unordered_map>
38
Christopher Ferris7a3681e2017-04-24 17:48:32 -070039#include <async_safe/log.h>
Dimitry Ivanovd3a07e82017-04-11 15:22:49 -070040
Dimitry Ivanov48ec2882016-08-04 11:50:36 -070041#define DL_ERR(fmt, x...) \
42 do { \
Christopher Ferris7a3681e2017-04-24 17:48:32 -070043 async_safe_format_buffer(linker_get_error_buffer(), linker_get_error_buffer_size(), fmt, ##x); \
Dimitry Ivanov48ec2882016-08-04 11:50:36 -070044 } while (false)
45
46#define DL_WARN(fmt, x...) \
47 do { \
Christopher Ferris7a3681e2017-04-24 17:48:32 -070048 async_safe_format_log(ANDROID_LOG_WARN, "linker", fmt, ##x); \
49 async_safe_format_fd(2, "WARNING: linker: "); \
50 async_safe_format_fd(2, fmt, ##x); \
51 async_safe_format_fd(2, "\n"); \
Dimitry Ivanov48ec2882016-08-04 11:50:36 -070052 } while (false)
53
Elliott Hughes3b6a13f2025-01-31 10:05:28 -080054bool DL_ERROR_AFTER(int target_sdk_version, const char* fmt, ...) __printflike(2, 3);
Elliott Hughes9076b0c2018-02-28 11:29:45 -080055
Dimitry Ivanovbd906752016-08-08 17:12:18 -070056#define DL_ERR_AND_LOG(fmt, x...) \
57 do { \
Martin Stjernholm9fe38262019-08-27 17:08:45 +010058 DL_ERR(fmt, ##x); \
Elliott Hughesf08d0eb2024-09-03 17:31:29 -040059 __linker_log(ANDROID_LOG_ERROR, fmt, ##x); \
Martin Stjernholm9fe38262019-08-27 17:08:45 +010060 } while (false)
61
62#define DL_OPEN_ERR(fmt, x...) \
63 do { \
64 DL_ERR(fmt, ##x); \
65 LD_LOG(kLogDlopen, fmt, ##x); \
66 } while (false)
67
68#define DL_SYM_ERR(fmt, x...) \
69 do { \
70 DL_ERR(fmt, ##x); \
71 LD_LOG(kLogDlsym, fmt, ##x); \
Dimitry Ivanovbd906752016-08-08 17:12:18 -070072 } while (false)
73
Dimitry Ivanov48ec2882016-08-04 11:50:36 -070074constexpr ElfW(Versym) kVersymNotNeeded = 0;
75constexpr ElfW(Versym) kVersymGlobal = 1;
76
77// These values are used to call constructors for .init_array && .preinit_array
78extern int g_argc;
79extern char** g_argv;
80extern char** g_envp;
81
82struct soinfo;
83struct android_namespace_t;
Tamas Petz8d55d182020-02-24 14:15:25 +010084struct platform_properties;
Dimitry Ivanov48ec2882016-08-04 11:50:36 -070085
86extern android_namespace_t g_default_namespace;
87
88extern std::unordered_map<uintptr_t, soinfo*> g_soinfo_handles_map;
89
Tamas Petz8d55d182020-02-24 14:15:25 +010090extern platform_properties g_platform_properties;
91
Dimitry Ivanov48ec2882016-08-04 11:50:36 -070092// Error buffer "variable"
93char* linker_get_error_buffer();
94size_t linker_get_error_buffer_size();
95
dimitry8db36a52017-10-23 15:10:10 +020096class DlErrorRestorer {
97 public:
98 DlErrorRestorer() {
99 saved_error_msg_ = linker_get_error_buffer();
100 }
101 ~DlErrorRestorer() {
102 strlcpy(linker_get_error_buffer(), saved_error_msg_.c_str(), linker_get_error_buffer_size());
103 }
104 private:
105 std::string saved_error_msg_;
106};
Elliott Hughes90f96b92019-05-09 15:56:39 -0700107
108__LIBC_HIDDEN__ extern bool g_is_ldd;
Ryan Prichard9a027c72023-07-21 23:04:50 -0700109__LIBC_HIDDEN__ extern pthread_mutex_t g_dl_mutex;