daily update
[deliverable/binutils-gdb.git] / bfd / elfcore.h
CommitLineData
252b5132 1/* ELF core file support for BFD.
3193e234 2 Copyright 1995, 1996, 1997, 1998, 2000, 2001, 2002, 2003
7898deda 3 Free Software Foundation, Inc.
252b5132 4
3193e234 5 This file is part of BFD, the Binary File Descriptor library.
252b5132 6
3193e234
NC
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 2 of the License, or
10 (at your option) any later version.
252b5132 11
3193e234
NC
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.
252b5132 16
3193e234
NC
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
252b5132 20
252b5132
RH
21char*
22elf_core_file_failing_command (abfd)
23 bfd *abfd;
24{
25 return elf_tdata (abfd)->core_command;
26}
27
28int
29elf_core_file_failing_signal (abfd)
30 bfd *abfd;
31{
32 return elf_tdata (abfd)->core_signal;
33}
34
b34976b6 35bfd_boolean
252b5132
RH
36elf_core_file_matches_executable_p (core_bfd, exec_bfd)
37 bfd *core_bfd;
38 bfd *exec_bfd;
39{
40 char* corename;
41
3e932841 42 /* xvecs must match if both are ELF files for the same target. */
252b5132
RH
43
44 if (core_bfd->xvec != exec_bfd->xvec)
45 {
46 bfd_set_error (bfd_error_system_call);
b34976b6 47 return FALSE;
252b5132
RH
48 }
49
3e932841 50 /* See if the name in the corefile matches the executable name. */
252b5132
RH
51 corename = elf_tdata (core_bfd)->core_program;
52 if (corename != NULL)
53 {
54 const char* execname = strrchr (exec_bfd->filename, '/');
3193e234 55
252b5132
RH
56 execname = execname ? execname + 1 : exec_bfd->filename;
57
58 if (strcmp(execname, corename) != 0)
b34976b6 59 return FALSE;
252b5132
RH
60 }
61
b34976b6 62 return TRUE;
252b5132
RH
63}
64
252b5132
RH
65/* Core files are simply standard ELF formatted files that partition
66 the file using the execution view of the file (program header table)
67 rather than the linking view. In fact, there is no section header
68 table in a core file.
69
70 The process status information (including the contents of the general
71 register set) and the floating point register set are stored in a
72 segment of type PT_NOTE. We handcraft a couple of extra bfd sections
73 that allow standard bfd access to the general registers (.reg) and the
3193e234 74 floating point registers (.reg2). */
252b5132
RH
75
76const bfd_target *
77elf_core_file_p (abfd)
78 bfd *abfd;
79{
3193e234
NC
80 Elf_External_Ehdr x_ehdr; /* Elf file header, external form. */
81 Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form. */
82 Elf_Internal_Phdr *i_phdrp; /* Elf program header, internal form. */
252b5132
RH
83 unsigned int phindex;
84 struct elf_backend_data *ebd;
ed591155 85 struct bfd_preserve preserve;
dc810e39 86 bfd_size_type amt;
252b5132 87
a7f84125 88 preserve.marker = NULL;
12e1f53e 89
252b5132 90 /* Read in the ELF header in external format. */
dc810e39
AM
91 if (bfd_bread ((PTR) &x_ehdr, (bfd_size_type) sizeof (x_ehdr), abfd)
92 != sizeof (x_ehdr))
252b5132
RH
93 {
94 if (bfd_get_error () != bfd_error_system_call)
a7f84125
AM
95 goto wrong;
96 else
97 goto fail;
252b5132
RH
98 }
99
3e932841 100 /* Check the magic number. */
82e51918 101 if (! elf_file_p (&x_ehdr))
60bcf0fa 102 goto wrong;
252b5132 103
3193e234 104 /* FIXME: Check EI_VERSION here ! */
252b5132 105
3e932841 106 /* Check the address size ("class"). */
252b5132
RH
107 if (x_ehdr.e_ident[EI_CLASS] != ELFCLASS)
108 goto wrong;
109
3e932841 110 /* Check the byteorder. */
252b5132
RH
111 switch (x_ehdr.e_ident[EI_DATA])
112 {
3193e234 113 case ELFDATA2MSB: /* Big-endian. */
252b5132
RH
114 if (! bfd_big_endian (abfd))
115 goto wrong;
116 break;
3193e234 117 case ELFDATA2LSB: /* Little-endian. */
252b5132
RH
118 if (! bfd_little_endian (abfd))
119 goto wrong;
120 break;
121 default:
122 goto wrong;
123 }
124
3e932841 125 /* Give abfd an elf_obj_tdata. */
dc810e39 126 amt = sizeof (struct elf_obj_tdata);
a7f84125
AM
127 preserve.marker = bfd_zalloc (abfd, amt);
128 if (preserve.marker == NULL)
129 goto fail;
130 if (!bfd_preserve_save (abfd, &preserve))
ed591155
AM
131 goto fail;
132
a7f84125
AM
133 elf_tdata (abfd) = preserve.marker;
134
3e932841 135 /* Swap in the rest of the header, now that we have the byte order. */
252b5132
RH
136 i_ehdrp = elf_elfheader (abfd);
137 elf_swap_ehdr_in (abfd, &x_ehdr, i_ehdrp);
138
139#if DEBUG & 1
140 elf_debug_file (i_ehdrp);
141#endif
142
143 ebd = get_elf_backend_data (abfd);
144
145 /* Check that the ELF e_machine field matches what this particular
146 BFD format expects. */
147
148 if (ebd->elf_machine_code != i_ehdrp->e_machine
149 && (ebd->elf_machine_alt1 == 0
150 || i_ehdrp->e_machine != ebd->elf_machine_alt1)
151 && (ebd->elf_machine_alt2 == 0
152 || i_ehdrp->e_machine != ebd->elf_machine_alt2))
153 {
154 const bfd_target * const *target_ptr;
155
156 if (ebd->elf_machine_code != EM_NONE)
157 goto wrong;
158
159 /* This is the generic ELF target. Let it match any ELF target
160 for which we do not have a specific backend. */
161
162 for (target_ptr = bfd_target_vector; *target_ptr != NULL; target_ptr++)
163 {
164 struct elf_backend_data *back;
165
166 if ((*target_ptr)->flavour != bfd_target_elf_flavour)
167 continue;
168 back = (struct elf_backend_data *) (*target_ptr)->backend_data;
3193e234
NC
169 if (back->elf_machine_code == i_ehdrp->e_machine
170 || (back->elf_machine_alt1 != 0
171 && i_ehdrp->e_machine == back->elf_machine_alt1)
172 || (back->elf_machine_alt2 != 0
173 && i_ehdrp->e_machine == back->elf_machine_alt2))
252b5132
RH
174 {
175 /* target_ptr is an ELF backend which matches this
176 object file, so reject the generic ELF target. */
177 goto wrong;
178 }
179 }
180 }
181
182 /* If there is no program header, or the type is not a core file, then
3e932841 183 we are hosed. */
252b5132
RH
184 if (i_ehdrp->e_phoff == 0 || i_ehdrp->e_type != ET_CORE)
185 goto wrong;
186
187 /* Does BFD's idea of the phdr size match the size
188 recorded in the file? */
189 if (i_ehdrp->e_phentsize != sizeof (Elf_External_Phdr))
190 goto wrong;
191
d20966a7 192 /* Move to the start of the program headers. */
dc810e39 193 if (bfd_seek (abfd, (file_ptr) i_ehdrp->e_phoff, SEEK_SET) != 0)
d20966a7 194 goto wrong;
3e932841
KH
195
196 /* Allocate space for the program headers. */
dc810e39
AM
197 amt = sizeof (*i_phdrp) * i_ehdrp->e_phnum;
198 i_phdrp = (Elf_Internal_Phdr *) bfd_alloc (abfd, amt);
252b5132 199 if (!i_phdrp)
0ab2f69a 200 goto fail;
252b5132
RH
201
202 elf_tdata (abfd)->phdr = i_phdrp;
203
3e932841 204 /* Read and convert to internal form. */
252b5132
RH
205 for (phindex = 0; phindex < i_ehdrp->e_phnum; ++phindex)
206 {
207 Elf_External_Phdr x_phdr;
3193e234 208
dc810e39 209 if (bfd_bread ((PTR) &x_phdr, (bfd_size_type) sizeof (x_phdr), abfd)
252b5132 210 != sizeof (x_phdr))
0ab2f69a 211 goto fail;
252b5132
RH
212
213 elf_swap_phdr_in (abfd, &x_phdr, i_phdrp + phindex);
214 }
215
702248bb
JT
216 /* Set the machine architecture. Do this before processing the
217 program headers since we need to know the architecture type
218 when processing the notes of some systems' core files. */
252b5132
RH
219 if (! bfd_default_set_arch_mach (abfd, ebd->arch, 0))
220 {
221 /* It's OK if this fails for the generic target. */
222 if (ebd->elf_machine_code != EM_NONE)
0ab2f69a 223 goto fail;
252b5132
RH
224 }
225
a94cef6a
JT
226 /* Process each program header. */
227 for (phindex = 0; phindex < i_ehdrp->e_phnum; ++phindex)
3193e234
NC
228 if (! bfd_section_from_phdr (abfd, i_phdrp + phindex, (int) phindex))
229 goto fail;
a94cef6a 230
3e932841 231 /* Save the entry point from the ELF header. */
252b5132
RH
232 bfd_get_start_address (abfd) = i_ehdrp->e_entry;
233
279b54a1
MS
234 /* Let the backend double check the format and override global
235 information. */
3193e234
NC
236 if (ebd->elf_backend_object_p
237 && (! (*ebd->elf_backend_object_p) (abfd)))
238 goto wrong;
279b54a1 239
a7f84125 240 bfd_preserve_finish (abfd, &preserve);
252b5132 241 return abfd->xvec;
0ab2f69a
MS
242
243wrong:
12e1f53e
HPN
244 /* There is way too much undoing of half-known state here. The caller,
245 bfd_check_format_matches, really shouldn't iterate on live bfd's to
246 check match/no-match like it does. We have to rely on that a call to
247 bfd_default_set_arch_mach with the previously known mach, undoes what
248 was done by the first bfd_default_set_arch_mach (with mach 0) here.
249 For this to work, only elf-data and the mach may be changed by the
250 target-specific elf_backend_object_p function. Note that saving the
251 whole bfd here and restoring it would be even worse; the first thing
252 you notice is that the cached bfd file position gets out of sync. */
0ab2f69a 253 bfd_set_error (bfd_error_wrong_format);
ed591155 254
0ab2f69a 255fail:
a7f84125
AM
256 if (preserve.marker != NULL)
257 bfd_preserve_restore (abfd, &preserve);
0ab2f69a 258 return NULL;
252b5132 259}
This page took 0.229872 seconds and 4 git commands to generate.