今天找到了这个GL的定义,记录一下,费了一些劲才找到的。(没有想到的是#和define之间还有空格,导致一直搜不到想要的结果。)是在sysdeps/generic/ldsodefs.h文件中。依赖于SHARED和rtld的定义。
#ifndef SHARED
# define EXTERN extern
# define GL(name) _##name
#else
# define EXTERN
# if IS_IN (rtld)
# define GL(name) _rtld_local._##name
# else
# define GL(name) _rtld_global._##name
# endif
从当前RHEL8上的dump,可用看到如下的定义:
(gdb) ptype _rtld_local
type = struct rtld_global {
struct link_namespaces _dl_ns[16];
size_t _dl_nns;
__rtld_lock_recursive_t _dl_load_lock;
__rtld_lock_recursive_t _dl_load_write_lock;
__rtld_lock_recursive_t _dl_load_tls_lock;
unsigned long long _dl_load_adds;
struct link_map *_dl_initfirst;
struct link_map *_dl_profile_map;
unsigned long _dl_num_relocations;
unsigned long _dl_num_cache_relocations;
struct r_search_path_elem *_dl_all_dirs;
struct link_map _dl_rtld_map;
struct auditstate audit_data[16];
void (*_dl_rtld_lock_recursive)(void *);
void (*_dl_rtld_unlock_recursive)(void *);
unsigned int _dl_x86_feature_1;
struct dl_x86_feature_control _dl_x86_feature_control;
int (*_dl_make_stack_executable_hook)(void **);
Elf64_Word _dl_stack_flags;
_Bool _dl_tls_dtv_gaps;
size_t _dl_tls_max_dtv_idx;
struct dtv_slotinfo_list *_dl_tls_dtv_slotinfo_list;
size_t _dl_tls_static_nelem;
size_t _dl_tls_static_size;
size_t _dl_tls_static_used;
size_t _dl_tls_static_align;
size_t _dl_tls_static_optional;
void *_dl_initial_dtv;
size_t _dl_tls_generation;
void (*_dl_init_static_tls)(struct link_map *);
void (*_dl_wait_lookup_done)(void);
struct dl_scope_free_list *_dl_scope_free_list;
}
(gdb) ptyp _rtld_local._dl_rtld_map.l_info
type = struct {
Elf64_Sxword d_tag;
union {
Elf64_Xword d_val;
Elf64_Addr d_ptr;
} d_un;
} *[77]
(gdb) p _rtld_local
$4 = {
_dl_ns = {{
_ns_loaded = 0x0,
_ns_nloaded = 0,
_ns_main_searchlist = 0x0,
GL(dl_load_lock);所以这个的定义就是一个全局结构体里的一个成员。