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