1 /* DWARF 2 low-level section code
2 
3    Copyright (C) 1994-2021 Free Software Foundation, Inc.
4 
5    Adapted by Gary Funck (gary@intrepid.com), Intrepid Technology,
6    Inc.  with support from Florida State University (under contract
7    with the Ada Joint Program Office), and Silicon Graphics, Inc.
8    Initial contribution by Brent Benson, Harris Computer Systems, Inc.,
9    based on Fred Fish's (Cygnus Support) implementation of DWARF 1
10    support.
11 
12    This file is part of GDB.
13 
14    This program is free software; you can redistribute it and/or modify
15    it under the terms of the GNU General Public License as published by
16    the Free Software Foundation; either version 3 of the License, or
17    (at your option) any later version.
18 
19    This program is distributed in the hope that it will be useful,
20    but WITHOUT ANY WARRANTY; without even the implied warranty of
21    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22    GNU General Public License for more details.
23 
24    You should have received a copy of the GNU General Public License
25    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
26 
27 #include "defs.h"
28 #include "dwarf2/section.h"
29 #include "gdb_bfd.h"
30 #include "objfiles.h"
31 #include "complaints.h"
32 
33 void
overflow_complaint()34 dwarf2_section_info::overflow_complaint () const
35 {
36   complaint (_("debug info runs off end of %s section"
37 	       " [in module %s]"),
38 	     get_name (), get_file_name ());
39 }
40 
41 struct dwarf2_section_info *
get_containing_section()42 dwarf2_section_info::get_containing_section () const
43 {
44   gdb_assert (is_virtual);
45   return s.containing_section;
46 }
47 
48 struct bfd *
get_bfd_owner()49 dwarf2_section_info::get_bfd_owner () const
50 {
51   const dwarf2_section_info *section = this;
52   if (is_virtual)
53     {
54       section = get_containing_section ();
55       gdb_assert (!section->is_virtual);
56     }
57   gdb_assert (section->s.section != nullptr);
58   return section->s.section->owner;
59 }
60 
61 asection *
get_bfd_section()62 dwarf2_section_info::get_bfd_section () const
63 {
64   const dwarf2_section_info *section = this;
65   if (section->is_virtual)
66     {
67       section = get_containing_section ();
68       gdb_assert (!section->is_virtual);
69     }
70   return section->s.section;
71 }
72 
73 const char *
get_name()74 dwarf2_section_info::get_name () const
75 {
76   asection *sectp = get_bfd_section ();
77 
78   gdb_assert (sectp != NULL);
79   return bfd_section_name (sectp);
80 }
81 
82 const char *
get_file_name()83 dwarf2_section_info::get_file_name () const
84 {
85   bfd *abfd = get_bfd_owner ();
86 
87   gdb_assert (abfd != nullptr);
88   return bfd_get_filename (abfd);
89 }
90 
91 int
get_id()92 dwarf2_section_info::get_id () const
93 {
94   asection *sectp = get_bfd_section ();
95 
96   if (sectp == NULL)
97     return 0;
98   return sectp->id;
99 }
100 
101 int
get_flags()102 dwarf2_section_info::get_flags () const
103 {
104   asection *sectp = get_bfd_section ();
105 
106   gdb_assert (sectp != NULL);
107   return bfd_section_flags (sectp);
108 }
109 
110 bool
empty()111 dwarf2_section_info::empty () const
112 {
113   if (is_virtual)
114     return size == 0;
115   return s.section == NULL || size == 0;
116 }
117 
118 void
read(struct objfile * objfile)119 dwarf2_section_info::read (struct objfile *objfile)
120 {
121   asection *sectp;
122   bfd *abfd;
123   gdb_byte *buf, *retbuf;
124 
125   if (readin)
126     return;
127   buffer = NULL;
128   readin = true;
129 
130   if (empty ())
131     return;
132 
133   sectp = get_bfd_section ();
134 
135   /* If this is a virtual section we need to read in the real one first.  */
136   if (is_virtual)
137     {
138       struct dwarf2_section_info *containing_section =
139 	get_containing_section ();
140 
141       gdb_assert (sectp != NULL);
142       if ((sectp->flags & SEC_RELOC) != 0)
143 	{
144 	  error (_("Dwarf Error: DWP format V2 with relocations is not"
145 		   " supported in section %s [in module %s]"),
146 		 get_name (), get_file_name ());
147 	}
148       containing_section->read (objfile);
149       /* Other code should have already caught virtual sections that don't
150 	 fit.  */
151       gdb_assert (virtual_offset + size <= containing_section->size);
152       /* If the real section is empty or there was a problem reading the
153 	 section we shouldn't get here.  */
154       gdb_assert (containing_section->buffer != NULL);
155       buffer = containing_section->buffer + virtual_offset;
156       return;
157     }
158 
159   /* If the section has relocations, we must read it ourselves.
160      Otherwise we attach it to the BFD.  */
161   if ((sectp->flags & SEC_RELOC) == 0)
162     {
163       buffer = gdb_bfd_map_section (sectp, &size);
164       return;
165     }
166 
167   buf = (gdb_byte *) obstack_alloc (&objfile->objfile_obstack, size);
168   buffer = buf;
169 
170   /* When debugging .o files, we may need to apply relocations; see
171      http://sourceware.org/ml/gdb-patches/2002-04/msg00136.html .
172      We never compress sections in .o files, so we only need to
173      try this when the section is not compressed.  */
174   retbuf = symfile_relocate_debug_section (objfile, sectp, buf);
175   if (retbuf != NULL)
176     {
177       buffer = retbuf;
178       return;
179     }
180 
181   abfd = get_bfd_owner ();
182   gdb_assert (abfd != NULL);
183 
184   if (bfd_seek (abfd, sectp->filepos, SEEK_SET) != 0
185       || bfd_bread (buf, size, abfd) != size)
186     {
187       error (_("Dwarf Error: Can't read DWARF data"
188 	       " in section %s [in module %s]"),
189 	     bfd_section_name (sectp), bfd_get_filename (abfd));
190     }
191 }
192 
193 const char *
read_string(struct objfile * objfile,LONGEST str_offset,const char * form_name)194 dwarf2_section_info::read_string (struct objfile *objfile, LONGEST str_offset,
195 				  const char *form_name)
196 {
197   read (objfile);
198   if (buffer == NULL)
199     {
200       if (get_bfd_section () == nullptr)
201 	error (_("Dwarf Error: %s used without required section"),
202 	       form_name);
203       else
204 	error (_("Dwarf Error: %s used without %s section [in module %s]"),
205 	       form_name, get_name (), get_file_name ());
206     }
207   if (str_offset >= size)
208     error (_("%s pointing outside of %s section [in module %s]"),
209 	   form_name, get_name (), get_file_name ());
210   gdb_assert (HOST_CHAR_BIT == 8);
211   if (buffer[str_offset] == '\0')
212     return NULL;
213   return (const char *) (buffer + str_offset);
214 }
215