Better ld --fatal-warnings support
[deliverable/binutils-gdb.git] / bfd / elfcore.h
CommitLineData
252b5132 1/* ELF core file support for BFD.
6f2750fe 2 Copyright (C) 1995-2016 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;
b32a5c16 191 file_ptr where = (file_ptr) i_ehdrp->e_shoff;
ecd12bc1
AM
192
193 /* Seek to the section header table in the file. */
b32a5c16 194 if (bfd_seek (abfd, where, SEEK_SET) != 0)
ecd12bc1
AM
195 goto fail;
196
197 /* Read the first section header at index 0, and convert to internal
198 form. */
199 if (bfd_bread (&x_shdr, sizeof (x_shdr), abfd) != sizeof (x_shdr))
200 goto fail;
201 elf_swap_shdr_in (abfd, &x_shdr, &i_shdr);
202
203 if (i_shdr.sh_info != 0)
204 {
205 i_ehdrp->e_phnum = i_shdr.sh_info;
206 if (i_ehdrp->e_phnum != i_shdr.sh_info)
207 goto wrong;
208 }
209 }
210
211 /* Sanity check that we can read all of the program headers.
212 It ought to be good enough to just read the last one. */
213 if (i_ehdrp->e_phnum > 1)
214 {
215 Elf_External_Phdr x_phdr;
216 Elf_Internal_Phdr i_phdr;
b32a5c16 217 file_ptr where;
ecd12bc1
AM
218
219 /* Check that we don't have a totally silly number of
220 program headers. */
221 if (i_ehdrp->e_phnum > (unsigned int) -1 / sizeof (x_phdr)
222 || i_ehdrp->e_phnum > (unsigned int) -1 / sizeof (i_phdr))
223 goto wrong;
224
b32a5c16 225 where = (file_ptr)(i_ehdrp->e_phoff + (i_ehdrp->e_phnum - 1) * sizeof (x_phdr));
ecd12bc1
AM
226 if ((bfd_size_type) where <= i_ehdrp->e_phoff)
227 goto wrong;
228
b32a5c16 229 if (bfd_seek (abfd, where, SEEK_SET) != 0)
ecd12bc1
AM
230 goto fail;
231 if (bfd_bread (&x_phdr, sizeof (x_phdr), abfd) != sizeof (x_phdr))
232 goto fail;
233 }
234
d20966a7 235 /* Move to the start of the program headers. */
dc810e39 236 if (bfd_seek (abfd, (file_ptr) i_ehdrp->e_phoff, SEEK_SET) != 0)
d20966a7 237 goto wrong;
3e932841
KH
238
239 /* Allocate space for the program headers. */
dc810e39 240 amt = sizeof (*i_phdrp) * i_ehdrp->e_phnum;
a50b1753 241 i_phdrp = (Elf_Internal_Phdr *) bfd_alloc (abfd, amt);
252b5132 242 if (!i_phdrp)
0ab2f69a 243 goto fail;
252b5132
RH
244
245 elf_tdata (abfd)->phdr = i_phdrp;
246
3e932841 247 /* Read and convert to internal form. */
252b5132
RH
248 for (phindex = 0; phindex < i_ehdrp->e_phnum; ++phindex)
249 {
250 Elf_External_Phdr x_phdr;
3193e234 251
268b6b39 252 if (bfd_bread (&x_phdr, sizeof (x_phdr), abfd) != sizeof (x_phdr))
0ab2f69a 253 goto fail;
252b5132
RH
254
255 elf_swap_phdr_in (abfd, &x_phdr, i_phdrp + phindex);
256 }
257
702248bb
JT
258 /* Set the machine architecture. Do this before processing the
259 program headers since we need to know the architecture type
260 when processing the notes of some systems' core files. */
5cba516c 261 if (! bfd_default_set_arch_mach (abfd, ebd->arch, 0)
252b5132 262 /* It's OK if this fails for the generic target. */
5cba516c
NC
263 && ebd->elf_machine_code != EM_NONE)
264 goto fail;
265
266 /* Let the backend double check the format and override global
267 information. We do this before processing the program headers
268 to allow the correct machine (as opposed to just the default
269 machine) to be set, making it possible for grok_prstatus and
270 grok_psinfo to rely on the mach setting. */
271 if (ebd->elf_backend_object_p != NULL
272 && ! ebd->elf_backend_object_p (abfd))
273 goto wrong;
252b5132 274
a94cef6a
JT
275 /* Process each program header. */
276 for (phindex = 0; phindex < i_ehdrp->e_phnum; ++phindex)
3193e234
NC
277 if (! bfd_section_from_phdr (abfd, i_phdrp + phindex, (int) phindex))
278 goto fail;
a94cef6a 279
536d0ff4
AM
280 /* Check for core truncation. */
281 {
282 bfd_size_type high = 0;
283 struct stat statbuf;
68ffbac6 284 for (phindex = 0; phindex < i_ehdrp->e_phnum; ++phindex)
536d0ff4
AM
285 {
286 Elf_Internal_Phdr *p = i_phdrp + phindex;
287 if (p->p_filesz)
288 {
289 bfd_size_type current = p->p_offset + p->p_filesz;
290 if (high < current)
291 high = current;
292 }
293 }
294 if (bfd_stat (abfd, &statbuf) == 0)
295 {
296 if ((bfd_size_type) statbuf.st_size < high)
297 {
298 (*_bfd_error_handler)
299 (_("Warning: %B is truncated: expected core file "
300 "size >= %lu, found: %lu."),
301 abfd, (unsigned long) high, (unsigned long) statbuf.st_size);
302 }
303 }
304 }
68ffbac6 305
3e932841 306 /* Save the entry point from the ELF header. */
252b5132 307 bfd_get_start_address (abfd) = i_ehdrp->e_entry;
252b5132 308 return abfd->xvec;
0ab2f69a
MS
309
310wrong:
311 bfd_set_error (bfd_error_wrong_format);
312fail:
0ab2f69a 313 return NULL;
252b5132 314}
This page took 1.303261 seconds and 4 git commands to generate.