tree-wide: switch dlopen hooks over to DLSYM_PROTOTYPE()/DLSYM_FUNCTION()

We have these pretty macros, let's use them everywhere (so far we mostly
used them for newer additions only).

This PR is mostly an excercise in "perl -p -i -e", but there are some
special cases:

* idn-util.c exposes a function whose prototype in the official library
  headers is marked with the "const" attribute, and this apparently does
  not propagate along typeof() correctly and then
  __builtin_types_compatible_p() fails later because it detects that
  prototype and original function don't match in prototype.

* libbpf removed some symbols in newer versions, hence we need to define
  some prototypes manually to still be able to build.

* libcryptsetup marked a symbol as deprecated we want to use (knowing it
  is deprecated). By using the macros this is detected by the compiler.
  We work around it via the usual warning off macros.

Note by using these macros we assume that all symbols are known during
build time. Which might not be the case. We might need to revert this
commit for some symbols if this trips up builds on older distros.
This commit is contained in:
Lennart Poettering
2024-03-01 15:51:24 +00:00
committed by Luca Boccassi
parent 96069e57a0
commit 9dbabd0a8b
21 changed files with 427 additions and 427 deletions
+41 -41
View File
@@ -38,51 +38,51 @@ static void *dw_dl = NULL;
static void *elf_dl = NULL;
/* libdw symbols */
Dwarf_Attribute *(*sym_dwarf_attr_integrate)(Dwarf_Die *, unsigned int, Dwarf_Attribute *);
const char *(*sym_dwarf_diename)(Dwarf_Die *);
const char *(*sym_dwarf_formstring)(Dwarf_Attribute *);
int (*sym_dwarf_getscopes)(Dwarf_Die *, Dwarf_Addr, Dwarf_Die **);
int (*sym_dwarf_getscopes_die)(Dwarf_Die *, Dwarf_Die **);
Elf *(*sym_dwelf_elf_begin)(int);
static DLSYM_FUNCTION(dwarf_attr_integrate);
static DLSYM_FUNCTION(dwarf_diename);
static DLSYM_FUNCTION(dwarf_formstring);
static DLSYM_FUNCTION(dwarf_getscopes);
static DLSYM_FUNCTION(dwarf_getscopes_die);
static DLSYM_FUNCTION(dwelf_elf_begin);
#if HAVE_DWELF_ELF_E_MACHINE_STRING
const char *(*sym_dwelf_elf_e_machine_string)(int);
static DLSYM_FUNCTION(dwelf_elf_e_machine_string);
#endif
ssize_t (*sym_dwelf_elf_gnu_build_id)(Elf *, const void **);
int (*sym_dwarf_tag)(Dwarf_Die *);
Dwfl_Module *(*sym_dwfl_addrmodule)(Dwfl *, Dwarf_Addr);
Dwfl *(*sym_dwfl_begin)(const Dwfl_Callbacks *);
int (*sym_dwfl_build_id_find_elf)(Dwfl_Module *, void **, const char *, Dwarf_Addr, char **, Elf **);
int (*sym_dwfl_core_file_attach)(Dwfl *, Elf *);
int (*sym_dwfl_core_file_report)(Dwfl *, Elf *, const char *);
void (*sym_dwfl_end)(Dwfl *);
const char *(*sym_dwfl_errmsg)(int);
int (*sym_dwfl_errno)(void);
bool (*sym_dwfl_frame_pc)(Dwfl_Frame *, Dwarf_Addr *, bool *);
ptrdiff_t (*sym_dwfl_getmodules)(Dwfl *, int (*)(Dwfl_Module *, void **, const char *, Dwarf_Addr, void *), void *, ptrdiff_t);
int (*sym_dwfl_getthreads)(Dwfl *, int (*)(Dwfl_Thread *, void *), void *);
Dwarf_Die *(*sym_dwfl_module_addrdie)(Dwfl_Module *, Dwarf_Addr, Dwarf_Addr *);
const char *(*sym_dwfl_module_addrname)(Dwfl_Module *, GElf_Addr);
int (*sym_dwfl_module_build_id)(Dwfl_Module *, const unsigned char **, GElf_Addr *);
Elf *(*sym_dwfl_module_getelf)(Dwfl_Module *, GElf_Addr *);
const char *(*sym_dwfl_module_info)(Dwfl_Module *, void ***, Dwarf_Addr *, Dwarf_Addr *, Dwarf_Addr *, Dwarf_Addr *, const char **, const char **);
int (*sym_dwfl_offline_section_address)(Dwfl_Module *, void **, const char *, Dwarf_Addr, const char *, GElf_Word, const GElf_Shdr *, Dwarf_Addr *);
int (*sym_dwfl_report_end)(Dwfl *, int (*)(Dwfl_Module *, void *, const char *, Dwarf_Addr, void *), void *);
int (*sym_dwfl_standard_find_debuginfo)(Dwfl_Module *, void **, const char *, Dwarf_Addr, const char *, const char *, GElf_Word, char **);
int (*sym_dwfl_thread_getframes)(Dwfl_Thread *, int (*)(Dwfl_Frame *, void *), void *);
pid_t (*sym_dwfl_thread_tid)(Dwfl_Thread *);
static DLSYM_FUNCTION(dwelf_elf_gnu_build_id);
static DLSYM_FUNCTION(dwarf_tag);
static DLSYM_FUNCTION(dwfl_addrmodule);
static DLSYM_FUNCTION(dwfl_begin);
static DLSYM_FUNCTION(dwfl_build_id_find_elf);
static DLSYM_FUNCTION(dwfl_core_file_attach);
static DLSYM_FUNCTION(dwfl_core_file_report);
static DLSYM_FUNCTION(dwfl_end);
static DLSYM_FUNCTION(dwfl_errmsg);
static DLSYM_FUNCTION(dwfl_errno);
static DLSYM_FUNCTION(dwfl_frame_pc);
static DLSYM_FUNCTION(dwfl_getmodules);
static DLSYM_FUNCTION(dwfl_getthreads);
static DLSYM_FUNCTION(dwfl_module_addrdie);
static DLSYM_FUNCTION(dwfl_module_addrname);
static DLSYM_FUNCTION(dwfl_module_build_id);
static DLSYM_FUNCTION(dwfl_module_getelf);
static DLSYM_FUNCTION(dwfl_module_info);
static DLSYM_FUNCTION(dwfl_offline_section_address);
static DLSYM_FUNCTION(dwfl_report_end);
static DLSYM_FUNCTION(dwfl_standard_find_debuginfo);
static DLSYM_FUNCTION(dwfl_thread_getframes);
static DLSYM_FUNCTION(dwfl_thread_tid);
/* libelf symbols */
Elf *(*sym_elf_begin)(int, Elf_Cmd, Elf *);
int (*sym_elf_end)(Elf *);
Elf_Data *(*sym_elf_getdata_rawchunk)(Elf *, int64_t, size_t, Elf_Type);
GElf_Ehdr *(*sym_gelf_getehdr)(Elf *, GElf_Ehdr *);
int (*sym_elf_getphdrnum)(Elf *, size_t *);
const char *(*sym_elf_errmsg)(int);
int (*sym_elf_errno)(void);
Elf *(*sym_elf_memory)(char *, size_t);
unsigned int (*sym_elf_version)(unsigned int);
GElf_Phdr *(*sym_gelf_getphdr)(Elf *, int, GElf_Phdr *);
size_t (*sym_gelf_getnote)(Elf_Data *, size_t, GElf_Nhdr *, size_t *, size_t *);
static DLSYM_FUNCTION(elf_begin);
static DLSYM_FUNCTION(elf_end);
static DLSYM_FUNCTION(elf_getdata_rawchunk);
static DLSYM_FUNCTION(gelf_getehdr);
static DLSYM_FUNCTION(elf_getphdrnum);
static DLSYM_FUNCTION(elf_errmsg);
static DLSYM_FUNCTION(elf_errno);
static DLSYM_FUNCTION(elf_memory);
static DLSYM_FUNCTION(elf_version);
static DLSYM_FUNCTION(gelf_getphdr);
static DLSYM_FUNCTION(gelf_getnote);
int dlopen_dw(void) {
int r;