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