1 /* Opening CTF files with BFD.
2 Copyright (C) 2019-2020 Free Software Foundation, Inc.
4 This file is part of libctf.
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
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.
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/>. */
23 #include <sys/types.h>
32 #include "ctf-endian.h"
36 /* Free the BFD bits of a CTF file on ctf_arc_close(). */
39 ctf_bfdclose (struct ctf_archive_internal
*arci
)
41 if (arci
->ctfi_abfd
!= NULL
)
42 if (!bfd_close_all_done (arci
->ctfi_abfd
))
43 ctf_dprintf ("Cannot close BFD: %s\n", bfd_errmsg (bfd_get_error()));
46 /* Open a CTF file given the specified BFD. */
49 ctf_bfdopen (struct bfd
*abfd
, int *errp
)
58 if ((ctf_asect
= bfd_get_section_by_name (abfd
, _CTF_SECTION
)) == NULL
)
60 return (ctf_set_open_errno (errp
, ECTF_NOCTFDATA
));
63 if (!bfd_malloc_and_get_section (abfd
, ctf_asect
, &contents
))
65 ctf_dprintf ("ctf_bfdopen(): cannot malloc CTF section: %s\n",
66 bfd_errmsg (bfd_get_error()));
67 return (ctf_set_open_errno (errp
, ECTF_FMT
));
70 ctfsect
.cts_name
= _CTF_SECTION
;
71 ctfsect
.cts_entsize
= 1;
72 ctfsect
.cts_size
= bfd_section_size (ctf_asect
);
73 ctfsect
.cts_data
= contents
;
75 if ((arc
= ctf_bfdopen_ctfsect (abfd
, &ctfsect
, errp
)) != NULL
)
77 /* This frees the cts_data later. */
78 arc
->ctfi_data
= (void *) ctfsect
.cts_data
;
83 return NULL
; /* errno is set for us. */
86 /* Open a CTF file given the specified BFD and CTF section (which may contain a
87 CTF archive or a file). */
90 ctf_bfdopen_ctfsect (struct bfd
*abfd _libctf_unused_
,
91 const ctf_sect_t
*ctfsect
, int *errp
)
94 ctf_sect_t
*symsectp
= NULL
;
95 ctf_sect_t
*strsectp
= NULL
;
96 const char *bfderrstr
= NULL
;
97 char *strtab_alloc
= NULL
;
100 ctf_sect_t symsect
, strsect
;
101 Elf_Internal_Shdr
*symhdr
= &elf_symtab_hdr (abfd
);
103 Elf_Internal_Sym
*isymbuf
;
104 bfd_byte
*symtab
= NULL
;
105 const char *strtab
= NULL
;
107 /* TODO: handle SYMTAB_SHNDX. */
109 /* Get the symtab, and the strtab associated with it. */
110 if (elf_tdata (abfd
) && symhdr
&& symhdr
->sh_size
&& symhdr
->sh_entsize
)
112 symcount
= symhdr
->sh_size
/ symhdr
->sh_entsize
;
113 if ((symtab
= malloc (symhdr
->sh_size
)) == NULL
)
115 bfderrstr
= "Cannot malloc symbol table";
119 isymbuf
= bfd_elf_get_elf_syms (abfd
, symhdr
, symcount
, 0,
124 bfderrstr
= "Cannot read symbol table";
128 if (elf_elfsections (abfd
) != NULL
129 && symhdr
->sh_link
< elf_numsections (abfd
))
131 Elf_Internal_Shdr
*strhdr
= elf_elfsections (abfd
)[symhdr
->sh_link
];
133 strsize
= strhdr
->sh_size
;
134 if (strhdr
->contents
== NULL
)
136 if ((strtab
= bfd_elf_get_str_section (abfd
, symhdr
->sh_link
)) == NULL
)
138 bfderrstr
= "Cannot read string table";
143 strtab
= (const char *) strhdr
->contents
;
146 else /* No symtab: just try getting .strtab by name. */
148 bfd_byte
*str_bcontents
;
151 if ((str_asect
= bfd_get_section_by_name (abfd
, ".strtab")) != NULL
)
153 if (bfd_malloc_and_get_section (abfd
, str_asect
, &str_bcontents
))
155 strtab
= (const char *) str_bcontents
;
156 strtab_alloc
= (char *) str_bcontents
;
157 strsize
= str_asect
->size
;
164 /* The names here are more or less arbitrary, but there is no point
165 thrashing around digging the name out of the shstrtab given that we don't
166 use it for anything but debugging. */
168 strsect
.cts_data
= strtab
;
169 strsect
.cts_name
= ".strtab";
170 strsect
.cts_size
= strsize
;
176 assert (symhdr
->sh_entsize
== get_elf_backend_data (abfd
)->s
->sizeof_sym
);
177 symsect
.cts_name
= ".symtab";
178 symsect
.cts_entsize
= symhdr
->sh_entsize
;
179 symsect
.cts_size
= symhdr
->sh_size
;
180 symsect
.cts_data
= symtab
;
185 arci
= ctf_arc_bufopen (ctfsect
, symsectp
, strsectp
, errp
);
188 /* Request freeing of the symsect and possibly the strsect. */
189 arci
->ctfi_free_symsect
= 1;
191 arci
->ctfi_free_strsect
= 1;
199 err
: _libctf_unused_
;
202 ctf_dprintf ("ctf_bfdopen(): %s: %s\n", bfderrstr
,
203 bfd_errmsg (bfd_get_error()));
204 ctf_set_open_errno (errp
, ECTF_FMT
);
209 /* Open the specified file descriptor and return a pointer to a CTF archive that
210 contains one or more CTF containers. The file can be an ELF file, a raw CTF
211 file, or a CTF archive. The caller is responsible for closing the file
212 descriptor when it is no longer needed. If this is an ELF file, TARGET, if
213 non-NULL, should be the name of a suitable BFD target. */
216 ctf_fdopen (int fd
, const char *filename
, const char *target
, int *errp
)
225 ctf_preamble_t ctfhdr
;
228 memset (&ctfhdr
, 0, sizeof (ctfhdr
));
232 if (fstat (fd
, &st
) == -1)
233 return (ctf_set_open_errno (errp
, errno
));
235 if ((nbytes
= ctf_pread (fd
, &ctfhdr
, sizeof (ctfhdr
), 0)) <= 0)
236 return (ctf_set_open_errno (errp
, nbytes
< 0 ? errno
: ECTF_FMT
));
238 /* If we have read enough bytes to form a CTF header and the magic string
239 matches, in either endianness, attempt to interpret the file as raw
242 if ((size_t) nbytes
>= sizeof (ctf_preamble_t
)
243 && (ctfhdr
.ctp_magic
== CTF_MAGIC
244 || ctfhdr
.ctp_magic
== bswap_16 (CTF_MAGIC
)))
246 ctf_file_t
*fp
= NULL
;
249 if ((data
= ctf_mmap (st
.st_size
, 0, fd
)) == NULL
)
250 return (ctf_set_open_errno (errp
, errno
));
252 if ((fp
= ctf_simple_open (data
, (size_t) st
.st_size
, NULL
, 0, 0,
253 NULL
, 0, errp
)) == NULL
)
255 ctf_munmap (data
, (size_t) st
.st_size
);
256 return NULL
; /* errno is set for us. */
259 fp
->ctf_data_mmapped
= data
;
260 fp
->ctf_data_mmapped_len
= (size_t) st
.st_size
;
262 return ctf_new_archive_internal (0, 1, NULL
, fp
, NULL
, NULL
, errp
);
265 if ((nbytes
= ctf_pread (fd
, &arc_magic
, sizeof (arc_magic
), 0)) <= 0)
266 return (ctf_set_open_errno (errp
, nbytes
< 0 ? errno
: ECTF_FMT
));
268 if ((size_t) nbytes
>= sizeof (uint64_t) && le64toh (arc_magic
) == CTFA_MAGIC
)
270 struct ctf_archive
*arc
;
272 if ((arc
= ctf_arc_open_internal (filename
, errp
)) == NULL
)
273 return NULL
; /* errno is set for us. */
275 return ctf_new_archive_internal (1, 1, arc
, NULL
, NULL
, NULL
, errp
);
278 /* Attempt to open the file with BFD. We must dup the fd first, since bfd
279 takes ownership of the passed fd. */
281 if ((nfd
= dup (fd
)) < 0)
282 return (ctf_set_open_errno (errp
, errno
));
284 if ((abfd
= bfd_fdopenr (filename
, target
, nfd
)) == NULL
)
286 ctf_dprintf ("Cannot open BFD from %s: %s\n",
287 filename
? filename
: "(unknown file)",
288 bfd_errmsg (bfd_get_error()));
289 return (ctf_set_open_errno (errp
, ECTF_FMT
));
291 bfd_set_cacheable (abfd
, 1);
293 if (!bfd_check_format (abfd
, bfd_object
))
295 ctf_dprintf ("BFD format problem in %s: %s\n",
296 filename
? filename
: "(unknown file)",
297 bfd_errmsg (bfd_get_error()));
298 if (bfd_get_error() == bfd_error_file_ambiguously_recognized
)
299 return (ctf_set_open_errno (errp
, ECTF_BFD_AMBIGUOUS
));
301 return (ctf_set_open_errno (errp
, ECTF_FMT
));
304 if ((arci
= ctf_bfdopen (abfd
, errp
)) == NULL
)
306 if (!bfd_close_all_done (abfd
))
307 ctf_dprintf ("Cannot close BFD: %s\n", bfd_errmsg (bfd_get_error()));
308 return NULL
; /* errno is set for us. */
310 arci
->ctfi_bfd_close
= ctf_bfdclose
;
311 arci
->ctfi_abfd
= abfd
;
316 /* Open the specified file and return a pointer to a CTF container. The file
317 can be either an ELF file or raw CTF file. This is just a convenient
318 wrapper around ctf_fdopen() for callers. */
321 ctf_open (const char *filename
, const char *target
, int *errp
)
326 if ((fd
= open (filename
, O_RDONLY
)) == -1)
333 arc
= ctf_fdopen (fd
, filename
, target
, errp
);
338 /* Public entry point: open a CTF archive, or CTF file. Returns the archive, or
339 NULL and an error in *err. Despite the fact that this uses CTF archives, it
340 must be in this file to avoid dragging in BFD into non-BFD-using programs. */
342 ctf_arc_open (const char *filename
, int *errp
)
344 return ctf_open (filename
, NULL
, errp
);