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