bfd, include, ld, binutils, libctf: CTF should use the dynstr/sym
[deliverable/binutils-gdb.git] / libctf / ctf-open-bfd.c
CommitLineData
143dce84 1/* Opening CTF files with BFD.
b3adc24a 2 Copyright (C) 2019-2020 Free Software Foundation, Inc.
143dce84
NA
3
4 This file is part of libctf.
5
6 libctf is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
9 version.
10
11 This program is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14 See the GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; see the file COPYING. If not see
18 <http://www.gnu.org/licenses/>. */
19
20#include <ctf-impl.h>
21#include <stddef.h>
6d5944fc 22#include <assert.h>
143dce84
NA
23#include <sys/types.h>
24#include <sys/stat.h>
25#include <errno.h>
26#include <string.h>
27#include <fcntl.h>
c1401ecc 28#include <unistd.h>
143dce84
NA
29#include <elf.h>
30#include <bfd.h>
cf02c44d
NA
31#include "swap.h"
32#include "ctf-endian.h"
143dce84
NA
33
34#include "elf-bfd.h"
35
f046147d 36/* Free the BFD bits of a CTF file on ctf_arc_close(). */
143dce84
NA
37
38static void
39ctf_bfdclose (struct ctf_archive_internal *arci)
40{
41 if (arci->ctfi_abfd != NULL)
42 if (!bfd_close_all_done (arci->ctfi_abfd))
926c9e76
NA
43 ctf_err_warn (NULL, 0, 0, _("cannot close BFD: %s"),
44 bfd_errmsg (bfd_get_error ()));
143dce84
NA
45}
46
47/* Open a CTF file given the specified BFD. */
48
49ctf_archive_t *
50ctf_bfdopen (struct bfd *abfd, int *errp)
51{
52 ctf_archive_t *arc;
53 asection *ctf_asect;
54 bfd_byte *contents;
55 ctf_sect_t ctfsect;
56
57 libctf_init_debug();
58
59 if ((ctf_asect = bfd_get_section_by_name (abfd, _CTF_SECTION)) == NULL)
60 {
61 return (ctf_set_open_errno (errp, ECTF_NOCTFDATA));
62 }
63
64 if (!bfd_malloc_and_get_section (abfd, ctf_asect, &contents))
65 {
926c9e76
NA
66 ctf_err_warn (NULL, 0, 0, _("ctf_bfdopen(): cannot malloc "
67 "CTF section: %s"),
68 bfd_errmsg (bfd_get_error ()));
143dce84
NA
69 return (ctf_set_open_errno (errp, ECTF_FMT));
70 }
71
72 ctfsect.cts_name = _CTF_SECTION;
143dce84 73 ctfsect.cts_entsize = 1;
fd361982 74 ctfsect.cts_size = bfd_section_size (ctf_asect);
143dce84
NA
75 ctfsect.cts_data = contents;
76
77 if ((arc = ctf_bfdopen_ctfsect (abfd, &ctfsect, errp)) != NULL)
78 {
2f6ecaed 79 /* This frees the cts_data later. */
143dce84
NA
80 arc->ctfi_data = (void *) ctfsect.cts_data;
81 return arc;
82 }
83
84 free (contents);
85 return NULL; /* errno is set for us. */
86}
87
88/* Open a CTF file given the specified BFD and CTF section (which may contain a
2f6ecaed 89 CTF archive or a file). */
143dce84
NA
90
91ctf_archive_t *
9698cf9b
NA
92ctf_bfdopen_ctfsect (struct bfd *abfd _libctf_unused_,
93 const ctf_sect_t *ctfsect, int *errp)
143dce84 94{
143dce84 95 ctf_archive_t *arci;
143dce84
NA
96 ctf_sect_t *symsectp = NULL;
97 ctf_sect_t *strsectp = NULL;
98 const char *bfderrstr = NULL;
d50c0802 99 char *strtab_alloc = NULL;
143dce84 100
9698cf9b 101#ifdef HAVE_BFD_ELF
143dce84 102 ctf_sect_t symsect, strsect;
3d16b64e 103 Elf_Internal_Shdr *symhdr;
d50c0802 104 size_t symcount;
6d5944fc 105 Elf_Internal_Sym *isymbuf;
d50c0802 106 bfd_byte *symtab = NULL;
3d16b64e 107 const char *symtab_name;
6d5944fc 108 const char *strtab = NULL;
3d16b64e 109 const char *strtab_name;
d50c0802 110 size_t strsize;
3d16b64e
NA
111 const ctf_preamble_t *preamble;
112
113 if (ctfsect->cts_data == NULL)
114 {
115 bfderrstr = N_("CTF section is NULL");
116 goto err;
117 }
118 preamble = ctf_arc_bufpreamble (ctfsect);
119
120 if (preamble->ctp_flags & CTF_F_DYNSTR)
121 {
122 symhdr = &elf_tdata (abfd)->dynsymtab_hdr;
123 strtab_name = ".dynstr";
124 symtab_name = ".dynsym";
125 }
126 else
127 {
128 symhdr = &elf_tdata (abfd)->symtab_hdr;
129 strtab_name = ".strtab";
130 symtab_name = ".symtab";
131 }
132
143dce84
NA
133 /* TODO: handle SYMTAB_SHNDX. */
134
d50c0802
NA
135 /* Get the symtab, and the strtab associated with it. */
136 if (elf_tdata (abfd) && symhdr && symhdr->sh_size && symhdr->sh_entsize)
143dce84 137 {
d50c0802
NA
138 symcount = symhdr->sh_size / symhdr->sh_entsize;
139 if ((symtab = malloc (symhdr->sh_size)) == NULL)
140 {
926c9e76 141 bfderrstr = N_("cannot malloc symbol table");
d50c0802
NA
142 goto err;
143 }
143dce84 144
d50c0802
NA
145 isymbuf = bfd_elf_get_elf_syms (abfd, symhdr, symcount, 0,
146 NULL, symtab, NULL);
147 free (isymbuf);
148 if (isymbuf == NULL)
149 {
926c9e76 150 bfderrstr = N_("cannot read symbol table");
d50c0802
NA
151 goto err_free_sym;
152 }
153
154 if (elf_elfsections (abfd) != NULL
155 && symhdr->sh_link < elf_numsections (abfd))
156 {
157 Elf_Internal_Shdr *strhdr = elf_elfsections (abfd)[symhdr->sh_link];
143dce84 158
d50c0802
NA
159 strsize = strhdr->sh_size;
160 if (strhdr->contents == NULL)
161 {
162 if ((strtab = bfd_elf_get_str_section (abfd, symhdr->sh_link)) == NULL)
163 {
926c9e76 164 bfderrstr = N_("cannot read string table");
d50c0802
NA
165 goto err_free_sym;
166 }
167 }
168 else
169 strtab = (const char *) strhdr->contents;
170 }
171 }
3d16b64e 172 else /* No symtab: just try getting .strtab or .dynstr by name. */
6d5944fc 173 {
d50c0802
NA
174 bfd_byte *str_bcontents;
175 asection *str_asect;
176
3d16b64e 177 if ((str_asect = bfd_get_section_by_name (abfd, strtab_name)) != NULL)
143dce84 178 {
d50c0802 179 if (bfd_malloc_and_get_section (abfd, str_asect, &str_bcontents))
143dce84 180 {
d50c0802
NA
181 strtab = (const char *) str_bcontents;
182 strtab_alloc = (char *) str_bcontents;
183 strsize = str_asect->size;
143dce84 184 }
143dce84 185 }
6d5944fc
NA
186 }
187
188 if (strtab)
189 {
190 /* The names here are more or less arbitrary, but there is no point
191 thrashing around digging the name out of the shstrtab given that we don't
192 use it for anything but debugging. */
193
194 strsect.cts_data = strtab;
3d16b64e 195 strsect.cts_name = strtab_name;
d50c0802 196 strsect.cts_size = strsize;
6d5944fc 197 strsectp = &strsect;
d50c0802 198 }
6d5944fc 199
d50c0802
NA
200 if (symtab)
201 {
6d5944fc 202 assert (symhdr->sh_entsize == get_elf_backend_data (abfd)->s->sizeof_sym);
3d16b64e 203 symsect.cts_name = symtab_name;
6d5944fc
NA
204 symsect.cts_entsize = symhdr->sh_entsize;
205 symsect.cts_size = symhdr->sh_size;
206 symsect.cts_data = symtab;
207 symsectp = &symsect;
143dce84 208 }
9698cf9b 209#endif
143dce84 210
2f6ecaed
NA
211 arci = ctf_arc_bufopen (ctfsect, symsectp, strsectp, errp);
212 if (arci)
143dce84 213 {
d50c0802 214 /* Request freeing of the symsect and possibly the strsect. */
2f6ecaed 215 arci->ctfi_free_symsect = 1;
d50c0802
NA
216 if (strtab_alloc)
217 arci->ctfi_free_strsect = 1;
2f6ecaed 218 return arci;
143dce84 219 }
9698cf9b 220#ifdef HAVE_BFD_ELF
6d5944fc
NA
221 err_free_sym:
222 free (symtab);
d50c0802 223 free (strtab_alloc);
9698cf9b 224#endif
143dce84
NA
225err: _libctf_unused_;
226 if (bfderrstr)
227 {
926c9e76 228 ctf_err_warn (NULL, 0, 0, "ctf_bfdopen(): %s: %s", gettext (bfderrstr),
143dce84
NA
229 bfd_errmsg (bfd_get_error()));
230 ctf_set_open_errno (errp, ECTF_FMT);
231 }
232 return NULL;
233}
234
235/* Open the specified file descriptor and return a pointer to a CTF archive that
139633c3
NA
236 contains one or more CTF dicts. The file can be an ELF file, a file
237 containing raw CTF, or a CTF archive. The caller is responsible for closing
238 the file descriptor when it is no longer needed. If this is an ELF file,
239 TARGET, if non-NULL, should be the name of a suitable BFD target. */
143dce84
NA
240
241ctf_archive_t *
242ctf_fdopen (int fd, const char *filename, const char *target, int *errp)
243{
244 ctf_archive_t *arci;
245 bfd *abfd;
246 int nfd;
247
248 struct stat st;
249 ssize_t nbytes;
250
251 ctf_preamble_t ctfhdr;
252 uint64_t arc_magic;
253
254 memset (&ctfhdr, 0, sizeof (ctfhdr));
255
256 libctf_init_debug();
257
258 if (fstat (fd, &st) == -1)
259 return (ctf_set_open_errno (errp, errno));
260
261 if ((nbytes = ctf_pread (fd, &ctfhdr, sizeof (ctfhdr), 0)) <= 0)
262 return (ctf_set_open_errno (errp, nbytes < 0 ? errno : ECTF_FMT));
263
cf02c44d
NA
264 /* If we have read enough bytes to form a CTF header and the magic string
265 matches, in either endianness, attempt to interpret the file as raw
266 CTF. */
143dce84 267
cf02c44d
NA
268 if ((size_t) nbytes >= sizeof (ctf_preamble_t)
269 && (ctfhdr.ctp_magic == CTF_MAGIC
270 || ctfhdr.ctp_magic == bswap_16 (CTF_MAGIC)))
143dce84 271 {
139633c3 272 ctf_dict_t *fp = NULL;
143dce84
NA
273 void *data;
274
143dce84
NA
275 if ((data = ctf_mmap (st.st_size, 0, fd)) == NULL)
276 return (ctf_set_open_errno (errp, errno));
277
278 if ((fp = ctf_simple_open (data, (size_t) st.st_size, NULL, 0, 0,
279 NULL, 0, errp)) == NULL)
cf02c44d
NA
280 {
281 ctf_munmap (data, (size_t) st.st_size);
282 return NULL; /* errno is set for us. */
283 }
284
143dce84
NA
285 fp->ctf_data_mmapped = data;
286 fp->ctf_data_mmapped_len = (size_t) st.st_size;
287
601e455b 288 return ctf_new_archive_internal (0, 1, NULL, fp, NULL, NULL, errp);
143dce84
NA
289 }
290
291 if ((nbytes = ctf_pread (fd, &arc_magic, sizeof (arc_magic), 0)) <= 0)
292 return (ctf_set_open_errno (errp, nbytes < 0 ? errno : ECTF_FMT));
293
cf02c44d 294 if ((size_t) nbytes >= sizeof (uint64_t) && le64toh (arc_magic) == CTFA_MAGIC)
143dce84
NA
295 {
296 struct ctf_archive *arc;
297
298 if ((arc = ctf_arc_open_internal (filename, errp)) == NULL)
299 return NULL; /* errno is set for us. */
300
601e455b 301 return ctf_new_archive_internal (1, 1, arc, NULL, NULL, NULL, errp);
143dce84
NA
302 }
303
304 /* Attempt to open the file with BFD. We must dup the fd first, since bfd
305 takes ownership of the passed fd. */
306
307 if ((nfd = dup (fd)) < 0)
308 return (ctf_set_open_errno (errp, errno));
309
310 if ((abfd = bfd_fdopenr (filename, target, nfd)) == NULL)
311 {
926c9e76
NA
312 ctf_err_warn (NULL, 0, 0, _("cannot open BFD from %s: %s"),
313 filename ? filename : _("(unknown file)"),
314 bfd_errmsg (bfd_get_error ()));
143dce84
NA
315 return (ctf_set_open_errno (errp, ECTF_FMT));
316 }
edc8bbe9 317 bfd_set_cacheable (abfd, 1);
143dce84
NA
318
319 if (!bfd_check_format (abfd, bfd_object))
320 {
926c9e76
NA
321 ctf_err_warn (NULL, 0, 0, _("BFD format problem in %s: %s"),
322 filename ? filename : _("(unknown file)"),
323 bfd_errmsg (bfd_get_error ()));
143dce84
NA
324 if (bfd_get_error() == bfd_error_file_ambiguously_recognized)
325 return (ctf_set_open_errno (errp, ECTF_BFD_AMBIGUOUS));
326 else
327 return (ctf_set_open_errno (errp, ECTF_FMT));
328 }
329
330 if ((arci = ctf_bfdopen (abfd, errp)) == NULL)
331 {
332 if (!bfd_close_all_done (abfd))
926c9e76
NA
333 ctf_err_warn (NULL, 0, 0, _("cannot close BFD: %s"),
334 bfd_errmsg (bfd_get_error ()));
143dce84
NA
335 return NULL; /* errno is set for us. */
336 }
337 arci->ctfi_bfd_close = ctf_bfdclose;
338 arci->ctfi_abfd = abfd;
339
340 return arci;
341}
342
139633c3 343/* Open the specified file and return a pointer to a CTF dict. The file
143dce84
NA
344 can be either an ELF file or raw CTF file. This is just a convenient
345 wrapper around ctf_fdopen() for callers. */
346
347ctf_archive_t *
348ctf_open (const char *filename, const char *target, int *errp)
349{
350 ctf_archive_t *arc;
351 int fd;
352
353 if ((fd = open (filename, O_RDONLY)) == -1)
354 {
355 if (errp != NULL)
356 *errp = errno;
357 return NULL;
358 }
359
360 arc = ctf_fdopen (fd, filename, target, errp);
361 (void) close (fd);
362 return arc;
363}
364
365/* Public entry point: open a CTF archive, or CTF file. Returns the archive, or
366 NULL and an error in *err. Despite the fact that this uses CTF archives, it
367 must be in this file to avoid dragging in BFD into non-BFD-using programs. */
368ctf_archive_t *
369ctf_arc_open (const char *filename, int *errp)
370{
371 return ctf_open (filename, NULL, errp);
372}
This page took 0.193172 seconds and 4 git commands to generate.