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