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