1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173
|
/*
* libpulp - User-space Livepatching Library
*
* Copyright (C) 2022 SUSE Software Solutions GmbH
*
* This file is part of libpulp.
*
* libpulp is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* libpulp is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with libpulp. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef _LD_RTLD
#define _LD_RTLD
#include <dlfcn.h>
#include <elf.h>
#include <link.h>
#include <pthread.h>
#if __GLIBC__ == 2 && __GLIBC_MINOR__ < 35
struct r_debug_extended
{
struct r_debug base;
struct r_debug_extended *r_next;
};
#endif
typedef struct
{
pthread_mutex_t mutex;
} __rtld_lock_recursive_t;
#define __rtld_lock_define_recursive(CLASS, NAME) \
CLASS __rtld_lock_recursive_t NAME;
#define DL_NNS 16
#define EXTERN
/* clang-format off */
/**
* Incomplete declaration of rtld_global, taken out from glibc's
* sysdeps/generic/ldsodefs.h. We just need the first part of it to reach the
* '_dl_load_lock'.
*
* Extracted from glibc 2.31
*
*/
struct rtld_global__2_31
{
struct
{
struct link_map *_ns_loaded;
unsigned int _ns_nloaded;
struct r_scope_elem *_ns_main_searchlist;
unsigned int _ns_global_scope_alloc;
unsigned int _ns_global_scope_pending_adds;
struct
{
__rtld_lock_define_recursive(, lock) struct
{
uint32_t hashval;
const char *name;
const ElfW(Sym) * sym;
const struct link_map *map;
} * entries;
size_t size;
size_t n_elements;
void (*free)(void *);
} _ns_unique_sym_table;
struct r_debug _ns_debug;
} _dl_ns[DL_NNS];
size_t _dl_nns;
__rtld_lock_define_recursive(EXTERN, _dl_load_lock)
__rtld_lock_define_recursive(EXTERN, _dl_load_write_lock)
unsigned long long _dl_load_adds;
};
/**
* Incomplete declaration of rtld_global, taken out from glibc's
* sysdeps/generic/ldsodefs.h. We just need the first part of it to reach the
* '_dl_load_lock'.
*
* Extracted from glibc 2.35.
*
*/
struct rtld_global__2_35
{
struct
{
struct link_map *_ns_loaded;
unsigned int _ns_nloaded;
struct r_scope_elem *_ns_main_searchlist;
unsigned int _ns_global_scope_alloc;
unsigned int _ns_global_scope_pending_adds;
struct link_map *libc_map;
struct
{
__rtld_lock_define_recursive (, lock)
struct
{
uint32_t hashval;
const char *name;
const ElfW(Sym) *sym;
const struct link_map *map;
} *entries;
size_t size;
size_t n_elements;
void (*free) (void *);
} _ns_unique_sym_table;
struct r_debug_extended _ns_debug;
} _dl_ns[DL_NNS];
size_t _dl_nns;
__rtld_lock_define_recursive (EXTERN, _dl_load_lock)
__rtld_lock_define_recursive (EXTERN, _dl_load_write_lock)
__rtld_lock_define_recursive (EXTERN, _dl_load_tls_lock)
};
/**
* Incomplete declaration of rtld_global, taken out from glibc's
* sysdeps/generic/ldsodefs.h. We just need the first part of it to reach the
* '_dl_load_lock'.
*
* Extracted from glibc 2.42.
*
*/
struct rtld_global__2_42
{
struct
{
struct link_map *_ns_loaded;
unsigned int _ns_nloaded;
struct r_scope_elem *_ns_main_searchlist;
unsigned int _ns_global_scope_alloc;
unsigned int _ns_global_scope_pending_adds;
struct link_map *libc_map;
struct
{
__rtld_lock_define_recursive (, lock)
struct
{
uint32_t hashval;
const char *name;
const ElfW(Sym) *sym;
const struct link_map *map;
} *entries;
size_t size;
size_t n_elements;
void (*free) (void *);
} _ns_unique_sym_table;
} _dl_ns[DL_NNS];
size_t _dl_nns;
__rtld_lock_define_recursive (EXTERN, _dl_load_lock)
__rtld_lock_define_recursive (EXTERN, _dl_load_write_lock)
__rtld_lock_define_recursive (EXTERN, _dl_load_tls_lock)
};
/* clang-format on */
#undef DL_NNS
#undef EXTERN
#endif
|