1 /* ELF executable support for BFD. 2 Copyright 1991, 92, 93, 94, 95, 96, 97, 98, 1999 Free Software 3 Foundation, Inc. 4 5 Written by Fred Fish @ Cygnus Support, from information published 6 in "UNIX System V Release 4, Programmers Guide: ANSI C and 7 Programming Support Tools". Sufficient support for gdb. 8 9 Rewritten by Mark Eichin @ Cygnus Support, from information 10 published in "System V Application Binary Interface", chapters 4 11 and 5, as well as the various "Processor Supplement" documents 12 derived from it. Added support for assembler and other object file 13 utilities. Further work done by Ken Raeburn (Cygnus Support), Michael 14 Meissner (Open Software Foundation), and Peter Hoogenboom (University 15 of Utah) to finish and extend this. 16 17 This file is part of BFD, the Binary File Descriptor library. 18 19 This program is free software; you can redistribute it and/or modify 20 it under the terms of the GNU General Public License as published by 21 the Free Software Foundation; either version 2 of the License, or 22 (at your option) any later version. 23 24 This program is distributed in the hope that it will be useful, 25 but WITHOUT ANY WARRANTY; without even the implied warranty of 26 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 27 GNU General Public License for more details. 28 29 You should have received a copy of the GNU General Public License 30 along with this program; if not, write to the Free Software 31 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ 32 33 /* Problems and other issues to resolve. 34 35 (1) BFD expects there to be some fixed number of "sections" in 36 the object file. I.E. there is a "section_count" variable in the 37 bfd structure which contains the number of sections. However, ELF 38 supports multiple "views" of a file. In particular, with current 39 implementations, executable files typically have two tables, a 40 program header table and a section header table, both of which 41 partition the executable. 42 43 In ELF-speak, the "linking view" of the file uses the section header 44 table to access "sections" within the file, and the "execution view" 45 uses the program header table to access "segments" within the file. 46 "Segments" typically may contain all the data from one or more 47 "sections". 48 49 Note that the section header table is optional in ELF executables, 50 but it is this information that is most useful to gdb. If the 51 section header table is missing, then gdb should probably try 52 to make do with the program header table. (FIXME) 53 54 (2) The code in this file is compiled twice, once in 32-bit mode and 55 once in 64-bit mode. More of it should be made size-independent 56 and moved into elf.c. 57 58 (3) ELF section symbols are handled rather sloppily now. This should 59 be cleaned up, and ELF section symbols reconciled with BFD section 60 symbols. 61 62 (4) We need a published spec for 64-bit ELF. We've got some stuff here 63 that we're using for SPARC V9 64-bit chips, but don't assume that 64 it's cast in stone. 65 */ 66 67 #include "bfd.h" 68 #include "sysdep.h" 69 #include "bfdlink.h" 70 #include "libbfd.h" 71 #include "elf-bfd.h" 72 73 /* Renaming structures, typedefs, macros and functions to be size-specific. */ 74 #define Elf_External_Ehdr NAME(Elf,External_Ehdr) 75 #define Elf_External_Sym NAME(Elf,External_Sym) 76 #define Elf_External_Shdr NAME(Elf,External_Shdr) 77 #define Elf_External_Phdr NAME(Elf,External_Phdr) 78 #define Elf_External_Rel NAME(Elf,External_Rel) 79 #define Elf_External_Rela NAME(Elf,External_Rela) 80 #define Elf_External_Dyn NAME(Elf,External_Dyn) 81 82 #define elf_core_file_failing_command NAME(bfd_elf,core_file_failing_command) 83 #define elf_core_file_failing_signal NAME(bfd_elf,core_file_failing_signal) 84 #define elf_core_file_matches_executable_p \ 85 NAME(bfd_elf,core_file_matches_executable_p) 86 #define elf_object_p NAME(bfd_elf,object_p) 87 #define elf_core_file_p NAME(bfd_elf,core_file_p) 88 #define elf_get_symtab_upper_bound NAME(bfd_elf,get_symtab_upper_bound) 89 #define elf_get_dynamic_symtab_upper_bound \ 90 NAME(bfd_elf,get_dynamic_symtab_upper_bound) 91 #define elf_swap_reloc_in NAME(bfd_elf,swap_reloc_in) 92 #define elf_swap_reloca_in NAME(bfd_elf,swap_reloca_in) 93 #define elf_swap_reloc_out NAME(bfd_elf,swap_reloc_out) 94 #define elf_swap_reloca_out NAME(bfd_elf,swap_reloca_out) 95 #define elf_swap_symbol_in NAME(bfd_elf,swap_symbol_in) 96 #define elf_swap_symbol_out NAME(bfd_elf,swap_symbol_out) 97 #define elf_swap_phdr_in NAME(bfd_elf,swap_phdr_in) 98 #define elf_swap_phdr_out NAME(bfd_elf,swap_phdr_out) 99 #define elf_swap_dyn_in NAME(bfd_elf,swap_dyn_in) 100 #define elf_swap_dyn_out NAME(bfd_elf,swap_dyn_out) 101 #define elf_get_reloc_upper_bound NAME(bfd_elf,get_reloc_upper_bound) 102 #define elf_canonicalize_reloc NAME(bfd_elf,canonicalize_reloc) 103 #define elf_slurp_symbol_table NAME(bfd_elf,slurp_symbol_table) 104 #define elf_get_symtab NAME(bfd_elf,get_symtab) 105 #define elf_canonicalize_dynamic_symtab \ 106 NAME(bfd_elf,canonicalize_dynamic_symtab) 107 #define elf_make_empty_symbol NAME(bfd_elf,make_empty_symbol) 108 #define elf_get_symbol_info NAME(bfd_elf,get_symbol_info) 109 #define elf_get_lineno NAME(bfd_elf,get_lineno) 110 #define elf_set_arch_mach NAME(bfd_elf,set_arch_mach) 111 #define elf_find_nearest_line NAME(bfd_elf,find_nearest_line) 112 #define elf_sizeof_headers NAME(bfd_elf,sizeof_headers) 113 #define elf_set_section_contents NAME(bfd_elf,set_section_contents) 114 #define elf_no_info_to_howto NAME(bfd_elf,no_info_to_howto) 115 #define elf_no_info_to_howto_rel NAME(bfd_elf,no_info_to_howto_rel) 116 #define elf_find_section NAME(bfd_elf,find_section) 117 #define elf_bfd_link_add_symbols NAME(bfd_elf,bfd_link_add_symbols) 118 #define elf_add_dynamic_entry NAME(bfd_elf,add_dynamic_entry) 119 #define elf_write_shdrs_and_ehdr NAME(bfd_elf,write_shdrs_and_ehdr) 120 #define elf_write_out_phdrs NAME(bfd_elf,write_out_phdrs) 121 #define elf_link_create_dynamic_sections \ 122 NAME(bfd_elf,link_create_dynamic_sections) 123 #define elf_link_record_dynamic_symbol _bfd_elf_link_record_dynamic_symbol 124 #define elf_bfd_final_link NAME(bfd_elf,bfd_final_link) 125 #define elf_create_pointer_linker_section NAME(bfd_elf,create_pointer_linker_section) 126 #define elf_finish_pointer_linker_section NAME(bfd_elf,finish_pointer_linker_section) 127 #define elf_gc_sections NAME(_bfd_elf,gc_sections) 128 #define elf_gc_common_finalize_got_offsets \ 129 NAME(_bfd_elf,gc_common_finalize_got_offsets) 130 #define elf_gc_common_final_link NAME(_bfd_elf,gc_common_final_link) 131 #define elf_gc_record_vtinherit NAME(_bfd_elf,gc_record_vtinherit) 132 #define elf_gc_record_vtentry NAME(_bfd_elf,gc_record_vtentry) 133 #define elf_link_record_local_dynamic_symbol \ 134 NAME(_bfd_elf,link_record_local_dynamic_symbol) 135 136 #if ARCH_SIZE == 64 137 #define ELF_R_INFO(X,Y) ELF64_R_INFO(X,Y) 138 #define ELF_R_SYM(X) ELF64_R_SYM(X) 139 #define ELF_R_TYPE(X) ELF64_R_TYPE(X) 140 #define ELFCLASS ELFCLASS64 141 #define FILE_ALIGN 8 142 #define LOG_FILE_ALIGN 3 143 #endif 144 #if ARCH_SIZE == 32 145 #define ELF_R_INFO(X,Y) ELF32_R_INFO(X,Y) 146 #define ELF_R_SYM(X) ELF32_R_SYM(X) 147 #define ELF_R_TYPE(X) ELF32_R_TYPE(X) 148 #define ELFCLASS ELFCLASS32 149 #define FILE_ALIGN 4 150 #define LOG_FILE_ALIGN 2 151 #endif 152 153 /* Static functions */ 154 155 static void elf_swap_ehdr_in 156 PARAMS ((bfd *, const Elf_External_Ehdr *, Elf_Internal_Ehdr *)); 157 static void elf_swap_ehdr_out 158 PARAMS ((bfd *, const Elf_Internal_Ehdr *, Elf_External_Ehdr *)); 159 static void elf_swap_shdr_in 160 PARAMS ((bfd *, const Elf_External_Shdr *, Elf_Internal_Shdr *)); 161 static void elf_swap_shdr_out 162 PARAMS ((bfd *, const Elf_Internal_Shdr *, Elf_External_Shdr *)); 163 164 #define elf_stringtab_init _bfd_elf_stringtab_init 165 166 #define section_from_elf_index bfd_section_from_elf_index 167 168 static boolean elf_slurp_reloc_table_from_section 169 PARAMS ((bfd *, asection *, Elf_Internal_Shdr *, bfd_size_type, 170 arelent *, asymbol **, boolean)); 171 static boolean elf_slurp_reloc_table 172 PARAMS ((bfd *, asection *, asymbol **, boolean)); 173 174 static void write_relocs PARAMS ((bfd *, asection *, PTR)); 175 176 static boolean elf_file_p PARAMS ((Elf_External_Ehdr *)); 177 178 #ifdef DEBUG 179 static void elf_debug_section PARAMS ((int, Elf_Internal_Shdr *)); 180 static void elf_debug_file PARAMS ((Elf_Internal_Ehdr *)); 181 static char *elf_symbol_flags PARAMS ((flagword)); 182 #endif 183 184 /* Structure swapping routines */ 185 186 /* Should perhaps use put_offset, put_word, etc. For now, the two versions 187 can be handled by explicitly specifying 32 bits or "the long type". */ 188 #if ARCH_SIZE == 64 189 #define put_word bfd_h_put_64 190 #define put_signed_word bfd_h_put_signed_64 191 #define get_word bfd_h_get_64 192 #define get_signed_word bfd_h_get_signed_64 193 #endif 194 #if ARCH_SIZE == 32 195 #define put_word bfd_h_put_32 196 #define put_signed_word bfd_h_put_signed_32 197 #define get_word bfd_h_get_32 198 #define get_signed_word bfd_h_get_signed_32 199 #endif 200 201 /* Translate an ELF symbol in external format into an ELF symbol in internal 202 format. */ 203 204 void 205 elf_swap_symbol_in (abfd, src, dst) 206 bfd *abfd; 207 const Elf_External_Sym *src; 208 Elf_Internal_Sym *dst; 209 { 210 int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma; 211 212 dst->st_name = bfd_h_get_32 (abfd, (bfd_byte *) src->st_name); 213 if (signed_vma) 214 dst->st_value = get_signed_word (abfd, (bfd_byte *) src->st_value); 215 else 216 dst->st_value = get_word (abfd, (bfd_byte *) src->st_value); 217 dst->st_size = get_word (abfd, (bfd_byte *) src->st_size); 218 dst->st_info = bfd_h_get_8 (abfd, (bfd_byte *) src->st_info); 219 dst->st_other = bfd_h_get_8 (abfd, (bfd_byte *) src->st_other); 220 dst->st_shndx = bfd_h_get_16 (abfd, (bfd_byte *) src->st_shndx); 221 } 222 223 /* Translate an ELF symbol in internal format into an ELF symbol in external 224 format. */ 225 226 void 227 elf_swap_symbol_out (abfd, src, cdst) 228 bfd *abfd; 229 const Elf_Internal_Sym *src; 230 PTR cdst; 231 { 232 Elf_External_Sym *dst = (Elf_External_Sym *) cdst; 233 bfd_h_put_32 (abfd, src->st_name, dst->st_name); 234 put_word (abfd, src->st_value, dst->st_value); 235 put_word (abfd, src->st_size, dst->st_size); 236 bfd_h_put_8 (abfd, src->st_info, dst->st_info); 237 bfd_h_put_8 (abfd, src->st_other, dst->st_other); 238 bfd_h_put_16 (abfd, src->st_shndx, dst->st_shndx); 239 } 240 241 242 /* Translate an ELF file header in external format into an ELF file header in 243 internal format. */ 244 245 static void 246 elf_swap_ehdr_in (abfd, src, dst) 247 bfd *abfd; 248 const Elf_External_Ehdr *src; 249 Elf_Internal_Ehdr *dst; 250 { 251 memcpy (dst->e_ident, src->e_ident, EI_NIDENT); 252 dst->e_type = bfd_h_get_16 (abfd, (bfd_byte *) src->e_type); 253 dst->e_machine = bfd_h_get_16 (abfd, (bfd_byte *) src->e_machine); 254 dst->e_version = bfd_h_get_32 (abfd, (bfd_byte *) src->e_version); 255 dst->e_entry = get_word (abfd, (bfd_byte *) src->e_entry); 256 dst->e_phoff = get_word (abfd, (bfd_byte *) src->e_phoff); 257 dst->e_shoff = get_word (abfd, (bfd_byte *) src->e_shoff); 258 dst->e_flags = bfd_h_get_32 (abfd, (bfd_byte *) src->e_flags); 259 dst->e_ehsize = bfd_h_get_16 (abfd, (bfd_byte *) src->e_ehsize); 260 dst->e_phentsize = bfd_h_get_16 (abfd, (bfd_byte *) src->e_phentsize); 261 dst->e_phnum = bfd_h_get_16 (abfd, (bfd_byte *) src->e_phnum); 262 dst->e_shentsize = bfd_h_get_16 (abfd, (bfd_byte *) src->e_shentsize); 263 dst->e_shnum = bfd_h_get_16 (abfd, (bfd_byte *) src->e_shnum); 264 dst->e_shstrndx = bfd_h_get_16 (abfd, (bfd_byte *) src->e_shstrndx); 265 } 266 267 /* Translate an ELF file header in internal format into an ELF file header in 268 external format. */ 269 270 static void 271 elf_swap_ehdr_out (abfd, src, dst) 272 bfd *abfd; 273 const Elf_Internal_Ehdr *src; 274 Elf_External_Ehdr *dst; 275 { 276 memcpy (dst->e_ident, src->e_ident, EI_NIDENT); 277 /* note that all elements of dst are *arrays of unsigned char* already... */ 278 bfd_h_put_16 (abfd, src->e_type, dst->e_type); 279 bfd_h_put_16 (abfd, src->e_machine, dst->e_machine); 280 bfd_h_put_32 (abfd, src->e_version, dst->e_version); 281 put_word (abfd, src->e_entry, dst->e_entry); 282 put_word (abfd, src->e_phoff, dst->e_phoff); 283 put_word (abfd, src->e_shoff, dst->e_shoff); 284 bfd_h_put_32 (abfd, src->e_flags, dst->e_flags); 285 bfd_h_put_16 (abfd, src->e_ehsize, dst->e_ehsize); 286 bfd_h_put_16 (abfd, src->e_phentsize, dst->e_phentsize); 287 bfd_h_put_16 (abfd, src->e_phnum, dst->e_phnum); 288 bfd_h_put_16 (abfd, src->e_shentsize, dst->e_shentsize); 289 bfd_h_put_16 (abfd, src->e_shnum, dst->e_shnum); 290 bfd_h_put_16 (abfd, src->e_shstrndx, dst->e_shstrndx); 291 } 292 293 294 /* Translate an ELF section header table entry in external format into an 295 ELF section header table entry in internal format. */ 296 297 static void 298 elf_swap_shdr_in (abfd, src, dst) 299 bfd *abfd; 300 const Elf_External_Shdr *src; 301 Elf_Internal_Shdr *dst; 302 { 303 int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma; 304 305 dst->sh_name = bfd_h_get_32 (abfd, (bfd_byte *) src->sh_name); 306 dst->sh_type = bfd_h_get_32 (abfd, (bfd_byte *) src->sh_type); 307 dst->sh_flags = get_word (abfd, (bfd_byte *) src->sh_flags); 308 if (signed_vma) 309 dst->sh_addr = get_signed_word (abfd, (bfd_byte *) src->sh_addr); 310 else 311 dst->sh_addr = get_word (abfd, (bfd_byte *) src->sh_addr); 312 dst->sh_offset = get_word (abfd, (bfd_byte *) src->sh_offset); 313 dst->sh_size = get_word (abfd, (bfd_byte *) src->sh_size); 314 dst->sh_link = bfd_h_get_32 (abfd, (bfd_byte *) src->sh_link); 315 dst->sh_info = bfd_h_get_32 (abfd, (bfd_byte *) src->sh_info); 316 dst->sh_addralign = get_word (abfd, (bfd_byte *) src->sh_addralign); 317 dst->sh_entsize = get_word (abfd, (bfd_byte *) src->sh_entsize); 318 dst->bfd_section = NULL; 319 dst->contents = NULL; 320 } 321 322 /* Translate an ELF section header table entry in internal format into an 323 ELF section header table entry in external format. */ 324 325 static void 326 elf_swap_shdr_out (abfd, src, dst) 327 bfd *abfd; 328 const Elf_Internal_Shdr *src; 329 Elf_External_Shdr *dst; 330 { 331 /* note that all elements of dst are *arrays of unsigned char* already... */ 332 bfd_h_put_32 (abfd, src->sh_name, dst->sh_name); 333 bfd_h_put_32 (abfd, src->sh_type, dst->sh_type); 334 put_word (abfd, src->sh_flags, dst->sh_flags); 335 put_word (abfd, src->sh_addr, dst->sh_addr); 336 put_word (abfd, src->sh_offset, dst->sh_offset); 337 put_word (abfd, src->sh_size, dst->sh_size); 338 bfd_h_put_32 (abfd, src->sh_link, dst->sh_link); 339 bfd_h_put_32 (abfd, src->sh_info, dst->sh_info); 340 put_word (abfd, src->sh_addralign, dst->sh_addralign); 341 put_word (abfd, src->sh_entsize, dst->sh_entsize); 342 } 343 344 345 /* Translate an ELF program header table entry in external format into an 346 ELF program header table entry in internal format. */ 347 348 void 349 elf_swap_phdr_in (abfd, src, dst) 350 bfd *abfd; 351 const Elf_External_Phdr *src; 352 Elf_Internal_Phdr *dst; 353 { 354 int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma; 355 356 dst->p_type = bfd_h_get_32 (abfd, (bfd_byte *) src->p_type); 357 dst->p_flags = bfd_h_get_32 (abfd, (bfd_byte *) src->p_flags); 358 dst->p_offset = get_word (abfd, (bfd_byte *) src->p_offset); 359 if (signed_vma) 360 { 361 dst->p_vaddr = get_signed_word (abfd, (bfd_byte *) src->p_vaddr); 362 dst->p_paddr = get_signed_word (abfd, (bfd_byte *) src->p_paddr); 363 } 364 else 365 { 366 dst->p_vaddr = get_word (abfd, (bfd_byte *) src->p_vaddr); 367 dst->p_paddr = get_word (abfd, (bfd_byte *) src->p_paddr); 368 } 369 dst->p_filesz = get_word (abfd, (bfd_byte *) src->p_filesz); 370 dst->p_memsz = get_word (abfd, (bfd_byte *) src->p_memsz); 371 dst->p_align = get_word (abfd, (bfd_byte *) src->p_align); 372 } 373 374 void 375 elf_swap_phdr_out (abfd, src, dst) 376 bfd *abfd; 377 const Elf_Internal_Phdr *src; 378 Elf_External_Phdr *dst; 379 { 380 /* note that all elements of dst are *arrays of unsigned char* already... */ 381 bfd_h_put_32 (abfd, src->p_type, dst->p_type); 382 put_word (abfd, src->p_offset, dst->p_offset); 383 put_word (abfd, src->p_vaddr, dst->p_vaddr); 384 put_word (abfd, src->p_paddr, dst->p_paddr); 385 put_word (abfd, src->p_filesz, dst->p_filesz); 386 put_word (abfd, src->p_memsz, dst->p_memsz); 387 bfd_h_put_32 (abfd, src->p_flags, dst->p_flags); 388 put_word (abfd, src->p_align, dst->p_align); 389 } 390 391 /* Translate an ELF reloc from external format to internal format. */ 392 INLINE void 393 elf_swap_reloc_in (abfd, src, dst) 394 bfd *abfd; 395 const Elf_External_Rel *src; 396 Elf_Internal_Rel *dst; 397 { 398 dst->r_offset = get_word (abfd, (bfd_byte *) src->r_offset); 399 dst->r_info = get_word (abfd, (bfd_byte *) src->r_info); 400 } 401 402 INLINE void 403 elf_swap_reloca_in (abfd, src, dst) 404 bfd *abfd; 405 const Elf_External_Rela *src; 406 Elf_Internal_Rela *dst; 407 { 408 dst->r_offset = get_word (abfd, (bfd_byte *) src->r_offset); 409 dst->r_info = get_word (abfd, (bfd_byte *) src->r_info); 410 dst->r_addend = get_signed_word (abfd, (bfd_byte *) src->r_addend); 411 } 412 413 /* Translate an ELF reloc from internal format to external format. */ 414 INLINE void 415 elf_swap_reloc_out (abfd, src, dst) 416 bfd *abfd; 417 const Elf_Internal_Rel *src; 418 Elf_External_Rel *dst; 419 { 420 put_word (abfd, src->r_offset, dst->r_offset); 421 put_word (abfd, src->r_info, dst->r_info); 422 } 423 424 INLINE void 425 elf_swap_reloca_out (abfd, src, dst) 426 bfd *abfd; 427 const Elf_Internal_Rela *src; 428 Elf_External_Rela *dst; 429 { 430 put_word (abfd, src->r_offset, dst->r_offset); 431 put_word (abfd, src->r_info, dst->r_info); 432 put_signed_word (abfd, src->r_addend, dst->r_addend); 433 } 434 435 INLINE void 436 elf_swap_dyn_in (abfd, p, dst) 437 bfd *abfd; 438 const PTR p; 439 Elf_Internal_Dyn *dst; 440 { 441 const Elf_External_Dyn *src = (const Elf_External_Dyn *) p; 442 443 dst->d_tag = get_word (abfd, src->d_tag); 444 dst->d_un.d_val = get_word (abfd, src->d_un.d_val); 445 } 446 447 INLINE void 448 elf_swap_dyn_out (abfd, src, p) 449 bfd *abfd; 450 const Elf_Internal_Dyn *src; 451 PTR p; 452 { 453 Elf_External_Dyn *dst = (Elf_External_Dyn *) p; 454 455 put_word (abfd, src->d_tag, dst->d_tag); 456 put_word (abfd, src->d_un.d_val, dst->d_un.d_val); 457 } 458 459 /* ELF .o/exec file reading */ 460 461 462 /* Begin processing a given object. 463 464 First we validate the file by reading in the ELF header and checking 465 the magic number. */ 466 467 static INLINE boolean 468 elf_file_p (x_ehdrp) 469 Elf_External_Ehdr *x_ehdrp; 470 { 471 return ((x_ehdrp->e_ident[EI_MAG0] == ELFMAG0) 472 && (x_ehdrp->e_ident[EI_MAG1] == ELFMAG1) 473 && (x_ehdrp->e_ident[EI_MAG2] == ELFMAG2) 474 && (x_ehdrp->e_ident[EI_MAG3] == ELFMAG3)); 475 } 476 477 /* Check to see if the file associated with ABFD matches the target vector 478 that ABFD points to. 479 480 Note that we may be called several times with the same ABFD, but different 481 target vectors, most of which will not match. We have to avoid leaving 482 any side effects in ABFD, or any data it points to (like tdata), if the 483 file does not match the target vector. */ 484 485 const bfd_target * 486 elf_object_p (abfd) 487 bfd *abfd; 488 { 489 Elf_External_Ehdr x_ehdr; /* Elf file header, external form */ 490 Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */ 491 Elf_External_Shdr x_shdr; /* Section header table entry, external form */ 492 Elf_Internal_Shdr *i_shdrp = NULL; /* Section header table, internal form */ 493 unsigned int shindex; 494 char *shstrtab; /* Internal copy of section header stringtab */ 495 struct elf_backend_data *ebd; 496 struct elf_obj_tdata *preserved_tdata = elf_tdata (abfd); 497 struct elf_obj_tdata *new_tdata = NULL; 498 asection *s; 499 500 /* Read in the ELF header in external format. */ 501 502 if (bfd_read ((PTR) & x_ehdr, sizeof (x_ehdr), 1, abfd) != sizeof (x_ehdr)) 503 { 504 if (bfd_get_error () != bfd_error_system_call) 505 goto got_wrong_format_error; 506 else 507 goto got_no_match; 508 } 509 510 /* Now check to see if we have a valid ELF file, and one that BFD can 511 make use of. The magic number must match, the address size ('class') 512 and byte-swapping must match our XVEC entry, and it must have a 513 section header table (FIXME: See comments re sections at top of this 514 file). */ 515 516 if ((elf_file_p (&x_ehdr) == false) || 517 (x_ehdr.e_ident[EI_VERSION] != EV_CURRENT) || 518 (x_ehdr.e_ident[EI_CLASS] != ELFCLASS)) 519 goto got_wrong_format_error; 520 521 /* Check that file's byte order matches xvec's */ 522 switch (x_ehdr.e_ident[EI_DATA]) 523 { 524 case ELFDATA2MSB: /* Big-endian */ 525 if (! bfd_header_big_endian (abfd)) 526 goto got_wrong_format_error; 527 break; 528 case ELFDATA2LSB: /* Little-endian */ 529 if (! bfd_header_little_endian (abfd)) 530 goto got_wrong_format_error; 531 break; 532 case ELFDATANONE: /* No data encoding specified */ 533 default: /* Unknown data encoding specified */ 534 goto got_wrong_format_error; 535 } 536 537 /* Allocate an instance of the elf_obj_tdata structure and hook it up to 538 the tdata pointer in the bfd. */ 539 540 new_tdata = ((struct elf_obj_tdata *) 541 bfd_zalloc (abfd, sizeof (struct elf_obj_tdata))); 542 if (new_tdata == NULL) 543 goto got_no_match; 544 elf_tdata (abfd) = new_tdata; 545 546 /* Now that we know the byte order, swap in the rest of the header */ 547 i_ehdrp = elf_elfheader (abfd); 548 elf_swap_ehdr_in (abfd, &x_ehdr, i_ehdrp); 549 #if DEBUG & 1 550 elf_debug_file (i_ehdrp); 551 #endif 552 553 /* Reject ET_CORE (header indicates core file, not object file) */ 554 if (i_ehdrp->e_type == ET_CORE) 555 goto got_wrong_format_error; 556 557 /* If there is no section header table, we're hosed. */ 558 if (i_ehdrp->e_shoff == 0) 559 goto got_wrong_format_error; 560 561 /* As a simple sanity check, verify that the what BFD thinks is the 562 size of each section header table entry actually matches the size 563 recorded in the file. */ 564 if (i_ehdrp->e_shentsize != sizeof (x_shdr)) 565 goto got_wrong_format_error; 566 567 ebd = get_elf_backend_data (abfd); 568 569 /* Check that the ELF e_machine field matches what this particular 570 BFD format expects. */ 571 if (ebd->elf_machine_code != i_ehdrp->e_machine 572 && (ebd->elf_machine_alt1 == 0 || i_ehdrp->e_machine != ebd->elf_machine_alt1) 573 && (ebd->elf_machine_alt2 == 0 || i_ehdrp->e_machine != ebd->elf_machine_alt2)) 574 { 575 const bfd_target * const *target_ptr; 576 577 if (ebd->elf_machine_code != EM_NONE) 578 goto got_wrong_format_error; 579 580 /* This is the generic ELF target. Let it match any ELF target 581 for which we do not have a specific backend. */ 582 for (target_ptr = bfd_target_vector; *target_ptr != NULL; target_ptr++) 583 { 584 struct elf_backend_data *back; 585 586 if ((*target_ptr)->flavour != bfd_target_elf_flavour) 587 continue; 588 back = (struct elf_backend_data *) (*target_ptr)->backend_data; 589 if (back->elf_machine_code == i_ehdrp->e_machine 590 || (back->elf_machine_alt1 != 0 591 && back->elf_machine_alt1 == i_ehdrp->e_machine) 592 || (back->elf_machine_alt2 != 0 593 && back->elf_machine_alt2 == i_ehdrp->e_machine)) 594 { 595 /* target_ptr is an ELF backend which matches this 596 object file, so reject the generic ELF target. */ 597 goto got_wrong_format_error; 598 } 599 } 600 } 601 602 if (i_ehdrp->e_type == ET_EXEC) 603 abfd->flags |= EXEC_P; 604 else if (i_ehdrp->e_type == ET_DYN) 605 abfd->flags |= DYNAMIC; 606 607 if (i_ehdrp->e_phnum > 0) 608 abfd->flags |= D_PAGED; 609 610 if (! bfd_default_set_arch_mach (abfd, ebd->arch, 0)) 611 { 612 /* It's OK if this fails for the generic target. */ 613 if (ebd->elf_machine_code != EM_NONE) 614 goto got_no_match; 615 } 616 617 /* Remember the entry point specified in the ELF file header. */ 618 bfd_get_start_address (abfd) = i_ehdrp->e_entry; 619 620 /* Allocate space for a copy of the section header table in 621 internal form, seek to the section header table in the file, 622 read it in, and convert it to internal form. */ 623 i_shdrp = ((Elf_Internal_Shdr *) 624 bfd_alloc (abfd, sizeof (*i_shdrp) * i_ehdrp->e_shnum)); 625 elf_elfsections (abfd) = ((Elf_Internal_Shdr **) 626 bfd_alloc (abfd, 627 sizeof (i_shdrp) * i_ehdrp->e_shnum)); 628 if (!i_shdrp || !elf_elfsections (abfd)) 629 goto got_no_match; 630 if (bfd_seek (abfd, i_ehdrp->e_shoff, SEEK_SET) != 0) 631 goto got_no_match; 632 for (shindex = 0; shindex < i_ehdrp->e_shnum; shindex++) 633 { 634 if (bfd_read ((PTR) & x_shdr, sizeof x_shdr, 1, abfd) != sizeof (x_shdr)) 635 goto got_no_match; 636 elf_swap_shdr_in (abfd, &x_shdr, i_shdrp + shindex); 637 elf_elfsections (abfd)[shindex] = i_shdrp + shindex; 638 639 /* If the section is loaded, but not page aligned, clear 640 D_PAGED. */ 641 if ((i_shdrp[shindex].sh_flags & SHF_ALLOC) != 0 642 && i_shdrp[shindex].sh_type != SHT_NOBITS 643 && (((i_shdrp[shindex].sh_addr - i_shdrp[shindex].sh_offset) 644 % ebd->maxpagesize) 645 != 0)) 646 abfd->flags &= ~D_PAGED; 647 } 648 if (i_ehdrp->e_shstrndx) 649 { 650 if (! bfd_section_from_shdr (abfd, i_ehdrp->e_shstrndx)) 651 goto got_no_match; 652 } 653 654 /* Read in the program headers. */ 655 if (i_ehdrp->e_phnum == 0) 656 elf_tdata (abfd)->phdr = NULL; 657 else 658 { 659 Elf_Internal_Phdr *i_phdr; 660 unsigned int i; 661 662 elf_tdata (abfd)->phdr = ((Elf_Internal_Phdr *) 663 bfd_alloc (abfd, 664 (i_ehdrp->e_phnum 665 * sizeof (Elf_Internal_Phdr)))); 666 if (elf_tdata (abfd)->phdr == NULL) 667 goto got_no_match; 668 if (bfd_seek (abfd, i_ehdrp->e_phoff, SEEK_SET) != 0) 669 goto got_no_match; 670 i_phdr = elf_tdata (abfd)->phdr; 671 for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++) 672 { 673 Elf_External_Phdr x_phdr; 674 675 if (bfd_read ((PTR) &x_phdr, sizeof x_phdr, 1, abfd) 676 != sizeof x_phdr) 677 goto got_no_match; 678 elf_swap_phdr_in (abfd, &x_phdr, i_phdr); 679 } 680 } 681 682 /* Read in the string table containing the names of the sections. We 683 will need the base pointer to this table later. */ 684 /* We read this inline now, so that we don't have to go through 685 bfd_section_from_shdr with it (since this particular strtab is 686 used to find all of the ELF section names.) */ 687 688 shstrtab = bfd_elf_get_str_section (abfd, i_ehdrp->e_shstrndx); 689 if (!shstrtab) 690 goto got_no_match; 691 692 /* Once all of the section headers have been read and converted, we 693 can start processing them. Note that the first section header is 694 a dummy placeholder entry, so we ignore it. */ 695 696 for (shindex = 1; shindex < i_ehdrp->e_shnum; shindex++) 697 { 698 if (! bfd_section_from_shdr (abfd, shindex)) 699 goto got_no_match; 700 } 701 702 /* Let the backend double check the format and override global 703 information. */ 704 if (ebd->elf_backend_object_p) 705 { 706 if ((*ebd->elf_backend_object_p) (abfd) == false) 707 goto got_wrong_format_error; 708 } 709 710 /* If we have created any reloc sections that are associated with 711 debugging sections, mark the reloc sections as debugging as well. */ 712 for (s = abfd->sections; s != NULL; s = s->next) 713 { 714 if ((elf_section_data (s)->this_hdr.sh_type == SHT_REL 715 || elf_section_data (s)->this_hdr.sh_type == SHT_RELA) 716 && elf_section_data (s)->this_hdr.sh_info > 0) 717 { 718 unsigned long targ_index; 719 asection *targ_sec; 720 721 targ_index = elf_section_data (s)->this_hdr.sh_info; 722 targ_sec = bfd_section_from_elf_index (abfd, targ_index); 723 if (targ_sec != NULL 724 && (targ_sec->flags & SEC_DEBUGGING) != 0) 725 s->flags |= SEC_DEBUGGING; 726 } 727 } 728 729 return (abfd->xvec); 730 731 got_wrong_format_error: 732 bfd_set_error (bfd_error_wrong_format); 733 got_no_match: 734 if (new_tdata != NULL 735 && new_tdata->elf_sect_ptr != NULL) 736 bfd_release (abfd, new_tdata->elf_sect_ptr); 737 if (i_shdrp != NULL) 738 bfd_release (abfd, i_shdrp); 739 if (new_tdata != NULL) 740 bfd_release (abfd, new_tdata); 741 elf_tdata (abfd) = preserved_tdata; 742 return (NULL); 743 } 744 745 /* ELF .o/exec file writing */ 746 747 /* Write out the relocs. */ 748 749 static void 750 write_relocs (abfd, sec, data) 751 bfd *abfd; 752 asection *sec; 753 PTR data; 754 { 755 boolean *failedp = (boolean *) data; 756 Elf_Internal_Shdr *rela_hdr; 757 Elf_External_Rela *outbound_relocas; 758 Elf_External_Rel *outbound_relocs; 759 unsigned int idx; 760 int use_rela_p; 761 asymbol *last_sym = 0; 762 int last_sym_idx = 0; 763 764 /* If we have already failed, don't do anything. */ 765 if (*failedp) 766 return; 767 768 if ((sec->flags & SEC_RELOC) == 0) 769 return; 770 771 /* The linker backend writes the relocs out itself, and sets the 772 reloc_count field to zero to inhibit writing them here. Also, 773 sometimes the SEC_RELOC flag gets set even when there aren't any 774 relocs. */ 775 if (sec->reloc_count == 0) 776 return; 777 778 rela_hdr = &elf_section_data (sec)->rel_hdr; 779 780 rela_hdr->sh_size = rela_hdr->sh_entsize * sec->reloc_count; 781 rela_hdr->contents = (PTR) bfd_alloc (abfd, rela_hdr->sh_size); 782 if (rela_hdr->contents == NULL) 783 { 784 *failedp = true; 785 return; 786 } 787 788 /* Figure out whether the relocations are RELA or REL relocations. */ 789 if (rela_hdr->sh_type == SHT_RELA) 790 use_rela_p = true; 791 else if (rela_hdr->sh_type == SHT_REL) 792 use_rela_p = false; 793 else 794 /* Every relocation section should be either an SHT_RELA or an 795 SHT_REL section. */ 796 abort (); 797 798 /* orelocation has the data, reloc_count has the count... */ 799 if (use_rela_p) 800 { 801 outbound_relocas = (Elf_External_Rela *) rela_hdr->contents; 802 803 for (idx = 0; idx < sec->reloc_count; idx++) 804 { 805 Elf_Internal_Rela dst_rela; 806 Elf_External_Rela *src_rela; 807 arelent *ptr; 808 asymbol *sym; 809 int n; 810 811 ptr = sec->orelocation[idx]; 812 src_rela = outbound_relocas + idx; 813 814 /* The address of an ELF reloc is section relative for an object 815 file, and absolute for an executable file or shared library. 816 The address of a BFD reloc is always section relative. */ 817 if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0) 818 dst_rela.r_offset = ptr->address; 819 else 820 dst_rela.r_offset = ptr->address + sec->vma; 821 822 sym = *ptr->sym_ptr_ptr; 823 if (sym == last_sym) 824 n = last_sym_idx; 825 else if (bfd_is_abs_section (sym->section) && sym->value == 0) 826 n = STN_UNDEF; 827 else 828 { 829 last_sym = sym; 830 n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym); 831 if (n < 0) 832 { 833 *failedp = true; 834 return; 835 } 836 last_sym_idx = n; 837 } 838 839 if ((*ptr->sym_ptr_ptr)->the_bfd != NULL 840 && (*ptr->sym_ptr_ptr)->the_bfd->xvec != abfd->xvec 841 && ! _bfd_elf_validate_reloc (abfd, ptr)) 842 { 843 *failedp = true; 844 return; 845 } 846 847 dst_rela.r_info = ELF_R_INFO (n, ptr->howto->type); 848 849 dst_rela.r_addend = ptr->addend; 850 elf_swap_reloca_out (abfd, &dst_rela, src_rela); 851 } 852 } 853 else 854 /* REL relocations */ 855 { 856 outbound_relocs = (Elf_External_Rel *) rela_hdr->contents; 857 858 for (idx = 0; idx < sec->reloc_count; idx++) 859 { 860 Elf_Internal_Rel dst_rel; 861 Elf_External_Rel *src_rel; 862 arelent *ptr; 863 int n; 864 asymbol *sym; 865 866 ptr = sec->orelocation[idx]; 867 sym = *ptr->sym_ptr_ptr; 868 src_rel = outbound_relocs + idx; 869 870 /* The address of an ELF reloc is section relative for an object 871 file, and absolute for an executable file or shared library. 872 The address of a BFD reloc is always section relative. */ 873 if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0) 874 dst_rel.r_offset = ptr->address; 875 else 876 dst_rel.r_offset = ptr->address + sec->vma; 877 878 if (sym == last_sym) 879 n = last_sym_idx; 880 else if (bfd_is_abs_section (sym->section) && sym->value == 0) 881 n = STN_UNDEF; 882 else 883 { 884 last_sym = sym; 885 n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym); 886 if (n < 0) 887 { 888 *failedp = true; 889 return; 890 } 891 last_sym_idx = n; 892 } 893 894 if ((*ptr->sym_ptr_ptr)->the_bfd != NULL 895 && (*ptr->sym_ptr_ptr)->the_bfd->xvec != abfd->xvec 896 && ! _bfd_elf_validate_reloc (abfd, ptr)) 897 { 898 *failedp = true; 899 return; 900 } 901 902 dst_rel.r_info = ELF_R_INFO (n, ptr->howto->type); 903 904 elf_swap_reloc_out (abfd, &dst_rel, src_rel); 905 } 906 } 907 } 908 909 /* Write out the program headers. */ 910 911 int 912 elf_write_out_phdrs (abfd, phdr, count) 913 bfd *abfd; 914 const Elf_Internal_Phdr *phdr; 915 int count; 916 { 917 while (count--) 918 { 919 Elf_External_Phdr extphdr; 920 elf_swap_phdr_out (abfd, phdr, &extphdr); 921 if (bfd_write (&extphdr, sizeof (Elf_External_Phdr), 1, abfd) 922 != sizeof (Elf_External_Phdr)) 923 return -1; 924 phdr++; 925 } 926 return 0; 927 } 928 929 /* Write out the section headers and the ELF file header. */ 930 931 boolean 932 elf_write_shdrs_and_ehdr (abfd) 933 bfd *abfd; 934 { 935 Elf_External_Ehdr x_ehdr; /* Elf file header, external form */ 936 Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */ 937 Elf_External_Shdr *x_shdrp; /* Section header table, external form */ 938 Elf_Internal_Shdr **i_shdrp; /* Section header table, internal form */ 939 unsigned int count; 940 941 i_ehdrp = elf_elfheader (abfd); 942 i_shdrp = elf_elfsections (abfd); 943 944 /* swap the header before spitting it out... */ 945 946 #if DEBUG & 1 947 elf_debug_file (i_ehdrp); 948 #endif 949 elf_swap_ehdr_out (abfd, i_ehdrp, &x_ehdr); 950 if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0 951 || (bfd_write ((PTR) & x_ehdr, sizeof (x_ehdr), 1, abfd) 952 != sizeof (x_ehdr))) 953 return false; 954 955 /* at this point we've concocted all the ELF sections... */ 956 x_shdrp = (Elf_External_Shdr *) 957 bfd_alloc (abfd, sizeof (*x_shdrp) * (i_ehdrp->e_shnum)); 958 if (!x_shdrp) 959 return false; 960 961 for (count = 0; count < i_ehdrp->e_shnum; count++) 962 { 963 #if DEBUG & 2 964 elf_debug_section (count, i_shdrp[count]); 965 #endif 966 elf_swap_shdr_out (abfd, i_shdrp[count], x_shdrp + count); 967 } 968 if (bfd_seek (abfd, (file_ptr) i_ehdrp->e_shoff, SEEK_SET) != 0 969 || (bfd_write ((PTR) x_shdrp, sizeof (*x_shdrp), i_ehdrp->e_shnum, abfd) 970 != sizeof (*x_shdrp) * i_ehdrp->e_shnum)) 971 return false; 972 973 /* need to dump the string table too... */ 974 975 return true; 976 } 977 978 long 979 elf_slurp_symbol_table (abfd, symptrs, dynamic) 980 bfd *abfd; 981 asymbol **symptrs; /* Buffer for generated bfd symbols */ 982 boolean dynamic; 983 { 984 Elf_Internal_Shdr *hdr; 985 Elf_Internal_Shdr *verhdr; 986 unsigned long symcount; /* Number of external ELF symbols */ 987 elf_symbol_type *sym; /* Pointer to current bfd symbol */ 988 elf_symbol_type *symbase; /* Buffer for generated bfd symbols */ 989 Elf_Internal_Sym i_sym; 990 Elf_External_Sym *x_symp = NULL; 991 Elf_External_Versym *x_versymp = NULL; 992 993 /* Read each raw ELF symbol, converting from external ELF form to 994 internal ELF form, and then using the information to create a 995 canonical bfd symbol table entry. 996 997 Note that we allocate the initial bfd canonical symbol buffer 998 based on a one-to-one mapping of the ELF symbols to canonical 999 symbols. We actually use all the ELF symbols, so there will be no 1000 space left over at the end. When we have all the symbols, we 1001 build the caller's pointer vector. */ 1002 1003 if (! dynamic) 1004 { 1005 hdr = &elf_tdata (abfd)->symtab_hdr; 1006 verhdr = NULL; 1007 } 1008 else 1009 { 1010 hdr = &elf_tdata (abfd)->dynsymtab_hdr; 1011 if (elf_dynversym (abfd) == 0) 1012 verhdr = NULL; 1013 else 1014 verhdr = &elf_tdata (abfd)->dynversym_hdr; 1015 if ((elf_tdata (abfd)->dynverdef_section != 0 1016 && elf_tdata (abfd)->verdef == NULL) 1017 || (elf_tdata (abfd)->dynverref_section != 0 1018 && elf_tdata (abfd)->verref == NULL)) 1019 { 1020 if (! _bfd_elf_slurp_version_tables (abfd)) 1021 return -1; 1022 } 1023 } 1024 1025 if (bfd_seek (abfd, hdr->sh_offset, SEEK_SET) == -1) 1026 return -1; 1027 1028 symcount = hdr->sh_size / sizeof (Elf_External_Sym); 1029 1030 if (symcount == 0) 1031 sym = symbase = NULL; 1032 else 1033 { 1034 unsigned long i; 1035 1036 if (bfd_seek (abfd, hdr->sh_offset, SEEK_SET) == -1) 1037 return -1; 1038 1039 symbase = ((elf_symbol_type *) 1040 bfd_zalloc (abfd, symcount * sizeof (elf_symbol_type))); 1041 if (symbase == (elf_symbol_type *) NULL) 1042 return -1; 1043 sym = symbase; 1044 1045 /* Temporarily allocate room for the raw ELF symbols. */ 1046 x_symp = ((Elf_External_Sym *) 1047 bfd_malloc (symcount * sizeof (Elf_External_Sym))); 1048 if (x_symp == NULL && symcount != 0) 1049 goto error_return; 1050 1051 if (bfd_read ((PTR) x_symp, sizeof (Elf_External_Sym), symcount, abfd) 1052 != symcount * sizeof (Elf_External_Sym)) 1053 goto error_return; 1054 1055 /* Read the raw ELF version symbol information. */ 1056 1057 if (verhdr != NULL 1058 && verhdr->sh_size / sizeof (Elf_External_Versym) != symcount) 1059 { 1060 (*_bfd_error_handler) 1061 (_("%s: version count (%ld) does not match symbol count (%ld)"), 1062 abfd->filename, 1063 (long) (verhdr->sh_size / sizeof (Elf_External_Versym)), 1064 symcount); 1065 1066 /* Slurp in the symbols without the version information, 1067 since that is more helpful than just quitting. */ 1068 verhdr = NULL; 1069 } 1070 1071 if (verhdr != NULL) 1072 { 1073 if (bfd_seek (abfd, verhdr->sh_offset, SEEK_SET) != 0) 1074 goto error_return; 1075 1076 x_versymp = (Elf_External_Versym *) bfd_malloc (verhdr->sh_size); 1077 if (x_versymp == NULL && verhdr->sh_size != 0) 1078 goto error_return; 1079 1080 if (bfd_read ((PTR) x_versymp, 1, verhdr->sh_size, abfd) 1081 != verhdr->sh_size) 1082 goto error_return; 1083 } 1084 1085 /* Skip first symbol, which is a null dummy. */ 1086 for (i = 1; i < symcount; i++) 1087 { 1088 elf_swap_symbol_in (abfd, x_symp + i, &i_sym); 1089 memcpy (&sym->internal_elf_sym, &i_sym, sizeof (Elf_Internal_Sym)); 1090 #ifdef ELF_KEEP_EXTSYM 1091 memcpy (&sym->native_elf_sym, x_symp + i, sizeof (Elf_External_Sym)); 1092 #endif 1093 sym->symbol.the_bfd = abfd; 1094 1095 sym->symbol.name = bfd_elf_string_from_elf_section (abfd, 1096 hdr->sh_link, 1097 i_sym.st_name); 1098 1099 sym->symbol.value = i_sym.st_value; 1100 1101 if (i_sym.st_shndx > 0 && i_sym.st_shndx < SHN_LORESERVE) 1102 { 1103 sym->symbol.section = section_from_elf_index (abfd, 1104 i_sym.st_shndx); 1105 if (sym->symbol.section == NULL) 1106 { 1107 /* This symbol is in a section for which we did not 1108 create a BFD section. Just use bfd_abs_section, 1109 although it is wrong. FIXME. */ 1110 sym->symbol.section = bfd_abs_section_ptr; 1111 } 1112 } 1113 else if (i_sym.st_shndx == SHN_ABS) 1114 { 1115 sym->symbol.section = bfd_abs_section_ptr; 1116 } 1117 else if (i_sym.st_shndx == SHN_COMMON) 1118 { 1119 sym->symbol.section = bfd_com_section_ptr; 1120 /* Elf puts the alignment into the `value' field, and 1121 the size into the `size' field. BFD wants to see the 1122 size in the value field, and doesn't care (at the 1123 moment) about the alignment. */ 1124 sym->symbol.value = i_sym.st_size; 1125 } 1126 else if (i_sym.st_shndx == SHN_UNDEF) 1127 { 1128 sym->symbol.section = bfd_und_section_ptr; 1129 } 1130 else 1131 sym->symbol.section = bfd_abs_section_ptr; 1132 1133 /* If this is a relocateable file, then the symbol value is 1134 already section relative. */ 1135 if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0) 1136 sym->symbol.value -= sym->symbol.section->vma; 1137 1138 switch (ELF_ST_BIND (i_sym.st_info)) 1139 { 1140 case STB_LOCAL: 1141 sym->symbol.flags |= BSF_LOCAL; 1142 break; 1143 case STB_GLOBAL: 1144 if (i_sym.st_shndx != SHN_UNDEF 1145 && i_sym.st_shndx != SHN_COMMON) 1146 sym->symbol.flags |= BSF_GLOBAL; 1147 break; 1148 case STB_WEAK: 1149 sym->symbol.flags |= BSF_WEAK; 1150 break; 1151 } 1152 1153 switch (ELF_ST_TYPE (i_sym.st_info)) 1154 { 1155 case STT_SECTION: 1156 sym->symbol.flags |= BSF_SECTION_SYM | BSF_DEBUGGING; 1157 break; 1158 case STT_FILE: 1159 sym->symbol.flags |= BSF_FILE | BSF_DEBUGGING; 1160 break; 1161 case STT_FUNC: 1162 sym->symbol.flags |= BSF_FUNCTION; 1163 break; 1164 case STT_OBJECT: 1165 sym->symbol.flags |= BSF_OBJECT; 1166 break; 1167 } 1168 1169 if (dynamic) 1170 sym->symbol.flags |= BSF_DYNAMIC; 1171 1172 if (x_versymp != NULL) 1173 { 1174 Elf_Internal_Versym iversym; 1175 1176 _bfd_elf_swap_versym_in (abfd, x_versymp + i, &iversym); 1177 sym->version = iversym.vs_vers; 1178 } 1179 1180 /* Do some backend-specific processing on this symbol. */ 1181 { 1182 struct elf_backend_data *ebd = get_elf_backend_data (abfd); 1183 if (ebd->elf_backend_symbol_processing) 1184 (*ebd->elf_backend_symbol_processing) (abfd, &sym->symbol); 1185 } 1186 1187 sym++; 1188 } 1189 } 1190 1191 /* Do some backend-specific processing on this symbol table. */ 1192 { 1193 struct elf_backend_data *ebd = get_elf_backend_data (abfd); 1194 if (ebd->elf_backend_symbol_table_processing) 1195 (*ebd->elf_backend_symbol_table_processing) (abfd, symbase, symcount); 1196 } 1197 1198 /* We rely on the zalloc to clear out the final symbol entry. */ 1199 1200 symcount = sym - symbase; 1201 1202 /* Fill in the user's symbol pointer vector if needed. */ 1203 if (symptrs) 1204 { 1205 long l = symcount; 1206 1207 sym = symbase; 1208 while (l-- > 0) 1209 { 1210 *symptrs++ = &sym->symbol; 1211 sym++; 1212 } 1213 *symptrs = 0; /* Final null pointer */ 1214 } 1215 1216 if (x_versymp != NULL) 1217 free (x_versymp); 1218 if (x_symp != NULL) 1219 free (x_symp); 1220 return symcount; 1221 error_return: 1222 if (x_versymp != NULL) 1223 free (x_versymp); 1224 if (x_symp != NULL) 1225 free (x_symp); 1226 return -1; 1227 } 1228 1229 /* Read relocations for ASECT from REL_HDR. There are RELOC_COUNT of 1230 them. */ 1231 1232 static boolean 1233 elf_slurp_reloc_table_from_section (abfd, asect, rel_hdr, reloc_count, 1234 relents, symbols, dynamic) 1235 bfd *abfd; 1236 asection *asect; 1237 Elf_Internal_Shdr *rel_hdr; 1238 bfd_size_type reloc_count; 1239 arelent *relents; 1240 asymbol **symbols; 1241 boolean dynamic; 1242 { 1243 struct elf_backend_data * const ebd = get_elf_backend_data (abfd); 1244 PTR allocated = NULL; 1245 bfd_byte *native_relocs; 1246 arelent *relent; 1247 unsigned int i; 1248 int entsize; 1249 1250 allocated = (PTR) bfd_malloc ((size_t) rel_hdr->sh_size); 1251 if (allocated == NULL) 1252 goto error_return; 1253 1254 if (bfd_seek (abfd, rel_hdr->sh_offset, SEEK_SET) != 0 1255 || (bfd_read (allocated, 1, rel_hdr->sh_size, abfd) 1256 != rel_hdr->sh_size)) 1257 goto error_return; 1258 1259 native_relocs = (bfd_byte *) allocated; 1260 1261 entsize = rel_hdr->sh_entsize; 1262 BFD_ASSERT (entsize == sizeof (Elf_External_Rel) 1263 || entsize == sizeof (Elf_External_Rela)); 1264 1265 for (i = 0, relent = relents; 1266 i < reloc_count; 1267 i++, relent++, native_relocs += entsize) 1268 { 1269 Elf_Internal_Rela rela; 1270 Elf_Internal_Rel rel; 1271 1272 if (entsize == sizeof (Elf_External_Rela)) 1273 elf_swap_reloca_in (abfd, (Elf_External_Rela *) native_relocs, &rela); 1274 else 1275 { 1276 elf_swap_reloc_in (abfd, (Elf_External_Rel *) native_relocs, &rel); 1277 rela.r_offset = rel.r_offset; 1278 rela.r_info = rel.r_info; 1279 rela.r_addend = 0; 1280 } 1281 1282 /* The address of an ELF reloc is section relative for an object 1283 file, and absolute for an executable file or shared library. 1284 The address of a normal BFD reloc is always section relative, 1285 and the address of a dynamic reloc is absolute.. */ 1286 if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0 || dynamic) 1287 relent->address = rela.r_offset; 1288 else 1289 relent->address = rela.r_offset - asect->vma; 1290 1291 if (ELF_R_SYM (rela.r_info) == 0) 1292 relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr; 1293 else 1294 { 1295 asymbol **ps, *s; 1296 1297 ps = symbols + ELF_R_SYM (rela.r_info) - 1; 1298 s = *ps; 1299 1300 /* Canonicalize ELF section symbols. FIXME: Why? */ 1301 if ((s->flags & BSF_SECTION_SYM) == 0) 1302 relent->sym_ptr_ptr = ps; 1303 else 1304 relent->sym_ptr_ptr = s->section->symbol_ptr_ptr; 1305 } 1306 1307 relent->addend = rela.r_addend; 1308 1309 if (entsize == sizeof (Elf_External_Rela)) 1310 (*ebd->elf_info_to_howto) (abfd, relent, &rela); 1311 else 1312 (*ebd->elf_info_to_howto_rel) (abfd, relent, &rel); 1313 } 1314 1315 if (allocated != NULL) 1316 free (allocated); 1317 1318 return true; 1319 1320 error_return: 1321 if (allocated != NULL) 1322 free (allocated); 1323 return false; 1324 } 1325 1326 /* Read in and swap the external relocs. */ 1327 1328 static boolean 1329 elf_slurp_reloc_table (abfd, asect, symbols, dynamic) 1330 bfd *abfd; 1331 asection *asect; 1332 asymbol **symbols; 1333 boolean dynamic; 1334 { 1335 struct bfd_elf_section_data * const d = elf_section_data (asect); 1336 Elf_Internal_Shdr *rel_hdr; 1337 Elf_Internal_Shdr *rel_hdr2; 1338 bfd_size_type reloc_count; 1339 bfd_size_type reloc_count2; 1340 arelent *relents; 1341 1342 if (asect->relocation != NULL) 1343 return true; 1344 1345 if (! dynamic) 1346 { 1347 if ((asect->flags & SEC_RELOC) == 0 1348 || asect->reloc_count == 0) 1349 return true; 1350 1351 rel_hdr = &d->rel_hdr; 1352 reloc_count = rel_hdr->sh_size / rel_hdr->sh_entsize; 1353 rel_hdr2 = d->rel_hdr2; 1354 reloc_count2 = (rel_hdr2 1355 ? (rel_hdr2->sh_size / rel_hdr2->sh_entsize) 1356 : 0); 1357 1358 BFD_ASSERT (asect->reloc_count == reloc_count + reloc_count2); 1359 BFD_ASSERT (asect->rel_filepos == rel_hdr->sh_offset 1360 || (rel_hdr2 && asect->rel_filepos == rel_hdr2->sh_offset)); 1361 1362 } 1363 else 1364 { 1365 /* Note that ASECT->RELOC_COUNT tends not to be accurate in this 1366 case because relocations against this section may use the 1367 dynamic symbol table, and in that case bfd_section_from_shdr 1368 in elf.c does not update the RELOC_COUNT. */ 1369 if (asect->_raw_size == 0) 1370 return true; 1371 1372 rel_hdr = &d->this_hdr; 1373 reloc_count = rel_hdr->sh_size / rel_hdr->sh_entsize; 1374 rel_hdr2 = NULL; 1375 reloc_count2 = 0; 1376 } 1377 1378 relents = ((arelent *) 1379 bfd_alloc (abfd, 1380 (reloc_count + reloc_count2) * sizeof (arelent))); 1381 if (relents == NULL) 1382 return false; 1383 1384 if (!elf_slurp_reloc_table_from_section (abfd, asect, 1385 rel_hdr, reloc_count, 1386 relents, 1387 symbols, dynamic)) 1388 return false; 1389 1390 if (rel_hdr2 1391 && !elf_slurp_reloc_table_from_section (abfd, asect, 1392 rel_hdr2, reloc_count2, 1393 relents + reloc_count, 1394 symbols, dynamic)) 1395 return false; 1396 1397 1398 asect->relocation = relents; 1399 return true; 1400 } 1401 1402 #ifdef DEBUG 1403 static void 1404 elf_debug_section (num, hdr) 1405 int num; 1406 Elf_Internal_Shdr *hdr; 1407 { 1408 fprintf (stderr, "\nSection#%d '%s' 0x%.8lx\n", num, 1409 hdr->bfd_section != NULL ? hdr->bfd_section->name : "", 1410 (long) hdr); 1411 fprintf (stderr, 1412 "sh_name = %ld\tsh_type = %ld\tsh_flags = %ld\n", 1413 (long) hdr->sh_name, 1414 (long) hdr->sh_type, 1415 (long) hdr->sh_flags); 1416 fprintf (stderr, 1417 "sh_addr = %ld\tsh_offset = %ld\tsh_size = %ld\n", 1418 (long) hdr->sh_addr, 1419 (long) hdr->sh_offset, 1420 (long) hdr->sh_size); 1421 fprintf (stderr, 1422 "sh_link = %ld\tsh_info = %ld\tsh_addralign = %ld\n", 1423 (long) hdr->sh_link, 1424 (long) hdr->sh_info, 1425 (long) hdr->sh_addralign); 1426 fprintf (stderr, "sh_entsize = %ld\n", 1427 (long) hdr->sh_entsize); 1428 fflush (stderr); 1429 } 1430 1431 static void 1432 elf_debug_file (ehdrp) 1433 Elf_Internal_Ehdr *ehdrp; 1434 { 1435 fprintf (stderr, "e_entry = 0x%.8lx\n", (long) ehdrp->e_entry); 1436 fprintf (stderr, "e_phoff = %ld\n", (long) ehdrp->e_phoff); 1437 fprintf (stderr, "e_phnum = %ld\n", (long) ehdrp->e_phnum); 1438 fprintf (stderr, "e_phentsize = %ld\n", (long) ehdrp->e_phentsize); 1439 fprintf (stderr, "e_shoff = %ld\n", (long) ehdrp->e_shoff); 1440 fprintf (stderr, "e_shnum = %ld\n", (long) ehdrp->e_shnum); 1441 fprintf (stderr, "e_shentsize = %ld\n", (long) ehdrp->e_shentsize); 1442 } 1443 1444 static char * 1445 elf_symbol_flags (flags) 1446 flagword flags; 1447 { 1448 static char buffer[1024]; 1449 1450 buffer[0] = '\0'; 1451 if (flags & BSF_LOCAL) 1452 strcat (buffer, " local"); 1453 1454 if (flags & BSF_GLOBAL) 1455 strcat (buffer, " global"); 1456 1457 if (flags & BSF_DEBUGGING) 1458 strcat (buffer, " debug"); 1459 1460 if (flags & BSF_FUNCTION) 1461 strcat (buffer, " function"); 1462 1463 if (flags & BSF_KEEP) 1464 strcat (buffer, " keep"); 1465 1466 if (flags & BSF_KEEP_G) 1467 strcat (buffer, " keep_g"); 1468 1469 if (flags & BSF_WEAK) 1470 strcat (buffer, " weak"); 1471 1472 if (flags & BSF_SECTION_SYM) 1473 strcat (buffer, " section-sym"); 1474 1475 if (flags & BSF_OLD_COMMON) 1476 strcat (buffer, " old-common"); 1477 1478 if (flags & BSF_NOT_AT_END) 1479 strcat (buffer, " not-at-end"); 1480 1481 if (flags & BSF_CONSTRUCTOR) 1482 strcat (buffer, " constructor"); 1483 1484 if (flags & BSF_WARNING) 1485 strcat (buffer, " warning"); 1486 1487 if (flags & BSF_INDIRECT) 1488 strcat (buffer, " indirect"); 1489 1490 if (flags & BSF_FILE) 1491 strcat (buffer, " file"); 1492 1493 if (flags & DYNAMIC) 1494 strcat (buffer, " dynamic"); 1495 1496 if (flags & ~(BSF_LOCAL 1497 | BSF_GLOBAL 1498 | BSF_DEBUGGING 1499 | BSF_FUNCTION 1500 | BSF_KEEP 1501 | BSF_KEEP_G 1502 | BSF_WEAK 1503 | BSF_SECTION_SYM 1504 | BSF_OLD_COMMON 1505 | BSF_NOT_AT_END 1506 | BSF_CONSTRUCTOR 1507 | BSF_WARNING 1508 | BSF_INDIRECT 1509 | BSF_FILE 1510 | BSF_DYNAMIC)) 1511 strcat (buffer, " unknown-bits"); 1512 1513 return buffer; 1514 } 1515 #endif 1516 1517 #include "elfcore.h" 1518 #include "elflink.h" 1519 1520 /* Size-dependent data and functions. */ 1521 const struct elf_size_info NAME(_bfd_elf,size_info) = { 1522 sizeof (Elf_External_Ehdr), 1523 sizeof (Elf_External_Phdr), 1524 sizeof (Elf_External_Shdr), 1525 sizeof (Elf_External_Rel), 1526 sizeof (Elf_External_Rela), 1527 sizeof (Elf_External_Sym), 1528 sizeof (Elf_External_Dyn), 1529 sizeof (Elf_External_Note), 1530 ARCH_SIZE / 8, 1531 1, 1532 ARCH_SIZE, FILE_ALIGN, 1533 ELFCLASS, EV_CURRENT, 1534 elf_write_out_phdrs, 1535 elf_write_shdrs_and_ehdr, 1536 write_relocs, 1537 elf_swap_symbol_out, 1538 elf_slurp_reloc_table, 1539 elf_slurp_symbol_table, 1540 elf_swap_dyn_in, 1541 elf_swap_dyn_out, 1542 NULL, 1543 NULL, 1544 NULL, 1545 NULL 1546 }; 1547