From: Nick Alcock Date: Mon, 13 Jan 2025 11:31:56 +0000 (+0000) Subject: libctf: move ctf_elf*_to_link_sym to ctf-link.c X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=d996ca5e85002263d5f0013519fcdeafccd85561;p=thirdparty%2Fbinutils-gdb.git libctf: move ctf_elf*_to_link_sym to ctf-link.c Everything in ctf-util.c is in some way associated with data structures in general in some way, except for the ctf_*_to_link_sym functions, which are straight translators between the Elf*_Sym type and the ctf_link_sym_t type used by ctf-link.c. Move them into ctf-link.c where they belong. --- diff --git a/libctf/ctf-link.c b/libctf/ctf-link.c index 6a24344acdb..cbc74f921e2 100644 --- a/libctf/ctf-link.c +++ b/libctf/ctf-link.c @@ -19,6 +19,7 @@ #include #include +#include "ctf-endian.h" #if defined (PIC) #pragma weak ctf_open @@ -1821,6 +1822,91 @@ ctf_link_shuffle_syms (ctf_dict_t *fp) return -err; } +/* Convert a 32-bit ELF symbol to a ctf_link_sym_t. */ + +ctf_link_sym_t * +ctf_elf32_to_link_sym (ctf_dict_t *fp, ctf_link_sym_t *dst, const Elf32_Sym *src, + uint32_t symidx) +{ + Elf32_Sym tmp; + int needs_flipping = 0; + +#ifdef WORDS_BIGENDIAN + if (fp->ctf_symsect_little_endian) + needs_flipping = 1; +#else + if (!fp->ctf_symsect_little_endian) + needs_flipping = 1; +#endif + + memcpy (&tmp, src, sizeof (Elf32_Sym)); + if (needs_flipping) + { + swap_thing (tmp.st_name); + swap_thing (tmp.st_size); + swap_thing (tmp.st_shndx); + swap_thing (tmp.st_value); + } + /* The name must be in the external string table. */ + if (tmp.st_name < fp->ctf_str[CTF_STRTAB_1].cts_len) + dst->st_name = (const char *) fp->ctf_str[CTF_STRTAB_1].cts_strs + tmp.st_name; + else + dst->st_name = _CTF_NULLSTR; + dst->st_nameidx_set = 0; + dst->st_symidx = symidx; + dst->st_shndx = tmp.st_shndx; + dst->st_type = ELF32_ST_TYPE (tmp.st_info); + dst->st_value = tmp.st_value; + + return dst; +} + +/* Convert a 64-bit ELF symbol to a ctf_link_sym_t. */ + +ctf_link_sym_t * +ctf_elf64_to_link_sym (ctf_dict_t *fp, ctf_link_sym_t *dst, const Elf64_Sym *src, + uint32_t symidx) +{ + Elf64_Sym tmp; + int needs_flipping = 0; + +#ifdef WORDS_BIGENDIAN + if (fp->ctf_symsect_little_endian) + needs_flipping = 1; +#else + if (!fp->ctf_symsect_little_endian) + needs_flipping = 1; +#endif + + memcpy (&tmp, src, sizeof (Elf64_Sym)); + if (needs_flipping) + { + swap_thing (tmp.st_name); + swap_thing (tmp.st_size); + swap_thing (tmp.st_shndx); + swap_thing (tmp.st_value); + } + + /* The name must be in the external string table. */ + if (tmp.st_name < fp->ctf_str[CTF_STRTAB_1].cts_len) + dst->st_name = (const char *) fp->ctf_str[CTF_STRTAB_1].cts_strs + tmp.st_name; + else + dst->st_name = _CTF_NULLSTR; + dst->st_nameidx_set = 0; + dst->st_symidx = symidx; + dst->st_shndx = tmp.st_shndx; + dst->st_type = ELF32_ST_TYPE (tmp.st_info); + + /* We only care if the value is zero, so avoid nonzeroes turning into + zeroes. */ + if (_libctf_unlikely_ (tmp.st_value != 0 && ((uint32_t) tmp.st_value == 0))) + dst->st_value = 1; + else + dst->st_value = (uint32_t) tmp.st_value; + + return dst; +} + typedef struct ctf_name_list_accum_cb_arg { char **names; diff --git a/libctf/ctf-util.c b/libctf/ctf-util.c index 9dad4b93c05..d4b668565a1 100644 --- a/libctf/ctf-util.c +++ b/libctf/ctf-util.c @@ -1,4 +1,4 @@ -/* Miscellaneous utilities. +/* Simple data structure utilities and helpers. Copyright (C) 2019-2025 Free Software Foundation, Inc. This file is part of libctf. @@ -109,91 +109,6 @@ ctf_list_splice (ctf_list_t *lp, ctf_list_t *append) append->l_prev = NULL; } -/* Convert a 32-bit ELF symbol to a ctf_link_sym_t. */ - -ctf_link_sym_t * -ctf_elf32_to_link_sym (ctf_dict_t *fp, ctf_link_sym_t *dst, const Elf32_Sym *src, - uint32_t symidx) -{ - Elf32_Sym tmp; - int needs_flipping = 0; - -#ifdef WORDS_BIGENDIAN - if (fp->ctf_symsect_little_endian) - needs_flipping = 1; -#else - if (!fp->ctf_symsect_little_endian) - needs_flipping = 1; -#endif - - memcpy (&tmp, src, sizeof (Elf32_Sym)); - if (needs_flipping) - { - swap_thing (tmp.st_name); - swap_thing (tmp.st_size); - swap_thing (tmp.st_shndx); - swap_thing (tmp.st_value); - } - /* The name must be in the external string table. */ - if (tmp.st_name < fp->ctf_str[CTF_STRTAB_1].cts_len) - dst->st_name = (const char *) fp->ctf_str[CTF_STRTAB_1].cts_strs + tmp.st_name; - else - dst->st_name = _CTF_NULLSTR; - dst->st_nameidx_set = 0; - dst->st_symidx = symidx; - dst->st_shndx = tmp.st_shndx; - dst->st_type = ELF32_ST_TYPE (tmp.st_info); - dst->st_value = tmp.st_value; - - return dst; -} - -/* Convert a 64-bit ELF symbol to a ctf_link_sym_t. */ - -ctf_link_sym_t * -ctf_elf64_to_link_sym (ctf_dict_t *fp, ctf_link_sym_t *dst, const Elf64_Sym *src, - uint32_t symidx) -{ - Elf64_Sym tmp; - int needs_flipping = 0; - -#ifdef WORDS_BIGENDIAN - if (fp->ctf_symsect_little_endian) - needs_flipping = 1; -#else - if (!fp->ctf_symsect_little_endian) - needs_flipping = 1; -#endif - - memcpy (&tmp, src, sizeof (Elf64_Sym)); - if (needs_flipping) - { - swap_thing (tmp.st_name); - swap_thing (tmp.st_size); - swap_thing (tmp.st_shndx); - swap_thing (tmp.st_value); - } - - /* The name must be in the external string table. */ - if (tmp.st_name < fp->ctf_str[CTF_STRTAB_1].cts_len) - dst->st_name = (const char *) fp->ctf_str[CTF_STRTAB_1].cts_strs + tmp.st_name; - else - dst->st_name = _CTF_NULLSTR; - dst->st_nameidx_set = 0; - dst->st_symidx = symidx; - dst->st_shndx = tmp.st_shndx; - dst->st_type = ELF32_ST_TYPE (tmp.st_info); - - /* We only care if the value is zero, so avoid nonzeroes turning into - zeroes. */ - if (_libctf_unlikely_ (tmp.st_value != 0 && ((uint32_t) tmp.st_value == 0))) - dst->st_value = 1; - else - dst->st_value = (uint32_t) tmp.st_value; - - return dst; -} - /* A string appender working on dynamic strings. Returns NULL on OOM. */ char *