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