Add irix4.h
[deliverable/binutils-gdb.git] / bfd / elf.c
1 /* ELF support for BFD.
2 Copyright (C) 1991 Free Software Foundation, Inc.
3
4 Written by Fred Fish @ Cygnus Support, from information published
5 in "UNIX System V Release 4, Programmers Guide: ANSI C and
6 Programming Support Tools".
7
8 This file is part of BFD, the Binary File Descriptor library.
9
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 2 of the License, or
13 (at your option) any later version.
14
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
19
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
23
24
25 /****************************************
26
27 WARNING
28
29 This is only a partial ELF implementation,
30 incorporating only those parts that are
31 required to get gdb up and running. It is
32 expected that it will be expanded to a full
33 ELF implementation at some future date.
34
35 Unimplemented stubs call abort() to ensure
36 that they get proper attention if they are
37 ever called. The stubs are here since
38 this version was hacked from the COFF
39 version, and thus they will probably
40 go away or get expanded appropriately in a
41 future version.
42
43 fnf@cygnus.com
44
45 *****************************************/
46
47
48 /* Problems and other issues to resolve.
49
50 (1) BFD expects there to be some fixed number of "sections" in
51 the object file. I.E. there is a "section_count" variable in the
52 bfd structure which contains the number of sections. However, ELF
53 supports multiple "views" of a file. In particular, with current
54 implementations, executable files typically have two tables, a
55 program header table and a section header table, both of which
56 partition the executable.
57
58 In ELF-speak, the "linking view" of the file uses the section header
59 table to access "sections" within the file, and the "execution view"
60 uses the program header table to access "segments" within the file.
61 "Segments" typically may contain all the data from one or more
62 "sections".
63
64 Note that the section header table is optional in ELF executables,
65 but it is this information that is most useful to gdb. If the
66 section header table is missing, then gdb should probably try
67 to make do with the program header table. (FIXME)
68
69 */
70
71 #include "bfd.h"
72 #include "sysdep.h"
73 #include "libbfd.h"
74 #include "obstack.h"
75 #include "elf/common.h"
76 #include "elf/internal.h"
77 #include "elf/external.h"
78
79 #ifdef HAVE_PROCFS /* Some core file support requires host /proc files */
80 #include <sys/procfs.h>
81 #else
82 #define bfd_prstatus(abfd, descdata, descsz, filepos) /* Define away */
83 #define bfd_fpregset(abfd, descdata, descsz, filepos) /* Define away */
84 #define bfd_prpsinfo(abfd, descdata, descsz, filepos) /* Define away */
85 #endif
86
87 /* Forward data declarations */
88
89 extern bfd_target elf_little_vec, elf_big_vec;
90
91 /* Currently the elf_symbol_type struct just contains the generic bfd
92 symbol structure. */
93
94 typedef struct
95 {
96 asymbol symbol;
97 } elf_symbol_type;
98
99 /* Some private data is stashed away for future use using the tdata pointer
100 in the bfd structure. This information is different for ELF core files
101 and other ELF files. */
102
103 typedef struct elf_core_tdata_struct
104 {
105 void *prstatus; /* The raw /proc prstatus structure */
106 void *prpsinfo; /* The raw /proc prpsinfo structure */
107 } elf_core_tdata;
108
109 #define core_prpsinfo(bfd) (((bfd)->tdata.elf_core_data) -> prpsinfo)
110 #define core_prstatus(bfd) (((bfd)->tdata.elf_core_data) -> prstatus)
111
112
113 typedef struct elf_obj_tdata_struct
114 {
115 file_ptr symtab_filepos; /* Offset to start of ELF symtab section */
116 long symtab_filesz; /* Size of ELF symtab section */
117 file_ptr strtab_filepos; /* Offset to start of ELF string tbl section */
118 long strtab_filesz; /* Size of ELF string tbl section */
119 } elf_obj_tdata;
120
121 #define elf_tdata(bfd) ((bfd) -> tdata.elf_obj_data)
122 #define elf_symtab_filepos(bfd) (elf_tdata(bfd) -> symtab_filepos)
123 #define elf_symtab_filesz(bfd) (elf_tdata(bfd) -> symtab_filesz)
124 #define elf_strtab_filepos(bfd) (elf_tdata(bfd) -> strtab_filepos)
125 #define elf_strtab_filesz(bfd) (elf_tdata(bfd) -> strtab_filesz)
126
127 /* Translate an ELF symbol in external format into an ELF symbol in internal
128 format. */
129
130 static void
131 DEFUN(elf_swap_symbol_in,(abfd, src, dst),
132 bfd *abfd AND
133 Elf_External_Sym *src AND
134 Elf_Internal_Sym *dst)
135 {
136 dst -> st_name = bfd_h_get_32 (abfd, (bfd_byte *) src -> st_name);
137 dst -> st_value = bfd_h_get_32 (abfd, (bfd_byte *) src -> st_value);
138 dst -> st_size = bfd_h_get_32 (abfd, (bfd_byte *) src -> st_size);
139 dst -> st_info = bfd_h_get_8 (abfd, (bfd_byte *) src -> st_info);
140 dst -> st_other = bfd_h_get_8 (abfd, (bfd_byte *) src -> st_other);
141 dst -> st_shndx = bfd_h_get_16 (abfd, (bfd_byte *) src -> st_shndx);
142 }
143
144
145 /* Translate an ELF file header in external format into an ELF file header in
146 internal format. */
147
148 static void
149 DEFUN(elf_swap_ehdr_in,(abfd, src, dst),
150 bfd *abfd AND
151 Elf_External_Ehdr *src AND
152 Elf_Internal_Ehdr *dst)
153 {
154 memcpy (dst -> e_ident, src -> e_ident, EI_NIDENT);
155 dst -> e_type = bfd_h_get_16 (abfd, (bfd_byte *) src -> e_type);
156 dst -> e_machine = bfd_h_get_16 (abfd, (bfd_byte *) src -> e_machine);
157 dst -> e_version = bfd_h_get_32 (abfd, (bfd_byte *) src -> e_version);
158 dst -> e_entry = bfd_h_get_32 (abfd, (bfd_byte *) src -> e_entry);
159 dst -> e_phoff = bfd_h_get_32 (abfd, (bfd_byte *) src -> e_phoff);
160 dst -> e_shoff = bfd_h_get_32 (abfd, (bfd_byte *) src -> e_shoff);
161 dst -> e_flags = bfd_h_get_32 (abfd, (bfd_byte *) src -> e_flags);
162 dst -> e_ehsize = bfd_h_get_16 (abfd, (bfd_byte *) src -> e_ehsize);
163 dst -> e_phentsize = bfd_h_get_16 (abfd, (bfd_byte *) src -> e_phentsize);
164 dst -> e_phnum = bfd_h_get_16 (abfd, (bfd_byte *) src -> e_phnum);
165 dst -> e_shentsize = bfd_h_get_16 (abfd, (bfd_byte *) src -> e_shentsize);
166 dst -> e_shnum = bfd_h_get_16 (abfd, (bfd_byte *) src -> e_shnum);
167 dst -> e_shstrndx = bfd_h_get_16 (abfd, (bfd_byte *) src -> e_shstrndx);
168 }
169
170
171 /* Translate an ELF section header table entry in external format into an
172 ELF section header table entry in internal format. */
173
174 static void
175 DEFUN(elf_swap_shdr_in,(abfd, src, dst),
176 bfd *abfd AND
177 Elf_External_Shdr *src AND
178 Elf_Internal_Shdr *dst)
179 {
180 dst -> sh_name = bfd_h_get_32 (abfd, (bfd_byte *) src -> sh_name);
181 dst -> sh_type = bfd_h_get_32 (abfd, (bfd_byte *) src -> sh_type);
182 dst -> sh_flags = bfd_h_get_32 (abfd, (bfd_byte *) src -> sh_flags);
183 dst -> sh_addr = bfd_h_get_32 (abfd, (bfd_byte *) src -> sh_addr);
184 dst -> sh_offset = bfd_h_get_32 (abfd, (bfd_byte *) src -> sh_offset);
185 dst -> sh_size = bfd_h_get_32 (abfd, (bfd_byte *) src -> sh_size);
186 dst -> sh_link = bfd_h_get_32 (abfd, (bfd_byte *) src -> sh_link);
187 dst -> sh_info = bfd_h_get_32 (abfd, (bfd_byte *) src -> sh_info);
188 dst -> sh_addralign = bfd_h_get_32 (abfd, (bfd_byte *) src -> sh_addralign);
189 dst -> sh_entsize = bfd_h_get_32 (abfd, (bfd_byte *) src -> sh_entsize);
190 }
191
192
193 /* Translate an ELF program header table entry in external format into an
194 ELF program header table entry in internal format. */
195
196 static void
197 DEFUN(elf_swap_phdr_in,(abfd, src, dst),
198 bfd *abfd AND
199 Elf_External_Phdr *src AND
200 Elf_Internal_Phdr *dst)
201 {
202 dst -> p_type = bfd_h_get_32 (abfd, (bfd_byte *) src -> p_type);
203 dst -> p_offset = bfd_h_get_32 (abfd, (bfd_byte *) src -> p_offset);
204 dst -> p_vaddr = bfd_h_get_32 (abfd, (bfd_byte *) src -> p_vaddr);
205 dst -> p_paddr = bfd_h_get_32 (abfd, (bfd_byte *) src -> p_paddr);
206 dst -> p_filesz = bfd_h_get_32 (abfd, (bfd_byte *) src -> p_filesz);
207 dst -> p_memsz = bfd_h_get_32 (abfd, (bfd_byte *) src -> p_memsz);
208 dst -> p_flags = bfd_h_get_32 (abfd, (bfd_byte *) src -> p_flags);
209 dst -> p_align = bfd_h_get_32 (abfd, (bfd_byte *) src -> p_align);
210 }
211
212
213 /* Create a new bfd section from an ELF section header. */
214
215 static boolean
216 DEFUN(bfd_section_from_shdr, (abfd, hdr, shstrtab),
217 bfd *abfd AND
218 Elf_Internal_Shdr *hdr AND
219 char *shstrtab)
220 {
221 asection *newsect;
222 char *name;
223
224 name = hdr -> sh_name ? shstrtab + hdr -> sh_name : "unnamed";
225 newsect = bfd_make_section (abfd, name);
226 if (!newsect) return false;
227 newsect -> vma = hdr -> sh_addr;
228 newsect -> _raw_size = hdr -> sh_size;
229 if (!(hdr -> sh_type == SHT_NOBITS))
230 {
231 newsect -> filepos = hdr -> sh_offset;
232 newsect -> flags |= SEC_HAS_CONTENTS;
233 }
234 if (hdr -> sh_flags & SHF_ALLOC)
235 {
236 newsect -> flags |= SEC_ALLOC;
237 if (hdr -> sh_type != SHT_NOBITS)
238 {
239 newsect -> flags |= SEC_LOAD;
240 }
241 }
242 if (!(hdr -> sh_flags & SHF_WRITE))
243 {
244 newsect -> flags |= SEC_READONLY;
245 }
246 if (hdr -> sh_flags & SHF_EXECINSTR)
247 {
248 newsect -> flags |= SEC_CODE; /* FIXME: may only contain SOME code */
249 }
250 else
251 {
252 newsect -> flags |= SEC_DATA;
253 }
254 if (hdr -> sh_type == SHT_SYMTAB)
255 {
256 abfd -> flags |= HAS_SYMS;
257 }
258
259 return (true);
260 }
261
262 /* Create a new bfd section from an ELF program header.
263
264 Since program segments have no names, we generate a synthetic name
265 of the form segment<NUM>, where NUM is generally the index in the
266 program header table. For segments that are split (see below) we
267 generate the names segment<NUM>a and segment<NUM>b.
268
269 Note that some program segments may have a file size that is different than
270 (less than) the memory size. All this means is that at execution the
271 system must allocate the amount of memory specified by the memory size,
272 but only initialize it with the first "file size" bytes read from the
273 file. This would occur for example, with program segments consisting
274 of combined data+bss.
275
276 To handle the above situation, this routine generates TWO bfd sections
277 for the single program segment. The first has the length specified by
278 the file size of the segment, and the second has the length specified
279 by the difference between the two sizes. In effect, the segment is split
280 into it's initialized and uninitialized parts.
281
282 */
283
284 static boolean
285 DEFUN(bfd_section_from_phdr, (abfd, hdr, index),
286 bfd *abfd AND
287 Elf_Internal_Phdr *hdr AND
288 int index)
289 {
290 asection *newsect;
291 char *name;
292 char namebuf[64];
293 int split;
294
295 split = ((hdr -> p_memsz > 0) &&
296 (hdr -> p_filesz > 0) &&
297 (hdr -> p_memsz > hdr -> p_filesz));
298 sprintf (namebuf, split ? "segment%da" : "segment%d", index);
299 name = bfd_alloc (abfd, strlen (namebuf) + 1);
300 (void) strcpy (name, namebuf);
301 newsect = bfd_make_section (abfd, name);
302 newsect -> vma = hdr -> p_vaddr;
303 newsect -> _raw_size = hdr -> p_filesz;
304 newsect -> filepos = hdr -> p_offset;
305 newsect -> flags |= SEC_HAS_CONTENTS;
306 if (hdr -> p_type == PT_LOAD)
307 {
308 newsect -> flags |= SEC_ALLOC;
309 newsect -> flags |= SEC_LOAD;
310 if (hdr -> p_flags & PF_X)
311 {
312 /* FIXME: all we known is that it has execute PERMISSION,
313 may be data. */
314 newsect -> flags |= SEC_CODE;
315 }
316 }
317 if (!(hdr -> p_flags & PF_W))
318 {
319 newsect -> flags |= SEC_READONLY;
320 }
321
322 if (split)
323 {
324 sprintf (namebuf, "segment%db", index);
325 name = bfd_alloc (abfd, strlen (namebuf) + 1);
326 (void) strcpy (name, namebuf);
327 newsect = bfd_make_section (abfd, name);
328 newsect -> vma = hdr -> p_vaddr + hdr -> p_filesz;
329 newsect -> _raw_size = hdr -> p_memsz - hdr -> p_filesz;
330 if (hdr -> p_type == PT_LOAD)
331 {
332 newsect -> flags |= SEC_ALLOC;
333 if (hdr -> p_flags & PF_X)
334 {
335 newsect -> flags |= SEC_CODE;
336 }
337 }
338 if (!(hdr -> p_flags & PF_W))
339 {
340 newsect -> flags |= SEC_READONLY;
341 }
342 }
343
344 return (true);
345 }
346
347 #ifdef HAVE_PROCFS
348
349 static void
350 DEFUN(bfd_prstatus,(abfd, descdata, descsz, filepos),
351 bfd *abfd AND
352 char *descdata AND
353 int descsz AND
354 long filepos)
355 {
356 asection *newsect;
357
358 if (descsz == sizeof (prstatus_t))
359 {
360 newsect = bfd_make_section (abfd, ".reg");
361 newsect -> _raw_size = sizeof (gregset_t);
362 newsect -> filepos = filepos + (long) (((prstatus_t *)0) -> pr_reg);
363 newsect -> flags = SEC_ALLOC | SEC_HAS_CONTENTS;
364 newsect -> alignment_power = 2;
365 if ((core_prstatus (abfd) = bfd_alloc (abfd, descsz)) != NULL)
366 {
367 memcpy (core_prstatus (abfd), descdata, descsz);
368 }
369 }
370 }
371
372 /* Stash a copy of the prpsinfo structure away for future use. */
373
374 static void
375 DEFUN(bfd_prpsinfo,(abfd, descdata, descsz, filepos),
376 bfd *abfd AND
377 char *descdata AND
378 int descsz AND
379 long filepos)
380 {
381 asection *newsect;
382
383 if (descsz == sizeof (prpsinfo_t))
384 {
385 if ((core_prpsinfo (abfd) = bfd_alloc (abfd, descsz)) != NULL)
386 {
387 bcopy (descdata, core_prpsinfo (abfd), descsz);
388 }
389 }
390 }
391
392 static void
393 DEFUN(bfd_fpregset,(abfd, descdata, descsz, filepos),
394 bfd *abfd AND
395 char *descdata AND
396 int descsz AND
397 long filepos)
398 {
399 asection *newsect;
400
401 if (descsz == sizeof (fpregset_t))
402 {
403 newsect = bfd_make_section (abfd, ".reg2");
404 newsect -> _raw_size = sizeof (fpregset_t);
405 newsect -> filepos = filepos;
406 newsect -> flags = SEC_ALLOC | SEC_HAS_CONTENTS;
407 newsect -> alignment_power = 2;
408 }
409 }
410
411 #endif /* HAVE_PROCFS */
412
413 /* Return a pointer to the args (including the command name) that were
414 seen by the program that generated the core dump. Note that for
415 some reason, a spurious space is tacked onto the end of the args
416 in some (at least one anyway) implementations, so strip it off if
417 it exists. */
418
419 char *
420 DEFUN(elf_core_file_failing_command, (abfd),
421 bfd *abfd)
422 {
423 #ifdef HAVE_PROCFS
424 if (core_prpsinfo (abfd))
425 {
426 prpsinfo_t *p = core_prpsinfo (abfd);
427 char *scan = p -> pr_psargs;
428 while (*scan++) {;}
429 scan -= 2;
430 if ((scan > p -> pr_psargs) && (*scan == ' '))
431 {
432 *scan = '\000';
433 }
434 return (p -> pr_psargs);
435 }
436 #endif
437 return (NULL);
438 }
439
440 /* Return the number of the signal that caused the core dump. Presumably,
441 since we have a core file, we got a signal of some kind, so don't bother
442 checking the other process status fields, just return the signal number.
443 */
444
445 static int
446 DEFUN(elf_core_file_failing_signal, (abfd),
447 bfd *abfd)
448 {
449 #ifdef HAVE_PROCFS
450 if (core_prstatus (abfd))
451 {
452 return (((prstatus_t *)(core_prstatus (abfd))) -> pr_cursig);
453 }
454 #endif
455 return (-1);
456 }
457
458 /* Check to see if the core file could reasonably be expected to have
459 come for the current executable file. Note that by default we return
460 true unless we find something that indicates that there might be a
461 problem.
462 */
463
464 static boolean
465 DEFUN(elf_core_file_matches_executable_p, (core_bfd, exec_bfd),
466 bfd *core_bfd AND
467 bfd *exec_bfd)
468 {
469 #ifdef HAVE_PROCFS
470 char *corename;
471 char *execname;
472 #endif
473
474 /* First, xvecs must match since both are ELF files for the same target. */
475
476 if (core_bfd->xvec != exec_bfd->xvec)
477 {
478 bfd_error = system_call_error;
479 return (false);
480 }
481
482 #ifdef HAVE_PROCFS
483
484 /* If no prpsinfo, just return true. Otherwise, grab the last component
485 of the exec'd pathname from the prpsinfo. */
486
487 if (core_prpsinfo (core_bfd))
488 {
489 corename = (((struct prpsinfo *) core_prpsinfo (core_bfd)) -> pr_fname);
490 }
491 else
492 {
493 return (true);
494 }
495
496 /* Find the last component of the executable pathname. */
497
498 if ((execname = strrchr (exec_bfd -> filename, '/')) != NULL)
499 {
500 execname++;
501 }
502 else
503 {
504 execname = (char *) exec_bfd -> filename;
505 }
506
507 /* See if they match */
508
509 return (strcmp (execname, corename) ? false : true);
510
511 #else
512
513 return (true);
514
515 #endif /* HAVE_PROCFS */
516 }
517
518 /* ELF core files contain a segment of type PT_NOTE, that holds much of
519 the information that would normally be available from the /proc interface
520 for the process, at the time the process dumped core. Currently this
521 includes copies of the prstatus, prpsinfo, and fpregset structures.
522
523 Since these structures are potentially machine dependent in size and
524 ordering, bfd provides two levels of support for them. The first level,
525 available on all machines since it does not require that the host
526 have /proc support or the relevant include files, is to create a bfd
527 section for each of the prstatus, prpsinfo, and fpregset structures,
528 without any interpretation of their contents. With just this support,
529 the bfd client will have to interpret the structures itself. Even with
530 /proc support, it might want these full structures for it's own reasons.
531
532 In the second level of support, where HAVE_PROCFS is defined, bfd will
533 pick apart the structures to gather some additional information that
534 clients may want, such as the general register set, the name of the
535 exec'ed file and its arguments, the signal (if any) that caused the
536 core dump, etc.
537
538 */
539
540 static boolean
541 DEFUN(elf_corefile_note, (abfd, hdr),
542 bfd *abfd AND
543 Elf_Internal_Phdr *hdr)
544 {
545 Elf_External_Note *x_note_p; /* Elf note, external form */
546 Elf_Internal_Note i_note; /* Elf note, internal form */
547 char *buf = NULL; /* Entire note segment contents */
548 char *namedata; /* Name portion of the note */
549 char *descdata; /* Descriptor portion of the note */
550 char *sectname; /* Name to use for new section */
551 long filepos; /* File offset to descriptor data */
552 asection *newsect;
553
554 if (hdr -> p_filesz > 0
555 && (buf = (char *) bfd_xmalloc (hdr -> p_filesz)) != NULL
556 && bfd_seek (abfd, hdr -> p_offset, SEEK_SET) != -1L
557 && bfd_read ((PTR) buf, hdr -> p_filesz, 1, abfd) == hdr -> p_filesz)
558 {
559 x_note_p = (Elf_External_Note *) buf;
560 while ((char *) x_note_p < (buf + hdr -> p_filesz))
561 {
562 i_note.namesz = bfd_h_get_32 (abfd, (bfd_byte *) x_note_p -> namesz);
563 i_note.descsz = bfd_h_get_32 (abfd, (bfd_byte *) x_note_p -> descsz);
564 i_note.type = bfd_h_get_32 (abfd, (bfd_byte *) x_note_p -> type);
565 namedata = x_note_p -> name;
566 descdata = namedata + BFD_ALIGN (i_note.namesz, 4);
567 filepos = hdr -> p_offset + (descdata - buf);
568 switch (i_note.type) {
569 case NT_PRSTATUS:
570 /* process descdata as prstatus info */
571 bfd_prstatus (abfd, descdata, i_note.descsz, filepos);
572 sectname = ".prstatus";
573 break;
574 case NT_FPREGSET:
575 /* process descdata as fpregset info */
576 bfd_fpregset (abfd, descdata, i_note.descsz, filepos);
577 sectname = ".fpregset";
578 break;
579 case NT_PRPSINFO:
580 /* process descdata as prpsinfo */
581 bfd_prpsinfo (abfd, descdata, i_note.descsz, filepos);
582 sectname = ".prpsinfo";
583 break;
584 default:
585 /* Unknown descriptor, just ignore it. */
586 sectname = NULL;
587 break;
588 }
589 if (sectname != NULL)
590 {
591 newsect = bfd_make_section (abfd, sectname);
592 newsect -> _raw_size = i_note.descsz;
593 newsect -> filepos = filepos;
594 newsect -> flags = SEC_ALLOC | SEC_HAS_CONTENTS;
595 newsect -> alignment_power = 2;
596 }
597 x_note_p = (Elf_External_Note *)
598 (descdata + BFD_ALIGN (i_note.descsz, 4));
599 }
600 }
601 if (buf != NULL)
602 {
603 free (buf);
604 }
605 return true;
606
607 }
608
609
610 /* Read a specified number of bytes at a specified offset in an ELF
611 file, into a newly allocated buffer, and return a pointer to the
612 buffer. */
613
614 static char *
615 DEFUN(elf_read, (abfd, offset, size),
616 bfd *abfd AND
617 long offset AND
618 int size)
619 {
620 char *buf;
621
622 if ((buf = bfd_alloc (abfd, size)) == NULL)
623 {
624 bfd_error = no_memory;
625 return (NULL);
626 }
627 if (bfd_seek (abfd, offset, SEEK_SET) == -1)
628 {
629 bfd_error = system_call_error;
630 return (NULL);
631 }
632 if (bfd_read ((PTR) buf, size, 1, abfd) != size)
633 {
634 bfd_error = system_call_error;
635 return (NULL);
636 }
637 return (buf);
638 }
639
640 /* Begin processing a given object.
641
642 First we validate the file by reading in the ELF header and checking
643 the magic number.
644
645 */
646
647 static bfd_target *
648 DEFUN (elf_object_p, (abfd), bfd *abfd)
649 {
650 Elf_External_Ehdr x_ehdr; /* Elf file header, external form */
651 Elf_Internal_Ehdr i_ehdr; /* Elf file header, internal form */
652 Elf_External_Shdr x_shdr; /* Section header table entry, external form */
653 Elf_Internal_Shdr *i_shdrp; /* Section header table, internal form */
654 int shindex;
655 char *shstrtab; /* Internal copy of section header stringtab */
656 int shstrtabsize; /* Size of section header string table */
657 Elf_Off offset; /* Temp place to stash file offsets */
658
659 /* Read in the ELF header in external format. */
660
661 if (bfd_read ((PTR) &x_ehdr, sizeof (x_ehdr), 1, abfd) != sizeof (x_ehdr))
662 {
663 bfd_error = system_call_error;
664 return (NULL);
665 }
666
667 /* Now check to see if we have a valid ELF file, and one that BFD can
668 make use of. The magic number must match, the address size ('class')
669 and byte-swapping must match our XVEC entry, and it must have a
670 section header table (FIXME: See comments re sections at top of this
671 file). */
672
673 if (x_ehdr.e_ident[EI_MAG0] != ELFMAG0 ||
674 x_ehdr.e_ident[EI_MAG1] != ELFMAG1 ||
675 x_ehdr.e_ident[EI_MAG2] != ELFMAG2 ||
676 x_ehdr.e_ident[EI_MAG3] != ELFMAG3)
677 {
678 wrong:
679 bfd_error = wrong_format;
680 return (NULL);
681 }
682
683 /* FIXME, Check EI_VERSION here ! */
684
685 switch (x_ehdr.e_ident[EI_CLASS]) {
686 case ELFCLASSNONE: /* address size not specified */
687 goto wrong; /* No support if can't tell address size */
688 case ELFCLASS32: /* 32-bit addresses */
689 break;
690 case ELFCLASS64: /* 64-bit addresses */
691 goto wrong; /* FIXME: 64 bits not yet supported */
692 default:
693 goto wrong; /* No support if unknown address class */
694 }
695
696 /* Switch xvec to match the specified byte order. */
697 switch (x_ehdr.e_ident[EI_DATA]) {
698 case ELFDATA2MSB: /* Big-endian */
699 if (!abfd->xvec->header_byteorder_big_p)
700 goto wrong;
701 break;
702 case ELFDATA2LSB: /* Little-endian */
703 if (abfd->xvec->header_byteorder_big_p)
704 goto wrong;
705 break;
706 case ELFDATANONE: /* No data encoding specified */
707 default: /* Unknown data encoding specified */
708 goto wrong;
709 }
710
711 /* Allocate an instance of the elf_obj_tdata structure and hook it up to
712 the tdata pointer in the bfd. */
713
714 if ((abfd -> tdata.elf_obj_data =
715 (elf_obj_tdata*) bfd_zalloc (abfd, sizeof (elf_obj_tdata)))
716 == NULL)
717 {
718 bfd_error = no_memory;
719 return (NULL);
720 }
721
722 /* Now that we know the byte order, swap in the rest of the header */
723 elf_swap_ehdr_in (abfd, &x_ehdr, &i_ehdr);
724
725 /* If there is no section header table, we're hosed. */
726 if (i_ehdr.e_shoff == 0)
727 goto wrong;
728
729 if (i_ehdr.e_type == ET_EXEC || i_ehdr.e_type == ET_DYN)
730 {
731 abfd -> flags |= EXEC_P;
732 }
733
734 /* Allocate space for copies of the section header table in external
735 and internal form, seek to the section header table in the file,
736 read it in, and convert it to internal form. As a simple sanity
737 check, verify that the what BFD thinks is the size of each section
738 header table entry actually matches the size recorded in the file. */
739
740 if (i_ehdr.e_shentsize != sizeof (x_shdr))
741 goto wrong;
742 if ((i_shdrp = (Elf_Internal_Shdr *)
743 bfd_alloc (abfd, sizeof (*i_shdrp) * i_ehdr.e_shnum)) == NULL)
744 {
745 bfd_error = no_memory;
746 return (NULL);
747 }
748 if (bfd_seek (abfd, i_ehdr.e_shoff, SEEK_SET) == -1)
749 {
750 bfd_error = system_call_error;
751 return (NULL);
752 }
753 for (shindex = 0; shindex < i_ehdr.e_shnum; shindex++)
754 {
755 if (bfd_read ((PTR) &x_shdr, sizeof (x_shdr), 1, abfd)
756 != sizeof (x_shdr))
757 {
758 bfd_error = system_call_error;
759 return (NULL);
760 }
761 elf_swap_shdr_in (abfd, &x_shdr, i_shdrp + shindex);
762 }
763
764 /* Read in the string table containing the names of the sections. We
765 will need the base pointer to this table later. */
766
767 shstrtabsize = i_shdrp[i_ehdr.e_shstrndx].sh_size;
768 offset = i_shdrp[i_ehdr.e_shstrndx].sh_offset;
769 if ((shstrtab = elf_read (abfd, offset, shstrtabsize)) == NULL)
770 {
771 return (NULL);
772 }
773
774 /* Once all of the section headers have been read and converted, we
775 can start processing them. Note that the first section header is
776 a dummy placeholder entry, so we ignore it.
777
778 We also watch for the symbol table section and remember the file
779 offset and section size for both the symbol table section and the
780 associated string table section. */
781
782 for (shindex = 1; shindex < i_ehdr.e_shnum; shindex++)
783 {
784 Elf_Internal_Shdr *hdr = i_shdrp + shindex;
785 bfd_section_from_shdr (abfd, hdr, shstrtab);
786 if (hdr -> sh_type == SHT_SYMTAB)
787 {
788 elf_symtab_filepos (abfd) = hdr -> sh_offset;
789 elf_symtab_filesz (abfd) = hdr -> sh_size;
790 elf_strtab_filepos (abfd) = (i_shdrp + hdr -> sh_link) -> sh_offset;
791 elf_strtab_filesz (abfd) = (i_shdrp + hdr -> sh_link) -> sh_size;
792 }
793 }
794
795 /* Remember the entry point specified in the ELF file header. */
796
797 bfd_get_start_address (abfd) = i_ehdr.e_entry;
798
799 return (abfd->xvec);
800 }
801
802 /* Core files are simply standard ELF formatted files that partition
803 the file using the execution view of the file (program header table)
804 rather than the linking view. In fact, there is no section header
805 table in a core file.
806
807 The process status information (including the contents of the general
808 register set) and the floating point register set are stored in a
809 segment of type PT_NOTE. We handcraft a couple of extra bfd sections
810 that allow standard bfd access to the general registers (.reg) and the
811 floating point registers (.reg2).
812
813 */
814
815 static bfd_target *
816 DEFUN (elf_core_file_p, (abfd), bfd *abfd)
817 {
818 Elf_External_Ehdr x_ehdr; /* Elf file header, external form */
819 Elf_Internal_Ehdr i_ehdr; /* Elf file header, internal form */
820 Elf_External_Phdr x_phdr; /* Program header table entry, external form */
821 Elf_Internal_Phdr *i_phdrp; /* Program header table, internal form */
822 int phindex;
823
824 /* Read in the ELF header in external format. */
825
826 if (bfd_read ((PTR) &x_ehdr, sizeof (x_ehdr), 1, abfd) != sizeof (x_ehdr))
827 {
828 bfd_error = system_call_error;
829 return (NULL);
830 }
831
832 /* Now check to see if we have a valid ELF file, and one that BFD can
833 make use of. The magic number must match, the address size ('class')
834 and byte-swapping must match our XVEC entry, and it must have a
835 program header table (FIXME: See comments re segments at top of this
836 file). */
837
838 if (x_ehdr.e_ident[EI_MAG0] != ELFMAG0 ||
839 x_ehdr.e_ident[EI_MAG1] != ELFMAG1 ||
840 x_ehdr.e_ident[EI_MAG2] != ELFMAG2 ||
841 x_ehdr.e_ident[EI_MAG3] != ELFMAG3)
842 {
843 wrong:
844 bfd_error = wrong_format;
845 return (NULL);
846 }
847
848 /* FIXME, Check EI_VERSION here ! */
849
850 switch (x_ehdr.e_ident[EI_CLASS]) {
851 case ELFCLASSNONE: /* address size not specified */
852 goto wrong; /* No support if can't tell address size */
853 case ELFCLASS32: /* 32-bit addresses */
854 break;
855 case ELFCLASS64: /* 64-bit addresses */
856 goto wrong; /* FIXME: 64 bits not yet supported */
857 default:
858 goto wrong; /* No support if unknown address class */
859 }
860
861 /* Switch xvec to match the specified byte order. */
862 switch (x_ehdr.e_ident[EI_DATA]) {
863 case ELFDATA2MSB: /* Big-endian */
864 abfd->xvec = &elf_big_vec;
865 break;
866 case ELFDATA2LSB: /* Little-endian */
867 abfd->xvec = &elf_little_vec;
868 break;
869 case ELFDATANONE: /* No data encoding specified */
870 default: /* Unknown data encoding specified */
871 goto wrong;
872 }
873
874 /* Now that we know the byte order, swap in the rest of the header */
875 elf_swap_ehdr_in (abfd, &x_ehdr, &i_ehdr);
876
877 /* If there is no program header, or the type is not a core file, then
878 we are hosed. */
879 if (i_ehdr.e_phoff == 0 || i_ehdr.e_type != ET_CORE)
880 goto wrong;
881
882 /* Allocate an instance of the elf_core_tdata structure and hook it up to
883 the tdata pointer in the bfd. */
884
885 if ((abfd -> tdata.elf_core_data =
886 (elf_core_tdata *) bfd_zalloc (abfd, sizeof (elf_core_tdata)))
887 == NULL)
888 {
889 bfd_error = no_memory;
890 return (NULL);
891 }
892
893 /* Allocate space for copies of the program header table in external
894 and internal form, seek to the program header table in the file,
895 read it in, and convert it to internal form. As a simple sanity
896 check, verify that the what BFD thinks is the size of each program
897 header table entry actually matches the size recorded in the file. */
898
899 if (i_ehdr.e_phentsize != sizeof (x_phdr))
900 goto wrong;
901 if ((i_phdrp = (Elf_Internal_Phdr *)
902 bfd_alloc (abfd, sizeof (*i_phdrp) * i_ehdr.e_phnum)) == NULL)
903 {
904 bfd_error = no_memory;
905 return (NULL);
906 }
907 if (bfd_seek (abfd, i_ehdr.e_phoff, SEEK_SET) == -1)
908 {
909 bfd_error = system_call_error;
910 return (NULL);
911 }
912 for (phindex = 0; phindex < i_ehdr.e_phnum; phindex++)
913 {
914 if (bfd_read ((PTR) &x_phdr, sizeof (x_phdr), 1, abfd)
915 != sizeof (x_phdr))
916 {
917 bfd_error = system_call_error;
918 return (NULL);
919 }
920 elf_swap_phdr_in (abfd, &x_phdr, i_phdrp + phindex);
921 }
922
923 /* Once all of the program headers have been read and converted, we
924 can start processing them. */
925
926 for (phindex = 0; phindex < i_ehdr.e_phnum; phindex++)
927 {
928 bfd_section_from_phdr (abfd, i_phdrp + phindex, phindex);
929 if ((i_phdrp + phindex) -> p_type == PT_NOTE)
930 {
931 elf_corefile_note (abfd, i_phdrp + phindex);
932 }
933 }
934
935 /* Remember the entry point specified in the ELF file header. */
936
937 bfd_get_start_address (abfd) = i_ehdr.e_entry;
938
939 return (abfd->xvec);
940 }
941
942 static boolean
943 DEFUN (elf_mkobject, (abfd), bfd *abfd)
944 {
945 fprintf (stderr, "elf_mkobject unimplemented\n");
946 fflush (stderr);
947 abort ();
948 return (false);
949 }
950
951 static boolean
952 DEFUN (elf_write_object_contents, (abfd), bfd *abfd)
953 {
954 fprintf (stderr, "elf_write_object_contents unimplemented\n");
955 fflush (stderr);
956 abort ();
957 return (false);
958 }
959
960 /* Given an index of a section, retrieve a pointer to it. Note
961 that for our purposes, sections are indexed by {1, 2, ...} with
962 0 being an illegal index. */
963
964 static struct sec *
965 DEFUN (section_from_bfd_index, (abfd, index),
966 bfd *abfd AND
967 int index)
968 {
969 if (index > 0)
970 {
971 struct sec *answer = abfd -> sections;
972 while (--index > 0)
973 {
974 answer = answer -> next;
975 }
976 return (answer);
977 }
978 return (NULL);
979 }
980
981 static boolean
982 DEFUN (elf_slurp_symbol_table, (abfd), bfd *abfd)
983 {
984 int symcount; /* Number of external ELF symbols */
985 char *strtab; /* Buffer for raw ELF string table section */
986 asymbol *sym; /* Pointer to current bfd symbol */
987 asymbol *symbase; /* Buffer for generated bfd symbols */
988 asymbol **vec; /* Pointer to current bfd symbol pointer */
989 Elf_Internal_Sym i_sym;
990 Elf_External_Sym x_sym;
991
992 if (bfd_get_outsymbols (abfd) != NULL)
993 {
994 return (true);
995 }
996
997 /* Slurp in the string table. We will keep it around permanently, as
998 long as the bfd is in use, since we will end up setting up pointers
999 into it for the names of all the symbols. */
1000
1001 strtab = elf_read (abfd, elf_strtab_filepos(abfd), elf_strtab_filesz(abfd));
1002 if (strtab == NULL)
1003 {
1004 return (false);
1005 }
1006
1007 /* Read each raw ELF symbol, converting from external ELF form to
1008 internal ELF form, and then using the information to create a
1009 canonical bfd symbol table entry.
1010
1011 Note that be allocate the initial bfd canonical symbol buffer
1012 based on a one-to-one mapping of the ELF symbols to canonical
1013 symbols. However, it is likely that not all the ELF symbols will
1014 be used, so there will be some space leftover at the end. Once
1015 we know how many symbols we actual generate, we realloc the buffer
1016 to the correct size and then build the pointer vector. */
1017
1018 if (bfd_seek (abfd, elf_symtab_filepos (abfd), SEEK_SET) == -1)
1019 {
1020 bfd_error = system_call_error;
1021 return (false);
1022 }
1023
1024 symcount = elf_symtab_filesz(abfd) / sizeof (Elf_External_Sym);
1025 sym = symbase = (asymbol *) bfd_zalloc (abfd, symcount * sizeof (asymbol));
1026
1027 while (symcount-- > 0)
1028 {
1029 if (bfd_read ((PTR) &x_sym, sizeof (x_sym), 1, abfd) != sizeof (x_sym))
1030 {
1031 bfd_error = system_call_error;
1032 return (false);
1033 }
1034 elf_swap_symbol_in (abfd, &x_sym, &i_sym);
1035 if (i_sym.st_name > 0)
1036 {
1037 sym -> the_bfd = abfd;
1038 sym -> name = strtab + i_sym.st_name;
1039 sym -> value = i_sym.st_value;
1040 if (i_sym.st_shndx > 0 && i_sym.st_shndx < SHN_LORESERV)
1041 {
1042 /* Note: This code depends upon there being an ordered
1043 one-for-one mapping of ELF sections to bfd sections. */
1044 sym -> section = section_from_bfd_index (abfd, i_sym.st_shndx);
1045 }
1046 else if (i_sym.st_shndx == SHN_ABS)
1047 {
1048 sym -> section = &bfd_abs_section;
1049 }
1050 else if (i_sym.st_shndx == SHN_COMMON)
1051 {
1052 sym -> section = &bfd_com_section;
1053 }
1054 switch (ELF_ST_BIND (i_sym.st_info))
1055 {
1056 case STB_LOCAL:
1057 sym -> flags |= BSF_LOCAL;
1058 break;
1059 case STB_GLOBAL:
1060 sym -> flags |= (BSF_GLOBAL | BSF_EXPORT);
1061 break;
1062 case STB_WEAK:
1063 sym -> flags |= BSF_WEAK;
1064 break;
1065 }
1066 sym++;
1067 }
1068 }
1069
1070 bfd_get_symcount(abfd) = symcount = sym - symbase;
1071 sym = symbase = (asymbol *)
1072 bfd_realloc (abfd, symbase, symcount * sizeof (asymbol));
1073 bfd_get_outsymbols(abfd) = vec = (asymbol **)
1074 bfd_alloc (abfd, symcount * sizeof (asymbol *));
1075
1076 while (symcount-- > 0)
1077 {
1078 *vec++ = sym++;
1079 }
1080
1081 return (true);
1082 }
1083
1084 /* Return the number of bytes required to hold the symtab vector.
1085
1086 Note that we base it on the count plus 1, since we will null terminate
1087 the vector allocated based on this size. */
1088
1089 static unsigned int
1090 DEFUN (elf_get_symtab_upper_bound, (abfd), bfd *abfd)
1091 {
1092 unsigned int symtab_size = 0;
1093
1094 if (elf_slurp_symbol_table (abfd))
1095 {
1096 symtab_size = (bfd_get_symcount (abfd) + 1) * (sizeof (asymbol));
1097 }
1098 return (symtab_size);
1099 }
1100
1101 static unsigned int
1102 elf_get_reloc_upper_bound (abfd, asect)
1103 bfd *abfd;
1104 sec_ptr asect;
1105 {
1106 fprintf (stderr, "elf_get_reloc_upper_bound unimplemented\n");
1107 fflush (stderr);
1108 abort ();
1109 return (0);
1110 }
1111
1112 static unsigned int
1113 elf_canonicalize_reloc (abfd, section, relptr, symbols)
1114 bfd *abfd;
1115 sec_ptr section;
1116 arelent **relptr;
1117 asymbol **symbols;
1118 {
1119 fprintf (stderr, "elf_canonicalize_reloc unimplemented\n");
1120 fflush (stderr);
1121 abort ();
1122 return (0);
1123 }
1124
1125 static unsigned int
1126 DEFUN (elf_get_symtab, (abfd, alocation),
1127 bfd *abfd AND
1128 asymbol **alocation)
1129 {
1130 unsigned int symcount;
1131 asymbol **vec;
1132
1133 if (!elf_slurp_symbol_table (abfd))
1134 {
1135 return (0);
1136 }
1137 else
1138 {
1139 symcount = bfd_get_symcount (abfd);
1140 vec = bfd_get_outsymbols (abfd);
1141 while (symcount-- > 0)
1142 {
1143 *alocation++ = *vec++;
1144 }
1145 *alocation++ = NULL;
1146 return (bfd_get_symcount (abfd));
1147 }
1148 }
1149
1150 static asymbol *
1151 DEFUN (elf_make_empty_symbol, (abfd),
1152 bfd *abfd)
1153 {
1154 elf_symbol_type *new;
1155
1156 new = (elf_symbol_type *) bfd_zalloc (abfd, sizeof (elf_symbol_type));
1157 if (new == NULL)
1158 {
1159 bfd_error = no_memory;
1160 return (NULL);
1161 }
1162 else
1163 {
1164 new -> symbol.the_bfd = abfd;
1165 return (&new -> symbol);
1166 }
1167 }
1168
1169 static void
1170 DEFUN (elf_print_symbol,(ignore_abfd, filep, symbol, how),
1171 bfd *ignore_abfd AND
1172 PTR filep AND
1173 asymbol *symbol AND
1174 bfd_print_symbol_type how)
1175 {
1176 fprintf (stderr, "elf_print_symbol unimplemented\n");
1177 fflush (stderr);
1178 abort ();
1179 }
1180
1181 static alent *
1182 DEFUN (elf_get_lineno,(ignore_abfd, symbol),
1183 bfd *ignore_abfd AND
1184 asymbol *symbol)
1185 {
1186 fprintf (stderr, "elf_get_lineno unimplemented\n");
1187 fflush (stderr);
1188 abort ();
1189 return (NULL);
1190 }
1191
1192 static boolean
1193 DEFUN (elf_set_arch_mach,(abfd, arch, machine),
1194 bfd *abfd AND
1195 enum bfd_architecture arch AND
1196 unsigned long machine)
1197 {
1198 fprintf (stderr, "elf_set_arch_mach unimplemented\n");
1199 fflush (stderr);
1200 /* Allow any architecture to be supported by the elf backend */
1201 return bfd_default_set_arch_mach(abfd, arch, machine);
1202 }
1203
1204 static boolean
1205 DEFUN (elf_find_nearest_line,(abfd,
1206 section,
1207 symbols,
1208 offset,
1209 filename_ptr,
1210 functionname_ptr,
1211 line_ptr),
1212 bfd *abfd AND
1213 asection *section AND
1214 asymbol **symbols AND
1215 bfd_vma offset AND
1216 CONST char **filename_ptr AND
1217 CONST char **functionname_ptr AND
1218 unsigned int *line_ptr)
1219 {
1220 fprintf (stderr, "elf_find_nearest_line unimplemented\n");
1221 fflush (stderr);
1222 abort ();
1223 return (false);
1224 }
1225
1226 static int
1227 DEFUN (elf_sizeof_headers, (abfd, reloc),
1228 bfd *abfd AND
1229 boolean reloc)
1230 {
1231 fprintf (stderr, "elf_sizeof_headers unimplemented\n");
1232 fflush (stderr);
1233 abort ();
1234 return (0);
1235 }
1236 \f
1237 /* This structure contains everything that BFD knows about a target.
1238 It includes things like its byte order, name, what routines to call
1239 to do various operations, etc. Every BFD points to a target structure
1240 with its "xvec" member.
1241
1242 There are two such structures here: one for big-endian machines and
1243 one for little-endian machines. */
1244
1245 /* Archives are generic or unimplemented. */
1246 #define elf_slurp_armap bfd_false
1247 #define elf_slurp_extended_name_table _bfd_slurp_extended_name_table
1248 #define elf_truncate_arname bfd_dont_truncate_arname
1249 #define elf_openr_next_archived_file bfd_generic_openr_next_archived_file
1250 #define elf_generic_stat_arch_elt bfd_generic_stat_arch_elt
1251 #define elf_write_armap (PROTO (boolean, (*), \
1252 (bfd *arch, unsigned int elength, struct orl *map, unsigned int orl_count, \
1253 int stridx))) bfd_false
1254
1255 /* Ordinary section reading and writing */
1256 #define elf_new_section_hook _bfd_dummy_new_section_hook
1257 #define elf_get_section_contents bfd_generic_get_section_contents
1258 #define elf_set_section_contents bfd_generic_set_section_contents
1259 #define elf_close_and_cleanup bfd_generic_close_and_cleanup
1260
1261 #define elf_bfd_debug_info_start bfd_void
1262 #define elf_bfd_debug_info_end bfd_void
1263 #define elf_bfd_debug_info_accumulate (PROTO(void,(*),(bfd*, struct sec *))) bfd_void
1264 #define elf_bfd_get_relocated_section_contents \
1265 bfd_generic_get_relocated_section_contents
1266 #define elf_bfd_relax_section bfd_generic_relax_section
1267 bfd_target elf_big_vec =
1268 {
1269 /* name: identify kind of target */
1270 "elf-big",
1271
1272 /* flavour: general indication about file */
1273 bfd_target_elf_flavour,
1274
1275 /* byteorder_big_p: data is big endian */
1276 true,
1277
1278 /* header_byteorder_big_p: header is also big endian */
1279 true,
1280
1281 /* object_flags: mask of all file flags */
1282 (HAS_RELOC | EXEC_P | HAS_LINENO | HAS_DEBUG | HAS_SYMS | HAS_LOCALS |
1283 DYNAMIC | WP_TEXT),
1284
1285 /* section_flags: mask of all section flags */
1286 (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_READONLY |
1287 SEC_DATA),
1288
1289 /* ar_pad_char: pad character for filenames within an archive header
1290 FIXME: this really has nothing to do with ELF, this is a characteristic
1291 of the archiver and/or os and should be independently tunable */
1292 '/',
1293
1294 /* ar_max_namelen: maximum number of characters in an archive header
1295 FIXME: this really has nothing to do with ELF, this is a characteristic
1296 of the archiver and should be independently tunable. This value is
1297 a WAG (wild a** guess) */
1298 15,
1299
1300 /* align_power_min: minimum alignment restriction for any section
1301 FIXME: this value may be target machine dependent */
1302 3,
1303
1304 /* Routines to byte-swap various sized integers from the data sections */
1305 _do_getb64, _do_putb64, _do_getb32, _do_putb32, _do_getb16, _do_putb16,
1306
1307 /* Routines to byte-swap various sized integers from the file headers */
1308 _do_getb64, _do_putb64, _do_getb32, _do_putb32, _do_getb16, _do_putb16,
1309
1310 /* bfd_check_format: check the format of a file being read */
1311 { _bfd_dummy_target, /* unknown format */
1312 elf_object_p, /* assembler/linker output (object file) */
1313 bfd_generic_archive_p, /* an archive */
1314 elf_core_file_p /* a core file */
1315 },
1316
1317 /* bfd_set_format: set the format of a file being written */
1318 { bfd_false,
1319 elf_mkobject,
1320 _bfd_generic_mkarchive,
1321 bfd_false
1322 },
1323
1324 /* bfd_write_contents: write cached information into a file being written */
1325 { bfd_false,
1326 elf_write_object_contents,
1327 _bfd_write_archive_contents,
1328 bfd_false
1329 },
1330
1331 /* Initialize a jump table with the standard macro. All names start
1332 with "elf" */
1333 JUMP_TABLE(elf),
1334
1335 /* SWAP_TABLE */
1336 NULL, NULL, NULL
1337 };
1338
1339 bfd_target elf_little_vec =
1340 {
1341 /* name: identify kind of target */
1342 "elf-little",
1343
1344 /* flavour: general indication about file */
1345 bfd_target_elf_flavour,
1346
1347 /* byteorder_big_p: data is big endian */
1348 false, /* Nope -- this one's little endian */
1349
1350 /* header_byteorder_big_p: header is also big endian */
1351 false, /* Nope -- this one's little endian */
1352
1353 /* object_flags: mask of all file flags */
1354 (HAS_RELOC | EXEC_P | HAS_LINENO | HAS_DEBUG | HAS_SYMS | HAS_LOCALS |
1355 DYNAMIC | WP_TEXT),
1356
1357 /* section_flags: mask of all section flags */
1358 (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_READONLY |
1359 SEC_DATA),
1360
1361 /* ar_pad_char: pad character for filenames within an archive header
1362 FIXME: this really has nothing to do with ELF, this is a characteristic
1363 of the archiver and/or os and should be independently tunable */
1364 '/',
1365
1366 /* ar_max_namelen: maximum number of characters in an archive header
1367 FIXME: this really has nothing to do with ELF, this is a characteristic
1368 of the archiver and should be independently tunable. This value is
1369 a WAG (wild a** guess) */
1370 15,
1371
1372 /* align_power_min: minimum alignment restriction for any section
1373 FIXME: this value may be target machine dependent */
1374 3,
1375
1376 /* Routines to byte-swap various sized integers from the data sections */
1377 _do_getl64, _do_putl64, _do_getl32, _do_putl32, _do_getl16, _do_putl16,
1378
1379 /* Routines to byte-swap various sized integers from the file headers */
1380 _do_getl64, _do_putl64, _do_getl32, _do_putl32, _do_getl16, _do_putl16,
1381
1382 /* bfd_check_format: check the format of a file being read */
1383 { _bfd_dummy_target, /* unknown format */
1384 elf_object_p, /* assembler/linker output (object file) */
1385 bfd_generic_archive_p, /* an archive */
1386 elf_core_file_p /* a core file */
1387 },
1388
1389 /* bfd_set_format: set the format of a file being written */
1390 { bfd_false,
1391 elf_mkobject,
1392 _bfd_generic_mkarchive,
1393 bfd_false
1394 },
1395
1396 /* bfd_write_contents: write cached information into a file being written */
1397 { bfd_false,
1398 elf_write_object_contents,
1399 _bfd_write_archive_contents,
1400 bfd_false
1401 },
1402
1403 /* Initialize a jump table with the standard macro. All names start
1404 with "elf" */
1405 JUMP_TABLE(elf),
1406
1407 /* SWAP_TABLE */
1408 NULL, NULL, NULL
1409 };
This page took 0.060414 seconds and 4 git commands to generate.