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.
This commit is contained in:
Nick Alcock
2025-01-13 11:31:56 +00:00
parent 4a7870a831
commit d996ca5e85
2 changed files with 87 additions and 86 deletions

View File

@@ -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 *