GDB (xrefs)
/tmp/gdb-8.1/gdb/gdb_bfd.h
Go to the documentation of this file.
1 /* Definitions for BFD wrappers used by GDB.
2 
3  Copyright (C) 2011-2018 Free Software Foundation, Inc.
4 
5  This file is part of GDB.
6 
7  This program is free software; you can redistribute it and/or modify
8  it under the terms of the GNU General Public License as published by
9  the Free Software Foundation; either version 3 of the License, or
10  (at your option) any later version.
11 
12  This program is distributed in the hope that it will be useful,
13  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  GNU General Public License for more details.
16 
17  You should have received a copy of the GNU General Public License
18  along with this program. If not, see <http://www.gnu.org/licenses/>. */
19 
20 #ifndef GDB_BFD_H
21 #define GDB_BFD_H
22 
23 #include "registry.h"
24 #include "common/gdb_ref_ptr.h"
25 
26 DECLARE_REGISTRY (bfd);
27 
28 /* If supplied a path starting with this sequence, gdb_bfd_open will
29  open BFDs using target fileio operations. */
30 
31 #define TARGET_SYSROOT_PREFIX "target:"
32 
33 /* Returns nonzero if NAME starts with TARGET_SYSROOT_PREFIX, zero
34  otherwise. */
35 
36 int is_target_filename (const char *name);
37 
38 /* Returns nonzero if the filename associated with ABFD starts with
39  TARGET_SYSROOT_PREFIX, zero otherwise. */
40 
41 int gdb_bfd_has_target_filename (struct bfd *abfd);
42 
43 /* Increment the reference count of ABFD. It is fine for ABFD to be
44  NULL; in this case the function does nothing. */
45 
46 void gdb_bfd_ref (struct bfd *abfd);
47 
48 /* Decrement the reference count of ABFD. If this is the last
49  reference, ABFD will be freed. If ABFD is NULL, this function does
50  nothing. */
51 
52 void gdb_bfd_unref (struct bfd *abfd);
53 
54 /* A policy class for gdb::ref_ptr for BFD reference counting. */
56 {
57  static void incref (struct bfd *abfd)
58  {
59  gdb_bfd_ref (abfd);
60  }
61 
62  static void decref (struct bfd *abfd)
63  {
64  gdb_bfd_unref (abfd);
65  }
66 };
67 
68 /* A gdb::ref_ptr that has been specialized for BFD objects. */
70 
71 /* A helper function that calls gdb_bfd_ref and returns a
72  gdb_bfd_ref_ptr. */
73 
74 static inline gdb_bfd_ref_ptr
75 new_bfd_ref (struct bfd *abfd)
76 {
77  gdb_bfd_ref (abfd);
78  return gdb_bfd_ref_ptr (abfd);
79 }
80 
81 /* Open a read-only (FOPEN_RB) BFD given arguments like bfd_fopen.
82  If NAME starts with TARGET_SYSROOT_PREFIX then the BFD will be
83  opened using target fileio operations if necessary. Returns NULL
84  on error. On success, returns a new reference to the BFD, which
85  must be freed with gdb_bfd_unref. BFDs returned by this call are
86  shared among all callers opening the same file. If FD is not -1,
87  then after this call it is owned by BFD. If the BFD was not
88  accessed using target fileio operations then the filename
89  associated with the BFD and accessible with bfd_get_filename will
90  not be exactly NAME but rather NAME with TARGET_SYSROOT_PREFIX
91  stripped. */
92 
93 gdb_bfd_ref_ptr gdb_bfd_open (const char *name, const char *target, int fd);
94 
95 /* Mark the CHILD BFD as being a member of PARENT. Also, increment
96  the reference count of CHILD. Calling this function ensures that
97  as along as CHILD remains alive, PARENT will as well. Both CHILD
98  and PARENT must be non-NULL. This can be called more than once
99  with the same arguments; but it is not allowed to call it for a
100  single CHILD with different values for PARENT. */
101 
102 void gdb_bfd_mark_parent (bfd *child, bfd *parent);
103 
104 /* Mark INCLUDEE as being included by INCLUDER.
105  This is used to associate the life time of INCLUDEE with INCLUDER.
106  For example, with Fission, one file can refer to debug info in another
107  file, and internal tables we build for the main file (INCLUDER) may refer
108  to data contained in INCLUDEE. Therefore we want to keep INCLUDEE around
109  at least as long as INCLUDER exists.
110 
111  Note that this is different than gdb_bfd_mark_parent because in our case
112  lifetime tracking is based on the "parent" whereas in gdb_bfd_mark_parent
113  lifetime tracking is based on the "child". Plus in our case INCLUDEE could
114  have multiple different "parents". */
115 
116 void gdb_bfd_record_inclusion (bfd *includer, bfd *includee);
117 
118 /* Try to read or map the contents of the section SECT. If
119  successful, the section data is returned and *SIZE is set to the
120  size of the section data; this may not be the same as the size
121  according to bfd_get_section_size if the section was compressed.
122  The returned section data is associated with the BFD and will be
123  destroyed when the BFD is destroyed. There is no other way to free
124  it; for temporary uses of section data, see
125  bfd_malloc_and_get_section. SECT may not have relocations. This
126  function will throw on error. */
127 
128 const gdb_byte *gdb_bfd_map_section (asection *section, bfd_size_type *size);
129 
130 /* Compute the CRC for ABFD. The CRC is used to find and verify
131  separate debug files. When successful, this fills in *CRC_OUT and
132  returns 1. Otherwise, this issues a warning and returns 0. */
133 
134 int gdb_bfd_crc (struct bfd *abfd, unsigned long *crc_out);
135 
136 
137 
138 /* A wrapper for bfd_fopen that initializes the gdb-specific reference
139  count. */
140 
141 gdb_bfd_ref_ptr gdb_bfd_fopen (const char *, const char *, const char *, int);
142 
143 /* A wrapper for bfd_openr that initializes the gdb-specific reference
144  count. */
145 
146 gdb_bfd_ref_ptr gdb_bfd_openr (const char *, const char *);
147 
148 /* A wrapper for bfd_openw that initializes the gdb-specific reference
149  count. */
150 
151 gdb_bfd_ref_ptr gdb_bfd_openw (const char *, const char *);
152 
153 /* A wrapper for bfd_openr_iovec that initializes the gdb-specific
154  reference count. */
155 
156 gdb_bfd_ref_ptr gdb_bfd_openr_iovec (const char *filename, const char *target,
157  void *(*open_func) (struct bfd *nbfd,
158  void *open_closure),
159  void *open_closure,
160  file_ptr (*pread_func) (struct bfd *nbfd,
161  void *stream,
162  void *buf,
163  file_ptr nbytes,
164  file_ptr offset),
165  int (*close_func) (struct bfd *nbfd,
166  void *stream),
167  int (*stat_func) (struct bfd *abfd,
168  void *stream,
169  struct stat *sb));
170 
171 /* A wrapper for bfd_openr_next_archived_file that initializes the
172  gdb-specific reference count. */
173 
174 gdb_bfd_ref_ptr gdb_bfd_openr_next_archived_file (bfd *archive, bfd *previous);
175 
176 /* A wrapper for bfd_fdopenr that initializes the gdb-specific
177  reference count. */
178 
179 gdb_bfd_ref_ptr gdb_bfd_fdopenr (const char *filename, const char *target,
180  int fd);
181 
182 
183 
184 /* Return the index of the BFD section SECTION. Ordinarily this is
185  just the section's index, but for some special sections, like
186  bfd_com_section_ptr, it will be a synthesized value. */
187 
188 int gdb_bfd_section_index (bfd *abfd, asection *section);
189 
190 
191 /* Like bfd_count_sections, but include any possible global sections,
192  like bfd_com_section_ptr. */
193 
194 int gdb_bfd_count_sections (bfd *abfd);
195 
196 /* Return true if any section requires relocations, false
197  otherwise. */
198 
199 int gdb_bfd_requires_relocations (bfd *abfd);
200 
201 #endif /* GDB_BFD_H */
int gdb_bfd_has_target_filename(struct bfd *abfd)
Definition: gdb_bfd.c:216
void gdb_bfd_mark_parent(bfd *child, bfd *parent)
Definition: gdb_bfd.c:829
int gdb_bfd_section_index(bfd *abfd, asection *section)
Definition: gdb_bfd.c:888
const gdb_byte * gdb_bfd_map_section(asection *section, bfd_size_type *size)
Definition: gdb_bfd.c:645
int gdb_bfd_crc(struct bfd *abfd, unsigned long *crc_out)
Definition: gdb_bfd.c:756
void gdb_bfd_record_inclusion(bfd *includer, bfd *includee)
Definition: gdb_bfd.c:863
void gdb_bfd_ref(struct bfd *abfd)
Definition: gdb_bfd.c:523
gdb::ref_ptr< struct bfd, gdb_bfd_ref_policy > gdb_bfd_ref_ptr
Definition: gdb_bfd.h:69
static void incref(struct bfd *abfd)
Definition: gdb_bfd.h:57
static gdb_bfd_ref_ptr new_bfd_ref(struct bfd *abfd)
Definition: gdb_bfd.h:75
const char *const name
Definition: aarch64-tdep.c:76
gdb_bfd_ref_ptr gdb_bfd_openr(const char *, const char *)
Definition: gdb_bfd.c:784
gdb_bfd_ref_ptr gdb_bfd_fopen(const char *, const char *, const char *, int)
Definition: gdb_bfd.c:773
gdb_bfd_ref_ptr gdb_bfd_openr_iovec(const char *filename, const char *target, void *(*open_func)(struct bfd *nbfd, void *open_closure), void *open_closure, file_ptr(*pread_func)(struct bfd *nbfd, void *stream, void *buf, file_ptr nbytes, file_ptr offset), int(*close_func)(struct bfd *nbfd, void *stream), int(*stat_func)(struct bfd *abfd, void *stream, struct stat *sb))
Definition: gdb_bfd.c:804
DECLARE_REGISTRY(bfd)
gdb_bfd_ref_ptr gdb_bfd_openw(const char *, const char *)
Definition: gdb_bfd.c:794
void gdb_bfd_unref(struct bfd *abfd)
Definition: gdb_bfd.c:561
bfd_byte gdb_byte
Definition: common-types.h:38
gdb_bfd_ref_ptr gdb_bfd_openr_next_archived_file(bfd *archive, bfd *previous)
Definition: gdb_bfd.c:850
int gdb_bfd_requires_relocations(bfd *abfd)
Definition: gdb_bfd.c:914
int offset
Definition: agent.c:65
int is_target_filename(const char *name)
Definition: gdb_bfd.c:208
size_t size
Definition: go32-nat.c:242
static void decref(struct bfd *abfd)
Definition: gdb_bfd.h:62
gdb_bfd_ref_ptr gdb_bfd_fdopenr(const char *filename, const char *target, int fd)
Definition: gdb_bfd.c:874
int gdb_bfd_count_sections(bfd *abfd)
Definition: gdb_bfd.c:906
gdb_bfd_ref_ptr gdb_bfd_open(const char *name, const char *target, int fd)
Definition: gdb_bfd.c:383