elf32-sparc.c revision 1.1
1/* SPARC-specific support for 32-bit ELF 2 Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 3 2003, 2004, 2005, 2006, 2007, 2010, 2011 4 Free Software Foundation, Inc. 5 6 This file is part of BFD, the Binary File Descriptor library. 7 8 This program 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 of the License, or 11 (at your option) any later version. 12 13 This program 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 this program; if not, write to the Free Software 20 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, 21 MA 02110-1301, USA. */ 22 23#include "sysdep.h" 24#include "bfd.h" 25#include "bfdlink.h" 26#include "libbfd.h" 27#include "elf-bfd.h" 28#include "elf/sparc.h" 29#include "opcode/sparc.h" 30#include "elfxx-sparc.h" 31#include "elf-vxworks.h" 32 33/* Support for core dump NOTE sections. */ 34 35static bfd_boolean 36elf32_sparc_grok_psinfo (bfd *abfd, Elf_Internal_Note *note) 37{ 38 switch (note->descsz) 39 { 40 default: 41 return FALSE; 42 43 case 260: /* Solaris prpsinfo_t. */ 44 elf_tdata (abfd)->core->program 45 = _bfd_elfcore_strndup (abfd, note->descdata + 84, 16); 46 elf_tdata (abfd)->core->command 47 = _bfd_elfcore_strndup (abfd, note->descdata + 100, 80); 48 break; 49 50 case 336: /* Solaris psinfo_t. */ 51 elf_tdata (abfd)->core->program 52 = _bfd_elfcore_strndup (abfd, note->descdata + 88, 16); 53 elf_tdata (abfd)->core->command 54 = _bfd_elfcore_strndup (abfd, note->descdata + 104, 80); 55 break; 56 } 57 58 return TRUE; 59} 60 61/* Functions for dealing with the e_flags field. 62 63 We don't define set_private_flags or copy_private_bfd_data because 64 the only currently defined values are based on the bfd mach number, 65 so we use the latter instead and defer setting e_flags until the 66 file is written out. */ 67 68/* Merge backend specific data from an object file to the output 69 object file when linking. */ 70 71static bfd_boolean 72elf32_sparc_merge_private_bfd_data (bfd *ibfd, bfd *obfd) 73{ 74 bfd_boolean error; 75 unsigned long ibfd_mach; 76 /* FIXME: This should not be static. */ 77 static unsigned long previous_ibfd_e_flags = (unsigned long) -1; 78 79 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour 80 || bfd_get_flavour (obfd) != bfd_target_elf_flavour) 81 return TRUE; 82 83 error = FALSE; 84 85 ibfd_mach = bfd_get_mach (ibfd); 86 if (bfd_mach_sparc_64bit_p (ibfd_mach)) 87 { 88 error = TRUE; 89 (*_bfd_error_handler) 90 (_("%B: compiled for a 64 bit system and target is 32 bit"), ibfd); 91 } 92 else if ((ibfd->flags & DYNAMIC) == 0) 93 { 94 if (bfd_get_mach (obfd) < ibfd_mach) 95 bfd_set_arch_mach (obfd, bfd_arch_sparc, ibfd_mach); 96 } 97 98 if (((elf_elfheader (ibfd)->e_flags & EF_SPARC_LEDATA) 99 != previous_ibfd_e_flags) 100 && previous_ibfd_e_flags != (unsigned long) -1) 101 { 102 (*_bfd_error_handler) 103 (_("%B: linking little endian files with big endian files"), ibfd); 104 error = TRUE; 105 } 106 previous_ibfd_e_flags = elf_elfheader (ibfd)->e_flags & EF_SPARC_LEDATA; 107 108 if (error) 109 { 110 bfd_set_error (bfd_error_bad_value); 111 return FALSE; 112 } 113 114 return _bfd_sparc_elf_merge_private_bfd_data (ibfd, obfd); 115} 116 117/* The final processing done just before writing out the object file. 118 We need to set the e_machine field appropriately. */ 119 120static void 121elf32_sparc_final_write_processing (bfd *abfd, 122 bfd_boolean linker ATTRIBUTE_UNUSED) 123{ 124 switch (bfd_get_mach (abfd)) 125 { 126 case bfd_mach_sparc : 127 case bfd_mach_sparc_sparclet : 128 case bfd_mach_sparc_sparclite : 129 break; /* nothing to do */ 130 case bfd_mach_sparc_v8plus : 131 elf_elfheader (abfd)->e_machine = EM_SPARC32PLUS; 132 elf_elfheader (abfd)->e_flags &=~ EF_SPARC_32PLUS_MASK; 133 elf_elfheader (abfd)->e_flags |= EF_SPARC_32PLUS; 134 break; 135 case bfd_mach_sparc_v8plusa : 136 elf_elfheader (abfd)->e_machine = EM_SPARC32PLUS; 137 elf_elfheader (abfd)->e_flags &=~ EF_SPARC_32PLUS_MASK; 138 elf_elfheader (abfd)->e_flags |= EF_SPARC_32PLUS | EF_SPARC_SUN_US1; 139 break; 140 case bfd_mach_sparc_v8plusb : 141 elf_elfheader (abfd)->e_machine = EM_SPARC32PLUS; 142 elf_elfheader (abfd)->e_flags &=~ EF_SPARC_32PLUS_MASK; 143 elf_elfheader (abfd)->e_flags |= EF_SPARC_32PLUS | EF_SPARC_SUN_US1 144 | EF_SPARC_SUN_US3; 145 break; 146 case bfd_mach_sparc_sparclite_le : 147 elf_elfheader (abfd)->e_flags |= EF_SPARC_LEDATA; 148 break; 149 default : 150 abort (); 151 break; 152 } 153} 154 155static enum elf_reloc_type_class 156elf32_sparc_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED, 157 const asection *rel_sec ATTRIBUTE_UNUSED, 158 const Elf_Internal_Rela *rela) 159{ 160 switch ((int) ELF32_R_TYPE (rela->r_info)) 161 { 162 case R_SPARC_RELATIVE: 163 return reloc_class_relative; 164 case R_SPARC_JMP_SLOT: 165 return reloc_class_plt; 166 case R_SPARC_COPY: 167 return reloc_class_copy; 168 default: 169 return reloc_class_normal; 170 } 171} 172 173/* Hook called by the linker routine which adds symbols from an object 174 file. */ 175 176static bfd_boolean 177elf32_sparc_add_symbol_hook (bfd * abfd, 178 struct bfd_link_info * info ATTRIBUTE_UNUSED, 179 Elf_Internal_Sym * sym, 180 const char ** namep ATTRIBUTE_UNUSED, 181 flagword * flagsp ATTRIBUTE_UNUSED, 182 asection ** secp ATTRIBUTE_UNUSED, 183 bfd_vma * valp ATTRIBUTE_UNUSED) 184{ 185 if ((abfd->flags & DYNAMIC) == 0 186 && (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC 187 || ELF_ST_BIND (sym->st_info) == STB_GNU_UNIQUE)) 188 elf_tdata (info->output_bfd)->has_gnu_symbols = TRUE; 189 return TRUE; 190} 191 192#define TARGET_BIG_SYM bfd_elf32_sparc_vec 193#define TARGET_BIG_NAME "elf32-sparc" 194#define ELF_ARCH bfd_arch_sparc 195#define ELF_TARGET_ID SPARC_ELF_DATA 196#define ELF_MACHINE_CODE EM_SPARC 197#define ELF_MACHINE_ALT1 EM_SPARC32PLUS 198#define ELF_MAXPAGESIZE 0x10000 199#define ELF_COMMONPAGESIZE 0x2000 200 201#define bfd_elf32_bfd_merge_private_bfd_data \ 202 elf32_sparc_merge_private_bfd_data 203#define elf_backend_final_write_processing \ 204 elf32_sparc_final_write_processing 205#define elf_backend_grok_psinfo elf32_sparc_grok_psinfo 206#define elf_backend_reloc_type_class elf32_sparc_reloc_type_class 207 208#define elf_info_to_howto _bfd_sparc_elf_info_to_howto 209#define bfd_elf32_bfd_reloc_type_lookup _bfd_sparc_elf_reloc_type_lookup 210#define bfd_elf32_bfd_reloc_name_lookup \ 211 _bfd_sparc_elf_reloc_name_lookup 212#define bfd_elf32_bfd_link_hash_table_create \ 213 _bfd_sparc_elf_link_hash_table_create 214#define bfd_elf32_bfd_link_hash_table_free \ 215 _bfd_sparc_elf_link_hash_table_free 216#define bfd_elf32_bfd_relax_section _bfd_sparc_elf_relax_section 217#define bfd_elf32_new_section_hook _bfd_sparc_elf_new_section_hook 218#define elf_backend_copy_indirect_symbol \ 219 _bfd_sparc_elf_copy_indirect_symbol 220#define elf_backend_create_dynamic_sections \ 221 _bfd_sparc_elf_create_dynamic_sections 222#define elf_backend_check_relocs _bfd_sparc_elf_check_relocs 223#define elf_backend_adjust_dynamic_symbol \ 224 _bfd_sparc_elf_adjust_dynamic_symbol 225#define elf_backend_omit_section_dynsym _bfd_sparc_elf_omit_section_dynsym 226#define elf_backend_size_dynamic_sections \ 227 _bfd_sparc_elf_size_dynamic_sections 228#define elf_backend_relocate_section _bfd_sparc_elf_relocate_section 229#define elf_backend_finish_dynamic_symbol \ 230 _bfd_sparc_elf_finish_dynamic_symbol 231#define elf_backend_finish_dynamic_sections \ 232 _bfd_sparc_elf_finish_dynamic_sections 233#define bfd_elf32_mkobject _bfd_sparc_elf_mkobject 234#define elf_backend_object_p _bfd_sparc_elf_object_p 235#define elf_backend_gc_mark_hook _bfd_sparc_elf_gc_mark_hook 236#define elf_backend_gc_sweep_hook _bfd_sparc_elf_gc_sweep_hook 237#define elf_backend_plt_sym_val _bfd_sparc_elf_plt_sym_val 238#define elf_backend_init_index_section _bfd_elf_init_1_index_section 239 240#define elf_backend_can_gc_sections 1 241#define elf_backend_can_refcount 1 242#define elf_backend_want_got_plt 0 243#define elf_backend_plt_readonly 0 244#define elf_backend_want_plt_sym 1 245#define elf_backend_got_header_size 4 246#define elf_backend_rela_normal 1 247 248#define elf_backend_add_symbol_hook elf32_sparc_add_symbol_hook 249 250#include "elf32-target.h" 251 252/* Solaris 2. */ 253 254#undef TARGET_BIG_SYM 255#define TARGET_BIG_SYM bfd_elf32_sparc_sol2_vec 256#undef TARGET_BIG_NAME 257#define TARGET_BIG_NAME "elf32-sparc-sol2" 258 259#undef elf32_bed 260#define elf32_bed elf32_sparc_sol2_bed 261 262/* The 32-bit static TLS arena size is rounded to the nearest 8-byte 263 boundary. */ 264#undef elf_backend_static_tls_alignment 265#define elf_backend_static_tls_alignment 8 266 267#include "elf32-target.h" 268 269/* A wrapper around _bfd_sparc_elf_link_hash_table_create that identifies 270 the target system as VxWorks. */ 271 272static struct bfd_link_hash_table * 273elf32_sparc_vxworks_link_hash_table_create (bfd *abfd) 274{ 275 struct bfd_link_hash_table *ret; 276 277 ret = _bfd_sparc_elf_link_hash_table_create (abfd); 278 if (ret) 279 { 280 struct _bfd_sparc_elf_link_hash_table *htab; 281 282 htab = (struct _bfd_sparc_elf_link_hash_table *) ret; 283 htab->is_vxworks = 1; 284 } 285 return ret; 286} 287 288/* A final_write_processing hook that does both the SPARC- and VxWorks- 289 specific handling. */ 290 291static void 292elf32_sparc_vxworks_final_write_processing (bfd *abfd, bfd_boolean linker) 293{ 294 elf32_sparc_final_write_processing (abfd, linker); 295 elf_vxworks_final_write_processing (abfd, linker); 296} 297 298#undef TARGET_BIG_SYM 299#define TARGET_BIG_SYM bfd_elf32_sparc_vxworks_vec 300#undef TARGET_BIG_NAME 301#define TARGET_BIG_NAME "elf32-sparc-vxworks" 302 303#undef ELF_MINPAGESIZE 304#define ELF_MINPAGESIZE 0x1000 305 306#undef bfd_elf32_bfd_link_hash_table_create 307#define bfd_elf32_bfd_link_hash_table_create \ 308 elf32_sparc_vxworks_link_hash_table_create 309 310#undef elf_backend_want_got_plt 311#define elf_backend_want_got_plt 1 312#undef elf_backend_plt_readonly 313#define elf_backend_plt_readonly 1 314#undef elf_backend_got_header_size 315#define elf_backend_got_header_size 12 316#undef elf_backend_add_symbol_hook 317#define elf_backend_add_symbol_hook \ 318 elf_vxworks_add_symbol_hook 319#undef elf_backend_link_output_symbol_hook 320#define elf_backend_link_output_symbol_hook \ 321 elf_vxworks_link_output_symbol_hook 322#undef elf_backend_emit_relocs 323#define elf_backend_emit_relocs \ 324 elf_vxworks_emit_relocs 325#undef elf_backend_final_write_processing 326#define elf_backend_final_write_processing \ 327 elf32_sparc_vxworks_final_write_processing 328#undef elf_backend_static_tls_alignment 329 330#undef elf32_bed 331#define elf32_bed sparc_elf_vxworks_bed 332 333#include "elf32-target.h" 334