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