]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - bfd/elfcore.h
Update copyright years
[thirdparty/binutils-gdb.git] / bfd / elfcore.h
CommitLineData
252b5132 1/* ELF core file support for BFD.
4b95cf5c 2 Copyright (C) 1995-2014 Free Software Foundation, Inc.
252b5132 3
3193e234 4 This file is part of BFD, the Binary File Descriptor library.
252b5132 5
3193e234
NC
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
cd123cb7 8 the Free Software Foundation; either version 3 of the License, or
3193e234 9 (at your option) any later version.
252b5132 10
3193e234
NC
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.
252b5132 15
3193e234
NC
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
cd123cb7
NC
18 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19 MA 02110-1301, USA. */
252b5132 20
252b5132 21char*
268b6b39 22elf_core_file_failing_command (bfd *abfd)
252b5132 23{
228e534f 24 return elf_tdata (abfd)->core->command;
252b5132
RH
25}
26
27int
268b6b39 28elf_core_file_failing_signal (bfd *abfd)
252b5132 29{
228e534f 30 return elf_tdata (abfd)->core->signal;
252b5132
RH
31}
32
261b8d08
PA
33int
34elf_core_file_pid (bfd *abfd)
35{
228e534f 36 return elf_tdata (abfd)->core->pid;
261b8d08
PA
37}
38
b34976b6 39bfd_boolean
268b6b39 40elf_core_file_matches_executable_p (bfd *core_bfd, bfd *exec_bfd)
252b5132
RH
41{
42 char* corename;
43
3e932841 44 /* xvecs must match if both are ELF files for the same target. */
252b5132
RH
45
46 if (core_bfd->xvec != exec_bfd->xvec)
47 {
48 bfd_set_error (bfd_error_system_call);
b34976b6 49 return FALSE;
252b5132
RH
50 }
51
3e932841 52 /* See if the name in the corefile matches the executable name. */
228e534f 53 corename = elf_tdata (core_bfd)->core->program;
252b5132
RH
54 if (corename != NULL)
55 {
56 const char* execname = strrchr (exec_bfd->filename, '/');
3193e234 57
252b5132
RH
58 execname = execname ? execname + 1 : exec_bfd->filename;
59
268b6b39 60 if (strcmp (execname, corename) != 0)
b34976b6 61 return FALSE;
252b5132
RH
62 }
63
b34976b6 64 return TRUE;
252b5132
RH
65}
66
252b5132
RH
67/* Core files are simply standard ELF formatted files that partition
68 the file using the execution view of the file (program header table)
69 rather than the linking view. In fact, there is no section header
70 table in a core file.
71
72 The process status information (including the contents of the general
73 register set) and the floating point register set are stored in a
74 segment of type PT_NOTE. We handcraft a couple of extra bfd sections
75 that allow standard bfd access to the general registers (.reg) and the
3193e234 76 floating point registers (.reg2). */
252b5132
RH
77
78const bfd_target *
268b6b39 79elf_core_file_p (bfd *abfd)
252b5132 80{
3193e234
NC
81 Elf_External_Ehdr x_ehdr; /* Elf file header, external form. */
82 Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form. */
83 Elf_Internal_Phdr *i_phdrp; /* Elf program header, internal form. */
252b5132 84 unsigned int phindex;
9c5bfbb7 85 const struct elf_backend_data *ebd;
dc810e39 86 bfd_size_type amt;
252b5132
RH
87
88 /* Read in the ELF header in external format. */
268b6b39 89 if (bfd_bread (&x_ehdr, sizeof (x_ehdr), abfd) != sizeof (x_ehdr))
252b5132
RH
90 {
91 if (bfd_get_error () != bfd_error_system_call)
a7f84125
AM
92 goto wrong;
93 else
94 goto fail;
252b5132
RH
95 }
96
3e932841 97 /* Check the magic number. */
82e51918 98 if (! elf_file_p (&x_ehdr))
60bcf0fa 99 goto wrong;
252b5132 100
3193e234 101 /* FIXME: Check EI_VERSION here ! */
252b5132 102
3e932841 103 /* Check the address size ("class"). */
252b5132
RH
104 if (x_ehdr.e_ident[EI_CLASS] != ELFCLASS)
105 goto wrong;
106
3e932841 107 /* Check the byteorder. */
252b5132
RH
108 switch (x_ehdr.e_ident[EI_DATA])
109 {
3193e234 110 case ELFDATA2MSB: /* Big-endian. */
252b5132
RH
111 if (! bfd_big_endian (abfd))
112 goto wrong;
113 break;
3193e234 114 case ELFDATA2LSB: /* Little-endian. */
252b5132
RH
115 if (! bfd_little_endian (abfd))
116 goto wrong;
117 break;
118 default:
119 goto wrong;
120 }
121
0c83546a
AM
122 /* Give abfd an elf_obj_tdata. */
123 if (! (*abfd->xvec->_bfd_set_format[bfd_core]) (abfd))
124 goto fail;
a7f84125 125
3e932841 126 /* Swap in the rest of the header, now that we have the byte order. */
252b5132
RH
127 i_ehdrp = elf_elfheader (abfd);
128 elf_swap_ehdr_in (abfd, &x_ehdr, i_ehdrp);
129
130#if DEBUG & 1
131 elf_debug_file (i_ehdrp);
132#endif
133
134 ebd = get_elf_backend_data (abfd);
135
136 /* Check that the ELF e_machine field matches what this particular
137 BFD format expects. */
138
139 if (ebd->elf_machine_code != i_ehdrp->e_machine
140 && (ebd->elf_machine_alt1 == 0
141 || i_ehdrp->e_machine != ebd->elf_machine_alt1)
142 && (ebd->elf_machine_alt2 == 0
143 || i_ehdrp->e_machine != ebd->elf_machine_alt2))
144 {
145 const bfd_target * const *target_ptr;
146
147 if (ebd->elf_machine_code != EM_NONE)
148 goto wrong;
149
150 /* This is the generic ELF target. Let it match any ELF target
151 for which we do not have a specific backend. */
152
153 for (target_ptr = bfd_target_vector; *target_ptr != NULL; target_ptr++)
154 {
9c5bfbb7 155 const struct elf_backend_data *back;
252b5132
RH
156
157 if ((*target_ptr)->flavour != bfd_target_elf_flavour)
158 continue;
f7231afc 159 back = xvec_get_elf_backend_data (*target_ptr);
11a7ae4f
AM
160 if (back->s->arch_size != ARCH_SIZE)
161 continue;
3193e234
NC
162 if (back->elf_machine_code == i_ehdrp->e_machine
163 || (back->elf_machine_alt1 != 0
164 && i_ehdrp->e_machine == back->elf_machine_alt1)
165 || (back->elf_machine_alt2 != 0
166 && i_ehdrp->e_machine == back->elf_machine_alt2))
252b5132
RH
167 {
168 /* target_ptr is an ELF backend which matches this
169 object file, so reject the generic ELF target. */
170 goto wrong;
171 }
172 }
173 }
174
175 /* If there is no program header, or the type is not a core file, then
3e932841 176 we are hosed. */
252b5132
RH
177 if (i_ehdrp->e_phoff == 0 || i_ehdrp->e_type != ET_CORE)
178 goto wrong;
179
180 /* Does BFD's idea of the phdr size match the size
181 recorded in the file? */
182 if (i_ehdrp->e_phentsize != sizeof (Elf_External_Phdr))
183 goto wrong;
184
ecd12bc1
AM
185 /* If the program header count is PN_XNUM(0xffff), the actual
186 count is in the first section header. */
187 if (i_ehdrp->e_shoff != 0 && i_ehdrp->e_phnum == PN_XNUM)
188 {
189 Elf_External_Shdr x_shdr;
190 Elf_Internal_Shdr i_shdr;
191 bfd_signed_vma where = i_ehdrp->e_shoff;
192
193 if (where != (file_ptr) where)
194 goto wrong;
195
196 /* Seek to the section header table in the file. */
197 if (bfd_seek (abfd, (file_ptr) where, SEEK_SET) != 0)
198 goto fail;
199
200 /* Read the first section header at index 0, and convert to internal
201 form. */
202 if (bfd_bread (&x_shdr, sizeof (x_shdr), abfd) != sizeof (x_shdr))
203 goto fail;
204 elf_swap_shdr_in (abfd, &x_shdr, &i_shdr);
205
206 if (i_shdr.sh_info != 0)
207 {
208 i_ehdrp->e_phnum = i_shdr.sh_info;
209 if (i_ehdrp->e_phnum != i_shdr.sh_info)
210 goto wrong;
211 }
212 }
213
214 /* Sanity check that we can read all of the program headers.
215 It ought to be good enough to just read the last one. */
216 if (i_ehdrp->e_phnum > 1)
217 {
218 Elf_External_Phdr x_phdr;
219 Elf_Internal_Phdr i_phdr;
220 bfd_signed_vma where;
221
222 /* Check that we don't have a totally silly number of
223 program headers. */
224 if (i_ehdrp->e_phnum > (unsigned int) -1 / sizeof (x_phdr)
225 || i_ehdrp->e_phnum > (unsigned int) -1 / sizeof (i_phdr))
226 goto wrong;
227
228 where = i_ehdrp->e_phoff + (i_ehdrp->e_phnum - 1) * sizeof (x_phdr);
229 if (where != (file_ptr) where)
230 goto wrong;
231 if ((bfd_size_type) where <= i_ehdrp->e_phoff)
232 goto wrong;
233
234 if (bfd_seek (abfd, (file_ptr) where, SEEK_SET) != 0)
235 goto fail;
236 if (bfd_bread (&x_phdr, sizeof (x_phdr), abfd) != sizeof (x_phdr))
237 goto fail;
238 }
239
d20966a7 240 /* Move to the start of the program headers. */
dc810e39 241 if (bfd_seek (abfd, (file_ptr) i_ehdrp->e_phoff, SEEK_SET) != 0)
d20966a7 242 goto wrong;
3e932841
KH
243
244 /* Allocate space for the program headers. */
dc810e39 245 amt = sizeof (*i_phdrp) * i_ehdrp->e_phnum;
a50b1753 246 i_phdrp = (Elf_Internal_Phdr *) bfd_alloc (abfd, amt);
252b5132 247 if (!i_phdrp)
0ab2f69a 248 goto fail;
252b5132
RH
249
250 elf_tdata (abfd)->phdr = i_phdrp;
251
3e932841 252 /* Read and convert to internal form. */
252b5132
RH
253 for (phindex = 0; phindex < i_ehdrp->e_phnum; ++phindex)
254 {
255 Elf_External_Phdr x_phdr;
3193e234 256
268b6b39 257 if (bfd_bread (&x_phdr, sizeof (x_phdr), abfd) != sizeof (x_phdr))
0ab2f69a 258 goto fail;
252b5132
RH
259
260 elf_swap_phdr_in (abfd, &x_phdr, i_phdrp + phindex);
261 }
262
702248bb
JT
263 /* Set the machine architecture. Do this before processing the
264 program headers since we need to know the architecture type
265 when processing the notes of some systems' core files. */
5cba516c 266 if (! bfd_default_set_arch_mach (abfd, ebd->arch, 0)
252b5132 267 /* It's OK if this fails for the generic target. */
5cba516c
NC
268 && ebd->elf_machine_code != EM_NONE)
269 goto fail;
270
271 /* Let the backend double check the format and override global
272 information. We do this before processing the program headers
273 to allow the correct machine (as opposed to just the default
274 machine) to be set, making it possible for grok_prstatus and
275 grok_psinfo to rely on the mach setting. */
276 if (ebd->elf_backend_object_p != NULL
277 && ! ebd->elf_backend_object_p (abfd))
278 goto wrong;
252b5132 279
a94cef6a
JT
280 /* Process each program header. */
281 for (phindex = 0; phindex < i_ehdrp->e_phnum; ++phindex)
3193e234
NC
282 if (! bfd_section_from_phdr (abfd, i_phdrp + phindex, (int) phindex))
283 goto fail;
a94cef6a 284
536d0ff4
AM
285 /* Check for core truncation. */
286 {
287 bfd_size_type high = 0;
288 struct stat statbuf;
68ffbac6 289 for (phindex = 0; phindex < i_ehdrp->e_phnum; ++phindex)
536d0ff4
AM
290 {
291 Elf_Internal_Phdr *p = i_phdrp + phindex;
292 if (p->p_filesz)
293 {
294 bfd_size_type current = p->p_offset + p->p_filesz;
295 if (high < current)
296 high = current;
297 }
298 }
299 if (bfd_stat (abfd, &statbuf) == 0)
300 {
301 if ((bfd_size_type) statbuf.st_size < high)
302 {
303 (*_bfd_error_handler)
304 (_("Warning: %B is truncated: expected core file "
305 "size >= %lu, found: %lu."),
306 abfd, (unsigned long) high, (unsigned long) statbuf.st_size);
307 }
308 }
309 }
68ffbac6 310
3e932841 311 /* Save the entry point from the ELF header. */
252b5132 312 bfd_get_start_address (abfd) = i_ehdrp->e_entry;
252b5132 313 return abfd->xvec;
0ab2f69a
MS
314
315wrong:
316 bfd_set_error (bfd_error_wrong_format);
317fail:
0ab2f69a 318 return NULL;
252b5132 319}