118099Spst/* ELF object file format.
269626Sru   Copyright 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
369626Sru   2002, 2003, 2004, 2006, 2007 Free Software Foundation, Inc.
469626Sru
569626Sru   This file is part of GAS, the GNU Assembler.
669626Sru
769626Sru   GAS is free software; you can redistribute it and/or modify
818099Spst   it under the terms of the GNU General Public License as published by
918099Spst   the Free Software Foundation; either version 2, or (at your option)
1018099Spst   any later version.
1118099Spst
1218099Spst   GAS is distributed in the hope that it will be useful,
1318099Spst   but WITHOUT ANY WARRANTY; without even the implied warranty of
1418099Spst   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1518099Spst   GNU General Public License for more details.
1618099Spst
1718099Spst   You should have received a copy of the GNU General Public License
1818099Spst   along with GAS; see the file COPYING.  If not, write to the Free
1918099Spst   Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
2018099Spst   02110-1301, USA.  */
2118099Spst
2218099Spst/* HP PA-RISC support was contributed by the Center for Software Science
2318099Spst   at the University of Utah.  */
2418099Spst
2569626Sru#ifndef _OBJ_ELF_H
2669626Sru#define _OBJ_ELF_H
27104862Sru
2818099Spst#define OBJ_ELF 1
2918099Spst
3018099Spst/* Note that all macros in this file should be wrapped in #ifndef, for
3118099Spst   sake of obj-multi.h which includes this file.  */
3218099Spst
3318099Spst#ifndef OUTPUT_FLAVOR
34#define OUTPUT_FLAVOR bfd_target_elf_flavour
35#endif
36
37#define BYTES_IN_WORD 4		/* for now */
38#include "bfd/elf-bfd.h"
39
40#include "targ-cpu.h"
41
42#ifdef TC_ALPHA
43#define ECOFF_DEBUGGING (alpha_flag_mdebug > 0)
44extern int alpha_flag_mdebug;
45#endif
46
47/* For now, always set ECOFF_DEBUGGING for a MIPS target.  */
48#ifdef TC_MIPS
49#define ECOFF_DEBUGGING mips_flag_mdebug
50extern int mips_flag_mdebug;
51#endif /* TC_MIPS */
52
53#ifdef OBJ_MAYBE_ECOFF
54#ifndef ECOFF_DEBUGGING
55#define ECOFF_DEBUGGING 1
56#endif
57#endif
58
59/* Additional information we keep for each symbol.  */
60struct elf_obj_sy
61{
62  /* Whether the symbol has been marked as local.  */
63  int local;
64
65  /* Use this to keep track of .size expressions that involve
66     differences that we can't compute yet.  */
67  expressionS *size;
68
69  /* The name specified by the .symver directive.  */
70  char *versioned_name;
71
72#ifdef ECOFF_DEBUGGING
73  /* If we are generating ECOFF debugging information, we need some
74     additional fields for each symbol.  */
75  struct efdr *ecoff_file;
76  struct localsym *ecoff_symbol;
77  valueT ecoff_extern_size;
78#endif
79};
80
81#define OBJ_SYMFIELD_TYPE struct elf_obj_sy
82
83/* Symbol fields used by the ELF back end.  */
84#define ELF_TARGET_SYMBOL_FIELDS unsigned int local:1;
85
86/* Don't change this; change ELF_TARGET_SYMBOL_FIELDS instead.  */
87#ifndef TARGET_SYMBOL_FIELDS
88#define TARGET_SYMBOL_FIELDS ELF_TARGET_SYMBOL_FIELDS
89#endif
90
91#ifndef FALSE
92#define FALSE 0
93#define TRUE  !FALSE
94#endif
95
96#ifndef obj_begin
97#define obj_begin() elf_begin ()
98#endif
99extern void elf_begin (void);
100
101/* should be conditional on address size! */
102#define elf_symbol(asymbol) ((elf_symbol_type *) (&(asymbol)->the_bfd))
103
104#ifndef S_GET_SIZE
105#define S_GET_SIZE(S) \
106  (elf_symbol (symbol_get_bfdsym (S))->internal_elf_sym.st_size)
107#endif
108#ifndef S_SET_SIZE
109#define S_SET_SIZE(S,V) \
110  (elf_symbol (symbol_get_bfdsym (S))->internal_elf_sym.st_size = (V))
111#endif
112
113#ifndef S_GET_ALIGN
114#define S_GET_ALIGN(S) \
115  (elf_symbol (symbol_get_bfdsym (S))->internal_elf_sym.st_value)
116#endif
117#ifndef S_SET_ALIGN
118#define S_SET_ALIGN(S,V) \
119  (elf_symbol (symbol_get_bfdsym (S))->internal_elf_sym.st_value = (V))
120#endif
121
122int elf_s_get_other (symbolS *);
123#ifndef S_GET_OTHER
124#define S_GET_OTHER(S)	(elf_s_get_other (S))
125#endif
126#ifndef S_SET_OTHER
127#define S_SET_OTHER(S,V) \
128  (elf_symbol (symbol_get_bfdsym (S))->internal_elf_sym.st_other = (V))
129#endif
130
131extern asection *gdb_section;
132
133#ifndef obj_frob_file
134#define obj_frob_file  elf_frob_file
135#endif
136extern void elf_frob_file (void);
137
138#ifndef obj_frob_file_before_adjust
139#define obj_frob_file_before_adjust  elf_frob_file_before_adjust
140#endif
141extern void elf_frob_file_before_adjust (void);
142
143#ifndef obj_frob_file_after_relocs
144#define obj_frob_file_after_relocs  elf_frob_file_after_relocs
145#endif
146extern void elf_frob_file_after_relocs (void);
147
148/* If the target doesn't have special processing for labels, take care of
149   dwarf2 output at the object file level.  */
150#ifndef tc_frob_label
151#include "dwarf2dbg.h"
152#define obj_frob_label  dwarf2_emit_label
153#endif
154
155#ifndef obj_app_file
156#define obj_app_file elf_file_symbol
157#endif
158extern void elf_file_symbol (const char *, int);
159
160extern void obj_elf_section_change_hook (void);
161
162extern void obj_elf_section (int);
163extern void obj_elf_previous (int);
164extern void obj_elf_version (int);
165extern void obj_elf_common (int);
166extern void obj_elf_data (int);
167extern void obj_elf_text (int);
168extern void obj_elf_change_section
169  (const char *, int, int, int, const char *, int, int);
170extern struct fix *obj_elf_vtable_inherit (int);
171extern struct fix *obj_elf_vtable_entry (int);
172
173/* BFD wants to write the udata field, which is a no-no for the
174   predefined section symbols in bfd/section.c.  They are read-only.  */
175#ifndef obj_sec_sym_ok_for_reloc
176#define obj_sec_sym_ok_for_reloc(SEC)	((SEC)->owner != 0)
177#endif
178
179void elf_obj_read_begin_hook (void);
180#ifndef obj_read_begin_hook
181#define obj_read_begin_hook	elf_obj_read_begin_hook
182#endif
183
184void elf_obj_symbol_new_hook (symbolS *);
185#ifndef obj_symbol_new_hook
186#define obj_symbol_new_hook	elf_obj_symbol_new_hook
187#endif
188
189void elf_copy_symbol_attributes (symbolS *, symbolS *);
190#ifndef OBJ_COPY_SYMBOL_ATTRIBUTES
191#define OBJ_COPY_SYMBOL_ATTRIBUTES(DEST, SRC) \
192  (elf_copy_symbol_attributes (DEST, SRC))
193#endif
194
195#ifndef SEPARATE_STAB_SECTIONS
196/* Avoid ifndef each separate macro setting by wrapping the whole of the
197   stab group on the assumption that whoever sets SEPARATE_STAB_SECTIONS
198   caters to ECOFF_DEBUGGING and the right setting of INIT_STAB_SECTIONS
199   and OBJ_PROCESS_STAB too, without needing the tweaks below.  */
200
201/* Stabs go in a separate section.  */
202#define SEPARATE_STAB_SECTIONS 1
203
204/* We need 12 bytes at the start of the section to hold some initial
205   information.  */
206extern void obj_elf_init_stab_section (segT);
207#define INIT_STAB_SECTION(seg) obj_elf_init_stab_section (seg)
208
209#ifdef ECOFF_DEBUGGING
210/* We smuggle stabs in ECOFF rather than using a separate section.
211   The Irix linker can not handle a separate stabs section.  */
212
213#undef  SEPARATE_STAB_SECTIONS
214#define SEPARATE_STAB_SECTIONS (!ECOFF_DEBUGGING)
215
216#undef  INIT_STAB_SECTION
217#define INIT_STAB_SECTION(seg) \
218  ((void) (ECOFF_DEBUGGING ? 0 : (obj_elf_init_stab_section (seg), 0)))
219
220#undef OBJ_PROCESS_STAB
221#define OBJ_PROCESS_STAB(seg, what, string, type, other, desc)		\
222  if (ECOFF_DEBUGGING)							\
223    ecoff_stab ((seg), (what), (string), (type), (other), (desc))
224#endif /* ECOFF_DEBUGGING */
225
226#endif /* SEPARATE_STAB_SECTIONS not defined.  */
227
228extern void elf_frob_symbol (symbolS *, int *);
229#ifndef obj_frob_symbol
230#define obj_frob_symbol(symp, punt) elf_frob_symbol (symp, &punt)
231#endif
232
233extern void elf_pop_insert (void);
234#ifndef obj_pop_insert
235#define obj_pop_insert()	elf_pop_insert()
236#endif
237
238#ifndef OBJ_MAYBE_ELF
239/* If OBJ_MAYBE_ELF then obj-multi.h will define obj_ecoff_set_ext.  */
240#define obj_ecoff_set_ext elf_ecoff_set_ext
241struct ecoff_extr;
242extern void elf_ecoff_set_ext (symbolS *, struct ecoff_extr *);
243#endif
244extern asection *elf_com_section_ptr;
245extern symbolS * elf_common_parse (int ignore ATTRIBUTE_UNUSED, symbolS *symbolP,
246				   addressT size);
247
248#endif /* _OBJ_ELF_H */
249