]> Git Repo - binutils.git/blob - bfd/elfcode.h
* elfcode.h (elf_object_p): If there is a SHT_DYNAMIC section, set
[binutils.git] / bfd / elfcode.h
1 /* ELF executable support for BFD.
2    Copyright 1991, 1992, 1993 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".  Sufficient support for gdb.
7
8    Rewritten by Mark Eichin @ Cygnus Support, from information
9    published in "System V Application Binary Interface", chapters 4
10    and 5, as well as the various "Processor Supplement" documents
11    derived from it. Added support for assembler and other object file
12    utilities.  Further work done by Ken Raeburn (Cygnus Support), Michael
13    Meissner (Open Software Foundation), and Peter Hoogenboom (University
14    of Utah) to finish and extend this.
15
16 This file is part of BFD, the Binary File Descriptor library.
17
18 This program is free software; you can redistribute it and/or modify
19 it under the terms of the GNU General Public License as published by
20 the Free Software Foundation; either version 2 of the License, or
21 (at your option) any later version.
22
23 This program is distributed in the hope that it will be useful,
24 but WITHOUT ANY WARRANTY; without even the implied warranty of
25 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
26 GNU General Public License for more details.
27
28 You should have received a copy of the GNU General Public License
29 along with this program; if not, write to the Free Software
30 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
31
32 /* Problems and other issues to resolve.
33
34    (1)  BFD expects there to be some fixed number of "sections" in
35         the object file.  I.E. there is a "section_count" variable in the
36         bfd structure which contains the number of sections.  However, ELF
37         supports multiple "views" of a file.  In particular, with current
38         implementations, executable files typically have two tables, a
39         program header table and a section header table, both of which
40         partition the executable.
41
42         In ELF-speak, the "linking view" of the file uses the section header
43         table to access "sections" within the file, and the "execution view"
44         uses the program header table to access "segments" within the file.
45         "Segments" typically may contain all the data from one or more
46         "sections".
47
48         Note that the section header table is optional in ELF executables,
49         but it is this information that is most useful to gdb.  If the
50         section header table is missing, then gdb should probably try
51         to make do with the program header table.  (FIXME)
52
53    (2)  The code in this file is compiled twice, once in 32-bit mode and
54         once in 64-bit mode.  More of it should be made size-independent
55         and moved into elf.c.
56
57    (3)  ELF section symbols are handled rather sloppily now.  This should
58         be cleaned up, and ELF section symbols reconciled with BFD section
59         symbols.
60  */
61
62 #include <assert.h>
63 #include <string.h>             /* For strrchr and friends */
64 #include "bfd.h"
65 #include "sysdep.h"
66 #include "libbfd.h"
67 #include "libelf.h"
68
69 #ifndef alloca
70 PTR alloca ();
71 #endif
72
73 /* Renaming structures, typedefs, macros and functions to be size-specific.  */
74 #define Elf_External_Ehdr       NAME(Elf,External_Ehdr)
75 #define Elf_External_Sym        NAME(Elf,External_Sym)
76 #define Elf_External_Shdr       NAME(Elf,External_Shdr)
77 #define Elf_External_Phdr       NAME(Elf,External_Phdr)
78 #define Elf_External_Rel        NAME(Elf,External_Rel)
79 #define Elf_External_Rela       NAME(Elf,External_Rela)
80
81 #define elf_core_file_failing_command   NAME(bfd_elf,core_file_failing_command)
82 #define elf_core_file_failing_signal    NAME(bfd_elf,core_file_failing_signal)
83 #define elf_core_file_matches_executable_p NAME(bfd_elf,core_file_matches_executable_p)
84 #define elf_object_p                    NAME(bfd_elf,object_p)
85 #define elf_core_file_p                 NAME(bfd_elf,core_file_p)
86 #define elf_get_symtab_upper_bound      NAME(bfd_elf,get_symtab_upper_bound)
87 #define elf_get_reloc_upper_bound       NAME(bfd_elf,get_reloc_upper_bound)
88 #define elf_canonicalize_reloc          NAME(bfd_elf,canonicalize_reloc)
89 #define elf_get_symtab                  NAME(bfd_elf,get_symtab)
90 #define elf_make_empty_symbol           NAME(bfd_elf,make_empty_symbol)
91 #define elf_get_symbol_info             NAME(bfd_elf,get_symbol_info)
92 #define elf_print_symbol                NAME(bfd_elf,print_symbol)
93 #define elf_get_lineno                  NAME(bfd_elf,get_lineno)
94 #define elf_set_arch_mach               NAME(bfd_elf,set_arch_mach)
95 #define elf_find_nearest_line           NAME(bfd_elf,find_nearest_line)
96 #define elf_sizeof_headers              NAME(bfd_elf,sizeof_headers)
97 #define elf_set_section_contents        NAME(bfd_elf,set_section_contents)
98 #define elf_no_info_to_howto            NAME(bfd_elf,no_info_to_howto)
99 #define elf_no_info_to_howto_rel        NAME(bfd_elf,no_info_to_howto_rel)
100 #define elf_new_section_hook            NAME(bfd_elf,new_section_hook)
101 #define write_relocs                    NAME(bfd_elf,_write_relocs)
102 #define elf_find_section                NAME(bfd_elf,find_section)
103
104 #if ARCH_SIZE == 64
105 #define ELF_R_INFO(X,Y) ELF64_R_INFO(X,Y)
106 #define ELF_R_SYM(X)    ELF64_R_SYM(X)
107 #define ELFCLASS        ELFCLASS64
108 #define FILE_ALIGN      8
109 #endif
110 #if ARCH_SIZE == 32
111 #define ELF_R_INFO(X,Y) ELF32_R_INFO(X,Y)
112 #define ELF_R_SYM(X)    ELF32_R_SYM(X)
113 #define ELFCLASS        ELFCLASS32
114 #define FILE_ALIGN      4
115 #endif
116
117 static int shstrtab_length_fixed;
118
119 struct elf_sect_data {
120   int reloc_sec;
121   /* more? */
122 };
123
124 /* Forward declarations of static functions */
125
126 static struct sec * section_from_elf_index PARAMS ((bfd *, int));
127
128 static int elf_section_from_bfd_section PARAMS ((bfd *, struct sec *));
129
130 static boolean elf_slurp_symbol_table PARAMS ((bfd *, asymbol **));
131
132 static int elf_symbol_from_bfd_symbol PARAMS ((bfd *,
133                                                struct symbol_cache_entry **));
134
135 static void elf_map_symbols PARAMS ((bfd *));
136 static void swap_out_syms PARAMS ((bfd *));
137
138 #ifdef DEBUG
139 static void elf_debug_section PARAMS ((char *, int, Elf_Internal_Shdr *));
140 static void elf_debug_file PARAMS ((Elf_Internal_Ehdr *));
141 #endif
142
143 #define elf_string_from_elf_strtab(abfd,strindex) \
144      elf_string_from_elf_section(abfd,elf_elfheader(abfd)->e_shstrndx,strindex)
145
146 \f
147 /* Structure swapping routines */
148
149 /* Should perhaps use put_offset, put_word, etc.  For now, the two versions
150    can be handled by explicitly specifying 32 bits or "the long type".  */
151 #if ARCH_SIZE == 64
152 #define put_word        bfd_h_put_64
153 #define get_word        bfd_h_get_64
154 #endif
155 #if ARCH_SIZE == 32
156 #define put_word        bfd_h_put_32
157 #define get_word        bfd_h_get_32
158 #endif
159
160 /* Translate an ELF symbol in external format into an ELF symbol in internal
161    format. */
162
163 static void
164 DEFUN (elf_swap_symbol_in, (abfd, src, dst),
165        bfd * abfd AND
166        Elf_External_Sym * src AND
167        Elf_Internal_Sym * dst)
168 {
169   dst->st_name = bfd_h_get_32 (abfd, (bfd_byte *) src->st_name);
170   dst->st_value = get_word (abfd, (bfd_byte *) src->st_value);
171   dst->st_size = get_word (abfd, (bfd_byte *) src->st_size);
172   dst->st_info = bfd_h_get_8 (abfd, (bfd_byte *) src->st_info);
173   dst->st_other = bfd_h_get_8 (abfd, (bfd_byte *) src->st_other);
174   dst->st_shndx = bfd_h_get_16 (abfd, (bfd_byte *) src->st_shndx);
175 }
176
177 /* Translate an ELF symbol in internal format into an ELF symbol in external
178    format. */
179
180 static void
181 DEFUN (elf_swap_symbol_out, (abfd, src, dst),
182        bfd * abfd AND
183        Elf_Internal_Sym * src AND
184        Elf_External_Sym * dst)
185 {
186   bfd_h_put_32 (abfd, src->st_name, dst->st_name);
187   put_word (abfd, src->st_value, dst->st_value);
188   put_word (abfd, src->st_size, dst->st_size);
189   bfd_h_put_8 (abfd, src->st_info, dst->st_info);
190   bfd_h_put_8 (abfd, src->st_other, dst->st_other);
191   bfd_h_put_16 (abfd, src->st_shndx, dst->st_shndx);
192 }
193
194
195 /* Translate an ELF file header in external format into an ELF file header in
196    internal format. */
197
198 static void
199 DEFUN (elf_swap_ehdr_in, (abfd, src, dst),
200        bfd * abfd AND
201        Elf_External_Ehdr * src AND
202        Elf_Internal_Ehdr * dst)
203 {
204   memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
205   dst->e_type = bfd_h_get_16 (abfd, (bfd_byte *) src->e_type);
206   dst->e_machine = bfd_h_get_16 (abfd, (bfd_byte *) src->e_machine);
207   dst->e_version = bfd_h_get_32 (abfd, (bfd_byte *) src->e_version);
208   dst->e_entry = get_word (abfd, (bfd_byte *) src->e_entry);
209   dst->e_phoff = get_word (abfd, (bfd_byte *) src->e_phoff);
210   dst->e_shoff = get_word (abfd, (bfd_byte *) src->e_shoff);
211   dst->e_flags = bfd_h_get_32 (abfd, (bfd_byte *) src->e_flags);
212   dst->e_ehsize = bfd_h_get_16 (abfd, (bfd_byte *) src->e_ehsize);
213   dst->e_phentsize = bfd_h_get_16 (abfd, (bfd_byte *) src->e_phentsize);
214   dst->e_phnum = bfd_h_get_16 (abfd, (bfd_byte *) src->e_phnum);
215   dst->e_shentsize = bfd_h_get_16 (abfd, (bfd_byte *) src->e_shentsize);
216   dst->e_shnum = bfd_h_get_16 (abfd, (bfd_byte *) src->e_shnum);
217   dst->e_shstrndx = bfd_h_get_16 (abfd, (bfd_byte *) src->e_shstrndx);
218 }
219
220 /* Translate an ELF file header in internal format into an ELF file header in
221    external format. */
222
223 static void
224 DEFUN (elf_swap_ehdr_out, (abfd, src, dst),
225        bfd * abfd AND
226        Elf_Internal_Ehdr * src AND
227        Elf_External_Ehdr * dst)
228 {
229   memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
230   /* note that all elements of dst are *arrays of unsigned char* already... */
231   bfd_h_put_16 (abfd, src->e_type, dst->e_type);
232   bfd_h_put_16 (abfd, src->e_machine, dst->e_machine);
233   bfd_h_put_32 (abfd, src->e_version, dst->e_version);
234   put_word (abfd, src->e_entry, dst->e_entry);
235   put_word (abfd, src->e_phoff, dst->e_phoff);
236   put_word (abfd, src->e_shoff, dst->e_shoff);
237   bfd_h_put_32 (abfd, src->e_flags, dst->e_flags);
238   bfd_h_put_16 (abfd, src->e_ehsize, dst->e_ehsize);
239   bfd_h_put_16 (abfd, src->e_phentsize, dst->e_phentsize);
240   bfd_h_put_16 (abfd, src->e_phnum, dst->e_phnum);
241   bfd_h_put_16 (abfd, src->e_shentsize, dst->e_shentsize);
242   bfd_h_put_16 (abfd, src->e_shnum, dst->e_shnum);
243   bfd_h_put_16 (abfd, src->e_shstrndx, dst->e_shstrndx);
244 }
245
246
247 /* Translate an ELF section header table entry in external format into an
248    ELF section header table entry in internal format. */
249
250 static void
251 DEFUN (elf_swap_shdr_in, (abfd, src, dst),
252        bfd * abfd AND
253        Elf_External_Shdr * src AND
254        Elf_Internal_Shdr * dst)
255 {
256   dst->sh_name = bfd_h_get_32 (abfd, (bfd_byte *) src->sh_name);
257   dst->sh_type = bfd_h_get_32 (abfd, (bfd_byte *) src->sh_type);
258   dst->sh_flags = get_word (abfd, (bfd_byte *) src->sh_flags);
259   dst->sh_addr = get_word (abfd, (bfd_byte *) src->sh_addr);
260   dst->sh_offset = get_word (abfd, (bfd_byte *) src->sh_offset);
261   dst->sh_size = get_word (abfd, (bfd_byte *) src->sh_size);
262   dst->sh_link = bfd_h_get_32 (abfd, (bfd_byte *) src->sh_link);
263   dst->sh_info = bfd_h_get_32 (abfd, (bfd_byte *) src->sh_info);
264   dst->sh_addralign = get_word (abfd, (bfd_byte *) src->sh_addralign);
265   dst->sh_entsize = get_word (abfd, (bfd_byte *) src->sh_entsize);
266   /* we haven't done any processing on it yet, so... */
267   dst->rawdata = (void *) 0;
268 }
269
270 /* Translate an ELF section header table entry in internal format into an
271    ELF section header table entry in external format. */
272
273 static void
274 DEFUN (elf_swap_shdr_out, (abfd, src, dst),
275        bfd * abfd AND
276        Elf_Internal_Shdr * src AND
277        Elf_External_Shdr * dst)
278 {
279   /* note that all elements of dst are *arrays of unsigned char* already... */
280   bfd_h_put_32 (abfd, src->sh_name, dst->sh_name);
281   bfd_h_put_32 (abfd, src->sh_type, dst->sh_type);
282   put_word (abfd, src->sh_flags, dst->sh_flags);
283   put_word (abfd, src->sh_addr, dst->sh_addr);
284   put_word (abfd, src->sh_offset, dst->sh_offset);
285   put_word (abfd, src->sh_size, dst->sh_size);
286   bfd_h_put_32 (abfd, src->sh_link, dst->sh_link);
287   bfd_h_put_32 (abfd, src->sh_info, dst->sh_info);
288   put_word (abfd, src->sh_addralign, dst->sh_addralign);
289   put_word (abfd, src->sh_entsize, dst->sh_entsize);
290 }
291
292
293 /* Translate an ELF program header table entry in external format into an
294    ELF program header table entry in internal format. */
295
296 static void
297 DEFUN (elf_swap_phdr_in, (abfd, src, dst),
298        bfd * abfd AND
299        Elf_External_Phdr * src AND
300        Elf_Internal_Phdr * dst)
301 {
302   dst->p_type = bfd_h_get_32 (abfd, (bfd_byte *) src->p_type);
303   dst->p_flags = bfd_h_get_32 (abfd, (bfd_byte *) src->p_flags);
304   dst->p_offset = get_word (abfd, (bfd_byte *) src->p_offset);
305   dst->p_vaddr = get_word (abfd, (bfd_byte *) src->p_vaddr);
306   dst->p_paddr = get_word (abfd, (bfd_byte *) src->p_paddr);
307   dst->p_filesz = get_word (abfd, (bfd_byte *) src->p_filesz);
308   dst->p_memsz = get_word (abfd, (bfd_byte *) src->p_memsz);
309   dst->p_align = get_word (abfd, (bfd_byte *) src->p_align);
310 }
311
312 static void
313 DEFUN (elf_swap_phdr_out, (abfd, src, dst),
314        bfd * abfd AND
315        Elf_Internal_Phdr * src AND
316        Elf_External_Phdr * dst)
317 {
318   /* note that all elements of dst are *arrays of unsigned char* already... */
319   bfd_h_put_32 (abfd, src->p_type, dst->p_type);
320   put_word (abfd, src->p_offset, dst->p_offset);
321   put_word (abfd, src->p_vaddr, dst->p_vaddr);
322   put_word (abfd, src->p_paddr, dst->p_paddr);
323   put_word (abfd, src->p_filesz, dst->p_filesz);
324   put_word (abfd, src->p_memsz, dst->p_memsz);
325   bfd_h_put_32 (abfd, src->p_flags, dst->p_flags);
326   put_word (abfd, src->p_align, dst->p_align);
327 }
328
329 /* Translate an ELF reloc from external format to internal format. */
330 static INLINE void
331 DEFUN (elf_swap_reloc_in, (abfd, src, dst),
332        bfd * abfd AND
333        Elf_External_Rel * src AND
334        Elf_Internal_Rel * dst)
335 {
336   dst->r_offset = get_word (abfd, (bfd_byte *) src->r_offset);
337   dst->r_info = get_word (abfd, (bfd_byte *) src->r_info);
338 }
339
340 static INLINE void
341 DEFUN (elf_swap_reloca_in, (abfd, src, dst),
342        bfd * abfd AND
343        Elf_External_Rela * src AND
344        Elf_Internal_Rela * dst)
345 {
346   dst->r_offset = get_word (abfd, (bfd_byte *) src->r_offset);
347   dst->r_info = get_word (abfd, (bfd_byte *) src->r_info);
348   dst->r_addend = get_word (abfd, (bfd_byte *) src->r_addend);
349 }
350
351 /* Translate an ELF reloc from internal format to external format. */
352 static INLINE void
353 DEFUN (elf_swap_reloc_out, (abfd, src, dst),
354        bfd * abfd AND
355        Elf_Internal_Rel * src AND
356        Elf_External_Rel * dst)
357 {
358   put_word (abfd, src->r_offset, dst->r_offset);
359   put_word (abfd, src->r_info, dst->r_info);
360 }
361
362 static INLINE void
363 DEFUN (elf_swap_reloca_out, (abfd, src, dst),
364        bfd * abfd AND
365        Elf_Internal_Rela * src AND
366        Elf_External_Rela * dst)
367 {
368   put_word (abfd, src->r_offset, dst->r_offset);
369   put_word (abfd, src->r_info, dst->r_info);
370   put_word (abfd, src->r_addend, dst->r_addend);
371 }
372
373 \f
374
375 /* String table creation/manipulation routines */
376
377 static struct strtab *
378 DEFUN (bfd_new_strtab, (abfd),
379        bfd * abfd)
380 {
381   struct strtab *ss;
382
383   ss = (struct strtab *) bfd_xmalloc (sizeof (struct strtab));
384   ss->tab = bfd_xmalloc (1);
385   BFD_ASSERT (ss->tab != 0);
386   *ss->tab = 0;
387   ss->nentries = 0;
388   ss->length = 1;
389
390   return ss;
391 }
392
393 static int
394 DEFUN (bfd_add_to_strtab, (abfd, ss, str),
395        bfd * abfd AND
396        struct strtab *ss AND
397        CONST char *str)
398 {
399   /* should search first, but for now: */
400   /* include the trailing NUL */
401   int ln = strlen (str) + 1;
402
403   /* should this be using obstacks? */
404   ss->tab = realloc (ss->tab, ss->length + ln);
405
406   BFD_ASSERT (ss->tab != 0);
407   strcpy (ss->tab + ss->length, str);
408   ss->nentries++;
409   ss->length += ln;
410
411   return ss->length - ln;
412 }
413
414 static int
415 DEFUN (bfd_add_2_to_strtab, (abfd, ss, str, str2),
416        bfd * abfd AND
417        struct strtab *ss AND
418        char *str AND
419        CONST char *str2)
420 {
421   /* should search first, but for now: */
422   /* include the trailing NUL */
423   int ln = strlen (str) + strlen (str2) + 1;
424
425   /* should this be using obstacks? */
426   if (ss->length)
427     ss->tab = realloc (ss->tab, ss->length + ln);
428   else
429     ss->tab = bfd_xmalloc (ln);
430
431   BFD_ASSERT (ss->tab != 0);
432   strcpy (ss->tab + ss->length, str);
433   strcpy (ss->tab + ss->length + strlen (str), str2);
434   ss->nentries++;
435   ss->length += ln;
436
437   return ss->length - ln;
438 }
439
440 \f
441 /* ELF .o/exec file reading */
442
443 /* Create a new bfd section from an ELF section header. */
444
445 static boolean
446 DEFUN (bfd_section_from_shdr, (abfd, shindex),
447        bfd * abfd AND
448        unsigned int shindex)
449 {
450   Elf_Internal_Shdr *hdr = elf_elfsections (abfd)[shindex];
451   Elf_Internal_Ehdr *ehdr = elf_elfheader (abfd);
452   asection *newsect;
453   char *name;
454
455   name = elf_string_from_elf_strtab (abfd, hdr->sh_name);
456
457   switch (hdr->sh_type)
458     {
459
460     case SHT_NULL:
461       /* inactive section. Throw it away. */
462       return true;
463
464     case SHT_PROGBITS:
465       /* Bits that get saved. This one is real. */
466       if (!hdr->rawdata)
467         {
468           newsect = bfd_make_section (abfd, name);
469           if (newsect != NULL)
470             {
471               newsect->filepos = hdr->sh_offset; /* so we can read back the bits */
472               newsect->flags |= SEC_HAS_CONTENTS;
473               newsect->vma = hdr->sh_addr;
474               newsect->_raw_size = hdr->sh_size;
475               newsect->alignment_power = bfd_log2 (hdr->sh_addralign);
476
477               if (hdr->sh_flags & SHF_ALLOC)
478                 {
479                   newsect->flags |= SEC_ALLOC;
480                   newsect->flags |= SEC_LOAD;
481                 }
482
483               if (!(hdr->sh_flags & SHF_WRITE))
484                 newsect->flags |= SEC_READONLY;
485
486               if (hdr->sh_flags & SHF_EXECINSTR)
487                 newsect->flags |= SEC_CODE; /* FIXME: may only contain SOME code */
488               else if (newsect->flags & SEC_ALLOC)
489                 newsect->flags |= SEC_DATA;
490
491               /* The debugging sections appear to recognized only by
492                  name.  */
493               if (strncmp (name, ".debug", sizeof ".debug" - 1) == 0
494                   || strncmp (name, ".line", sizeof ".line" - 1) == 0
495                   || strncmp (name, ".stab", sizeof ".stab" - 1) == 0)
496                 newsect->flags |= SEC_DEBUGGING;
497
498               hdr->rawdata = (void *) newsect;
499             }
500           else
501             hdr->rawdata = (void *) bfd_get_section_by_name (abfd, name);
502         }
503       return true;
504
505     case SHT_NOBITS:
506       /* Bits that get saved. This one is real. */
507       if (!hdr->rawdata)
508         {
509           newsect = bfd_make_section (abfd, name);
510           if (newsect != NULL)
511             {
512               newsect->vma = hdr->sh_addr;
513               newsect->_raw_size = hdr->sh_size;
514               newsect->filepos = hdr->sh_offset;        /* fake */
515               newsect->alignment_power = bfd_log2 (hdr->sh_addralign);
516               if (hdr->sh_flags & SHF_ALLOC)
517                 newsect->flags |= SEC_ALLOC;
518
519               if (!(hdr->sh_flags & SHF_WRITE))
520                 newsect->flags |= SEC_READONLY;
521
522               /* FIXME: This section is empty.  Does it really make
523                  sense to set SEC_CODE for it?  */
524               if (hdr->sh_flags & SHF_EXECINSTR)
525                 newsect->flags |= SEC_CODE;     /* FIXME: may only contain SOME code */
526
527               hdr->rawdata = (void *) newsect;
528             }
529         }
530       return true;
531
532     case SHT_SYMTAB:            /* A symbol table */
533       if (elf_onesymtab (abfd) == shindex)
534         return true;
535
536       BFD_ASSERT (hdr->sh_entsize == sizeof (Elf_External_Sym));
537       BFD_ASSERT (elf_onesymtab (abfd) == 0);
538       elf_onesymtab (abfd) = shindex;
539       elf_tdata(abfd)->symtab_hdr = *hdr;
540       elf_elfsections(abfd)[shindex] = &elf_tdata(abfd)->symtab_hdr;
541       abfd->flags |= HAS_SYMS;
542       return true;
543
544     case SHT_STRTAB:            /* A string table */
545       if (hdr->rawdata)
546         return true;
547       if (ehdr->e_shstrndx == shindex)
548         {
549           elf_tdata(abfd)->shstrtab_hdr = *hdr;
550           elf_elfsections(abfd)[shindex] = &elf_tdata(abfd)->shstrtab_hdr;
551           hdr->rawdata = (PTR) &elf_tdata(abfd)->shstrtab_hdr;
552           return true;
553         }
554       {
555         int i;
556
557         for (i = 1; i < ehdr->e_shnum; i++)
558           {
559             Elf_Internal_Shdr *hdr2 = elf_elfsections(abfd)[i];
560             if (hdr2->sh_link == shindex)
561               {
562                 bfd_section_from_shdr (abfd, i);
563                 if (elf_onesymtab (abfd) == i)
564                   {
565                     elf_tdata(abfd)->strtab_hdr = *hdr;
566                     elf_elfsections(abfd)[shindex] = &elf_tdata(abfd)->strtab_hdr;
567                     return true;
568                   }
569 #if 0 /* Not handling other string tables specially right now.  */
570                 hdr2 = elf_elfsections(abfd)[i]; /* in case it moved */
571                 /* We have a strtab for some random other section.  */
572                 newsect = (asection *) hdr2->rawdata;
573                 if (!newsect)
574                   break;
575                 hdr->rawdata = (PTR) newsect;
576                 hdr2 = &elf_section_data (newsect)->str_hdr;
577                 *hdr2 = *hdr;
578                 elf_elfsections(abfd)[shindex] = hdr2;
579 #endif
580               }
581           }
582       }
583
584       newsect = bfd_make_section (abfd, name);
585       if (newsect)
586         {
587           newsect->flags = SEC_HAS_CONTENTS;
588           hdr->rawdata = (PTR) newsect;
589           newsect->_raw_size = hdr->sh_size;
590           newsect->alignment_power = 0;
591           newsect->vma = 0;
592           newsect->filepos = hdr->sh_offset;
593
594           if (hdr->sh_flags & SHF_ALLOC)
595             newsect->flags |= SEC_ALLOC|SEC_LOAD;
596           if (!(hdr->sh_flags & SHF_WRITE))
597             newsect->flags |= SEC_READONLY;
598           if (hdr->sh_flags & SHF_EXECINSTR)
599             newsect->flags |= SEC_CODE;
600           else if (newsect->flags & SEC_ALLOC)
601             newsect->flags |= SEC_DATA;
602
603           /* Check for debugging string tables.  */
604           if (strncmp (name, ".debug", sizeof ".debug" - 1) == 0
605               || strncmp (name, ".stab", sizeof ".stab" - 1) == 0)
606             newsect->flags |= SEC_DEBUGGING;
607         }
608
609       return true;
610
611     case SHT_REL:
612     case SHT_RELA:
613       /* *These* do a lot of work -- but build no sections!
614          The spec says there can be multiple strtabs, but only one symtab,
615          but there can be lots of REL* sections. */
616       /* FIXME:  The above statement is wrong!  There are typically at least
617          two symbol tables in a dynamically linked executable, ".dynsym"
618          which is the dynamic linkage symbol table and ".symtab", which is
619          the "traditional" symbol table.  -fnf */
620
621       {
622         asection *target_sect;
623         Elf_Internal_Shdr *hdr2;
624         int use_rela_p = get_elf_backend_data (abfd)->use_rela_p;
625
626         /* Don't allow REL relocations on a machine that uses RELA and
627            vice versa.  */
628         /* @@ Actually, the generic ABI does suggest that both might be
629            used in one file.  But the four ABI Processor Supplements I
630            have access to right now all specify that only one is used on
631            each of those architectures.  It's conceivable that, e.g., a
632            bunch of absolute 32-bit relocs might be more compact in REL
633            form even on a RELA machine...  */
634         BFD_ASSERT (!(use_rela_p && (hdr->sh_type == SHT_REL)));
635         BFD_ASSERT (!(!use_rela_p && (hdr->sh_type == SHT_RELA)));
636         BFD_ASSERT (hdr->sh_entsize ==
637                     (use_rela_p
638                      ? sizeof (Elf_External_Rela)
639                      : sizeof (Elf_External_Rel)));
640
641         bfd_section_from_shdr (abfd, hdr->sh_info);     /* target */
642         bfd_section_from_shdr (abfd, hdr->sh_link);     /* symbol table */
643         target_sect = section_from_elf_index (abfd, hdr->sh_info);
644         if (target_sect == NULL
645             || elf_section_data (target_sect) == NULL)
646           return false;
647
648         hdr2 = &elf_section_data (target_sect)->rel_hdr;
649         *hdr2 = *hdr;
650         elf_elfsections(abfd)[shindex] = hdr2;
651         target_sect->reloc_count = hdr->sh_size / hdr->sh_entsize;
652         target_sect->flags |= SEC_RELOC;
653         target_sect->relocation = 0;
654         target_sect->rel_filepos = hdr->sh_offset;
655         abfd->flags |= HAS_RELOC;
656         return true;
657       }
658       break;
659
660     case SHT_HASH:
661     case SHT_DYNAMIC:
662     case SHT_DYNSYM:            /* could treat this like symtab... */
663 #if 0
664       fprintf (stderr, "Dynamic Linking sections not yet supported.\n");
665       BFD_FAIL ();
666 #endif
667       break;
668
669     case SHT_NOTE:
670 #if 0
671       fprintf (stderr, "Note Sections not yet supported.\n");
672       BFD_FAIL ();
673 #endif
674       break;
675
676     case SHT_SHLIB:
677 #if 0
678       fprintf (stderr, "SHLIB Sections not supported (and non conforming.)\n");
679 #endif
680       return true;
681
682     default:
683       /* Check for any processor-specific section types.  */
684       {
685         struct elf_backend_data *bed = get_elf_backend_data (abfd);
686
687         if (bed->elf_backend_section_from_shdr)
688           (*bed->elf_backend_section_from_shdr) (abfd, hdr, name);
689       }
690       break;
691     }
692
693   return true;
694 }
695
696 boolean
697 DEFUN (elf_new_section_hook, (abfd, sec),
698        bfd *abfd
699        AND asection *sec)
700 {
701   struct bfd_elf_section_data *sdata;
702
703   sdata = (struct bfd_elf_section_data *) bfd_alloc (abfd, sizeof (*sdata));
704   sec->used_by_bfd = (PTR) sdata;
705   memset (sdata, 0, sizeof (*sdata));
706   return true;
707 }
708
709 /* Create a new bfd section from an ELF program header.
710
711    Since program segments have no names, we generate a synthetic name
712    of the form segment<NUM>, where NUM is generally the index in the
713    program header table.  For segments that are split (see below) we
714    generate the names segment<NUM>a and segment<NUM>b.
715
716    Note that some program segments may have a file size that is different than
717    (less than) the memory size.  All this means is that at execution the
718    system must allocate the amount of memory specified by the memory size,
719    but only initialize it with the first "file size" bytes read from the
720    file.  This would occur for example, with program segments consisting
721    of combined data+bss.
722
723    To handle the above situation, this routine generates TWO bfd sections
724    for the single program segment.  The first has the length specified by
725    the file size of the segment, and the second has the length specified
726    by the difference between the two sizes.  In effect, the segment is split
727    into it's initialized and uninitialized parts.
728
729  */
730
731 static boolean
732 DEFUN (bfd_section_from_phdr, (abfd, hdr, index),
733        bfd * abfd AND
734        Elf_Internal_Phdr * hdr AND
735        int index)
736 {
737   asection *newsect;
738   char *name;
739   char namebuf[64];
740   int split;
741
742   split = ((hdr->p_memsz > 0) &&
743            (hdr->p_filesz > 0) &&
744            (hdr->p_memsz > hdr->p_filesz));
745   sprintf (namebuf, split ? "segment%da" : "segment%d", index);
746   name = bfd_alloc (abfd, strlen (namebuf) + 1);
747   strcpy (name, namebuf);
748   newsect = bfd_make_section (abfd, name);
749   newsect->vma = hdr->p_vaddr;
750   newsect->_raw_size = hdr->p_filesz;
751   newsect->filepos = hdr->p_offset;
752   newsect->flags |= SEC_HAS_CONTENTS;
753   if (hdr->p_type == PT_LOAD)
754     {
755       newsect->flags |= SEC_ALLOC;
756       newsect->flags |= SEC_LOAD;
757       if (hdr->p_flags & PF_X)
758         {
759           /* FIXME: all we known is that it has execute PERMISSION,
760              may be data. */
761           newsect->flags |= SEC_CODE;
762         }
763     }
764   if (!(hdr->p_flags & PF_W))
765     {
766       newsect->flags |= SEC_READONLY;
767     }
768
769   if (split)
770     {
771       sprintf (namebuf, "segment%db", index);
772       name = bfd_alloc (abfd, strlen (namebuf) + 1);
773       strcpy (name, namebuf);
774       newsect = bfd_make_section (abfd, name);
775       newsect->vma = hdr->p_vaddr + hdr->p_filesz;
776       newsect->_raw_size = hdr->p_memsz - hdr->p_filesz;
777       if (hdr->p_type == PT_LOAD)
778         {
779           newsect->flags |= SEC_ALLOC;
780           if (hdr->p_flags & PF_X)
781             newsect->flags |= SEC_CODE;
782         }
783       if (!(hdr->p_flags & PF_W))
784         newsect->flags |= SEC_READONLY;
785     }
786
787   return true;
788 }
789
790 /* Begin processing a given object.
791
792    First we validate the file by reading in the ELF header and checking
793    the magic number.  */
794
795 static INLINE boolean
796 DEFUN (elf_file_p, (x_ehdrp), Elf_External_Ehdr * x_ehdrp)
797 {
798   return ((x_ehdrp->e_ident[EI_MAG0] == ELFMAG0)
799           && (x_ehdrp->e_ident[EI_MAG1] == ELFMAG1)
800           && (x_ehdrp->e_ident[EI_MAG2] == ELFMAG2)
801           && (x_ehdrp->e_ident[EI_MAG3] == ELFMAG3));
802 }
803
804 /* Check to see if the file associated with ABFD matches the target vector
805    that ABFD points to.
806
807    Note that we may be called several times with the same ABFD, but different
808    target vectors, most of which will not match.  We have to avoid leaving
809    any side effects in ABFD, or any data it points to (like tdata), if the
810    file does not match the target vector.
811
812    FIXME:  There is memory leak if we are called more than once with the same
813    ABFD, and that bfd already has tdata allocated, since we allocate more tdata
814    and the old tdata is orphaned.  Since it's in the bfd obstack, there isn't
815    much we can do about this except possibly rewrite the code.  There are
816    also other bfd_allocs that may be the source of memory leaks as well. */
817
818 bfd_target *
819 DEFUN (elf_object_p, (abfd), bfd * abfd)
820 {
821   Elf_External_Ehdr x_ehdr;     /* Elf file header, external form */
822   Elf_Internal_Ehdr *i_ehdrp;   /* Elf file header, internal form */
823   Elf_External_Shdr x_shdr;     /* Section header table entry, external form */
824   Elf_Internal_Shdr *i_shdrp;   /* Section header table, internal form */
825   int shindex;
826   char *shstrtab;               /* Internal copy of section header stringtab */
827   struct elf_backend_data *ebd;
828   struct elf_obj_tdata *preserved_tdata = elf_tdata (abfd);
829
830   /* Read in the ELF header in external format.  */
831
832   if (bfd_read ((PTR) & x_ehdr, sizeof (x_ehdr), 1, abfd) != sizeof (x_ehdr))
833     goto got_system_call_error;
834
835   /* Now check to see if we have a valid ELF file, and one that BFD can
836      make use of.  The magic number must match, the address size ('class')
837      and byte-swapping must match our XVEC entry, and it must have a
838      section header table (FIXME: See comments re sections at top of this
839      file). */
840
841   if ((elf_file_p (&x_ehdr) == false) ||
842       (x_ehdr.e_ident[EI_VERSION] != EV_CURRENT) ||
843       (x_ehdr.e_ident[EI_CLASS] != ELFCLASS))
844     goto got_wrong_format_error;
845
846   /* Check that file's byte order matches xvec's */
847   switch (x_ehdr.e_ident[EI_DATA])
848     {
849     case ELFDATA2MSB:           /* Big-endian */
850       if (!abfd->xvec->header_byteorder_big_p)
851         goto got_wrong_format_error;
852       break;
853     case ELFDATA2LSB:           /* Little-endian */
854       if (abfd->xvec->header_byteorder_big_p)
855         goto got_wrong_format_error;
856       break;
857     case ELFDATANONE:           /* No data encoding specified */
858     default:                    /* Unknown data encoding specified */
859       goto got_wrong_format_error;
860     }
861
862   /* Allocate an instance of the elf_obj_tdata structure and hook it up to
863      the tdata pointer in the bfd.  FIXME:  memory leak, see above. */
864
865   elf_tdata (abfd) =
866     (struct elf_obj_tdata *) bfd_zalloc (abfd, sizeof (struct elf_obj_tdata));
867   if (elf_tdata (abfd) == NULL)
868     goto got_no_memory_error;
869
870   /* Now that we know the byte order, swap in the rest of the header */
871   i_ehdrp = elf_elfheader (abfd);
872   elf_swap_ehdr_in (abfd, &x_ehdr, i_ehdrp);
873 #if DEBUG & 1
874   elf_debug_file (i_ehdrp);
875 #endif
876
877   /* If there is no section header table, we're hosed. */
878   if (i_ehdrp->e_shoff == 0)
879     goto got_wrong_format_error;
880
881   /* As a simple sanity check, verify that the what BFD thinks is the
882      size of each section header table entry actually matches the size
883      recorded in the file. */
884   if (i_ehdrp->e_shentsize != sizeof (x_shdr))
885     goto got_wrong_format_error;
886
887   ebd = get_elf_backend_data (abfd);
888
889   /* Check that the ELF e_machine field matches what this particular
890      BFD format expects.  */
891   if (ebd->elf_machine_code != i_ehdrp->e_machine)
892     {
893       bfd_target **target_ptr;
894
895       if (ebd->elf_machine_code != EM_NONE)
896         goto got_wrong_format_error;
897
898       /* This is the generic ELF target.  Let it match any ELF target
899          for which we do not have a specific backend.  */
900       for (target_ptr = target_vector; *target_ptr != NULL; target_ptr++)
901         {
902           struct elf_backend_data *back;
903
904           if ((*target_ptr)->flavour != bfd_target_elf_flavour)
905             continue;
906           back = (struct elf_backend_data *) (*target_ptr)->backend_data;
907           if (back->elf_machine_code == i_ehdrp->e_machine)
908             {
909               /* target_ptr is an ELF backend which matches this
910                  object file, so reject the generic ELF target.  */
911               goto got_wrong_format_error;
912             }
913         }
914     }
915
916
917   /* Set the flags and architecture before calling the backend so that
918      it can override them.  */
919   if (i_ehdrp->e_type == ET_EXEC)
920     abfd->flags |= EXEC_P;
921   else if (i_ehdrp->e_type == ET_DYN)
922     abfd->flags |= DYNAMIC;
923
924   bfd_default_set_arch_mach (abfd, ebd->arch, 0);
925
926   /* Remember the entry point specified in the ELF file header. */
927   bfd_get_start_address (abfd) = i_ehdrp->e_entry;
928
929   /* Let the backend double check the format and override global
930      information.  */
931   if (ebd->elf_backend_object_p)
932     {
933       if ((*ebd->elf_backend_object_p) (abfd) == false)
934         goto got_wrong_format_error;
935     }
936     
937   /* Allocate space for a copy of the section header table in
938      internal form, seek to the section header table in the file,
939      read it in, and convert it to internal form.  */
940   i_shdrp = (Elf_Internal_Shdr *)
941     bfd_alloc (abfd, sizeof (*i_shdrp) * i_ehdrp->e_shnum);
942   elf_elfsections (abfd) =
943     (Elf_Internal_Shdr **) bfd_alloc (abfd, sizeof (i_shdrp) * i_ehdrp->e_shnum);
944   if (!i_shdrp || !elf_elfsections(abfd))
945     goto got_no_memory_error;
946   if (bfd_seek (abfd, i_ehdrp->e_shoff, SEEK_SET) == -1)
947     goto got_system_call_error;
948   for (shindex = 0; shindex < i_ehdrp->e_shnum; shindex++)
949     {
950       if (bfd_read ((PTR) & x_shdr, sizeof x_shdr, 1, abfd) != sizeof (x_shdr))
951         goto got_system_call_error;
952       elf_swap_shdr_in (abfd, &x_shdr, i_shdrp + shindex);
953       elf_elfsections(abfd)[shindex] = i_shdrp + shindex;
954
955       /* If this is a .dynamic section, mark the object file as being
956          dynamically linked.  */
957       if (i_shdrp[shindex].sh_type == SHT_DYNAMIC)
958         abfd->flags |= DYNAMIC;
959     }
960   if (i_ehdrp->e_shstrndx)
961     {
962       bfd_section_from_shdr (abfd, i_ehdrp->e_shstrndx);
963     }
964
965 #if 0
966   for (shindex = i_ehdrp->e_shnum - 1; shindex >= 0; shindex--)
967     {
968       if (!strcmp (elf_string_from_elf_strtab (abfd,
969                                                i_shdrp[shindex].sh_name),
970                    ".strtab"))
971         {
972           elf_tdata(abfd)->strtab_hdr = i_shdrp[shindex];
973           elf_elfsections(abfd)[shindex] = &elf_tdata(abfd)->strtab_hdr;
974         }
975       else if (!strcmp (elf_string_from_elf_strtab (abfd,
976                                                     i_shdrp[shindex].sh_name),
977                         ".symtab"))
978         {
979           elf_tdata(abfd)->symtab_hdr = i_shdrp[shindex];
980           elf_elfsections(abfd)[shindex] = &elf_tdata(abfd)->symtab_hdr;
981           elf_onesymtab (abfd) = shindex;
982         }
983     }
984 #endif
985
986   /* Read in the string table containing the names of the sections.  We
987      will need the base pointer to this table later. */
988   /* We read this inline now, so that we don't have to go through
989      bfd_section_from_shdr with it (since this particular strtab is
990      used to find all of the ELF section names.) */
991
992   shstrtab = elf_get_str_section (abfd, i_ehdrp->e_shstrndx);
993   if (!shstrtab)
994     goto got_wrong_format_error;
995
996   /* Once all of the section headers have been read and converted, we
997      can start processing them.  Note that the first section header is
998      a dummy placeholder entry, so we ignore it.
999
1000      We also watch for the symbol table section and remember the file
1001      offset and section size for both the symbol table section and the
1002      associated string table section. */
1003
1004   for (shindex = 1; shindex < i_ehdrp->e_shnum; shindex++)
1005     {
1006       bfd_section_from_shdr (abfd, shindex);
1007     }
1008
1009   return (abfd->xvec);
1010
1011   /* If we are going to use goto's to avoid duplicating error setting
1012      and return(NULL) code, then this at least makes it more maintainable. */
1013
1014  got_system_call_error:
1015   bfd_error = system_call_error;
1016   goto got_no_match;
1017  got_wrong_format_error:
1018   bfd_error = wrong_format;
1019   goto got_no_match;
1020  got_no_memory_error:
1021   bfd_error = no_memory;
1022   goto got_no_match;
1023  got_no_match:
1024   elf_tdata (abfd) = preserved_tdata;
1025   return (NULL);
1026 }
1027
1028 \f
1029 /* ELF .o/exec file writing */
1030
1031 /* Takes a bfd and a symbol, returns a pointer to the elf specific area
1032    of the symbol if there is one.  */
1033 static INLINE elf_symbol_type *
1034 DEFUN (elf_symbol_from, (ignore_abfd, symbol),
1035        bfd * ignore_abfd AND
1036        asymbol * symbol)
1037 {
1038   if (symbol->the_bfd->xvec->flavour != bfd_target_elf_flavour)
1039     return 0;
1040
1041   if (symbol->the_bfd->tdata.elf_obj_data == (struct elf_obj_tdata *) NULL)
1042     return 0;
1043
1044   return (elf_symbol_type *) symbol;
1045 }
1046
1047 /* Create ELF output from BFD sections.
1048
1049    Essentially, just create the section header and forget about the program
1050    header for now.  */
1051
1052 static void
1053 DEFUN (elf_make_sections, (abfd, asect, obj),
1054        bfd * abfd AND
1055        asection * asect AND
1056        PTR obj)
1057 {
1058   /* most of what is in bfd_shdr_from_section goes in here... */
1059   /* and all of these sections generate at *least* one ELF section. */
1060   Elf_Internal_Shdr *this_hdr;
1061   this_hdr = &elf_section_data (asect)->this_hdr;
1062
1063   this_hdr->sh_addr = asect->vma;
1064   this_hdr->sh_size = asect->_raw_size;
1065   /* contents already set by elf_set_section_contents */
1066
1067   if (asect->flags & SEC_RELOC)
1068     {
1069       /* emit a reloc section, and thus strtab and symtab... */
1070       Elf_Internal_Shdr *rela_hdr;
1071       int use_rela_p = get_elf_backend_data (abfd)->use_rela_p;
1072
1073       rela_hdr = &elf_section_data (asect)->rel_hdr;
1074
1075       /* orelocation has the data, reloc_count has the count... */
1076       if (use_rela_p)
1077         {
1078           rela_hdr->sh_type = SHT_RELA;
1079           rela_hdr->sh_entsize = sizeof (Elf_External_Rela);
1080         }
1081       else
1082         /* REL relocations */
1083         {
1084           rela_hdr->sh_type = SHT_REL;
1085           rela_hdr->sh_entsize = sizeof (Elf_External_Rel);
1086         }
1087       rela_hdr->sh_flags = 0;
1088       rela_hdr->sh_addr = 0;
1089       rela_hdr->sh_offset = 0;
1090
1091       /* FIXME: Systems I've checked use an alignment of 4, but it is
1092          possible that some systems use a different alignment.  */
1093       rela_hdr->sh_addralign = 4;
1094
1095       rela_hdr->size = 0;
1096     }
1097   if (asect->flags & SEC_ALLOC)
1098     {
1099       this_hdr->sh_flags |= SHF_ALLOC;
1100       if (asect->flags & SEC_LOAD)
1101         {
1102           /* @@ Do something with sh_type? */
1103         }
1104     }
1105   else
1106     {
1107       /* If this section is not part of the program image during
1108          execution, leave the address fields at 0.  */
1109       this_hdr->sh_addr = 0;
1110       asect->vma = 0;
1111     }
1112   if (!(asect->flags & SEC_READONLY))
1113     this_hdr->sh_flags |= SHF_WRITE;
1114
1115   if (asect->flags & SEC_CODE)
1116     this_hdr->sh_flags |= SHF_EXECINSTR;
1117 }
1118
1119 void
1120 write_relocs (abfd, sec, xxx)
1121      bfd *abfd;
1122      asection *sec;
1123      PTR xxx;
1124 {
1125   Elf_Internal_Shdr *rela_hdr;
1126   Elf_External_Rela *outbound_relocas;
1127   Elf_External_Rel *outbound_relocs;
1128   int idx;
1129   int use_rela_p = get_elf_backend_data (abfd)->use_rela_p;
1130   asymbol *last_sym = 0;
1131   int last_sym_idx = 9999999;   /* should always be written before use */
1132
1133   if ((sec->flags & SEC_RELOC) == 0)
1134     return;
1135   /* Flags are sometimes inconsistent.  */
1136   if (sec->reloc_count == 0)
1137     return;
1138
1139   rela_hdr = &elf_section_data (sec)->rel_hdr;
1140
1141   rela_hdr->sh_size = rela_hdr->sh_entsize * sec->reloc_count;
1142   rela_hdr->contents = (void *) bfd_alloc (abfd, rela_hdr->sh_size);
1143
1144   /* orelocation has the data, reloc_count has the count... */
1145   if (use_rela_p)
1146     {
1147       outbound_relocas = (Elf_External_Rela *) rela_hdr->contents;
1148
1149       for (idx = 0; idx < sec->reloc_count; idx++)
1150         {
1151           Elf_Internal_Rela dst_rela;
1152           Elf_External_Rela *src_rela;
1153           arelent *ptr;
1154           asymbol *sym;
1155           int n;
1156
1157           ptr = sec->orelocation[idx];
1158           src_rela = outbound_relocas + idx;
1159           if (!(abfd->flags & EXEC_P))
1160             dst_rela.r_offset = ptr->address - sec->vma;
1161           else
1162             dst_rela.r_offset = ptr->address;
1163
1164           sym = *ptr->sym_ptr_ptr;
1165           if (sym == last_sym)
1166             n = last_sym_idx;
1167           else
1168             {
1169               last_sym = sym;
1170               last_sym_idx = n = elf_symbol_from_bfd_symbol (abfd, &sym);
1171             }
1172           dst_rela.r_info = ELF_R_INFO (n, ptr->howto->type);
1173
1174           dst_rela.r_addend = ptr->addend;
1175           elf_swap_reloca_out (abfd, &dst_rela, src_rela);
1176         }
1177     }
1178   else
1179     /* REL relocations */
1180     {
1181       outbound_relocs = (Elf_External_Rel *) rela_hdr->contents;
1182
1183       for (idx = 0; idx < sec->reloc_count; idx++)
1184         {
1185           Elf_Internal_Rel dst_rel;
1186           Elf_External_Rel *src_rel;
1187           arelent *ptr;
1188           int n;
1189           asymbol *sym;
1190
1191           ptr = sec->orelocation[idx];
1192           sym = *ptr->sym_ptr_ptr;
1193           src_rel = outbound_relocs + idx;
1194           if (!(abfd->flags & EXEC_P))
1195             dst_rel.r_offset = ptr->address - sec->vma;
1196           else
1197             dst_rel.r_offset = ptr->address;
1198
1199           if (sym == last_sym)
1200             n = last_sym_idx;
1201           else
1202             {
1203               last_sym = sym;
1204               last_sym_idx = n = elf_symbol_from_bfd_symbol (abfd, &sym);
1205             }
1206           dst_rel.r_info = ELF_R_INFO (n, ptr->howto->type);
1207
1208           elf_swap_reloc_out (abfd, &dst_rel, src_rel);
1209         }
1210     }
1211 }
1212
1213 static void
1214 fix_up_strtabs (abfd, asect, obj)
1215      bfd *abfd;
1216      asection *asect;
1217      PTR obj;
1218 {
1219   Elf_Internal_Shdr *this_hdr = &elf_section_data (asect)->this_hdr;
1220   int this_idx = elf_section_data(asect)->this_idx;
1221
1222   /* @@ Check flags!  */
1223   if (!strncmp (asect->name, ".stab", 5)
1224       && !strcmp ("str", asect->name + strlen (asect->name) - 3))
1225     {
1226       size_t len = strlen (asect->name) + 1;
1227       char *s = (char *) alloca (len);
1228       strcpy (s, asect->name);
1229       s[len - 4] = 0;
1230       asect = bfd_get_section_by_name (abfd, s);
1231       if (!asect)
1232         abort ();
1233       elf_section_data(asect)->this_hdr.sh_link = this_idx;
1234       /* @@ Assuming 32 bits!  */
1235       elf_section_data(asect)->this_hdr.sh_entsize = 0xc;
1236
1237       this_hdr->sh_type = SHT_STRTAB;
1238     }
1239 }
1240
1241 static void
1242 DEFUN (elf_fake_sections, (abfd, asect, obj),
1243        bfd * abfd AND
1244        asection * asect AND
1245        PTR obj)
1246 {
1247   /* most of what is in bfd_shdr_from_section goes in here... */
1248   /* and all of these sections generate at *least* one ELF section. */
1249
1250   Elf_Internal_Shdr *this_hdr;
1251   this_hdr = &elf_section_data (asect)->this_hdr;
1252   this_hdr->sh_name =
1253     bfd_add_to_strtab (abfd, elf_shstrtab (abfd), asect->name);
1254   /* We need to log the type *now* so that elf_section_from_bfd_section
1255      can find us... have to set rawdata too. */
1256   this_hdr->rawdata = (void *) asect;
1257   this_hdr->sh_addralign = 1 << asect->alignment_power;
1258   if ((asect->flags & SEC_ALLOC) && (asect->flags & SEC_LOAD))
1259     this_hdr->sh_type = SHT_PROGBITS;
1260   else if ((asect->flags & SEC_ALLOC) && ((asect->flags & SEC_LOAD) == 0))
1261     {
1262       BFD_ASSERT (strcmp (asect->name, ".bss") == 0
1263                   || strcmp (asect->name, ".sbss") == 0);
1264       this_hdr->sh_type = SHT_NOBITS;
1265     }
1266   /* FIXME I am not sure how to detect a .note section from the flags
1267      word of an `asection'.  */
1268   else if (!strcmp (asect->name, ".note"))
1269     this_hdr->sh_type = SHT_NOTE;
1270   else
1271     this_hdr->sh_type = SHT_PROGBITS;
1272
1273   this_hdr->sh_flags = 0;
1274   this_hdr->sh_addr = 0;
1275   this_hdr->sh_size = 0;
1276   this_hdr->sh_entsize = 0;
1277   this_hdr->sh_info = 0;
1278   this_hdr->sh_link = 0;
1279   this_hdr->sh_offset = 0;
1280   this_hdr->size = 0;
1281
1282   /* Now, check for processor-specific section types.  */
1283   {
1284     struct elf_backend_data *bed = get_elf_backend_data (abfd);
1285
1286     if (bed->elf_backend_fake_sections)
1287       (*bed->elf_backend_fake_sections) (abfd, this_hdr, asect);
1288   }
1289
1290   {
1291     /* Emit a strtab and symtab, and possibly a reloc section.  */
1292     Elf_Internal_Shdr *rela_hdr;
1293
1294     /* Note that only one symtab is used, so just remember it
1295        for now.  */
1296
1297     if (asect->flags & SEC_RELOC)
1298       {
1299         int use_rela_p = get_elf_backend_data (abfd)->use_rela_p;
1300
1301         rela_hdr = &elf_section_data (asect)->rel_hdr;
1302         rela_hdr->sh_name =
1303           bfd_add_2_to_strtab (abfd, elf_shstrtab (abfd),
1304                                use_rela_p ? ".rela" : ".rel",
1305                                asect->name);
1306         rela_hdr->sh_type = use_rela_p ? SHT_RELA : SHT_REL;
1307         rela_hdr->sh_entsize = (use_rela_p
1308                                 ? sizeof (Elf_External_Rela)
1309                                 : sizeof (Elf_External_Rel));
1310
1311         rela_hdr->sh_flags = 0;
1312         rela_hdr->sh_addr = 0;
1313         rela_hdr->sh_size = 0;
1314         rela_hdr->sh_offset = 0;
1315
1316         /* FIXME: Systems I've checked use an alignment of 4, but some
1317            systems may use a different alignment.  */
1318         rela_hdr->sh_addralign = 4;
1319
1320         rela_hdr->size = 0;
1321       }
1322   }
1323   if (asect->flags & SEC_ALLOC)
1324     {
1325       this_hdr->sh_flags |= SHF_ALLOC;
1326       if (asect->flags & SEC_LOAD)
1327         {
1328           /* @@ Do something with sh_type?  */
1329         }
1330     }
1331   if (!(asect->flags & SEC_READONLY))
1332     this_hdr->sh_flags |= SHF_WRITE;
1333   if (asect->flags & SEC_CODE)
1334     this_hdr->sh_flags |= SHF_EXECINSTR;
1335 }
1336
1337 /* Map symbol from it's internal number to the external number, moving
1338    all local symbols to be at the head of the list.  */
1339
1340 static INLINE int
1341 sym_is_global (abfd, sym)
1342      bfd *abfd;
1343      asymbol *sym;
1344 {
1345   /* If the backend has a special mapping, use it.  */
1346   if (get_elf_backend_data (abfd)->elf_backend_sym_is_global)
1347     return ((*get_elf_backend_data (abfd)->elf_backend_sym_is_global)
1348             (abfd, sym));
1349
1350   if (sym->flags & (BSF_GLOBAL | BSF_WEAK))
1351     {
1352       if (sym->flags & BSF_LOCAL)
1353         abort ();
1354       return 1;
1355     }
1356   if (sym->section == 0)
1357     {
1358       /* Is this valid?  */
1359       abort ();
1360
1361       return 1;
1362     }
1363   if (sym->section == &bfd_und_section)
1364     return 1;
1365   if (bfd_is_com_section (sym->section))
1366     return 1;
1367   if (sym->flags & (BSF_LOCAL | BSF_SECTION_SYM | BSF_FILE))
1368     return 0;
1369   return 0;
1370 }
1371
1372 static void
1373 DEFUN (elf_map_symbols, (abfd), bfd * abfd)
1374 {
1375   int symcount = bfd_get_symcount (abfd);
1376   asymbol **syms = bfd_get_outsymbols (abfd);
1377   asymbol **sect_syms;
1378   int num_locals = 0;
1379   int num_globals = 0;
1380   int num_locals2 = 0;
1381   int num_globals2 = 0;
1382   int max_index = 0;
1383   int num_sections = 0;
1384   Elf_Sym_Extra *sym_extra;
1385   int idx;
1386   asection *asect;
1387
1388 #ifdef DEBUG
1389   fprintf (stderr, "elf_map_symbols\n");
1390   fflush (stderr);
1391 #endif
1392
1393   /* Add local symbols for each section for which there are relocs.
1394      FIXME: How can we tell which sections have relocs at this point?
1395      Will reloc_count always be accurate?  Actually, I think most ELF
1396      targets create section symbols for all sections anyhow.  */
1397   for (asect = abfd->sections; asect; asect = asect->next)
1398     {
1399       if (max_index < asect->index)
1400         max_index = asect->index;
1401     }
1402
1403   max_index++;
1404   elf_num_section_syms (abfd) = max_index;
1405   sect_syms = (asymbol **) bfd_zalloc (abfd, max_index * sizeof (asymbol *));
1406   elf_section_syms (abfd) = sect_syms;
1407
1408   BFD_ASSERT (sect_syms != 0);
1409
1410   for (asect = abfd->sections; asect; asect = asect->next)
1411     {
1412       asymbol *sym = bfd_make_empty_symbol (abfd);
1413       sym->the_bfd = abfd;
1414       sym->name = asect->name;
1415       sym->value = asect->vma;
1416       sym->flags = BSF_SECTION_SYM;
1417       sym->section = asect;
1418       sect_syms[asect->index] = sym;
1419       num_sections++;
1420 #ifdef DEBUG
1421       fprintf (stderr,
1422                "creating section symbol, name = %s, value = 0x%.8lx, index = %d, section = 0x%.8lx\n",
1423                asect->name, (long) asect->vma, asect->index, (long) asect);
1424 #endif
1425     }
1426
1427   if (num_sections)
1428     {
1429       if (syms)
1430         syms = (asymbol **) bfd_realloc (abfd, syms,
1431                                          ((symcount + num_sections + 1)
1432                                           * sizeof (asymbol *)));
1433       else
1434         syms = (asymbol **) bfd_alloc (abfd,
1435                                        (num_sections + 1) * sizeof (asymbol *));
1436
1437       for (asect = abfd->sections; asect; asect = asect->next)
1438         {
1439           if (sect_syms[asect->index])
1440             syms[symcount++] = sect_syms[asect->index];
1441         }
1442
1443       syms[symcount] = (asymbol *) 0;
1444       bfd_set_symtab (abfd, syms, symcount);
1445     }
1446
1447   elf_sym_extra (abfd) = sym_extra
1448     = (Elf_Sym_Extra *) bfd_alloc (abfd, symcount * sizeof (Elf_Sym_Extra));
1449
1450   /* Identify and classify all of the symbols.  */
1451   for (idx = 0; idx < symcount; idx++)
1452     {
1453       if (!sym_is_global (abfd, syms[idx]))
1454         num_locals++;
1455       else
1456         num_globals++;
1457     }
1458
1459   /* Now provide mapping information.  Add +1 for skipping over the
1460      dummy symbol.  */
1461   for (idx = 0; idx < symcount; idx++)
1462     {
1463       syms[idx]->udata = (PTR) &sym_extra[idx];
1464       if (!sym_is_global (abfd, syms[idx]))
1465         sym_extra[idx].elf_sym_num = 1 + num_locals2++;
1466       else
1467         sym_extra[idx].elf_sym_num = 1 + num_locals + num_globals2++;
1468     }
1469
1470   elf_num_locals (abfd) = num_locals;
1471   elf_num_globals (abfd) = num_globals;
1472 }
1473
1474 static void assign_section_numbers ();
1475 static void assign_file_positions_except_relocs ();
1476
1477 static boolean
1478 DEFUN (elf_compute_section_file_positions, (abfd), bfd * abfd)
1479 {
1480   bfd_map_over_sections (abfd, elf_fake_sections, 0);
1481
1482   assign_section_numbers (abfd);
1483
1484   bfd_map_over_sections (abfd, elf_make_sections, 0);
1485
1486   bfd_map_over_sections (abfd, fix_up_strtabs, 0); /* .stab/.stabstr &c */
1487
1488   swap_out_syms (abfd);
1489
1490   assign_file_positions_except_relocs (abfd);
1491
1492   return true;
1493 }
1494
1495 static boolean
1496 DEFUN (elf_write_phdrs, (abfd, i_ehdrp, i_phdrp, phdr_cnt),
1497        bfd * abfd AND
1498        Elf_Internal_Ehdr * i_ehdrp AND
1499        Elf_Internal_Phdr * i_phdrp AND
1500        Elf32_Half phdr_cnt)
1501 {
1502   /* first program header entry goes after the file header */
1503   int outbase = i_ehdrp->e_phoff;
1504   int i;
1505   Elf_External_Phdr x_phdr;
1506
1507   for (i = 0; i < phdr_cnt; i++)
1508     {
1509       elf_swap_phdr_out (abfd, i_phdrp + i, &x_phdr);
1510       bfd_seek (abfd, outbase, SEEK_SET);
1511       bfd_write ((PTR) & x_phdr, sizeof (x_phdr), 1, abfd);
1512       outbase += sizeof (x_phdr);
1513     }
1514
1515   return true;
1516 }
1517
1518 static const Elf_Internal_Shdr null_shdr;
1519
1520 /* Assign all ELF section numbers.  The dummy first section is handled here
1521    too.  The link/info pointers for the standard section types are filled
1522    in here too, while we're at it.  (Link pointers for .stab sections are
1523    not filled in here.)  */
1524 static void
1525 assign_section_numbers (abfd)
1526      bfd *abfd;
1527 {
1528   struct elf_obj_tdata *t = elf_tdata (abfd);
1529   asection *sec;
1530   int section_number = 1;
1531   int i;
1532   Elf_Internal_Shdr **i_shdrp;
1533
1534   t->shstrtab_hdr.sh_size = elf_shstrtab(abfd)->length;
1535   t->shstrtab_hdr.contents = (void *) elf_shstrtab(abfd)->tab;
1536   shstrtab_length_fixed = 1;
1537
1538   t->shstrtab_section = section_number++;
1539   elf_elfheader(abfd)->e_shstrndx = t->shstrtab_section;
1540   if (abfd->symcount)
1541     {
1542       t->symtab_section = section_number++;
1543       t->strtab_section = section_number++;
1544       t->symtab_hdr.sh_link = t->strtab_section;
1545     }
1546   for (sec = abfd->sections; sec; sec = sec->next)
1547     {
1548       struct bfd_elf_section_data *d = elf_section_data (sec);
1549       d->this_idx = section_number++;
1550       if (sec->flags & SEC_RELOC)
1551         {
1552           d->rel_idx = section_number++;
1553           d->rel_hdr.sh_link = t->symtab_section;
1554           d->rel_hdr.sh_info = d->this_idx;
1555         }
1556       else
1557         d->rel_idx = 0;
1558       /* No handling for per-section string tables currently.  */
1559     }
1560   elf_elfheader(abfd)->e_shnum = section_number;
1561
1562   /* Set up the list of section header pointers, in agreement with the
1563      indices.  */
1564   i_shdrp = (Elf_Internal_Shdr **)
1565     bfd_alloc (abfd, section_number * sizeof (Elf_Internal_Shdr *));
1566   elf_elfsections(abfd) = i_shdrp;
1567   for (i = 0; i < section_number; i++)
1568     i_shdrp[i] = 0;
1569
1570   i_shdrp[0] = (Elf_Internal_Shdr *) &null_shdr;
1571   i_shdrp[t->shstrtab_section] = &t->shstrtab_hdr;
1572   if (abfd->symcount)
1573     {
1574       i_shdrp[t->symtab_section] = &t->symtab_hdr;
1575       i_shdrp[t->strtab_section] = &t->strtab_hdr;
1576     }
1577   for (sec = abfd->sections; sec; sec = sec->next)
1578     {
1579       struct bfd_elf_section_data *d = elf_section_data (sec);
1580       i_shdrp[d->this_idx] = &d->this_hdr;
1581       if (d->rel_idx)
1582         i_shdrp[d->rel_idx] = &d->rel_hdr;
1583     }
1584   /* Make sure we got everything.... */
1585   for (i = 0; i < section_number; i++)
1586     if (i_shdrp[i] == 0)
1587       abort ();
1588 }
1589
1590 static INLINE file_ptr
1591 assign_file_position_for_section (i_shdrp, offset)
1592      Elf_Internal_Shdr *i_shdrp;
1593      file_ptr offset;
1594 {
1595   int align;
1596
1597   if (i_shdrp->sh_addralign != 0)
1598     align = i_shdrp->sh_addralign;
1599   else
1600     align = 1;
1601   i_shdrp->sh_offset = offset = BFD_ALIGN (offset, align);
1602   if (i_shdrp->rawdata != NULL)
1603     ((asection *) i_shdrp->rawdata)->filepos = offset;
1604   if (i_shdrp->sh_type != SHT_NOBITS)
1605     offset += i_shdrp->sh_size;
1606   return offset;
1607 }
1608
1609 static INLINE file_ptr
1610 align_file_position (off)
1611      file_ptr off;
1612 {
1613   return (off + FILE_ALIGN - 1) & ~(FILE_ALIGN - 1);
1614 }
1615
1616 static INLINE file_ptr
1617 assign_file_positions_for_symtab_and_strtabs (abfd, off)
1618      bfd *abfd;
1619      file_ptr off;
1620 {
1621   struct elf_obj_tdata *t = elf_tdata (abfd);
1622
1623   off = align_file_position (off);
1624   off = assign_file_position_for_section (&t->symtab_hdr, off);
1625   off = assign_file_position_for_section (&t->shstrtab_hdr, off);
1626   off = assign_file_position_for_section (&t->strtab_hdr, off);
1627   return off;
1628 }
1629
1630 struct seg_info {
1631   bfd_vma low, mem_size;
1632   file_ptr file_size;
1633   int start_pos;
1634   int sh_flags;
1635   struct seg_info *next;
1636 };
1637
1638 static void
1639 map_program_segments (abfd)
1640      bfd *abfd;
1641 {
1642   Elf_Internal_Shdr **i_shdrpp = elf_elfsections (abfd);
1643   Elf_Internal_Ehdr *i_ehdrp = elf_elfheader (abfd);
1644   Elf_Internal_Shdr *i_shdrp;
1645   Elf_Internal_Phdr *phdr;
1646   char *done;
1647   int i, n_left = 0;
1648   file_ptr lowest_offset = 0;
1649   struct seg_info *seg = 0;
1650
1651   done = (char *) alloca (i_ehdrp->e_shnum);
1652   memset (done, 0, i_ehdrp->e_shnum);
1653   for (i = 1; i < i_ehdrp->e_shnum; i++)
1654     {
1655       i_shdrp = i_shdrpp[i];
1656       /* If it's going to be mapped in, it's been assigned a position.  */
1657       if (i_shdrp->sh_offset + 1 == 0)
1658         {
1659           /* Well, not really, but we won't process it here.   */
1660           done[i] = 1;
1661           continue;
1662         }
1663       if (i_shdrp->sh_offset < lowest_offset
1664           || lowest_offset == 0)
1665         lowest_offset = i_shdrp->sh_offset;
1666       /* Only interested in PROGBITS or NOBITS for generating segments.  */
1667       switch (i_shdrp->sh_type)
1668         {
1669         case SHT_PROGBITS:
1670         case SHT_NOBITS:
1671           break;
1672         default:
1673           done[i] = 1;
1674         }
1675       if (!done[i])
1676         n_left++;
1677     }
1678   while (n_left)
1679     {
1680       bfd_vma lowest_vma = -1, high;
1681       int low_sec = 0;
1682       int mem_size;
1683       int file_size = 0;
1684
1685       for (i = 1; i < i_ehdrp->e_shnum; i++)
1686         {
1687           i_shdrp = i_shdrpp[i];
1688           if (!done[i] && i_shdrp->sh_addr < lowest_vma)
1689             {
1690               lowest_vma = i_shdrp->sh_addr;
1691               low_sec = i;
1692             }
1693         }
1694       if (low_sec == 0)
1695         abort ();
1696       /* So now we know the lowest vma of any unassigned sections; start
1697          a segment there.  */
1698       {
1699         struct seg_info *s;
1700         s = (struct seg_info *) bfd_alloc (abfd, sizeof (struct seg_info));
1701         s->next = seg;
1702         seg = s;
1703       }
1704       seg->low = lowest_vma;
1705       i_shdrp = i_shdrpp[low_sec];
1706       seg->start_pos = i_shdrp->sh_offset;
1707       seg->sh_flags = i_shdrp->sh_flags;
1708       done[low_sec] = 1, n_left--;
1709       mem_size = i_shdrp->sh_size;
1710       high = lowest_vma + i_shdrp->sh_size;
1711
1712       if (i_shdrp->sh_type == SHT_PROGBITS)
1713         file_size = i_shdrp->sh_size;
1714
1715       for (i = 1; i < i_ehdrp->e_shnum; i++)
1716         {
1717           file_ptr f1;
1718
1719           if (done[i])
1720             continue;
1721           i_shdrp = i_shdrpp[i];
1722           /* position of next byte on disk */
1723           f1 = seg->start_pos + file_size;
1724           if (i_shdrp->sh_type == SHT_PROGBITS)
1725             {
1726               if (i_shdrp->sh_offset - f1 != i_shdrp->sh_addr - high)
1727                 continue;
1728               if (file_size != mem_size)
1729                 break;
1730             }
1731           else /* sh_type == NOBITS */
1732             {
1733               /* If the section in question has no contents in the disk
1734                  file, we really don't care where it supposedly starts.
1735                  But we don't want to bother merging it into this segment
1736                  if it doesn't start on this memory page.  */
1737               bfd_vma page1, page2;
1738               bfd_vma maxpagesize = get_elf_backend_data (abfd)->maxpagesize;
1739
1740               /* page number in address space of current end of seg */
1741               page1 = (high - 1 + maxpagesize - 1) / maxpagesize;
1742               /* page number in address space of start of this section */
1743               page2 = (i_shdrp->sh_addr + maxpagesize - 1) / maxpagesize;
1744
1745               if (page1 != page2)
1746                 continue;
1747             }
1748           done[i] = 1, n_left--;
1749           if (i_shdrp->sh_type == SHT_PROGBITS)
1750             file_size = i_shdrp->sh_offset + i_shdrp->sh_size - seg->start_pos;
1751           mem_size = i_shdrp->sh_addr + i_shdrp->sh_size - seg->low;
1752           high = i_shdrp->sh_addr + i_shdrp->sh_size;
1753           i = 0;
1754         }
1755       seg->file_size = file_size;
1756       seg->mem_size = mem_size;
1757     }
1758   /* Now do something with the list of segments we've built up.  */
1759   {
1760     bfd_vma maxpagesize = get_elf_backend_data (abfd)->maxpagesize;
1761     struct seg_info *s;
1762     int n_segs = 0;
1763     int sz;
1764
1765     for (s = seg; s; s = s->next)
1766       {
1767         n_segs++;
1768       }
1769     i_ehdrp->e_phentsize = sizeof (Elf_External_Phdr);
1770     sz = sizeof (Elf_External_Phdr) * n_segs;
1771     if (align_file_position (i_ehdrp->e_ehsize) + sz <= lowest_offset)
1772       i_ehdrp->e_phoff = align_file_position (i_ehdrp->e_ehsize);
1773     else
1774       {
1775         i_ehdrp->e_phoff = align_file_position (elf_tdata (abfd)->next_file_pos);
1776         elf_tdata (abfd)->next_file_pos = i_ehdrp->e_phoff + sz;
1777       }
1778     phdr = (Elf_Internal_Phdr*) bfd_alloc (abfd,
1779                                            n_segs * sizeof (Elf_Internal_Phdr));
1780     elf_tdata (abfd)->phdr = phdr;
1781     while (seg)
1782       {
1783         phdr->p_type = PT_LOAD; /* only type we really support so far */
1784         phdr->p_offset = seg->start_pos;
1785         phdr->p_vaddr = seg->low;
1786         phdr->p_paddr = 0;
1787         phdr->p_filesz = seg->file_size;
1788         phdr->p_memsz = seg->mem_size;
1789         phdr->p_flags = PF_R;
1790         phdr->p_align = maxpagesize; /* ? */
1791         if (seg->sh_flags & SHF_WRITE)
1792           /* SysVr4 ELF docs say "data segments normally have read, write,
1793              and execute permissions."  */
1794           phdr->p_flags |= (PF_W | PF_X);
1795         if (seg->sh_flags & SHF_EXECINSTR)
1796           phdr->p_flags |= PF_X;
1797         phdr++;
1798         seg = seg->next;
1799       }
1800     i_ehdrp->e_phnum = n_segs;
1801   }
1802   elf_write_phdrs (abfd, i_ehdrp, elf_tdata (abfd)->phdr, i_ehdrp->e_phnum);
1803 }
1804
1805 static void
1806 assign_file_positions_except_relocs (abfd)
1807      bfd *abfd;
1808 {
1809   /* For now, we ignore the possibility of having program segments, which
1810      may require some alignment in the file.  That'll require padding, and
1811      some interesting calculations to optimize file space usage.
1812
1813      Also, since the application may change the list of relocations for
1814      a given section, we don't figure them in here.  We'll put them at the
1815      end of the file, at positions computed during bfd_close.
1816
1817      The order, for now: <ehdr> <shdr> <sec1> <sec2> <sec3> ... <rel1> ...
1818      or:                 <ehdr> <phdr> <sec1> <sec2> ... <shdr> <rel1> ... */
1819
1820   struct elf_obj_tdata *t = elf_tdata (abfd);
1821   file_ptr off;
1822   int i;
1823   Elf_Internal_Shdr **i_shdrpp = elf_elfsections (abfd);
1824   Elf_Internal_Shdr *i_shdrp;
1825   Elf_Internal_Ehdr *i_ehdrp = elf_elfheader (abfd);
1826   int exec_p = (abfd->flags & EXEC_P) != 0;
1827   bfd_vma maxpagesize = get_elf_backend_data (abfd)->maxpagesize;
1828
1829   /* Everything starts after the ELF file header.  */
1830   off = i_ehdrp->e_ehsize;
1831
1832   if (!exec_p)
1833     {
1834       /* Section headers.  */
1835       off = align_file_position (off);
1836       i_ehdrp->e_shoff = off;
1837       off += i_ehdrp->e_shnum * i_ehdrp->e_shentsize;
1838       off = assign_file_positions_for_symtab_and_strtabs (abfd, off);
1839     }
1840   for (i = 1; i < i_ehdrp->e_shnum; i++)
1841     {
1842       /* The symtab and strtab sections are placed by
1843          assign_file_positions_for_symtab_and_strtabs.  */
1844       if (i == t->symtab_section
1845           || i == t->strtab_section
1846           || i == t->shstrtab_section)
1847         continue;
1848
1849       i_shdrp = i_shdrpp[i];
1850       if (i_shdrp->sh_type == SHT_REL || i_shdrp->sh_type == SHT_RELA)
1851         {
1852           i_shdrp->sh_offset = -1;
1853           continue;
1854         }
1855       if (exec_p)
1856         {
1857           if (maxpagesize == 0)
1858             maxpagesize = 1;    /* make the arithmetic work */
1859           /* This isn't necessarily going to give the best packing, if the
1860              segments require padding between them, but since that isn't
1861              usually the case, this'll do.  */
1862           if ((i_shdrp->sh_flags & SHF_ALLOC) == 0)
1863             {
1864               i_shdrp->sh_offset = -1;
1865               continue;
1866             }
1867           /* Blindly assume that the segments are ordered optimally.  With
1868              the default LD script, they will be.  */
1869           if (i_shdrp->sh_type != SHT_NOBITS)
1870             {
1871               /* need big unsigned type */
1872               bfd_vma addtl_off;
1873               addtl_off = i_shdrp->sh_addr - off;
1874               addtl_off = addtl_off % maxpagesize;
1875               if (addtl_off)
1876                 {
1877                   off += addtl_off;
1878                 }
1879             }
1880         }
1881       off = assign_file_position_for_section (i_shdrp, off);
1882
1883       if (exec_p
1884           && i_shdrp->sh_type == SHT_NOBITS
1885           && (i == i_ehdrp->e_shnum
1886               || i_shdrpp[i + 1]->sh_type != SHT_NOBITS))
1887         {
1888           /* Skip to the next page to ensure that when the file is
1889              loaded the bss section is loaded with zeroes.  I don't
1890              know if this is required on all platforms, but it
1891              shouldn't really hurt.  */
1892           off = BFD_ALIGN (off, maxpagesize);
1893         }
1894
1895       if (exec_p
1896           && get_elf_backend_data(abfd)->maxpagesize > 1
1897           && i_shdrp->sh_type == SHT_PROGBITS
1898           && (i_shdrp->sh_flags & SHF_ALLOC)
1899           && (i_shdrp->sh_offset - i_shdrp->sh_addr) % get_elf_backend_data (abfd)->maxpagesize != 0)
1900         abort ();
1901     }
1902   if (exec_p)
1903     {
1904       elf_tdata (abfd)->next_file_pos = off;
1905       map_program_segments (abfd);
1906       off = elf_tdata (abfd)->next_file_pos;
1907
1908       /* Section headers.  */
1909       off = align_file_position (off);
1910       i_ehdrp->e_shoff = off;
1911       off += i_ehdrp->e_shnum * i_ehdrp->e_shentsize;
1912
1913       off = assign_file_positions_for_symtab_and_strtabs (abfd, off);
1914
1915       for (i = 1; i < i_ehdrp->e_shnum; i++)
1916         {
1917           i_shdrp = i_shdrpp[i];
1918           if (i_shdrp->sh_offset + 1 == 0
1919               && i_shdrp->sh_type != SHT_REL
1920               && i_shdrp->sh_type != SHT_RELA)
1921             off = assign_file_position_for_section (i_shdrp, off);
1922         }
1923     }
1924   elf_tdata (abfd)->next_file_pos = off;
1925 }
1926
1927 static boolean
1928 prep_headers (abfd)
1929      bfd *abfd;
1930 {
1931   Elf_Internal_Ehdr *i_ehdrp;   /* Elf file header, internal form */
1932   Elf_Internal_Phdr *i_phdrp = 0; /* Program header table, internal form */
1933   Elf_Internal_Shdr **i_shdrp;  /* Section header table, internal form */
1934   int count;
1935   struct strtab *shstrtab;
1936
1937   i_ehdrp = elf_elfheader (abfd);
1938   i_shdrp = elf_elfsections (abfd);
1939
1940   shstrtab = bfd_new_strtab (abfd);
1941   elf_shstrtab (abfd) = shstrtab;
1942
1943   i_ehdrp->e_ident[EI_MAG0] = ELFMAG0;
1944   i_ehdrp->e_ident[EI_MAG1] = ELFMAG1;
1945   i_ehdrp->e_ident[EI_MAG2] = ELFMAG2;
1946   i_ehdrp->e_ident[EI_MAG3] = ELFMAG3;
1947
1948   i_ehdrp->e_ident[EI_CLASS] = ELFCLASS;
1949   i_ehdrp->e_ident[EI_DATA] =
1950     abfd->xvec->byteorder_big_p ? ELFDATA2MSB : ELFDATA2LSB;
1951   i_ehdrp->e_ident[EI_VERSION] = EV_CURRENT;
1952
1953   for (count = EI_PAD; count < EI_NIDENT; count++)
1954     i_ehdrp->e_ident[count] = 0;
1955
1956   i_ehdrp->e_type = (abfd->flags & EXEC_P) ? ET_EXEC : ET_REL;
1957   switch (bfd_get_arch (abfd))
1958     {
1959     case bfd_arch_unknown:
1960       i_ehdrp->e_machine = EM_NONE;
1961       break;
1962     case bfd_arch_sparc:
1963       i_ehdrp->e_machine = EM_SPARC;
1964       /* start-sanitize-v9 */
1965 #if ARCH_SIZE == 64
1966       i_ehdrp->e_machine = EM_SPARC64;
1967 #endif
1968       /* end-sanitize-v9 */
1969       break;
1970     case bfd_arch_i386:
1971       i_ehdrp->e_machine = EM_386;
1972       break;
1973     case bfd_arch_m68k:
1974       i_ehdrp->e_machine = EM_68K;
1975       break;
1976     case bfd_arch_m88k:
1977       i_ehdrp->e_machine = EM_88K;
1978       break;
1979     case bfd_arch_i860:
1980       i_ehdrp->e_machine = EM_860;
1981       break;
1982     case bfd_arch_mips: /* MIPS Rxxxx */
1983       i_ehdrp->e_machine = EM_MIPS;     /* only MIPS R3000 */
1984       break;
1985     case bfd_arch_hppa:
1986       i_ehdrp->e_machine = EM_HPPA;
1987       break;
1988       /* also note that EM_M32, AT&T WE32100 is unknown to bfd */
1989     default:
1990       i_ehdrp->e_machine = EM_NONE;
1991     }
1992   i_ehdrp->e_version = EV_CURRENT;
1993   i_ehdrp->e_ehsize = sizeof (Elf_External_Ehdr);
1994
1995   /* no program header, for now. */
1996   i_ehdrp->e_phoff = 0;
1997   i_ehdrp->e_phentsize = 0;
1998   i_ehdrp->e_phnum = 0;
1999
2000   /* each bfd section is section header entry */
2001   i_ehdrp->e_entry = bfd_get_start_address (abfd);
2002   i_ehdrp->e_shentsize = sizeof (Elf_External_Shdr);
2003
2004   /* if we're building an executable, we'll need a program header table */
2005   if (abfd->flags & EXEC_P)
2006     {
2007       /* it all happens later */
2008 #if 0
2009       i_ehdrp->e_phentsize = sizeof (Elf_External_Phdr);
2010
2011       /* elf_build_phdrs() returns a (NULL-terminated) array of
2012          Elf_Internal_Phdrs */
2013       i_phdrp = elf_build_phdrs (abfd, i_ehdrp, i_shdrp, &i_ehdrp->e_phnum);
2014       i_ehdrp->e_phoff = outbase;
2015       outbase += i_ehdrp->e_phentsize * i_ehdrp->e_phnum;
2016 #endif
2017     }
2018   else
2019     {
2020       i_ehdrp->e_phentsize = 0;
2021       i_phdrp = 0;
2022       i_ehdrp->e_phoff = 0;
2023     }
2024
2025   elf_tdata (abfd)->symtab_hdr.sh_name = bfd_add_to_strtab (abfd, shstrtab,
2026                                                             ".symtab");
2027   elf_tdata (abfd)->strtab_hdr.sh_name = bfd_add_to_strtab (abfd, shstrtab,
2028                                                             ".strtab");
2029   elf_tdata (abfd)->shstrtab_hdr.sh_name = bfd_add_to_strtab (abfd, shstrtab,
2030                                                               ".shstrtab");
2031   return true;
2032 }
2033
2034 static void
2035 swap_out_syms (abfd)
2036      bfd *abfd;
2037 {
2038   elf_map_symbols (abfd);
2039
2040   /* Dump out the symtabs. */
2041   {
2042     int symcount = bfd_get_symcount (abfd);
2043     asymbol **syms = bfd_get_outsymbols (abfd);
2044     struct strtab *stt = bfd_new_strtab (abfd);
2045     Elf_Internal_Shdr *symtab_hdr;
2046     Elf_Internal_Shdr *symstrtab_hdr;
2047     Elf_External_Sym *outbound_syms;
2048     int idx;
2049
2050     symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
2051     symtab_hdr->sh_type = SHT_SYMTAB;
2052     symtab_hdr->sh_entsize = sizeof (Elf_External_Sym);
2053     symtab_hdr->sh_size = symtab_hdr->sh_entsize * (symcount + 1);
2054     symtab_hdr->sh_info = elf_num_locals (abfd) + 1;
2055
2056     /* FIXME: Systems I've checked use 4 byte alignment for .symtab,
2057        but it is possible that there are systems which use a different
2058        alignment.  */
2059     symtab_hdr->sh_addralign = 4;
2060
2061     /* see assert in elf_fake_sections that supports this: */
2062     symstrtab_hdr = &elf_tdata (abfd)->strtab_hdr;
2063     symstrtab_hdr->sh_type = SHT_STRTAB;
2064
2065     outbound_syms = (Elf_External_Sym *)
2066       bfd_alloc (abfd, (1 + symcount) * sizeof (Elf_External_Sym));
2067     /* now generate the data (for "contents") */
2068     {
2069       /* Fill in zeroth symbol and swap it out.  */
2070       Elf_Internal_Sym sym;
2071       sym.st_name = 0;
2072       sym.st_value = 0;
2073       sym.st_size = 0;
2074       sym.st_info = 0;
2075       sym.st_other = 0;
2076       sym.st_shndx = SHN_UNDEF;
2077       elf_swap_symbol_out (abfd, &sym, outbound_syms);
2078     }
2079     for (idx = 0; idx < symcount; idx++)
2080       {
2081         Elf_Internal_Sym sym;
2082         bfd_vma value = syms[idx]->value;
2083
2084         if (syms[idx]->flags & BSF_SECTION_SYM)
2085           /* Section symbols have no names.  */
2086           sym.st_name = 0;
2087         else
2088           sym.st_name = bfd_add_to_strtab (abfd, stt, syms[idx]->name);
2089
2090         if (bfd_is_com_section (syms[idx]->section))
2091           {
2092             /* ELF common symbols put the alignment into the `value' field,
2093                and the size into the `size' field.  This is backwards from
2094                how BFD handles it, so reverse it here.  */
2095             sym.st_size = value;
2096             /* Should retrieve this from somewhere... */
2097             sym.st_value = 16;
2098             sym.st_shndx = SHN_COMMON;
2099           }
2100         else
2101           {
2102             asection *sec = syms[idx]->section;
2103             elf_symbol_type *type_ptr;
2104             int shndx;
2105
2106             if (sec->output_section)
2107               {
2108                 value += sec->output_offset;
2109                 sec = sec->output_section;
2110               }
2111             value += sec->vma;
2112             sym.st_value = value;
2113             type_ptr = elf_symbol_from (abfd, syms[idx]);
2114             sym.st_size = type_ptr ? type_ptr->internal_elf_sym.st_size : 0;
2115             sym.st_shndx = shndx = elf_section_from_bfd_section (abfd, sec);
2116             if (shndx == -1)
2117               {
2118                 asection *sec2;
2119                 /* Writing this would be a hell of a lot easier if we had
2120                    some decent documentation on bfd, and knew what to expect
2121                    of the library, and what to demand of applications.  For
2122                    example, it appears that `objcopy' might not set the
2123                    section of a symbol to be a section that is actually in
2124                    the output file.  */
2125                 sec2 = bfd_get_section_by_name (abfd, sec->name);
2126                 assert (sec2 != 0);
2127                 sym.st_shndx = shndx = elf_section_from_bfd_section (abfd, sec2);
2128                 assert (shndx != -1);
2129               }
2130           }
2131
2132         if (bfd_is_com_section (syms[idx]->section))
2133           sym.st_info = ELF_ST_INFO (STB_GLOBAL, STT_OBJECT);
2134         else if (syms[idx]->section == &bfd_und_section)
2135           sym.st_info = ELF_ST_INFO (STB_GLOBAL, STT_NOTYPE);
2136         else if (syms[idx]->flags & BSF_SECTION_SYM)
2137           sym.st_info = ELF_ST_INFO (STB_LOCAL, STT_SECTION);
2138         else if (syms[idx]->flags & BSF_FILE)
2139           sym.st_info = ELF_ST_INFO (STB_LOCAL, STT_FILE);
2140         else
2141           {
2142             int bind = STB_LOCAL;
2143             int type = STT_OBJECT;
2144             unsigned int flags = syms[idx]->flags;
2145
2146             if (flags & BSF_LOCAL)
2147               bind = STB_LOCAL;
2148             else if (flags & BSF_WEAK)
2149               bind = STB_WEAK;
2150             else if (flags & BSF_GLOBAL)
2151               bind = STB_GLOBAL;
2152
2153             if (flags & BSF_FUNCTION)
2154               type = STT_FUNC;
2155
2156             sym.st_info = ELF_ST_INFO (bind, type);
2157           }
2158
2159         sym.st_other = 0;
2160         elf_swap_symbol_out (abfd, &sym,
2161                              (outbound_syms
2162                               + elf_sym_extra (abfd)[idx].elf_sym_num));
2163       }
2164
2165     symtab_hdr->contents = (PTR) outbound_syms;
2166     symstrtab_hdr->contents = (PTR) stt->tab;
2167     symstrtab_hdr->sh_size = stt->length;
2168     symstrtab_hdr->sh_type = SHT_STRTAB;
2169
2170     symstrtab_hdr->sh_flags = 0;
2171     symstrtab_hdr->sh_addr = 0;
2172     symstrtab_hdr->sh_entsize = 0;
2173     symstrtab_hdr->sh_link = 0;
2174     symstrtab_hdr->sh_info = 0;
2175     symstrtab_hdr->sh_addralign = 1;
2176     symstrtab_hdr->size = 0;
2177   }
2178
2179   /* put the strtab out too... */
2180   {
2181     Elf_Internal_Shdr *this_hdr;
2182
2183     this_hdr = &elf_tdata(abfd)->shstrtab_hdr;
2184     this_hdr->contents = (PTR) elf_shstrtab (abfd)->tab;
2185     this_hdr->sh_size = elf_shstrtab (abfd)->length;
2186     this_hdr->sh_type = SHT_STRTAB;
2187     this_hdr->sh_flags = 0;
2188     this_hdr->sh_addr = 0;
2189     this_hdr->sh_entsize = 0;
2190     this_hdr->sh_addralign = 1;
2191     this_hdr->size = 0;
2192   }
2193 }
2194
2195 static boolean
2196 write_shdrs_and_ehdr (abfd)
2197      bfd *abfd;
2198 {
2199   Elf_External_Ehdr x_ehdr;     /* Elf file header, external form */
2200   Elf_Internal_Ehdr *i_ehdrp;   /* Elf file header, internal form */
2201   Elf_External_Shdr *x_shdrp;   /* Section header table, external form */
2202   Elf_Internal_Shdr **i_shdrp;  /* Section header table, internal form */
2203   int count;
2204   struct strtab *shstrtab;
2205
2206   i_ehdrp = elf_elfheader (abfd);
2207   i_shdrp = elf_elfsections (abfd);
2208   shstrtab = elf_shstrtab (abfd);
2209
2210   /* swap the header before spitting it out... */
2211
2212 #if DEBUG & 1
2213   elf_debug_file (i_ehdrp);
2214 #endif
2215   elf_swap_ehdr_out (abfd, i_ehdrp, &x_ehdr);
2216   bfd_seek (abfd, (file_ptr) 0, SEEK_SET);
2217   bfd_write ((PTR) & x_ehdr, sizeof (x_ehdr), 1, abfd);
2218
2219   /* at this point we've concocted all the ELF sections... */
2220   x_shdrp = (Elf_External_Shdr *)
2221     bfd_alloc (abfd, sizeof (*x_shdrp) * (i_ehdrp->e_shnum));
2222   if (!x_shdrp)
2223     {
2224       bfd_error = no_memory;
2225       return false;
2226     }
2227
2228   for (count = 0; count < i_ehdrp->e_shnum; count++)
2229     {
2230 #if DEBUG & 2
2231       elf_debug_section (shstrtab->tab + i_shdrp[count]->sh_name, count,
2232                          i_shdrp[count]);
2233 #endif
2234       elf_swap_shdr_out (abfd, i_shdrp[count], x_shdrp + count);
2235     }
2236   bfd_seek (abfd, (file_ptr) i_ehdrp->e_shoff, SEEK_SET);
2237   bfd_write ((PTR) x_shdrp, sizeof (*x_shdrp), i_ehdrp->e_shnum, abfd);
2238   /* need to dump the string table too... */
2239
2240   return true;
2241 }
2242
2243 static void
2244 assign_file_positions_for_relocs (abfd)
2245      bfd *abfd;
2246 {
2247   file_ptr off = elf_tdata(abfd)->next_file_pos;
2248   int i;
2249   Elf_Internal_Shdr **shdrpp = elf_elfsections (abfd);
2250   Elf_Internal_Shdr *shdrp;
2251   for (i = 1; i < elf_elfheader(abfd)->e_shnum; i++)
2252     {
2253       shdrp = shdrpp[i];
2254       if (shdrp->sh_type != SHT_REL && shdrp->sh_type != SHT_RELA)
2255         continue;
2256       off = align_file_position (off);
2257       off = assign_file_position_for_section (shdrp, off);
2258     }
2259   elf_tdata(abfd)->next_file_pos = off;
2260 }
2261
2262 boolean
2263 DEFUN (NAME(bfd_elf,write_object_contents), (abfd), bfd * abfd)
2264 {
2265   struct elf_backend_data *bed = get_elf_backend_data (abfd);
2266   Elf_Internal_Ehdr *i_ehdrp;
2267   Elf_Internal_Shdr **i_shdrp;
2268   int count;
2269
2270   /* We don't know how to write dynamic objects.  Specifically, we
2271      don't know how to construct the program header.  */
2272   if ((abfd->flags & DYNAMIC) != 0)
2273     {
2274       fprintf (stderr, "Writing ELF dynamic objects is not supported\n");
2275       bfd_error = wrong_format;
2276       return false;
2277     }
2278
2279   if (abfd->output_has_begun == false)
2280     {
2281       prep_headers (abfd);
2282       elf_compute_section_file_positions (abfd);
2283       abfd->output_has_begun = true;
2284     }
2285
2286   i_shdrp = elf_elfsections (abfd);
2287   i_ehdrp = elf_elfheader (abfd);
2288
2289   bfd_map_over_sections (abfd, write_relocs, (PTR) 0);
2290   assign_file_positions_for_relocs (abfd);
2291
2292   /* After writing the headers, we need to write the sections too... */
2293   for (count = 1; count < i_ehdrp->e_shnum; count++)
2294     {
2295       if (bed->elf_backend_section_processing)
2296         (*bed->elf_backend_section_processing) (abfd, i_shdrp[count]);
2297       if (i_shdrp[count]->contents)
2298         {
2299           bfd_seek (abfd, i_shdrp[count]->sh_offset, SEEK_SET);
2300           bfd_write (i_shdrp[count]->contents, i_shdrp[count]->sh_size, 1,
2301                      abfd);
2302         }
2303     }
2304
2305   if (bed->elf_backend_final_write_processing)
2306     (*bed->elf_backend_final_write_processing) (abfd);
2307
2308   return write_shdrs_and_ehdr (abfd);
2309 }
2310
2311 /* Given an index of a section, retrieve a pointer to it.  Note
2312    that for our purposes, sections are indexed by {1, 2, ...} with
2313    0 being an illegal index. */
2314
2315 /* In the original, each ELF section went into exactly one BFD
2316    section. This doesn't really make sense, so we need a real mapping.
2317    The mapping has to hide in the Elf_Internal_Shdr since asection
2318    doesn't have anything like a tdata field... */
2319
2320 static struct sec *
2321 DEFUN (section_from_elf_index, (abfd, index),
2322        bfd * abfd AND
2323        int index)
2324 {
2325   /* @@ Is bfd_com_section really correct in all the places it could
2326      be returned from this routine?  */
2327
2328   if (index == SHN_ABS)
2329     return &bfd_com_section;    /* not abs? */
2330   if (index == SHN_COMMON)
2331     return &bfd_com_section;
2332
2333   if (index > elf_elfheader (abfd)->e_shnum)
2334     return 0;
2335
2336   {
2337     Elf_Internal_Shdr *hdr = elf_elfsections (abfd)[index];
2338
2339     switch (hdr->sh_type)
2340       {
2341         /* ELF sections that map to BFD sections */
2342       case SHT_PROGBITS:
2343       case SHT_NOBITS:
2344         if (!hdr->rawdata)
2345           bfd_section_from_shdr (abfd, index);
2346         return (struct sec *) hdr->rawdata;
2347
2348       default:
2349         return (struct sec *) &bfd_abs_section;
2350       }
2351   }
2352 }
2353
2354 /* given a section, search the header to find them... */
2355 static int
2356 DEFUN (elf_section_from_bfd_section, (abfd, asect),
2357        bfd * abfd AND
2358        struct sec *asect)
2359 {
2360   Elf_Internal_Shdr **i_shdrp = elf_elfsections (abfd);
2361   int index;
2362   Elf_Internal_Shdr *hdr;
2363   int maxindex = elf_elfheader (abfd)->e_shnum;
2364
2365   if (asect == &bfd_abs_section)
2366     return SHN_ABS;
2367   if (asect == &bfd_com_section)
2368     return SHN_COMMON;
2369   if (asect == &bfd_und_section)
2370     return SHN_UNDEF;
2371
2372   for (index = 0; index < maxindex; index++)
2373     {
2374       hdr = i_shdrp[index];
2375       switch (hdr->sh_type)
2376         {
2377           /* ELF sections that map to BFD sections */
2378         case SHT_PROGBITS:
2379         case SHT_NOBITS:
2380         case SHT_NOTE:
2381           if (hdr->rawdata)
2382             {
2383               if (((struct sec *) (hdr->rawdata)) == asect)
2384                 return index;
2385             }
2386           break;
2387
2388         case SHT_STRTAB:
2389           /* fix_up_strtabs will generate STRTAB sections with names
2390              of .stab*str.  */
2391           if (!strncmp (asect->name, ".stab", 5)
2392               && !strcmp ("str", asect->name + strlen (asect->name) - 3))
2393             {
2394               if (hdr->rawdata)
2395                 {
2396                   if (((struct sec *) (hdr->rawdata)) == asect)
2397                     return index;
2398                 }
2399               break;
2400             }
2401           /* FALL THROUGH */
2402         default:
2403           {
2404             struct elf_backend_data *bed = get_elf_backend_data (abfd);
2405
2406             if (bed->elf_backend_section_from_bfd_section)
2407               {
2408                 int retval;
2409
2410                 retval = index;
2411                 if ((*bed->elf_backend_section_from_bfd_section)
2412                     (abfd, hdr, asect, &retval))
2413                   return retval;
2414               }
2415           }
2416           break;
2417         }
2418     }
2419   return -1;
2420 }
2421
2422 /* given a symbol, return the bfd index for that symbol.  */
2423 static int
2424 DEFUN (elf_symbol_from_bfd_symbol, (abfd, asym_ptr_ptr),
2425        bfd * abfd AND
2426        struct symbol_cache_entry **asym_ptr_ptr)
2427 {
2428   struct symbol_cache_entry *asym_ptr = *asym_ptr_ptr;
2429   int idx;
2430   flagword flags = asym_ptr->flags;
2431
2432   /* When gas creates relocations against local labels, it creates its
2433      own symbol for the section, but does put the symbol into the
2434      symbol chain, so udata is 0.  When the linker is generating
2435      relocatable output, this section symbol may be for one of the
2436      input sections rather than the output section.  */
2437   if (asym_ptr->udata == (PTR) 0
2438       && (flags & BSF_SECTION_SYM)
2439       && asym_ptr->section)
2440     {
2441       int indx;
2442
2443       if (asym_ptr->section->output_section != NULL)
2444         indx = asym_ptr->section->output_section->index;
2445       else
2446         indx = asym_ptr->section->index;
2447       if (elf_section_syms (abfd)[indx])
2448         asym_ptr->udata = elf_section_syms (abfd)[indx]->udata;
2449     }
2450
2451   if (asym_ptr->udata)
2452     idx = ((Elf_Sym_Extra *)asym_ptr->udata)->elf_sym_num;
2453   else
2454     {
2455       abort ();
2456     }
2457
2458 #if DEBUG & 4
2459   {
2460
2461     fprintf (stderr,
2462              "elf_symbol_from_bfd_symbol 0x%.8lx, name = %s, sym num = %d, flags = 0x%.8lx %s\n",
2463              (long) asym_ptr, asym_ptr->name, idx, flags, elf_symbol_flags (flags));
2464     fflush (stderr);
2465   }
2466 #endif
2467
2468   return idx;
2469 }
2470
2471 static boolean
2472 DEFUN (elf_slurp_symbol_table, (abfd, symptrs),
2473        bfd * abfd AND
2474        asymbol ** symptrs)      /* Buffer for generated bfd symbols */
2475 {
2476   Elf_Internal_Shdr *hdr = &elf_tdata(abfd)->symtab_hdr;
2477   int symcount;                 /* Number of external ELF symbols */
2478   int i;
2479   elf_symbol_type *sym;         /* Pointer to current bfd symbol */
2480   elf_symbol_type *symbase;     /* Buffer for generated bfd symbols */
2481   Elf_Internal_Sym i_sym;
2482   Elf_External_Sym *x_symp;
2483
2484   /* this is only valid because there is only one symtab... */
2485   /* FIXME:  This is incorrect, there may also be a dynamic symbol
2486      table which is a subset of the full symbol table.  We either need
2487      to be prepared to read both (and merge them) or ensure that we
2488      only read the full symbol table.  Currently we only get called to
2489      read the full symbol table.  -fnf */
2490
2491   /* Read each raw ELF symbol, converting from external ELF form to
2492      internal ELF form, and then using the information to create a
2493      canonical bfd symbol table entry.
2494
2495      Note that we allocate the initial bfd canonical symbol buffer
2496      based on a one-to-one mapping of the ELF symbols to canonical
2497      symbols.  We actually use all the ELF symbols, so there will be no
2498      space left over at the end.  When we have all the symbols, we
2499      build the caller's pointer vector. */
2500
2501   if (bfd_seek (abfd, hdr->sh_offset, SEEK_SET) == -1)
2502     {
2503       bfd_error = system_call_error;
2504       return false;
2505     }
2506
2507   symcount = hdr->sh_size / sizeof (Elf_External_Sym);
2508   symbase = (elf_symbol_type *) bfd_zalloc (abfd, symcount * sizeof (elf_symbol_type));
2509   sym = symbase;
2510
2511   /* Temporarily allocate room for the raw ELF symbols.  */
2512   x_symp = (Elf_External_Sym *) bfd_xmalloc (symcount * sizeof (Elf_External_Sym));
2513
2514   if (bfd_read ((PTR) x_symp, sizeof (Elf_External_Sym), symcount, abfd)
2515       != symcount * sizeof (Elf_External_Sym))
2516     {
2517       free ((PTR) x_symp);
2518       bfd_error = system_call_error;
2519       return false;
2520     }
2521   /* Skip first symbol, which is a null dummy.  */
2522   for (i = 1; i < symcount; i++)
2523     {
2524       elf_swap_symbol_in (abfd, x_symp + i, &i_sym);
2525       memcpy (&sym->internal_elf_sym, &i_sym, sizeof (Elf_Internal_Sym));
2526 #ifdef ELF_KEEP_EXTSYM
2527       memcpy (&sym->native_elf_sym, x_symp + i, sizeof (Elf_External_Sym));
2528 #endif
2529       sym->symbol.the_bfd = abfd;
2530
2531       sym->symbol.name = elf_string_from_elf_section (abfd, hdr->sh_link,
2532                                                       i_sym.st_name);
2533
2534       sym->symbol.value = i_sym.st_value;
2535
2536       if (i_sym.st_shndx > 0 && i_sym.st_shndx < SHN_LORESERV)
2537         {
2538           sym->symbol.section = section_from_elf_index (abfd, i_sym.st_shndx);
2539         }
2540       else if (i_sym.st_shndx == SHN_ABS)
2541         {
2542           sym->symbol.section = &bfd_abs_section;
2543         }
2544       else if (i_sym.st_shndx == SHN_COMMON)
2545         {
2546           sym->symbol.section = &bfd_com_section;
2547           /* Elf puts the alignment into the `value' field, and the size
2548              into the `size' field.  BFD wants to see the size in the
2549              value field, and doesn't care (at the moment) about the
2550              alignment.  */
2551           sym->symbol.value = i_sym.st_size;
2552         }
2553       else if (i_sym.st_shndx == SHN_UNDEF)
2554         {
2555           sym->symbol.section = &bfd_und_section;
2556         }
2557       else
2558         sym->symbol.section = &bfd_abs_section;
2559
2560       sym->symbol.value -= sym->symbol.section->vma;
2561
2562       switch (ELF_ST_BIND (i_sym.st_info))
2563         {
2564         case STB_LOCAL:
2565           sym->symbol.flags |= BSF_LOCAL;
2566           break;
2567         case STB_GLOBAL:
2568           sym->symbol.flags |= BSF_GLOBAL;
2569           break;
2570         case STB_WEAK:
2571           sym->symbol.flags |= BSF_WEAK;
2572           break;
2573         }
2574
2575       switch (ELF_ST_TYPE (i_sym.st_info))
2576         {
2577         case STT_SECTION:
2578           sym->symbol.flags |= BSF_SECTION_SYM | BSF_DEBUGGING;
2579           break;
2580         case STT_FILE:
2581           sym->symbol.flags |= BSF_FILE | BSF_DEBUGGING;
2582           break;
2583         case STT_FUNC:
2584           sym->symbol.flags |= BSF_FUNCTION;
2585           break;
2586         }
2587
2588       /* Do some backend-specific processing on this symbol.  */
2589       {
2590         struct elf_backend_data *ebd = get_elf_backend_data (abfd);
2591         if (ebd->elf_backend_symbol_processing)
2592           (*ebd->elf_backend_symbol_processing) (abfd, &sym->symbol);
2593       }
2594
2595       sym++;
2596     }
2597
2598   /* Do some backend-specific processing on this symbol table.  */
2599   {
2600     struct elf_backend_data *ebd = get_elf_backend_data (abfd);
2601     if (ebd->elf_backend_symbol_table_processing)
2602       (*ebd->elf_backend_symbol_table_processing) (abfd, symbase, symcount);
2603   }
2604
2605   /* We rely on the zalloc to clear out the final symbol entry.  */
2606
2607   bfd_get_symcount (abfd) = symcount = sym - symbase;
2608
2609   /* Fill in the user's symbol pointer vector if needed.  */
2610   if (symptrs)
2611     {
2612       sym = symbase;
2613       while (symcount-- > 0)
2614         {
2615           *symptrs++ = &sym->symbol;
2616           sym++;
2617         }
2618       *symptrs = 0;             /* Final null pointer */
2619     }
2620
2621   free ((PTR) x_symp);
2622   return true;
2623 }
2624
2625 /* Return the number of bytes required to hold the symtab vector.
2626
2627    Note that we base it on the count plus 1, since we will null terminate
2628    the vector allocated based on this size.  However, the ELF symbol table
2629    always has a dummy entry as symbol #0, so it ends up even.  */
2630
2631 unsigned int
2632 DEFUN (elf_get_symtab_upper_bound, (abfd), bfd * abfd)
2633 {
2634   unsigned int symcount;
2635   unsigned int symtab_size = 0;
2636
2637   Elf_Internal_Shdr *hdr = &elf_tdata(abfd)->symtab_hdr;
2638   symcount = hdr->sh_size / sizeof (Elf_External_Sym);
2639   symtab_size = (symcount - 1 + 1) * (sizeof (asymbol));
2640
2641   return symtab_size;
2642 }
2643
2644 /*
2645         This function return the number of bytes required to store the
2646         relocation information associated with section <<sect>>
2647         attached to bfd <<abfd>>
2648
2649 */
2650 unsigned int
2651 elf_get_reloc_upper_bound (abfd, asect)
2652      bfd *abfd;
2653      sec_ptr asect;
2654 {
2655   if (asect->flags & SEC_RELOC)
2656     {
2657       /* either rel or rela */
2658       return elf_section_data(asect)->rel_hdr.sh_size;
2659     }
2660   else
2661     return 0;
2662 }
2663
2664 static boolean
2665 DEFUN (elf_slurp_reloca_table, (abfd, asect, symbols),
2666        bfd * abfd AND
2667        sec_ptr asect AND
2668        asymbol ** symbols)
2669 {
2670   Elf_External_Rela *native_relocs;
2671   arelent *reloc_cache;
2672   arelent *cache_ptr;
2673
2674   unsigned int idx;
2675
2676   if (asect->relocation)
2677     return true;
2678   if (asect->reloc_count == 0)
2679     return true;
2680   if (asect->flags & SEC_CONSTRUCTOR)
2681     return true;
2682
2683   bfd_seek (abfd, asect->rel_filepos, SEEK_SET);
2684   native_relocs = (Elf_External_Rela *)
2685     bfd_alloc (abfd, asect->reloc_count * sizeof (Elf_External_Rela));
2686   bfd_read ((PTR) native_relocs,
2687             sizeof (Elf_External_Rela), asect->reloc_count, abfd);
2688
2689   reloc_cache = (arelent *)
2690     bfd_alloc (abfd, (size_t) (asect->reloc_count * sizeof (arelent)));
2691
2692   if (!reloc_cache)
2693     {
2694       bfd_error = no_memory;
2695       return false;
2696     }
2697
2698   for (idx = 0; idx < asect->reloc_count; idx++)
2699     {
2700       Elf_Internal_Rela dst;
2701       Elf_External_Rela *src;
2702
2703       cache_ptr = reloc_cache + idx;
2704       src = native_relocs + idx;
2705       elf_swap_reloca_in (abfd, src, &dst);
2706
2707 #ifdef RELOC_PROCESSING
2708       RELOC_PROCESSING (cache_ptr, &dst, symbols, abfd, asect);
2709 #else
2710       if (asect->flags & SEC_RELOC)
2711         {
2712           /* relocatable, so the offset is off of the section */
2713           cache_ptr->address = dst.r_offset + asect->vma;
2714         }
2715       else
2716         {
2717           /* non-relocatable, so the offset a virtual address */
2718           cache_ptr->address = dst.r_offset;
2719         }
2720
2721       /* ELF_R_SYM(dst.r_info) is the symbol table offset.  An offset
2722          of zero points to the dummy symbol, which was not read into
2723          the symbol table SYMBOLS.  */
2724       if (ELF_R_SYM (dst.r_info) == 0)
2725         cache_ptr->sym_ptr_ptr = bfd_abs_section.symbol_ptr_ptr;
2726       else
2727         {
2728           asymbol *s;
2729
2730           cache_ptr->sym_ptr_ptr = symbols + ELF_R_SYM (dst.r_info) - 1;
2731
2732           /* Translate any ELF section symbol into a BFD section
2733              symbol.  */
2734           s = *(cache_ptr->sym_ptr_ptr);
2735           if (s->flags & BSF_SECTION_SYM)
2736             {
2737               cache_ptr->sym_ptr_ptr = s->section->symbol_ptr_ptr;
2738               s = *cache_ptr->sym_ptr_ptr;
2739               if (s->name == 0 || s->name[0] == 0)
2740                 abort ();
2741             }
2742         }
2743       cache_ptr->addend = dst.r_addend;
2744
2745       /* Fill in the cache_ptr->howto field from dst.r_type */
2746       {
2747         struct elf_backend_data *ebd = get_elf_backend_data (abfd);
2748         (*ebd->elf_info_to_howto) (abfd, cache_ptr, &dst);
2749       }
2750 #endif
2751     }
2752
2753   asect->relocation = reloc_cache;
2754   return true;
2755 }
2756
2757 #ifdef DEBUG
2758 static void
2759 elf_debug_section (str, num, hdr)
2760      char *str;
2761      int num;
2762      Elf_Internal_Shdr *hdr;
2763 {
2764   fprintf (stderr, "\nSection#%d '%s' 0x%.8lx\n", num, str, (long) hdr);
2765   fprintf (stderr,
2766            "sh_name      = %ld\tsh_type      = %ld\tsh_flags     = %ld\n",
2767            (long) hdr->sh_name,
2768            (long) hdr->sh_type,
2769            (long) hdr->sh_flags);
2770   fprintf (stderr,
2771            "sh_addr      = %ld\tsh_offset    = %ld\tsh_size      = %ld\n",
2772            (long) hdr->sh_addr,
2773            (long) hdr->sh_offset,
2774            (long) hdr->sh_size);
2775   fprintf (stderr,
2776            "sh_link      = %ld\tsh_info      = %ld\tsh_addralign = %ld\n",
2777            (long) hdr->sh_link,
2778            (long) hdr->sh_info,
2779            (long) hdr->sh_addralign);
2780   fprintf (stderr, "sh_entsize   = %ld\n",
2781            (long) hdr->sh_entsize);
2782   fprintf (stderr, "rawdata      = 0x%.8lx\n", (long) hdr->rawdata);
2783   fprintf (stderr, "contents     = 0x%.8lx\n", (long) hdr->contents);
2784   fprintf (stderr, "size         = %ld\n", (long) hdr->size);
2785   fflush (stderr);
2786 }
2787
2788 static void
2789 elf_debug_file (ehdrp)
2790      Elf_Internal_Ehdr *ehdrp;
2791 {
2792   fprintf (stderr, "e_entry      = 0x%.8lx\n", (long) ehdrp->e_entry);
2793   fprintf (stderr, "e_phoff      = %ld\n", (long) ehdrp->e_phoff);
2794   fprintf (stderr, "e_phnum      = %ld\n", (long) ehdrp->e_phnum);
2795   fprintf (stderr, "e_phentsize  = %ld\n", (long) ehdrp->e_phentsize);
2796   fprintf (stderr, "e_shoff      = %ld\n", (long) ehdrp->e_shoff);
2797   fprintf (stderr, "e_shnum      = %ld\n", (long) ehdrp->e_shnum);
2798   fprintf (stderr, "e_shentsize  = %ld\n", (long) ehdrp->e_shentsize);
2799 }
2800 #endif
2801
2802 static boolean
2803 DEFUN (elf_slurp_reloc_table, (abfd, asect, symbols),
2804        bfd * abfd AND
2805        sec_ptr asect AND
2806        asymbol ** symbols)
2807 {
2808   Elf_External_Rel *native_relocs;
2809   arelent *reloc_cache;
2810   arelent *cache_ptr;
2811   Elf_Internal_Shdr *data_hdr;
2812   ElfNAME (Off) data_off;
2813   ElfNAME (Word) data_max;
2814   char buf[4];                  /* FIXME -- might be elf64 */
2815
2816   unsigned int idx;
2817
2818   if (asect->relocation)
2819     return true;
2820   if (asect->reloc_count == 0)
2821     return true;
2822   if (asect->flags & SEC_CONSTRUCTOR)
2823     return true;
2824
2825   bfd_seek (abfd, asect->rel_filepos, SEEK_SET);
2826   native_relocs = (Elf_External_Rel *)
2827     bfd_alloc (abfd, asect->reloc_count * sizeof (Elf_External_Rel));
2828   bfd_read ((PTR) native_relocs,
2829             sizeof (Elf_External_Rel), asect->reloc_count, abfd);
2830
2831   reloc_cache = (arelent *)
2832     bfd_alloc (abfd, (size_t) (asect->reloc_count * sizeof (arelent)));
2833
2834   if (!reloc_cache)
2835     {
2836       bfd_error = no_memory;
2837       return false;
2838     }
2839
2840   /* Get the offset of the start of the segment we are relocating to read in
2841      the implicit addend.  */
2842   data_hdr = &elf_section_data(asect)->this_hdr;
2843   data_off = data_hdr->sh_offset;
2844   data_max = data_hdr->sh_size - sizeof (buf) + 1;
2845
2846 #if DEBUG & 2
2847   elf_debug_section ("data section", -1, data_hdr);
2848 #endif
2849
2850   for (idx = 0; idx < asect->reloc_count; idx++)
2851     {
2852 #ifdef RELOC_PROCESSING
2853       Elf_Internal_Rel dst;
2854       Elf_External_Rel *src;
2855
2856       cache_ptr = reloc_cache + idx;
2857       src = native_relocs + idx;
2858       elf_swap_reloc_in (abfd, src, &dst);
2859
2860       RELOC_PROCESSING (cache_ptr, &dst, symbols, abfd, asect);
2861 #else
2862       Elf_Internal_Rel dst;
2863       Elf_External_Rel *src;
2864
2865       cache_ptr = reloc_cache + idx;
2866       src = native_relocs + idx;
2867
2868       elf_swap_reloc_in (abfd, src, &dst);
2869
2870       if (asect->flags & SEC_RELOC)
2871         {
2872           /* relocatable, so the offset is off of the section */
2873           cache_ptr->address = dst.r_offset + asect->vma;
2874         }
2875       else
2876         {
2877           /* non-relocatable, so the offset a virtual address */
2878           cache_ptr->address = dst.r_offset;
2879         }
2880
2881       /* ELF_R_SYM(dst.r_info) is the symbol table offset.  An offset
2882          of zero points to the dummy symbol, which was not read into
2883          the symbol table SYMBOLS.  */
2884       if (ELF_R_SYM (dst.r_info) == 0)
2885         cache_ptr->sym_ptr_ptr = bfd_abs_section.symbol_ptr_ptr;
2886       else
2887         {
2888           asymbol *s;
2889
2890           cache_ptr->sym_ptr_ptr = symbols + ELF_R_SYM (dst.r_info) - 1;
2891
2892           /* Translate any ELF section symbol into a BFD section
2893              symbol.  */
2894           s = *(cache_ptr->sym_ptr_ptr);
2895           if (s->flags & BSF_SECTION_SYM)
2896             {
2897               cache_ptr->sym_ptr_ptr = s->section->symbol_ptr_ptr;
2898               s = *cache_ptr->sym_ptr_ptr;
2899               if (s->name == 0 || s->name[0] == 0)
2900                 abort ();
2901             }
2902         }
2903       BFD_ASSERT (dst.r_offset <= data_max);
2904       cache_ptr->addend = 0;
2905
2906       /* Fill in the cache_ptr->howto field from dst.r_type */
2907       {
2908         struct elf_backend_data *ebd = get_elf_backend_data (abfd);
2909         (*ebd->elf_info_to_howto_rel) (abfd, cache_ptr, &dst);
2910       }
2911 #endif
2912     }
2913
2914   asect->relocation = reloc_cache;
2915   return true;
2916 }
2917
2918 unsigned int
2919 elf_canonicalize_reloc (abfd, section, relptr, symbols)
2920      bfd *abfd;
2921      sec_ptr section;
2922      arelent **relptr;
2923      asymbol **symbols;
2924 {
2925   arelent *tblptr = section->relocation;
2926   unsigned int count = 0;
2927   int use_rela_p = get_elf_backend_data (abfd)->use_rela_p;
2928
2929   /* snarfed from coffcode.h */
2930   if (use_rela_p)
2931     elf_slurp_reloca_table (abfd, section, symbols);
2932   else
2933     elf_slurp_reloc_table (abfd, section, symbols);
2934
2935   tblptr = section->relocation;
2936   if (!tblptr)
2937     return 0;
2938
2939   for (; count++ < section->reloc_count;)
2940     *relptr++ = tblptr++;
2941
2942   *relptr = 0;
2943   return section->reloc_count;
2944 }
2945
2946 unsigned int
2947 DEFUN (elf_get_symtab, (abfd, alocation),
2948        bfd * abfd AND
2949        asymbol ** alocation)
2950 {
2951
2952   if (!elf_slurp_symbol_table (abfd, alocation))
2953     return 0;
2954   else
2955     return bfd_get_symcount (abfd);
2956 }
2957
2958 asymbol *
2959 DEFUN (elf_make_empty_symbol, (abfd),
2960        bfd * abfd)
2961 {
2962   elf_symbol_type *newsym;
2963
2964   newsym = (elf_symbol_type *) bfd_zalloc (abfd, sizeof (elf_symbol_type));
2965   if (!newsym)
2966     {
2967       bfd_error = no_memory;
2968       return NULL;
2969     }
2970   else
2971     {
2972       newsym->symbol.the_bfd = abfd;
2973       return &newsym->symbol;
2974     }
2975 }
2976
2977 void
2978 DEFUN (elf_get_symbol_info, (ignore_abfd, symbol, ret),
2979        bfd * ignore_abfd AND
2980        asymbol * symbol AND
2981        symbol_info * ret)
2982 {
2983   bfd_symbol_info (symbol, ret);
2984 }
2985
2986 void
2987 DEFUN (elf_print_symbol, (ignore_abfd, filep, symbol, how),
2988        bfd * ignore_abfd AND
2989        PTR filep AND
2990        asymbol * symbol AND
2991        bfd_print_symbol_type how)
2992 {
2993   FILE *file = (FILE *) filep;
2994   switch (how)
2995     {
2996     case bfd_print_symbol_name:
2997       fprintf (file, "%s", symbol->name);
2998       break;
2999     case bfd_print_symbol_more:
3000       fprintf (file, "elf ");
3001       fprintf_vma (file, symbol->value);
3002       fprintf (file, " %lx", (long) symbol->flags);
3003       break;
3004     case bfd_print_symbol_all:
3005       {
3006         CONST char *section_name;
3007         section_name = symbol->section ? symbol->section->name : "(*none*)";
3008         bfd_print_symbol_vandf ((PTR) file, symbol);
3009         fprintf (file, " %s\t%s",
3010                  section_name,
3011                  symbol->name);
3012       }
3013       break;
3014     }
3015
3016 }
3017
3018 alent *
3019 DEFUN (elf_get_lineno, (ignore_abfd, symbol),
3020        bfd * ignore_abfd AND
3021        asymbol * symbol)
3022 {
3023   fprintf (stderr, "elf_get_lineno unimplemented\n");
3024   fflush (stderr);
3025   BFD_FAIL ();
3026   return NULL;
3027 }
3028
3029 boolean
3030 DEFUN (elf_set_arch_mach, (abfd, arch, machine),
3031        bfd * abfd AND
3032        enum bfd_architecture arch AND
3033        unsigned long machine)
3034 {
3035   /* Allow any architecture to be supported by the elf backend */
3036   switch (arch)
3037     {
3038     case bfd_arch_unknown:      /* EM_NONE */
3039     case bfd_arch_sparc:        /* EM_SPARC */
3040     case bfd_arch_i386: /* EM_386 */
3041     case bfd_arch_m68k: /* EM_68K */
3042     case bfd_arch_m88k: /* EM_88K */
3043     case bfd_arch_i860: /* EM_860 */
3044     case bfd_arch_mips: /* EM_MIPS (MIPS R3000) */
3045     case bfd_arch_hppa: /* EM_HPPA (HP PA_RISC) */
3046       return bfd_default_set_arch_mach (abfd, arch, machine);
3047     default:
3048       return false;
3049     }
3050 }
3051
3052 boolean
3053 DEFUN (elf_find_nearest_line, (abfd,
3054                                section,
3055                                symbols,
3056                                offset,
3057                                filename_ptr,
3058                                functionname_ptr,
3059                                line_ptr),
3060        bfd * abfd AND
3061        asection * section AND
3062        asymbol ** symbols AND
3063        bfd_vma offset AND
3064        CONST char **filename_ptr AND
3065        CONST char **functionname_ptr AND
3066        unsigned int *line_ptr)
3067 {
3068   return false;
3069 }
3070
3071 int
3072 DEFUN (elf_sizeof_headers, (abfd, reloc),
3073        bfd * abfd AND
3074        boolean reloc)
3075 {
3076   fprintf (stderr, "elf_sizeof_headers unimplemented\n");
3077   fflush (stderr);
3078   BFD_FAIL ();
3079   return 0;
3080 }
3081
3082 boolean
3083 DEFUN (elf_set_section_contents, (abfd, section, location, offset, count),
3084        bfd * abfd AND
3085        sec_ptr section AND
3086        PTR location AND
3087        file_ptr offset AND
3088        bfd_size_type count)
3089 {
3090   Elf_Internal_Shdr *hdr;
3091
3092   if (abfd->output_has_begun == false)  /* set by bfd.c handler? */
3093     {
3094       /* do setup calculations (FIXME) */
3095       prep_headers (abfd);
3096       elf_compute_section_file_positions (abfd);
3097       abfd->output_has_begun = true;
3098     }
3099
3100   hdr = &elf_section_data(section)->this_hdr;
3101
3102   if (bfd_seek (abfd, hdr->sh_offset + offset, SEEK_SET) == -1)
3103     return false;
3104   if (bfd_write (location, 1, count, abfd) != count)
3105     return false;
3106
3107   return true;
3108 }
3109
3110 void
3111 DEFUN (elf_no_info_to_howto, (abfd, cache_ptr, dst),
3112        bfd * abfd AND
3113        arelent * cache_ptr AND
3114        Elf_Internal_Rela * dst)
3115 {
3116   fprintf (stderr, "elf RELA relocation support for target machine unimplemented\n");
3117   fflush (stderr);
3118   BFD_FAIL ();
3119 }
3120
3121 void
3122 DEFUN (elf_no_info_to_howto_rel, (abfd, cache_ptr, dst),
3123        bfd * abfd AND
3124        arelent * cache_ptr AND
3125        Elf_Internal_Rel * dst)
3126 {
3127   fprintf (stderr, "elf REL relocation support for target machine unimplemented\n");
3128   fflush (stderr);
3129   BFD_FAIL ();
3130 }
3131
3132 \f
3133 /* Core file support */
3134
3135 #ifdef HAVE_PROCFS              /* Some core file support requires host /proc files */
3136 #include <sys/procfs.h>
3137 #else
3138 #define bfd_prstatus(abfd, descdata, descsz, filepos)   /* Define away */
3139 #define bfd_fpregset(abfd, descdata, descsz, filepos)   /* Define away */
3140 #define bfd_prpsinfo(abfd, descdata, descsz, filepos)   /* Define away */
3141 #endif
3142
3143 #ifdef HAVE_PROCFS
3144
3145 static void
3146 DEFUN (bfd_prstatus, (abfd, descdata, descsz, filepos),
3147        bfd * abfd AND
3148        char *descdata AND
3149        int descsz AND
3150        long filepos)
3151 {
3152   asection *newsect;
3153   prstatus_t *status = (prstatus_t *) 0;
3154
3155   if (descsz == sizeof (prstatus_t))
3156     {
3157       newsect = bfd_make_section (abfd, ".reg");
3158       newsect->_raw_size = sizeof (status->pr_reg);
3159       newsect->filepos = filepos + (long) &status->pr_reg;
3160       newsect->flags = SEC_ALLOC | SEC_HAS_CONTENTS;
3161       newsect->alignment_power = 2;
3162       if ((core_prstatus (abfd) = bfd_alloc (abfd, descsz)) != NULL)
3163         {
3164           memcpy (core_prstatus (abfd), descdata, descsz);
3165         }
3166     }
3167 }
3168
3169 /* Stash a copy of the prpsinfo structure away for future use. */
3170
3171 static void
3172 DEFUN (bfd_prpsinfo, (abfd, descdata, descsz, filepos),
3173        bfd * abfd AND
3174        char *descdata AND
3175        int descsz AND
3176        long filepos)
3177 {
3178   asection *newsect;
3179
3180   if (descsz == sizeof (prpsinfo_t))
3181     {
3182       if ((core_prpsinfo (abfd) = bfd_alloc (abfd, descsz)) != NULL)
3183         {
3184           memcpy (core_prpsinfo (abfd), descdata, descsz);
3185         }
3186     }
3187 }
3188
3189 static void
3190 DEFUN (bfd_fpregset, (abfd, descdata, descsz, filepos),
3191        bfd * abfd AND
3192        char *descdata AND
3193        int descsz AND
3194        long filepos)
3195 {
3196   asection *newsect;
3197
3198   newsect = bfd_make_section (abfd, ".reg2");
3199   newsect->_raw_size = descsz;
3200   newsect->filepos = filepos;
3201   newsect->flags = SEC_ALLOC | SEC_HAS_CONTENTS;
3202   newsect->alignment_power = 2;
3203 }
3204
3205 #endif /* HAVE_PROCFS */
3206
3207 /* Return a pointer to the args (including the command name) that were
3208    seen by the program that generated the core dump.  Note that for
3209    some reason, a spurious space is tacked onto the end of the args
3210    in some (at least one anyway) implementations, so strip it off if
3211    it exists. */
3212
3213 char *
3214 DEFUN (elf_core_file_failing_command, (abfd),
3215        bfd * abfd)
3216 {
3217 #ifdef HAVE_PROCFS
3218   if (core_prpsinfo (abfd))
3219     {
3220       prpsinfo_t *p = core_prpsinfo (abfd);
3221       char *scan = p->pr_psargs;
3222       while (*scan++)
3223         {;
3224         }
3225       scan -= 2;
3226       if ((scan > p->pr_psargs) && (*scan == ' '))
3227         {
3228           *scan = '\000';
3229         }
3230       return p->pr_psargs;
3231     }
3232 #endif
3233   return NULL;
3234 }
3235
3236 /* Return the number of the signal that caused the core dump.  Presumably,
3237    since we have a core file, we got a signal of some kind, so don't bother
3238    checking the other process status fields, just return the signal number.
3239    */
3240
3241 int
3242 DEFUN (elf_core_file_failing_signal, (abfd),
3243        bfd * abfd)
3244 {
3245 #ifdef HAVE_PROCFS
3246   if (core_prstatus (abfd))
3247     {
3248       return ((prstatus_t *) (core_prstatus (abfd)))->pr_cursig;
3249     }
3250 #endif
3251   return -1;
3252 }
3253
3254 /* Check to see if the core file could reasonably be expected to have
3255    come for the current executable file.  Note that by default we return
3256    true unless we find something that indicates that there might be a
3257    problem.
3258    */
3259
3260 boolean
3261 DEFUN (elf_core_file_matches_executable_p, (core_bfd, exec_bfd),
3262        bfd * core_bfd AND
3263        bfd * exec_bfd)
3264 {
3265 #ifdef HAVE_PROCFS
3266   char *corename;
3267   char *execname;
3268 #endif
3269
3270   /* First, xvecs must match since both are ELF files for the same target. */
3271
3272   if (core_bfd->xvec != exec_bfd->xvec)
3273     {
3274       bfd_error = system_call_error;
3275       return false;
3276     }
3277
3278 #ifdef HAVE_PROCFS
3279
3280   /* If no prpsinfo, just return true.  Otherwise, grab the last component
3281      of the exec'd pathname from the prpsinfo. */
3282
3283   if (core_prpsinfo (core_bfd))
3284     {
3285       corename = (((struct prpsinfo *) core_prpsinfo (core_bfd))->pr_fname);
3286     }
3287   else
3288     {
3289       return true;
3290     }
3291
3292   /* Find the last component of the executable pathname. */
3293
3294   if ((execname = strrchr (exec_bfd->filename, '/')) != NULL)
3295     {
3296       execname++;
3297     }
3298   else
3299     {
3300       execname = (char *) exec_bfd->filename;
3301     }
3302
3303   /* See if they match */
3304
3305   return strcmp (execname, corename) ? false : true;
3306
3307 #else
3308
3309   return true;
3310
3311 #endif /* HAVE_PROCFS */
3312 }
3313
3314 /* ELF core files contain a segment of type PT_NOTE, that holds much of
3315    the information that would normally be available from the /proc interface
3316    for the process, at the time the process dumped core.  Currently this
3317    includes copies of the prstatus, prpsinfo, and fpregset structures.
3318
3319    Since these structures are potentially machine dependent in size and
3320    ordering, bfd provides two levels of support for them.  The first level,
3321    available on all machines since it does not require that the host
3322    have /proc support or the relevant include files, is to create a bfd
3323    section for each of the prstatus, prpsinfo, and fpregset structures,
3324    without any interpretation of their contents.  With just this support,
3325    the bfd client will have to interpret the structures itself.  Even with
3326    /proc support, it might want these full structures for it's own reasons.
3327
3328    In the second level of support, where HAVE_PROCFS is defined, bfd will
3329    pick apart the structures to gather some additional information that
3330    clients may want, such as the general register set, the name of the
3331    exec'ed file and its arguments, the signal (if any) that caused the
3332    core dump, etc.
3333
3334    */
3335
3336 static boolean
3337 DEFUN (elf_corefile_note, (abfd, hdr),
3338        bfd * abfd AND
3339        Elf_Internal_Phdr * hdr)
3340 {
3341   Elf_External_Note *x_note_p;  /* Elf note, external form */
3342   Elf_Internal_Note i_note;     /* Elf note, internal form */
3343   char *buf = NULL;             /* Entire note segment contents */
3344   char *namedata;               /* Name portion of the note */
3345   char *descdata;               /* Descriptor portion of the note */
3346   char *sectname;               /* Name to use for new section */
3347   long filepos;                 /* File offset to descriptor data */
3348   asection *newsect;
3349
3350   if (hdr->p_filesz > 0
3351       && (buf = (char *) bfd_xmalloc (hdr->p_filesz)) != NULL
3352       && bfd_seek (abfd, hdr->p_offset, SEEK_SET) != -1
3353       && bfd_read ((PTR) buf, hdr->p_filesz, 1, abfd) == hdr->p_filesz)
3354     {
3355       x_note_p = (Elf_External_Note *) buf;
3356       while ((char *) x_note_p < (buf + hdr->p_filesz))
3357         {
3358           i_note.namesz = bfd_h_get_32 (abfd, (bfd_byte *) x_note_p->namesz);
3359           i_note.descsz = bfd_h_get_32 (abfd, (bfd_byte *) x_note_p->descsz);
3360           i_note.type = bfd_h_get_32 (abfd, (bfd_byte *) x_note_p->type);
3361           namedata = x_note_p->name;
3362           descdata = namedata + BFD_ALIGN (i_note.namesz, 4);
3363           filepos = hdr->p_offset + (descdata - buf);
3364           switch (i_note.type)
3365             {
3366             case NT_PRSTATUS:
3367               /* process descdata as prstatus info */
3368               bfd_prstatus (abfd, descdata, i_note.descsz, filepos);
3369               sectname = ".prstatus";
3370               break;
3371             case NT_FPREGSET:
3372               /* process descdata as fpregset info */
3373               bfd_fpregset (abfd, descdata, i_note.descsz, filepos);
3374               sectname = ".fpregset";
3375               break;
3376             case NT_PRPSINFO:
3377               /* process descdata as prpsinfo */
3378               bfd_prpsinfo (abfd, descdata, i_note.descsz, filepos);
3379               sectname = ".prpsinfo";
3380               break;
3381             default:
3382               /* Unknown descriptor, just ignore it. */
3383               sectname = NULL;
3384               break;
3385             }
3386           if (sectname != NULL)
3387             {
3388               newsect = bfd_make_section (abfd, sectname);
3389               newsect->_raw_size = i_note.descsz;
3390               newsect->filepos = filepos;
3391               newsect->flags = SEC_ALLOC | SEC_HAS_CONTENTS;
3392               newsect->alignment_power = 2;
3393             }
3394           x_note_p = (Elf_External_Note *)
3395             (descdata + BFD_ALIGN (i_note.descsz, 4));
3396         }
3397     }
3398   if (buf != NULL)
3399     {
3400       free (buf);
3401     }
3402   return true;
3403
3404 }
3405
3406 /*  Core files are simply standard ELF formatted files that partition
3407     the file using the execution view of the file (program header table)
3408     rather than the linking view.  In fact, there is no section header
3409     table in a core file.
3410
3411     The process status information (including the contents of the general
3412     register set) and the floating point register set are stored in a
3413     segment of type PT_NOTE.  We handcraft a couple of extra bfd sections
3414     that allow standard bfd access to the general registers (.reg) and the
3415     floating point registers (.reg2).
3416
3417  */
3418
3419 bfd_target *
3420 DEFUN (elf_core_file_p, (abfd), bfd * abfd)
3421 {
3422   Elf_External_Ehdr x_ehdr;     /* Elf file header, external form */
3423   Elf_Internal_Ehdr *i_ehdrp;   /* Elf file header, internal form */
3424   Elf_External_Phdr x_phdr;     /* Program header table entry, external form */
3425   Elf_Internal_Phdr *i_phdrp;   /* Program header table, internal form */
3426   unsigned int phindex;
3427
3428   /* Read in the ELF header in external format.  */
3429
3430   if (bfd_read ((PTR) & x_ehdr, sizeof (x_ehdr), 1, abfd) != sizeof (x_ehdr))
3431     {
3432       bfd_error = system_call_error;
3433       return NULL;
3434     }
3435
3436   /* Now check to see if we have a valid ELF file, and one that BFD can
3437      make use of.  The magic number must match, the address size ('class')
3438      and byte-swapping must match our XVEC entry, and it must have a
3439      program header table (FIXME: See comments re segments at top of this
3440      file). */
3441
3442   if (elf_file_p (&x_ehdr) == false)
3443     {
3444     wrong:
3445       bfd_error = wrong_format;
3446       return NULL;
3447     }
3448
3449   /* FIXME, Check EI_VERSION here !  */
3450
3451   {
3452 #if ARCH_SIZE == 32
3453     int desired_address_size = ELFCLASS32;
3454 #endif
3455 #if ARCH_SIZE == 64
3456     int desired_address_size = ELFCLASS64;
3457 #endif
3458
3459     if (x_ehdr.e_ident[EI_CLASS] != desired_address_size)
3460       goto wrong;
3461   }
3462
3463   /* Switch xvec to match the specified byte order.  */
3464   switch (x_ehdr.e_ident[EI_DATA])
3465     {
3466     case ELFDATA2MSB:           /* Big-endian */
3467       if (abfd->xvec->byteorder_big_p == false)
3468         goto wrong;
3469       break;
3470     case ELFDATA2LSB:           /* Little-endian */
3471       if (abfd->xvec->byteorder_big_p == true)
3472         goto wrong;
3473       break;
3474     case ELFDATANONE:           /* No data encoding specified */
3475     default:                    /* Unknown data encoding specified */
3476       goto wrong;
3477     }
3478
3479   /* Allocate an instance of the elf_obj_tdata structure and hook it up to
3480      the tdata pointer in the bfd. */
3481
3482   elf_tdata (abfd) =
3483     (struct elf_obj_tdata *) bfd_zalloc (abfd, sizeof (struct elf_obj_tdata));
3484   if (elf_tdata (abfd) == NULL)
3485     {
3486       bfd_error = no_memory;
3487       return NULL;
3488     }
3489
3490   /* FIXME, `wrong' returns from this point onward, leak memory.  */
3491
3492   /* Now that we know the byte order, swap in the rest of the header */
3493   i_ehdrp = elf_elfheader (abfd);
3494   elf_swap_ehdr_in (abfd, &x_ehdr, i_ehdrp);
3495 #if DEBUG & 1
3496   elf_debug_file (i_ehdrp);
3497 #endif
3498
3499   /* If there is no program header, or the type is not a core file, then
3500      we are hosed. */
3501   if (i_ehdrp->e_phoff == 0 || i_ehdrp->e_type != ET_CORE)
3502     goto wrong;
3503
3504   /* Allocate space for a copy of the program header table in
3505      internal form, seek to the program header table in the file,
3506      read it in, and convert it to internal form.  As a simple sanity
3507      check, verify that the what BFD thinks is the size of each program
3508      header table entry actually matches the size recorded in the file. */
3509
3510   if (i_ehdrp->e_phentsize != sizeof (x_phdr))
3511     goto wrong;
3512   i_phdrp = (Elf_Internal_Phdr *)
3513     bfd_alloc (abfd, sizeof (*i_phdrp) * i_ehdrp->e_phnum);
3514   if (!i_phdrp)
3515     {
3516       bfd_error = no_memory;
3517       return NULL;
3518     }
3519   if (bfd_seek (abfd, i_ehdrp->e_phoff, SEEK_SET) == -1)
3520     {
3521       bfd_error = system_call_error;
3522       return NULL;
3523     }
3524   for (phindex = 0; phindex < i_ehdrp->e_phnum; phindex++)
3525     {
3526       if (bfd_read ((PTR) & x_phdr, sizeof (x_phdr), 1, abfd)
3527           != sizeof (x_phdr))
3528         {
3529           bfd_error = system_call_error;
3530           return NULL;
3531         }
3532       elf_swap_phdr_in (abfd, &x_phdr, i_phdrp + phindex);
3533     }
3534
3535   /* Once all of the program headers have been read and converted, we
3536      can start processing them. */
3537
3538   for (phindex = 0; phindex < i_ehdrp->e_phnum; phindex++)
3539     {
3540       bfd_section_from_phdr (abfd, i_phdrp + phindex, phindex);
3541       if ((i_phdrp + phindex)->p_type == PT_NOTE)
3542         {
3543           elf_corefile_note (abfd, i_phdrp + phindex);
3544         }
3545     }
3546
3547   /* Remember the entry point specified in the ELF file header. */
3548
3549   bfd_get_start_address (abfd) = i_ehdrp->e_entry;
3550
3551   return abfd->xvec;
3552 }
This page took 0.226813 seconds and 4 git commands to generate.