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