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