1 /* ELF core file support for BFD.
2    Copyright (C) 1995-2020 Free Software Foundation, Inc.
3 
4    This file is part of BFD, the Binary File Descriptor library.
5 
6    This program is free software; you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 3 of the License, or
9    (at your option) any later version.
10 
11    This program is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    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; if not, write to the Free Software
18    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19    MA 02110-1301, USA.  */
20 
21 char*
22 elf_core_file_failing_command (bfd *abfd)
23 {
24   return elf_tdata (abfd)->core->command;
25 }
26 
27 int
28 elf_core_file_failing_signal (bfd *abfd)
29 {
30   return elf_tdata (abfd)->core->signal;
31 }
32 
33 int
34 elf_core_file_pid (bfd *abfd)
35 {
36   return elf_tdata (abfd)->core->pid;
37 }
38 
39 bfd_boolean
40 elf_core_file_matches_executable_p (bfd *core_bfd, bfd *exec_bfd)
41 {
42   char* corename;
43 
44   /* xvecs must match if both are ELF files for the same target.  */
45 
46   if (core_bfd->xvec != exec_bfd->xvec)
47     {
48       bfd_set_error (bfd_error_system_call);
49       return FALSE;
50     }
51 
52   /* If both BFDs have identical build-ids, then they match.  */
53   if (core_bfd->build_id != NULL
54       && exec_bfd->build_id != NULL
55       && core_bfd->build_id->size == exec_bfd->build_id->size
56       && memcmp (core_bfd->build_id->data, exec_bfd->build_id->data,
57 		 core_bfd->build_id->size) == 0)
58     return TRUE;
59 
60   /* See if the name in the corefile matches the executable name.  */
61   corename = elf_tdata (core_bfd)->core->program;
62   if (corename != NULL)
63     {
64       const char* execname = strrchr (exec_bfd->filename, '/');
65 
66       execname = execname ? execname + 1 : exec_bfd->filename;
67 
68       if (strcmp (execname, corename) != 0)
69 	return FALSE;
70     }
71 
72   return TRUE;
73 }
74 
75 /*  Core files are simply standard ELF formatted files that partition
76     the file using the execution view of the file (program header table)
77     rather than the linking view.  In fact, there is no section header
78     table in a core file.
79 
80     The process status information (including the contents of the general
81     register set) and the floating point register set are stored in a
82     segment of type PT_NOTE.  We handcraft a couple of extra bfd sections
83     that allow standard bfd access to the general registers (.reg) and the
84     floating point registers (.reg2).  */
85 
86 const bfd_target *
87 elf_core_file_p (bfd *abfd)
88 {
89   Elf_External_Ehdr x_ehdr;	/* Elf file header, external form.  */
90   Elf_Internal_Ehdr *i_ehdrp;	/* Elf file header, internal form.  */
91   Elf_Internal_Phdr *i_phdrp;	/* Elf program header, internal form.  */
92   unsigned int phindex;
93   const struct elf_backend_data *ebd;
94   bfd_size_type amt;
95 
96   /* Read in the ELF header in external format.  */
97   if (bfd_bread (&x_ehdr, sizeof (x_ehdr), abfd) != sizeof (x_ehdr))
98     {
99       if (bfd_get_error () != bfd_error_system_call)
100 	goto wrong;
101       else
102 	goto fail;
103     }
104 
105   /* Check the magic number.  */
106   if (! elf_file_p (&x_ehdr))
107     goto wrong;
108 
109   /* FIXME: Check EI_VERSION here !  */
110 
111   /* Check the address size ("class").  */
112   if (x_ehdr.e_ident[EI_CLASS] != ELFCLASS)
113     goto wrong;
114 
115   /* Check the byteorder.  */
116   switch (x_ehdr.e_ident[EI_DATA])
117     {
118     case ELFDATA2MSB:		/* Big-endian.  */
119       if (! bfd_big_endian (abfd))
120 	goto wrong;
121       break;
122     case ELFDATA2LSB:		/* Little-endian.  */
123       if (! bfd_little_endian (abfd))
124 	goto wrong;
125       break;
126     default:
127       goto wrong;
128     }
129 
130   /* Give abfd an elf_obj_tdata.  */
131   if (! (*abfd->xvec->_bfd_set_format[bfd_core]) (abfd))
132     goto fail;
133 
134   /* Swap in the rest of the header, now that we have the byte order.  */
135   i_ehdrp = elf_elfheader (abfd);
136   elf_swap_ehdr_in (abfd, &x_ehdr, i_ehdrp);
137 
138 #if DEBUG & 1
139   elf_debug_file (i_ehdrp);
140 #endif
141 
142   ebd = get_elf_backend_data (abfd);
143 
144   /* Check that the ELF e_machine field matches what this particular
145      BFD format expects.  */
146 
147   if (ebd->elf_machine_code != i_ehdrp->e_machine
148       && (ebd->elf_machine_alt1 == 0
149 	  || i_ehdrp->e_machine != ebd->elf_machine_alt1)
150       && (ebd->elf_machine_alt2 == 0
151 	  || i_ehdrp->e_machine != ebd->elf_machine_alt2))
152     {
153       const bfd_target * const *target_ptr;
154 
155       if (ebd->elf_machine_code != EM_NONE)
156 	goto wrong;
157 
158       /* This is the generic ELF target.  Let it match any ELF target
159 	 for which we do not have a specific backend.  */
160 
161       for (target_ptr = bfd_target_vector; *target_ptr != NULL; target_ptr++)
162 	{
163 	  const struct elf_backend_data *back;
164 
165 	  if ((*target_ptr)->flavour != bfd_target_elf_flavour)
166 	    continue;
167 	  back = xvec_get_elf_backend_data (*target_ptr);
168 	  if (back->s->arch_size != ARCH_SIZE)
169 	    continue;
170 	  if (back->elf_machine_code == i_ehdrp->e_machine
171 	      || (back->elf_machine_alt1 != 0
172 		  && i_ehdrp->e_machine == back->elf_machine_alt1)
173 	      || (back->elf_machine_alt2 != 0
174 		  && i_ehdrp->e_machine == back->elf_machine_alt2))
175 	    {
176 	      /* target_ptr is an ELF backend which matches this
177 		 object file, so reject the generic ELF target.  */
178 	      goto wrong;
179 	    }
180 	}
181     }
182 
183   /* If there is no program header, or the type is not a core file, then
184      we are hosed.  */
185   if (i_ehdrp->e_phoff == 0 || i_ehdrp->e_type != ET_CORE)
186     goto wrong;
187 
188   /* Does BFD's idea of the phdr size match the size
189      recorded in the file? */
190   if (i_ehdrp->e_phentsize != sizeof (Elf_External_Phdr))
191     goto wrong;
192 
193   /* If the program header count is PN_XNUM(0xffff), the actual
194      count is in the first section header.  */
195   if (i_ehdrp->e_shoff != 0 && i_ehdrp->e_phnum == PN_XNUM)
196     {
197       Elf_External_Shdr x_shdr;
198       Elf_Internal_Shdr i_shdr;
199       file_ptr where = (file_ptr) i_ehdrp->e_shoff;
200 
201       /* Seek to the section header table in the file.  */
202       if (bfd_seek (abfd, where, SEEK_SET) != 0)
203 	goto fail;
204 
205       /* Read the first section header at index 0, and convert to internal
206 	 form.  */
207       if (bfd_bread (&x_shdr, sizeof (x_shdr), abfd) != sizeof (x_shdr))
208 	goto fail;
209       elf_swap_shdr_in (abfd, &x_shdr, &i_shdr);
210 
211       if (i_shdr.sh_info != 0)
212 	{
213 	  i_ehdrp->e_phnum = i_shdr.sh_info;
214 	  if (i_ehdrp->e_phnum != i_shdr.sh_info)
215 	    goto wrong;
216 	}
217     }
218 
219   /* Sanity check that we can read all of the program headers.
220      It ought to be good enough to just read the last one.  */
221   if (i_ehdrp->e_phnum > 1)
222     {
223       Elf_External_Phdr x_phdr;
224       Elf_Internal_Phdr i_phdr;
225       file_ptr where;
226 
227       /* Check that we don't have a totally silly number of
228 	 program headers.  */
229       if (i_ehdrp->e_phnum > (unsigned int) -1 / sizeof (x_phdr)
230 	  || i_ehdrp->e_phnum > (unsigned int) -1 / sizeof (i_phdr))
231 	goto wrong;
232 
233       where = (file_ptr)(i_ehdrp->e_phoff + (i_ehdrp->e_phnum - 1) * sizeof (x_phdr));
234       if ((bfd_size_type) where <= i_ehdrp->e_phoff)
235 	goto wrong;
236 
237       if (bfd_seek (abfd, where, SEEK_SET) != 0)
238 	goto fail;
239       if (bfd_bread (&x_phdr, sizeof (x_phdr), abfd) != sizeof (x_phdr))
240 	goto fail;
241     }
242 
243   /* Move to the start of the program headers.  */
244   if (bfd_seek (abfd, (file_ptr) i_ehdrp->e_phoff, SEEK_SET) != 0)
245     goto wrong;
246 
247   /* Allocate space for the program headers.  */
248   amt = sizeof (*i_phdrp) * i_ehdrp->e_phnum;
249   i_phdrp = (Elf_Internal_Phdr *) bfd_alloc (abfd, amt);
250   if (!i_phdrp)
251     goto fail;
252 
253   elf_tdata (abfd)->phdr = i_phdrp;
254 
255   /* Read and convert to internal form.  */
256   for (phindex = 0; phindex < i_ehdrp->e_phnum; ++phindex)
257     {
258       Elf_External_Phdr x_phdr;
259 
260       if (bfd_bread (&x_phdr, sizeof (x_phdr), abfd) != sizeof (x_phdr))
261 	goto fail;
262 
263       elf_swap_phdr_in (abfd, &x_phdr, i_phdrp + phindex);
264     }
265 
266   /* Set the machine architecture.  Do this before processing the
267      program headers since we need to know the architecture type
268      when processing the notes of some systems' core files.  */
269   if (! bfd_default_set_arch_mach (abfd, ebd->arch, 0)
270       /* It's OK if this fails for the generic target.  */
271       && ebd->elf_machine_code != EM_NONE)
272     goto fail;
273 
274   /* Let the backend double check the format and override global
275      information.  We do this before processing the program headers
276      to allow the correct machine (as opposed to just the default
277      machine) to be set, making it possible for grok_prstatus and
278      grok_psinfo to rely on the mach setting.  */
279   if (ebd->elf_backend_object_p != NULL
280       && ! ebd->elf_backend_object_p (abfd))
281     goto wrong;
282 
283   /* Process each program header.  */
284   for (phindex = 0; phindex < i_ehdrp->e_phnum; ++phindex)
285     if (! bfd_section_from_phdr (abfd, i_phdrp + phindex, (int) phindex))
286       goto fail;
287 
288   /* Check for core truncation.  */
289   {
290     bfd_size_type high = 0;
291     struct stat statbuf;
292     for (phindex = 0; phindex < i_ehdrp->e_phnum; ++phindex)
293       {
294 	Elf_Internal_Phdr *p = i_phdrp + phindex;
295 	if (p->p_filesz)
296 	  {
297 	    bfd_size_type current = p->p_offset + p->p_filesz;
298 	    if (high < current)
299 	      high = current;
300 	  }
301       }
302     if (bfd_stat (abfd, &statbuf) == 0)
303       {
304 	if ((bfd_size_type) statbuf.st_size < high)
305 	  {
306 	    _bfd_error_handler
307 	      /* xgettext:c-format */
308 	      (_("warning: %pB is truncated: expected core file "
309 		 "size >= %" PRIu64 ", found: %" PRIu64),
310 	       abfd, (uint64_t) high, (uint64_t) statbuf.st_size);
311 	  }
312       }
313   }
314 
315   /* Save the entry point from the ELF header.  */
316   abfd->start_address = i_ehdrp->e_entry;
317   return abfd->xvec;
318 
319 wrong:
320   bfd_set_error (bfd_error_wrong_format);
321 fail:
322   return NULL;
323 }
324 
325 /* Attempt to find a build-id in a core file from the core file BFD.
326    OFFSET is the file offset to a PT_LOAD segment that may contain
327    the build-id note.  Returns TRUE upon success, FALSE otherwise.  */
328 
329 bfd_boolean
330 NAME(_bfd_elf, core_find_build_id)
331   (bfd *abfd,
332    bfd_vma offset)
333 {
334   Elf_External_Ehdr x_ehdr;	/* Elf file header, external form.   */
335   Elf_Internal_Ehdr i_ehdr;	/* Elf file header, internal form.   */
336   Elf_Internal_Phdr *i_phdr;
337   unsigned int i;
338 
339   /* Seek to the position of the segment at OFFSET.  */
340   if (bfd_seek (abfd, offset, SEEK_SET) != 0)
341     goto fail;
342 
343   /* Read in the ELF header in external format.  */
344   if (bfd_bread (&x_ehdr, sizeof (x_ehdr), abfd) != sizeof (x_ehdr))
345     {
346       if (bfd_get_error () != bfd_error_system_call)
347 	goto wrong;
348       else
349 	goto fail;
350     }
351 
352   /* Now check to see if we have a valid ELF file, and one that BFD can
353      make use of.  The magic number must match, the address size ('class')
354      and byte-swapping must match our XVEC entry, and it must have a
355      section header table (FIXME: See comments re sections at top of this
356      file).  */
357   if (! elf_file_p (&x_ehdr)
358       || x_ehdr.e_ident[EI_VERSION] != EV_CURRENT
359       || x_ehdr.e_ident[EI_CLASS] != ELFCLASS)
360     goto wrong;
361 
362   /* Check that file's byte order matches xvec's.  */
363   switch (x_ehdr.e_ident[EI_DATA])
364     {
365     case ELFDATA2MSB:		/* Big-endian.  */
366       if (! bfd_header_big_endian (abfd))
367 	goto wrong;
368       break;
369     case ELFDATA2LSB:		/* Little-endian.  */
370       if (! bfd_header_little_endian (abfd))
371 	goto wrong;
372       break;
373     case ELFDATANONE:		/* No data encoding specified.  */
374     default:			/* Unknown data encoding specified . */
375       goto wrong;
376     }
377 
378   elf_swap_ehdr_in (abfd, &x_ehdr, &i_ehdr);
379 #if DEBUG
380   elf_debug_file (&i_ehdr);
381 #endif
382 
383   if (i_ehdr.e_phentsize != sizeof (Elf_External_Phdr) || i_ehdr.e_phnum == 0)
384     goto fail;
385 
386   /* Read in program headers.  */
387   i_phdr = (Elf_Internal_Phdr *) bfd_alloc2 (abfd, i_ehdr.e_phnum,
388 					     sizeof (*i_phdr));
389   if (i_phdr == NULL)
390     goto fail;
391 
392   if (bfd_seek (abfd, (file_ptr) (offset + i_ehdr.e_phoff), SEEK_SET) != 0)
393     goto fail;
394 
395   /* Read in program headers and parse notes.  */
396   for (i = 0; i < i_ehdr.e_phnum; ++i, ++i_phdr)
397     {
398       Elf_External_Phdr x_phdr;
399 
400       if (bfd_bread (&x_phdr, sizeof (x_phdr), abfd) != sizeof (x_phdr))
401 	goto fail;
402       elf_swap_phdr_in (abfd, &x_phdr, i_phdr);
403 
404       if (i_phdr->p_type == PT_NOTE && i_phdr->p_filesz > 0)
405 	{
406 	  elf_read_notes (abfd, offset + i_phdr->p_offset,
407 			  i_phdr->p_filesz, i_phdr->p_align);
408 	  if (abfd->build_id != NULL)
409 	    return TRUE;
410 	}
411     }
412 
413   /* Having gotten this far, we have a valid ELF section, but no
414      build-id was found.  */
415   goto fail;
416 
417 wrong:
418   bfd_set_error (bfd_error_wrong_format);
419 fail:
420   return FALSE;
421 }
422