elf32-sh.c revision 1.1
1/* Renesas / SuperH SH specific support for 32-bit ELF 2 Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 3 2006, 2007, 2008, 2009, 2010, 2011, 2012 4 Free Software Foundation, Inc. 5 Contributed by Ian Lance Taylor, Cygnus Support. 6 7 This file is part of BFD, the Binary File Descriptor library. 8 9 This program is free software; you can redistribute it and/or modify 10 it under the terms of the GNU General Public License as published by 11 the Free Software Foundation; either version 3 of the License, or 12 (at your option) any later version. 13 14 This program is distributed in the hope that it will be useful, 15 but WITHOUT ANY WARRANTY; without even the implied warranty of 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 GNU General Public License for more details. 18 19 You should have received a copy of the GNU General Public License 20 along with this program; if not, write to the Free Software 21 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, 22 MA 02110-1301, USA. */ 23 24#include "sysdep.h" 25#include "bfd.h" 26#include "bfdlink.h" 27#include "libbfd.h" 28#include "elf-bfd.h" 29#include "elf-vxworks.h" 30#include "elf/sh.h" 31#include "dwarf2.h" 32#include "libiberty.h" 33#include "../opcodes/sh-opc.h" 34 35static bfd_reloc_status_type sh_elf_reloc 36 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); 37static bfd_reloc_status_type sh_elf_ignore_reloc 38 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); 39static bfd_boolean sh_elf_relax_delete_bytes 40 (bfd *, asection *, bfd_vma, int); 41static bfd_boolean sh_elf_align_loads 42 (bfd *, asection *, Elf_Internal_Rela *, bfd_byte *, bfd_boolean *); 43#ifndef SH64_ELF 44static bfd_boolean sh_elf_swap_insns 45 (bfd *, asection *, void *, bfd_byte *, bfd_vma); 46#endif 47static int sh_elf_optimized_tls_reloc 48 (struct bfd_link_info *, int, int); 49static bfd_vma dtpoff_base 50 (struct bfd_link_info *); 51static bfd_vma tpoff 52 (struct bfd_link_info *, bfd_vma); 53 54/* The name of the dynamic interpreter. This is put in the .interp 55 section. */ 56 57#define ELF_DYNAMIC_INTERPRETER "/usr/lib/libc.so.1" 58 59/* FDPIC binaries have a default 128K stack. */ 60#define DEFAULT_STACK_SIZE 0x20000 61 62#define MINUS_ONE ((bfd_vma) 0 - 1) 63 64/* Decide whether a reference to a symbol can be resolved locally or 65 not. If the symbol is protected, we want the local address, but 66 its function descriptor must be assigned by the dynamic linker. */ 67#define SYMBOL_FUNCDESC_LOCAL(INFO, H) \ 68 (SYMBOL_REFERENCES_LOCAL (INFO, H) \ 69 || ! elf_hash_table (INFO)->dynamic_sections_created) 70 71#define SH_PARTIAL32 TRUE 72#define SH_SRC_MASK32 0xffffffff 73#define SH_ELF_RELOC sh_elf_reloc 74static reloc_howto_type sh_elf_howto_table[] = 75{ 76#include "elf32-sh-relocs.h" 77}; 78 79#define SH_PARTIAL32 FALSE 80#define SH_SRC_MASK32 0 81#define SH_ELF_RELOC bfd_elf_generic_reloc 82static reloc_howto_type sh_vxworks_howto_table[] = 83{ 84#include "elf32-sh-relocs.h" 85}; 86 87/* Return true if OUTPUT_BFD is a VxWorks object. */ 88 89static bfd_boolean 90vxworks_object_p (bfd *abfd ATTRIBUTE_UNUSED) 91{ 92#if !defined INCLUDE_SHMEDIA && !defined SH_TARGET_ALREADY_DEFINED 93 extern const bfd_target bfd_elf32_shlvxworks_vec; 94 extern const bfd_target bfd_elf32_shvxworks_vec; 95 96 return (abfd->xvec == &bfd_elf32_shlvxworks_vec 97 || abfd->xvec == &bfd_elf32_shvxworks_vec); 98#else 99 return FALSE; 100#endif 101} 102 103/* Return true if OUTPUT_BFD is an FDPIC object. */ 104 105static bfd_boolean 106fdpic_object_p (bfd *abfd ATTRIBUTE_UNUSED) 107{ 108#if !defined INCLUDE_SHMEDIA && !defined SH_TARGET_ALREADY_DEFINED 109 extern const bfd_target bfd_elf32_shfd_vec; 110 extern const bfd_target bfd_elf32_shbfd_vec; 111 112 return (abfd->xvec == &bfd_elf32_shfd_vec 113 || abfd->xvec == &bfd_elf32_shbfd_vec); 114#else 115 return FALSE; 116#endif 117} 118 119/* Return the howto table for ABFD. */ 120 121static reloc_howto_type * 122get_howto_table (bfd *abfd) 123{ 124 if (vxworks_object_p (abfd)) 125 return sh_vxworks_howto_table; 126 return sh_elf_howto_table; 127} 128 129static bfd_reloc_status_type 130sh_elf_reloc_loop (int r_type ATTRIBUTE_UNUSED, bfd *input_bfd, 131 asection *input_section, bfd_byte *contents, 132 bfd_vma addr, asection *symbol_section, 133 bfd_vma start, bfd_vma end) 134{ 135 static bfd_vma last_addr; 136 static asection *last_symbol_section; 137 bfd_byte *start_ptr, *ptr, *last_ptr; 138 int diff, cum_diff; 139 bfd_signed_vma x; 140 int insn; 141 142 /* Sanity check the address. */ 143 if (addr > bfd_get_section_limit (input_bfd, input_section)) 144 return bfd_reloc_outofrange; 145 146 /* We require the start and end relocations to be processed consecutively - 147 although we allow then to be processed forwards or backwards. */ 148 if (! last_addr) 149 { 150 last_addr = addr; 151 last_symbol_section = symbol_section; 152 return bfd_reloc_ok; 153 } 154 if (last_addr != addr) 155 abort (); 156 last_addr = 0; 157 158 if (! symbol_section || last_symbol_section != symbol_section || end < start) 159 return bfd_reloc_outofrange; 160 161 /* Get the symbol_section contents. */ 162 if (symbol_section != input_section) 163 { 164 if (elf_section_data (symbol_section)->this_hdr.contents != NULL) 165 contents = elf_section_data (symbol_section)->this_hdr.contents; 166 else 167 { 168 if (!bfd_malloc_and_get_section (input_bfd, symbol_section, 169 &contents)) 170 { 171 if (contents != NULL) 172 free (contents); 173 return bfd_reloc_outofrange; 174 } 175 } 176 } 177#define IS_PPI(PTR) ((bfd_get_16 (input_bfd, (PTR)) & 0xfc00) == 0xf800) 178 start_ptr = contents + start; 179 for (cum_diff = -6, ptr = contents + end; cum_diff < 0 && ptr > start_ptr;) 180 { 181 for (last_ptr = ptr, ptr -= 4; ptr >= start_ptr && IS_PPI (ptr);) 182 ptr -= 2; 183 ptr += 2; 184 diff = (last_ptr - ptr) >> 1; 185 cum_diff += diff & 1; 186 cum_diff += diff; 187 } 188 /* Calculate the start / end values to load into rs / re minus four - 189 so that will cancel out the four we would otherwise have to add to 190 addr to get the value to subtract in order to get relative addressing. */ 191 if (cum_diff >= 0) 192 { 193 start -= 4; 194 end = (ptr + cum_diff * 2) - contents; 195 } 196 else 197 { 198 bfd_vma start0 = start - 4; 199 200 while (start0 && IS_PPI (contents + start0)) 201 start0 -= 2; 202 start0 = start - 2 - ((start - start0) & 2); 203 start = start0 - cum_diff - 2; 204 end = start0; 205 } 206 207 if (contents != NULL 208 && elf_section_data (symbol_section)->this_hdr.contents != contents) 209 free (contents); 210 211 insn = bfd_get_16 (input_bfd, contents + addr); 212 213 x = (insn & 0x200 ? end : start) - addr; 214 if (input_section != symbol_section) 215 x += ((symbol_section->output_section->vma + symbol_section->output_offset) 216 - (input_section->output_section->vma 217 + input_section->output_offset)); 218 x >>= 1; 219 if (x < -128 || x > 127) 220 return bfd_reloc_overflow; 221 222 x = (insn & ~0xff) | (x & 0xff); 223 bfd_put_16 (input_bfd, (bfd_vma) x, contents + addr); 224 225 return bfd_reloc_ok; 226} 227 228/* This function is used for normal relocs. This used to be like the COFF 229 function, and is almost certainly incorrect for other ELF targets. */ 230 231static bfd_reloc_status_type 232sh_elf_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol_in, 233 void *data, asection *input_section, bfd *output_bfd, 234 char **error_message ATTRIBUTE_UNUSED) 235{ 236 unsigned long insn; 237 bfd_vma sym_value; 238 enum elf_sh_reloc_type r_type; 239 bfd_vma addr = reloc_entry->address; 240 bfd_byte *hit_data = addr + (bfd_byte *) data; 241 242 r_type = (enum elf_sh_reloc_type) reloc_entry->howto->type; 243 244 if (output_bfd != NULL) 245 { 246 /* Partial linking--do nothing. */ 247 reloc_entry->address += input_section->output_offset; 248 return bfd_reloc_ok; 249 } 250 251 /* Almost all relocs have to do with relaxing. If any work must be 252 done for them, it has been done in sh_relax_section. */ 253 if (r_type == R_SH_IND12W && (symbol_in->flags & BSF_LOCAL) != 0) 254 return bfd_reloc_ok; 255 256 if (symbol_in != NULL 257 && bfd_is_und_section (symbol_in->section)) 258 return bfd_reloc_undefined; 259 260 if (bfd_is_com_section (symbol_in->section)) 261 sym_value = 0; 262 else 263 sym_value = (symbol_in->value + 264 symbol_in->section->output_section->vma + 265 symbol_in->section->output_offset); 266 267 switch (r_type) 268 { 269 case R_SH_DIR32: 270 insn = bfd_get_32 (abfd, hit_data); 271 insn += sym_value + reloc_entry->addend; 272 bfd_put_32 (abfd, (bfd_vma) insn, hit_data); 273 break; 274 case R_SH_IND12W: 275 insn = bfd_get_16 (abfd, hit_data); 276 sym_value += reloc_entry->addend; 277 sym_value -= (input_section->output_section->vma 278 + input_section->output_offset 279 + addr 280 + 4); 281 sym_value += (insn & 0xfff) << 1; 282 if (insn & 0x800) 283 sym_value -= 0x1000; 284 insn = (insn & 0xf000) | (sym_value & 0xfff); 285 bfd_put_16 (abfd, (bfd_vma) insn, hit_data); 286 if (sym_value < (bfd_vma) -0x1000 || sym_value >= 0x1000) 287 return bfd_reloc_overflow; 288 break; 289 default: 290 abort (); 291 break; 292 } 293 294 return bfd_reloc_ok; 295} 296 297/* This function is used for relocs which are only used for relaxing, 298 which the linker should otherwise ignore. */ 299 300static bfd_reloc_status_type 301sh_elf_ignore_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry, 302 asymbol *symbol ATTRIBUTE_UNUSED, 303 void *data ATTRIBUTE_UNUSED, asection *input_section, 304 bfd *output_bfd, 305 char **error_message ATTRIBUTE_UNUSED) 306{ 307 if (output_bfd != NULL) 308 reloc_entry->address += input_section->output_offset; 309 return bfd_reloc_ok; 310} 311 312/* This structure is used to map BFD reloc codes to SH ELF relocs. */ 313 314struct elf_reloc_map 315{ 316 bfd_reloc_code_real_type bfd_reloc_val; 317 unsigned char elf_reloc_val; 318}; 319 320/* An array mapping BFD reloc codes to SH ELF relocs. */ 321 322static const struct elf_reloc_map sh_reloc_map[] = 323{ 324 { BFD_RELOC_NONE, R_SH_NONE }, 325 { BFD_RELOC_32, R_SH_DIR32 }, 326 { BFD_RELOC_16, R_SH_DIR16 }, 327 { BFD_RELOC_8, R_SH_DIR8 }, 328 { BFD_RELOC_CTOR, R_SH_DIR32 }, 329 { BFD_RELOC_32_PCREL, R_SH_REL32 }, 330 { BFD_RELOC_SH_PCDISP8BY2, R_SH_DIR8WPN }, 331 { BFD_RELOC_SH_PCDISP12BY2, R_SH_IND12W }, 332 { BFD_RELOC_SH_PCRELIMM8BY2, R_SH_DIR8WPZ }, 333 { BFD_RELOC_SH_PCRELIMM8BY4, R_SH_DIR8WPL }, 334 { BFD_RELOC_8_PCREL, R_SH_SWITCH8 }, 335 { BFD_RELOC_SH_SWITCH16, R_SH_SWITCH16 }, 336 { BFD_RELOC_SH_SWITCH32, R_SH_SWITCH32 }, 337 { BFD_RELOC_SH_USES, R_SH_USES }, 338 { BFD_RELOC_SH_COUNT, R_SH_COUNT }, 339 { BFD_RELOC_SH_ALIGN, R_SH_ALIGN }, 340 { BFD_RELOC_SH_CODE, R_SH_CODE }, 341 { BFD_RELOC_SH_DATA, R_SH_DATA }, 342 { BFD_RELOC_SH_LABEL, R_SH_LABEL }, 343 { BFD_RELOC_VTABLE_INHERIT, R_SH_GNU_VTINHERIT }, 344 { BFD_RELOC_VTABLE_ENTRY, R_SH_GNU_VTENTRY }, 345 { BFD_RELOC_SH_LOOP_START, R_SH_LOOP_START }, 346 { BFD_RELOC_SH_LOOP_END, R_SH_LOOP_END }, 347 { BFD_RELOC_SH_TLS_GD_32, R_SH_TLS_GD_32 }, 348 { BFD_RELOC_SH_TLS_LD_32, R_SH_TLS_LD_32 }, 349 { BFD_RELOC_SH_TLS_LDO_32, R_SH_TLS_LDO_32 }, 350 { BFD_RELOC_SH_TLS_IE_32, R_SH_TLS_IE_32 }, 351 { BFD_RELOC_SH_TLS_LE_32, R_SH_TLS_LE_32 }, 352 { BFD_RELOC_SH_TLS_DTPMOD32, R_SH_TLS_DTPMOD32 }, 353 { BFD_RELOC_SH_TLS_DTPOFF32, R_SH_TLS_DTPOFF32 }, 354 { BFD_RELOC_SH_TLS_TPOFF32, R_SH_TLS_TPOFF32 }, 355 { BFD_RELOC_32_GOT_PCREL, R_SH_GOT32 }, 356 { BFD_RELOC_32_PLT_PCREL, R_SH_PLT32 }, 357 { BFD_RELOC_SH_COPY, R_SH_COPY }, 358 { BFD_RELOC_SH_GLOB_DAT, R_SH_GLOB_DAT }, 359 { BFD_RELOC_SH_JMP_SLOT, R_SH_JMP_SLOT }, 360 { BFD_RELOC_SH_RELATIVE, R_SH_RELATIVE }, 361 { BFD_RELOC_32_GOTOFF, R_SH_GOTOFF }, 362 { BFD_RELOC_SH_GOTPC, R_SH_GOTPC }, 363 { BFD_RELOC_SH_GOTPLT32, R_SH_GOTPLT32 }, 364 { BFD_RELOC_SH_GOT20, R_SH_GOT20 }, 365 { BFD_RELOC_SH_GOTOFF20, R_SH_GOTOFF20 }, 366 { BFD_RELOC_SH_GOTFUNCDESC, R_SH_GOTFUNCDESC }, 367 { BFD_RELOC_SH_GOTFUNCDESC20, R_SH_GOTFUNCDESC20 }, 368 { BFD_RELOC_SH_GOTOFFFUNCDESC, R_SH_GOTOFFFUNCDESC }, 369 { BFD_RELOC_SH_GOTOFFFUNCDESC20, R_SH_GOTOFFFUNCDESC20 }, 370 { BFD_RELOC_SH_FUNCDESC, R_SH_FUNCDESC }, 371#ifdef INCLUDE_SHMEDIA 372 { BFD_RELOC_SH_GOT_LOW16, R_SH_GOT_LOW16 }, 373 { BFD_RELOC_SH_GOT_MEDLOW16, R_SH_GOT_MEDLOW16 }, 374 { BFD_RELOC_SH_GOT_MEDHI16, R_SH_GOT_MEDHI16 }, 375 { BFD_RELOC_SH_GOT_HI16, R_SH_GOT_HI16 }, 376 { BFD_RELOC_SH_GOTPLT_LOW16, R_SH_GOTPLT_LOW16 }, 377 { BFD_RELOC_SH_GOTPLT_MEDLOW16, R_SH_GOTPLT_MEDLOW16 }, 378 { BFD_RELOC_SH_GOTPLT_MEDHI16, R_SH_GOTPLT_MEDHI16 }, 379 { BFD_RELOC_SH_GOTPLT_HI16, R_SH_GOTPLT_HI16 }, 380 { BFD_RELOC_SH_PLT_LOW16, R_SH_PLT_LOW16 }, 381 { BFD_RELOC_SH_PLT_MEDLOW16, R_SH_PLT_MEDLOW16 }, 382 { BFD_RELOC_SH_PLT_MEDHI16, R_SH_PLT_MEDHI16 }, 383 { BFD_RELOC_SH_PLT_HI16, R_SH_PLT_HI16 }, 384 { BFD_RELOC_SH_GOTOFF_LOW16, R_SH_GOTOFF_LOW16 }, 385 { BFD_RELOC_SH_GOTOFF_MEDLOW16, R_SH_GOTOFF_MEDLOW16 }, 386 { BFD_RELOC_SH_GOTOFF_MEDHI16, R_SH_GOTOFF_MEDHI16 }, 387 { BFD_RELOC_SH_GOTOFF_HI16, R_SH_GOTOFF_HI16 }, 388 { BFD_RELOC_SH_GOTPC_LOW16, R_SH_GOTPC_LOW16 }, 389 { BFD_RELOC_SH_GOTPC_MEDLOW16, R_SH_GOTPC_MEDLOW16 }, 390 { BFD_RELOC_SH_GOTPC_MEDHI16, R_SH_GOTPC_MEDHI16 }, 391 { BFD_RELOC_SH_GOTPC_HI16, R_SH_GOTPC_HI16 }, 392 { BFD_RELOC_SH_COPY64, R_SH_COPY64 }, 393 { BFD_RELOC_SH_GLOB_DAT64, R_SH_GLOB_DAT64 }, 394 { BFD_RELOC_SH_JMP_SLOT64, R_SH_JMP_SLOT64 }, 395 { BFD_RELOC_SH_RELATIVE64, R_SH_RELATIVE64 }, 396 { BFD_RELOC_SH_GOT10BY4, R_SH_GOT10BY4 }, 397 { BFD_RELOC_SH_GOT10BY8, R_SH_GOT10BY8 }, 398 { BFD_RELOC_SH_GOTPLT10BY4, R_SH_GOTPLT10BY4 }, 399 { BFD_RELOC_SH_GOTPLT10BY8, R_SH_GOTPLT10BY8 }, 400 { BFD_RELOC_SH_PT_16, R_SH_PT_16 }, 401 { BFD_RELOC_SH_SHMEDIA_CODE, R_SH_SHMEDIA_CODE }, 402 { BFD_RELOC_SH_IMMU5, R_SH_DIR5U }, 403 { BFD_RELOC_SH_IMMS6, R_SH_DIR6S }, 404 { BFD_RELOC_SH_IMMU6, R_SH_DIR6U }, 405 { BFD_RELOC_SH_IMMS10, R_SH_DIR10S }, 406 { BFD_RELOC_SH_IMMS10BY2, R_SH_DIR10SW }, 407 { BFD_RELOC_SH_IMMS10BY4, R_SH_DIR10SL }, 408 { BFD_RELOC_SH_IMMS10BY8, R_SH_DIR10SQ }, 409 { BFD_RELOC_SH_IMMS16, R_SH_IMMS16 }, 410 { BFD_RELOC_SH_IMMU16, R_SH_IMMU16 }, 411 { BFD_RELOC_SH_IMM_LOW16, R_SH_IMM_LOW16 }, 412 { BFD_RELOC_SH_IMM_LOW16_PCREL, R_SH_IMM_LOW16_PCREL }, 413 { BFD_RELOC_SH_IMM_MEDLOW16, R_SH_IMM_MEDLOW16 }, 414 { BFD_RELOC_SH_IMM_MEDLOW16_PCREL, R_SH_IMM_MEDLOW16_PCREL }, 415 { BFD_RELOC_SH_IMM_MEDHI16, R_SH_IMM_MEDHI16 }, 416 { BFD_RELOC_SH_IMM_MEDHI16_PCREL, R_SH_IMM_MEDHI16_PCREL }, 417 { BFD_RELOC_SH_IMM_HI16, R_SH_IMM_HI16 }, 418 { BFD_RELOC_SH_IMM_HI16_PCREL, R_SH_IMM_HI16_PCREL }, 419 { BFD_RELOC_64, R_SH_64 }, 420 { BFD_RELOC_64_PCREL, R_SH_64_PCREL }, 421#endif /* not INCLUDE_SHMEDIA */ 422}; 423 424/* Given a BFD reloc code, return the howto structure for the 425 corresponding SH ELF reloc. */ 426 427static reloc_howto_type * 428sh_elf_reloc_type_lookup (bfd *abfd, bfd_reloc_code_real_type code) 429{ 430 unsigned int i; 431 432 for (i = 0; i < sizeof (sh_reloc_map) / sizeof (struct elf_reloc_map); i++) 433 { 434 if (sh_reloc_map[i].bfd_reloc_val == code) 435 return get_howto_table (abfd) + (int) sh_reloc_map[i].elf_reloc_val; 436 } 437 438 return NULL; 439} 440 441static reloc_howto_type * 442sh_elf_reloc_name_lookup (bfd *abfd, const char *r_name) 443{ 444 unsigned int i; 445 446 if (vxworks_object_p (abfd)) 447 { 448 for (i = 0; 449 i < (sizeof (sh_vxworks_howto_table) 450 / sizeof (sh_vxworks_howto_table[0])); 451 i++) 452 if (sh_vxworks_howto_table[i].name != NULL 453 && strcasecmp (sh_vxworks_howto_table[i].name, r_name) == 0) 454 return &sh_vxworks_howto_table[i]; 455 } 456 else 457 { 458 for (i = 0; 459 i < (sizeof (sh_elf_howto_table) 460 / sizeof (sh_elf_howto_table[0])); 461 i++) 462 if (sh_elf_howto_table[i].name != NULL 463 && strcasecmp (sh_elf_howto_table[i].name, r_name) == 0) 464 return &sh_elf_howto_table[i]; 465 } 466 467 return NULL; 468} 469 470/* Given an ELF reloc, fill in the howto field of a relent. */ 471 472static void 473sh_elf_info_to_howto (bfd *abfd, arelent *cache_ptr, Elf_Internal_Rela *dst) 474{ 475 unsigned int r; 476 477 r = ELF32_R_TYPE (dst->r_info); 478 479 BFD_ASSERT (r < (unsigned int) R_SH_max); 480 BFD_ASSERT (r < R_SH_FIRST_INVALID_RELOC || r > R_SH_LAST_INVALID_RELOC); 481 BFD_ASSERT (r < R_SH_FIRST_INVALID_RELOC_2 || r > R_SH_LAST_INVALID_RELOC_2); 482 BFD_ASSERT (r < R_SH_FIRST_INVALID_RELOC_3 || r > R_SH_LAST_INVALID_RELOC_3); 483 BFD_ASSERT (r < R_SH_FIRST_INVALID_RELOC_4 || r > R_SH_LAST_INVALID_RELOC_4); 484 BFD_ASSERT (r < R_SH_FIRST_INVALID_RELOC_5 || r > R_SH_LAST_INVALID_RELOC_5); 485 BFD_ASSERT (r < R_SH_FIRST_INVALID_RELOC_6 || r > R_SH_LAST_INVALID_RELOC_6); 486 487 cache_ptr->howto = get_howto_table (abfd) + r; 488} 489 490/* This function handles relaxing for SH ELF. See the corresponding 491 function in coff-sh.c for a description of what this does. FIXME: 492 There is a lot of duplication here between this code and the COFF 493 specific code. The format of relocs and symbols is wound deeply 494 into this code, but it would still be better if the duplication 495 could be eliminated somehow. Note in particular that although both 496 functions use symbols like R_SH_CODE, those symbols have different 497 values; in coff-sh.c they come from include/coff/sh.h, whereas here 498 they come from enum elf_sh_reloc_type in include/elf/sh.h. */ 499 500static bfd_boolean 501sh_elf_relax_section (bfd *abfd, asection *sec, 502 struct bfd_link_info *link_info, bfd_boolean *again) 503{ 504 Elf_Internal_Shdr *symtab_hdr; 505 Elf_Internal_Rela *internal_relocs; 506 bfd_boolean have_code; 507 Elf_Internal_Rela *irel, *irelend; 508 bfd_byte *contents = NULL; 509 Elf_Internal_Sym *isymbuf = NULL; 510 511 *again = FALSE; 512 513 if (link_info->relocatable 514 || (sec->flags & SEC_RELOC) == 0 515 || sec->reloc_count == 0) 516 return TRUE; 517 518#ifdef INCLUDE_SHMEDIA 519 if (elf_section_data (sec)->this_hdr.sh_flags 520 & (SHF_SH5_ISA32 | SHF_SH5_ISA32_MIXED)) 521 { 522 return TRUE; 523 } 524#endif 525 526 symtab_hdr = &elf_symtab_hdr (abfd); 527 528 internal_relocs = (_bfd_elf_link_read_relocs 529 (abfd, sec, NULL, (Elf_Internal_Rela *) NULL, 530 link_info->keep_memory)); 531 if (internal_relocs == NULL) 532 goto error_return; 533 534 have_code = FALSE; 535 536 irelend = internal_relocs + sec->reloc_count; 537 for (irel = internal_relocs; irel < irelend; irel++) 538 { 539 bfd_vma laddr, paddr, symval; 540 unsigned short insn; 541 Elf_Internal_Rela *irelfn, *irelscan, *irelcount; 542 bfd_signed_vma foff; 543 544 if (ELF32_R_TYPE (irel->r_info) == (int) R_SH_CODE) 545 have_code = TRUE; 546 547 if (ELF32_R_TYPE (irel->r_info) != (int) R_SH_USES) 548 continue; 549 550 /* Get the section contents. */ 551 if (contents == NULL) 552 { 553 if (elf_section_data (sec)->this_hdr.contents != NULL) 554 contents = elf_section_data (sec)->this_hdr.contents; 555 else 556 { 557 if (!bfd_malloc_and_get_section (abfd, sec, &contents)) 558 goto error_return; 559 } 560 } 561 562 /* The r_addend field of the R_SH_USES reloc will point us to 563 the register load. The 4 is because the r_addend field is 564 computed as though it were a jump offset, which are based 565 from 4 bytes after the jump instruction. */ 566 laddr = irel->r_offset + 4 + irel->r_addend; 567 if (laddr >= sec->size) 568 { 569 (*_bfd_error_handler) (_("%B: 0x%lx: warning: bad R_SH_USES offset"), 570 abfd, 571 (unsigned long) irel->r_offset); 572 continue; 573 } 574 insn = bfd_get_16 (abfd, contents + laddr); 575 576 /* If the instruction is not mov.l NN,rN, we don't know what to 577 do. */ 578 if ((insn & 0xf000) != 0xd000) 579 { 580 ((*_bfd_error_handler) 581 (_("%B: 0x%lx: warning: R_SH_USES points to unrecognized insn 0x%x"), 582 abfd, (unsigned long) irel->r_offset, insn)); 583 continue; 584 } 585 586 /* Get the address from which the register is being loaded. The 587 displacement in the mov.l instruction is quadrupled. It is a 588 displacement from four bytes after the movl instruction, but, 589 before adding in the PC address, two least significant bits 590 of the PC are cleared. We assume that the section is aligned 591 on a four byte boundary. */ 592 paddr = insn & 0xff; 593 paddr *= 4; 594 paddr += (laddr + 4) &~ (bfd_vma) 3; 595 if (paddr >= sec->size) 596 { 597 ((*_bfd_error_handler) 598 (_("%B: 0x%lx: warning: bad R_SH_USES load offset"), 599 abfd, (unsigned long) irel->r_offset)); 600 continue; 601 } 602 603 /* Get the reloc for the address from which the register is 604 being loaded. This reloc will tell us which function is 605 actually being called. */ 606 for (irelfn = internal_relocs; irelfn < irelend; irelfn++) 607 if (irelfn->r_offset == paddr 608 && ELF32_R_TYPE (irelfn->r_info) == (int) R_SH_DIR32) 609 break; 610 if (irelfn >= irelend) 611 { 612 ((*_bfd_error_handler) 613 (_("%B: 0x%lx: warning: could not find expected reloc"), 614 abfd, (unsigned long) paddr)); 615 continue; 616 } 617 618 /* Read this BFD's symbols if we haven't done so already. */ 619 if (isymbuf == NULL && symtab_hdr->sh_info != 0) 620 { 621 isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents; 622 if (isymbuf == NULL) 623 isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr, 624 symtab_hdr->sh_info, 0, 625 NULL, NULL, NULL); 626 if (isymbuf == NULL) 627 goto error_return; 628 } 629 630 /* Get the value of the symbol referred to by the reloc. */ 631 if (ELF32_R_SYM (irelfn->r_info) < symtab_hdr->sh_info) 632 { 633 /* A local symbol. */ 634 Elf_Internal_Sym *isym; 635 636 isym = isymbuf + ELF32_R_SYM (irelfn->r_info); 637 if (isym->st_shndx 638 != (unsigned int) _bfd_elf_section_from_bfd_section (abfd, sec)) 639 { 640 ((*_bfd_error_handler) 641 (_("%B: 0x%lx: warning: symbol in unexpected section"), 642 abfd, (unsigned long) paddr)); 643 continue; 644 } 645 646 symval = (isym->st_value 647 + sec->output_section->vma 648 + sec->output_offset); 649 } 650 else 651 { 652 unsigned long indx; 653 struct elf_link_hash_entry *h; 654 655 indx = ELF32_R_SYM (irelfn->r_info) - symtab_hdr->sh_info; 656 h = elf_sym_hashes (abfd)[indx]; 657 BFD_ASSERT (h != NULL); 658 if (h->root.type != bfd_link_hash_defined 659 && h->root.type != bfd_link_hash_defweak) 660 { 661 /* This appears to be a reference to an undefined 662 symbol. Just ignore it--it will be caught by the 663 regular reloc processing. */ 664 continue; 665 } 666 667 symval = (h->root.u.def.value 668 + h->root.u.def.section->output_section->vma 669 + h->root.u.def.section->output_offset); 670 } 671 672 if (get_howto_table (abfd)[R_SH_DIR32].partial_inplace) 673 symval += bfd_get_32 (abfd, contents + paddr); 674 else 675 symval += irelfn->r_addend; 676 677 /* See if this function call can be shortened. */ 678 foff = (symval 679 - (irel->r_offset 680 + sec->output_section->vma 681 + sec->output_offset 682 + 4)); 683 /* A branch to an address beyond ours might be increased by an 684 .align that doesn't move when bytes behind us are deleted. 685 So, we add some slop in this calculation to allow for 686 that. */ 687 if (foff < -0x1000 || foff >= 0x1000 - 8) 688 { 689 /* After all that work, we can't shorten this function call. */ 690 continue; 691 } 692 693 /* Shorten the function call. */ 694 695 /* For simplicity of coding, we are going to modify the section 696 contents, the section relocs, and the BFD symbol table. We 697 must tell the rest of the code not to free up this 698 information. It would be possible to instead create a table 699 of changes which have to be made, as is done in coff-mips.c; 700 that would be more work, but would require less memory when 701 the linker is run. */ 702 703 elf_section_data (sec)->relocs = internal_relocs; 704 elf_section_data (sec)->this_hdr.contents = contents; 705 symtab_hdr->contents = (unsigned char *) isymbuf; 706 707 /* Replace the jsr with a bsr. */ 708 709 /* Change the R_SH_USES reloc into an R_SH_IND12W reloc, and 710 replace the jsr with a bsr. */ 711 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irelfn->r_info), R_SH_IND12W); 712 /* We used to test (ELF32_R_SYM (irelfn->r_info) < symtab_hdr->sh_info) 713 here, but that only checks if the symbol is an external symbol, 714 not if the symbol is in a different section. Besides, we need 715 a consistent meaning for the relocation, so we just assume here that 716 the value of the symbol is not available. */ 717 718 /* We can't fully resolve this yet, because the external 719 symbol value may be changed by future relaxing. We let 720 the final link phase handle it. */ 721 bfd_put_16 (abfd, (bfd_vma) 0xb000, contents + irel->r_offset); 722 723 irel->r_addend = -4; 724 725 /* When we calculated the symbol "value" we had an offset in the 726 DIR32's word in memory (we read and add it above). However, 727 the jsr we create does NOT have this offset encoded, so we 728 have to add it to the addend to preserve it. */ 729 irel->r_addend += bfd_get_32 (abfd, contents + paddr); 730 731 /* See if there is another R_SH_USES reloc referring to the same 732 register load. */ 733 for (irelscan = internal_relocs; irelscan < irelend; irelscan++) 734 if (ELF32_R_TYPE (irelscan->r_info) == (int) R_SH_USES 735 && laddr == irelscan->r_offset + 4 + irelscan->r_addend) 736 break; 737 if (irelscan < irelend) 738 { 739 /* Some other function call depends upon this register load, 740 and we have not yet converted that function call. 741 Indeed, we may never be able to convert it. There is 742 nothing else we can do at this point. */ 743 continue; 744 } 745 746 /* Look for a R_SH_COUNT reloc on the location where the 747 function address is stored. Do this before deleting any 748 bytes, to avoid confusion about the address. */ 749 for (irelcount = internal_relocs; irelcount < irelend; irelcount++) 750 if (irelcount->r_offset == paddr 751 && ELF32_R_TYPE (irelcount->r_info) == (int) R_SH_COUNT) 752 break; 753 754 /* Delete the register load. */ 755 if (! sh_elf_relax_delete_bytes (abfd, sec, laddr, 2)) 756 goto error_return; 757 758 /* That will change things, so, just in case it permits some 759 other function call to come within range, we should relax 760 again. Note that this is not required, and it may be slow. */ 761 *again = TRUE; 762 763 /* Now check whether we got a COUNT reloc. */ 764 if (irelcount >= irelend) 765 { 766 ((*_bfd_error_handler) 767 (_("%B: 0x%lx: warning: could not find expected COUNT reloc"), 768 abfd, (unsigned long) paddr)); 769 continue; 770 } 771 772 /* The number of uses is stored in the r_addend field. We've 773 just deleted one. */ 774 if (irelcount->r_addend == 0) 775 { 776 ((*_bfd_error_handler) (_("%B: 0x%lx: warning: bad count"), 777 abfd, 778 (unsigned long) paddr)); 779 continue; 780 } 781 782 --irelcount->r_addend; 783 784 /* If there are no more uses, we can delete the address. Reload 785 the address from irelfn, in case it was changed by the 786 previous call to sh_elf_relax_delete_bytes. */ 787 if (irelcount->r_addend == 0) 788 { 789 if (! sh_elf_relax_delete_bytes (abfd, sec, irelfn->r_offset, 4)) 790 goto error_return; 791 } 792 793 /* We've done all we can with that function call. */ 794 } 795 796 /* Look for load and store instructions that we can align on four 797 byte boundaries. */ 798 if ((elf_elfheader (abfd)->e_flags & EF_SH_MACH_MASK) != EF_SH4 799 && have_code) 800 { 801 bfd_boolean swapped; 802 803 /* Get the section contents. */ 804 if (contents == NULL) 805 { 806 if (elf_section_data (sec)->this_hdr.contents != NULL) 807 contents = elf_section_data (sec)->this_hdr.contents; 808 else 809 { 810 if (!bfd_malloc_and_get_section (abfd, sec, &contents)) 811 goto error_return; 812 } 813 } 814 815 if (! sh_elf_align_loads (abfd, sec, internal_relocs, contents, 816 &swapped)) 817 goto error_return; 818 819 if (swapped) 820 { 821 elf_section_data (sec)->relocs = internal_relocs; 822 elf_section_data (sec)->this_hdr.contents = contents; 823 symtab_hdr->contents = (unsigned char *) isymbuf; 824 } 825 } 826 827 if (isymbuf != NULL 828 && symtab_hdr->contents != (unsigned char *) isymbuf) 829 { 830 if (! link_info->keep_memory) 831 free (isymbuf); 832 else 833 { 834 /* Cache the symbols for elf_link_input_bfd. */ 835 symtab_hdr->contents = (unsigned char *) isymbuf; 836 } 837 } 838 839 if (contents != NULL 840 && elf_section_data (sec)->this_hdr.contents != contents) 841 { 842 if (! link_info->keep_memory) 843 free (contents); 844 else 845 { 846 /* Cache the section contents for elf_link_input_bfd. */ 847 elf_section_data (sec)->this_hdr.contents = contents; 848 } 849 } 850 851 if (internal_relocs != NULL 852 && elf_section_data (sec)->relocs != internal_relocs) 853 free (internal_relocs); 854 855 return TRUE; 856 857 error_return: 858 if (isymbuf != NULL 859 && symtab_hdr->contents != (unsigned char *) isymbuf) 860 free (isymbuf); 861 if (contents != NULL 862 && elf_section_data (sec)->this_hdr.contents != contents) 863 free (contents); 864 if (internal_relocs != NULL 865 && elf_section_data (sec)->relocs != internal_relocs) 866 free (internal_relocs); 867 868 return FALSE; 869} 870 871/* Delete some bytes from a section while relaxing. FIXME: There is a 872 lot of duplication between this function and sh_relax_delete_bytes 873 in coff-sh.c. */ 874 875static bfd_boolean 876sh_elf_relax_delete_bytes (bfd *abfd, asection *sec, bfd_vma addr, 877 int count) 878{ 879 Elf_Internal_Shdr *symtab_hdr; 880 unsigned int sec_shndx; 881 bfd_byte *contents; 882 Elf_Internal_Rela *irel, *irelend; 883 Elf_Internal_Rela *irelalign; 884 bfd_vma toaddr; 885 Elf_Internal_Sym *isymbuf, *isym, *isymend; 886 struct elf_link_hash_entry **sym_hashes; 887 struct elf_link_hash_entry **end_hashes; 888 unsigned int symcount; 889 asection *o; 890 891 symtab_hdr = &elf_symtab_hdr (abfd); 892 isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents; 893 894 sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec); 895 896 contents = elf_section_data (sec)->this_hdr.contents; 897 898 /* The deletion must stop at the next ALIGN reloc for an aligment 899 power larger than the number of bytes we are deleting. */ 900 901 irelalign = NULL; 902 toaddr = sec->size; 903 904 irel = elf_section_data (sec)->relocs; 905 irelend = irel + sec->reloc_count; 906 for (; irel < irelend; irel++) 907 { 908 if (ELF32_R_TYPE (irel->r_info) == (int) R_SH_ALIGN 909 && irel->r_offset > addr 910 && count < (1 << irel->r_addend)) 911 { 912 irelalign = irel; 913 toaddr = irel->r_offset; 914 break; 915 } 916 } 917 918 /* Actually delete the bytes. */ 919 memmove (contents + addr, contents + addr + count, 920 (size_t) (toaddr - addr - count)); 921 if (irelalign == NULL) 922 sec->size -= count; 923 else 924 { 925 int i; 926 927#define NOP_OPCODE (0x0009) 928 929 BFD_ASSERT ((count & 1) == 0); 930 for (i = 0; i < count; i += 2) 931 bfd_put_16 (abfd, (bfd_vma) NOP_OPCODE, contents + toaddr - count + i); 932 } 933 934 /* Adjust all the relocs. */ 935 for (irel = elf_section_data (sec)->relocs; irel < irelend; irel++) 936 { 937 bfd_vma nraddr, stop; 938 bfd_vma start = 0; 939 int insn = 0; 940 int off, adjust, oinsn; 941 bfd_signed_vma voff = 0; 942 bfd_boolean overflow; 943 944 /* Get the new reloc address. */ 945 nraddr = irel->r_offset; 946 if ((irel->r_offset > addr 947 && irel->r_offset < toaddr) 948 || (ELF32_R_TYPE (irel->r_info) == (int) R_SH_ALIGN 949 && irel->r_offset == toaddr)) 950 nraddr -= count; 951 952 /* See if this reloc was for the bytes we have deleted, in which 953 case we no longer care about it. Don't delete relocs which 954 represent addresses, though. */ 955 if (irel->r_offset >= addr 956 && irel->r_offset < addr + count 957 && ELF32_R_TYPE (irel->r_info) != (int) R_SH_ALIGN 958 && ELF32_R_TYPE (irel->r_info) != (int) R_SH_CODE 959 && ELF32_R_TYPE (irel->r_info) != (int) R_SH_DATA 960 && ELF32_R_TYPE (irel->r_info) != (int) R_SH_LABEL) 961 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), 962 (int) R_SH_NONE); 963 964 /* If this is a PC relative reloc, see if the range it covers 965 includes the bytes we have deleted. */ 966 switch ((enum elf_sh_reloc_type) ELF32_R_TYPE (irel->r_info)) 967 { 968 default: 969 break; 970 971 case R_SH_DIR8WPN: 972 case R_SH_IND12W: 973 case R_SH_DIR8WPZ: 974 case R_SH_DIR8WPL: 975 start = irel->r_offset; 976 insn = bfd_get_16 (abfd, contents + nraddr); 977 break; 978 } 979 980 switch ((enum elf_sh_reloc_type) ELF32_R_TYPE (irel->r_info)) 981 { 982 default: 983 start = stop = addr; 984 break; 985 986 case R_SH_DIR32: 987 /* If this reloc is against a symbol defined in this 988 section, and the symbol will not be adjusted below, we 989 must check the addend to see it will put the value in 990 range to be adjusted, and hence must be changed. */ 991 if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info) 992 { 993 isym = isymbuf + ELF32_R_SYM (irel->r_info); 994 if (isym->st_shndx == sec_shndx 995 && (isym->st_value <= addr 996 || isym->st_value >= toaddr)) 997 { 998 bfd_vma val; 999 1000 if (get_howto_table (abfd)[R_SH_DIR32].partial_inplace) 1001 { 1002 val = bfd_get_32 (abfd, contents + nraddr); 1003 val += isym->st_value; 1004 if (val > addr && val < toaddr) 1005 bfd_put_32 (abfd, val - count, contents + nraddr); 1006 } 1007 else 1008 { 1009 val = isym->st_value + irel->r_addend; 1010 if (val > addr && val < toaddr) 1011 irel->r_addend -= count; 1012 } 1013 } 1014 } 1015 start = stop = addr; 1016 break; 1017 1018 case R_SH_DIR8WPN: 1019 off = insn & 0xff; 1020 if (off & 0x80) 1021 off -= 0x100; 1022 stop = (bfd_vma) ((bfd_signed_vma) start + 4 + off * 2); 1023 break; 1024 1025 case R_SH_IND12W: 1026 off = insn & 0xfff; 1027 if (! off) 1028 { 1029 /* This has been made by previous relaxation. Since the 1030 relocation will be against an external symbol, the 1031 final relocation will just do the right thing. */ 1032 start = stop = addr; 1033 } 1034 else 1035 { 1036 if (off & 0x800) 1037 off -= 0x1000; 1038 stop = (bfd_vma) ((bfd_signed_vma) start + 4 + off * 2); 1039 1040 /* The addend will be against the section symbol, thus 1041 for adjusting the addend, the relevant start is the 1042 start of the section. 1043 N.B. If we want to abandon in-place changes here and 1044 test directly using symbol + addend, we have to take into 1045 account that the addend has already been adjusted by -4. */ 1046 if (stop > addr && stop < toaddr) 1047 irel->r_addend -= count; 1048 } 1049 break; 1050 1051 case R_SH_DIR8WPZ: 1052 off = insn & 0xff; 1053 stop = start + 4 + off * 2; 1054 break; 1055 1056 case R_SH_DIR8WPL: 1057 off = insn & 0xff; 1058 stop = (start & ~(bfd_vma) 3) + 4 + off * 4; 1059 break; 1060 1061 case R_SH_SWITCH8: 1062 case R_SH_SWITCH16: 1063 case R_SH_SWITCH32: 1064 /* These relocs types represent 1065 .word L2-L1 1066 The r_addend field holds the difference between the reloc 1067 address and L1. That is the start of the reloc, and 1068 adding in the contents gives us the top. We must adjust 1069 both the r_offset field and the section contents. 1070 N.B. in gas / coff bfd, the elf bfd r_addend is called r_offset, 1071 and the elf bfd r_offset is called r_vaddr. */ 1072 1073 stop = irel->r_offset; 1074 start = (bfd_vma) ((bfd_signed_vma) stop - (long) irel->r_addend); 1075 1076 if (start > addr 1077 && start < toaddr 1078 && (stop <= addr || stop >= toaddr)) 1079 irel->r_addend += count; 1080 else if (stop > addr 1081 && stop < toaddr 1082 && (start <= addr || start >= toaddr)) 1083 irel->r_addend -= count; 1084 1085 if (ELF32_R_TYPE (irel->r_info) == (int) R_SH_SWITCH16) 1086 voff = bfd_get_signed_16 (abfd, contents + nraddr); 1087 else if (ELF32_R_TYPE (irel->r_info) == (int) R_SH_SWITCH8) 1088 voff = bfd_get_8 (abfd, contents + nraddr); 1089 else 1090 voff = bfd_get_signed_32 (abfd, contents + nraddr); 1091 stop = (bfd_vma) ((bfd_signed_vma) start + voff); 1092 1093 break; 1094 1095 case R_SH_USES: 1096 start = irel->r_offset; 1097 stop = (bfd_vma) ((bfd_signed_vma) start 1098 + (long) irel->r_addend 1099 + 4); 1100 break; 1101 } 1102 1103 if (start > addr 1104 && start < toaddr 1105 && (stop <= addr || stop >= toaddr)) 1106 adjust = count; 1107 else if (stop > addr 1108 && stop < toaddr 1109 && (start <= addr || start >= toaddr)) 1110 adjust = - count; 1111 else 1112 adjust = 0; 1113 1114 if (adjust != 0) 1115 { 1116 oinsn = insn; 1117 overflow = FALSE; 1118 switch ((enum elf_sh_reloc_type) ELF32_R_TYPE (irel->r_info)) 1119 { 1120 default: 1121 abort (); 1122 break; 1123 1124 case R_SH_DIR8WPN: 1125 case R_SH_DIR8WPZ: 1126 insn += adjust / 2; 1127 if ((oinsn & 0xff00) != (insn & 0xff00)) 1128 overflow = TRUE; 1129 bfd_put_16 (abfd, (bfd_vma) insn, contents + nraddr); 1130 break; 1131 1132 case R_SH_IND12W: 1133 insn += adjust / 2; 1134 if ((oinsn & 0xf000) != (insn & 0xf000)) 1135 overflow = TRUE; 1136 bfd_put_16 (abfd, (bfd_vma) insn, contents + nraddr); 1137 break; 1138 1139 case R_SH_DIR8WPL: 1140 BFD_ASSERT (adjust == count || count >= 4); 1141 if (count >= 4) 1142 insn += adjust / 4; 1143 else 1144 { 1145 if ((irel->r_offset & 3) == 0) 1146 ++insn; 1147 } 1148 if ((oinsn & 0xff00) != (insn & 0xff00)) 1149 overflow = TRUE; 1150 bfd_put_16 (abfd, (bfd_vma) insn, contents + nraddr); 1151 break; 1152 1153 case R_SH_SWITCH8: 1154 voff += adjust; 1155 if (voff < 0 || voff >= 0xff) 1156 overflow = TRUE; 1157 bfd_put_8 (abfd, voff, contents + nraddr); 1158 break; 1159 1160 case R_SH_SWITCH16: 1161 voff += adjust; 1162 if (voff < - 0x8000 || voff >= 0x8000) 1163 overflow = TRUE; 1164 bfd_put_signed_16 (abfd, (bfd_vma) voff, contents + nraddr); 1165 break; 1166 1167 case R_SH_SWITCH32: 1168 voff += adjust; 1169 bfd_put_signed_32 (abfd, (bfd_vma) voff, contents + nraddr); 1170 break; 1171 1172 case R_SH_USES: 1173 irel->r_addend += adjust; 1174 break; 1175 } 1176 1177 if (overflow) 1178 { 1179 ((*_bfd_error_handler) 1180 (_("%B: 0x%lx: fatal: reloc overflow while relaxing"), 1181 abfd, (unsigned long) irel->r_offset)); 1182 bfd_set_error (bfd_error_bad_value); 1183 return FALSE; 1184 } 1185 } 1186 1187 irel->r_offset = nraddr; 1188 } 1189 1190 /* Look through all the other sections. If there contain any IMM32 1191 relocs against internal symbols which we are not going to adjust 1192 below, we may need to adjust the addends. */ 1193 for (o = abfd->sections; o != NULL; o = o->next) 1194 { 1195 Elf_Internal_Rela *internal_relocs; 1196 Elf_Internal_Rela *irelscan, *irelscanend; 1197 bfd_byte *ocontents; 1198 1199 if (o == sec 1200 || (o->flags & SEC_RELOC) == 0 1201 || o->reloc_count == 0) 1202 continue; 1203 1204 /* We always cache the relocs. Perhaps, if info->keep_memory is 1205 FALSE, we should free them, if we are permitted to, when we 1206 leave sh_coff_relax_section. */ 1207 internal_relocs = (_bfd_elf_link_read_relocs 1208 (abfd, o, NULL, (Elf_Internal_Rela *) NULL, TRUE)); 1209 if (internal_relocs == NULL) 1210 return FALSE; 1211 1212 ocontents = NULL; 1213 irelscanend = internal_relocs + o->reloc_count; 1214 for (irelscan = internal_relocs; irelscan < irelscanend; irelscan++) 1215 { 1216 /* Dwarf line numbers use R_SH_SWITCH32 relocs. */ 1217 if (ELF32_R_TYPE (irelscan->r_info) == (int) R_SH_SWITCH32) 1218 { 1219 bfd_vma start, stop; 1220 bfd_signed_vma voff; 1221 1222 if (ocontents == NULL) 1223 { 1224 if (elf_section_data (o)->this_hdr.contents != NULL) 1225 ocontents = elf_section_data (o)->this_hdr.contents; 1226 else 1227 { 1228 /* We always cache the section contents. 1229 Perhaps, if info->keep_memory is FALSE, we 1230 should free them, if we are permitted to, 1231 when we leave sh_coff_relax_section. */ 1232 if (!bfd_malloc_and_get_section (abfd, o, &ocontents)) 1233 { 1234 if (ocontents != NULL) 1235 free (ocontents); 1236 return FALSE; 1237 } 1238 1239 elf_section_data (o)->this_hdr.contents = ocontents; 1240 } 1241 } 1242 1243 stop = irelscan->r_offset; 1244 start 1245 = (bfd_vma) ((bfd_signed_vma) stop - (long) irelscan->r_addend); 1246 1247 /* STOP is in a different section, so it won't change. */ 1248 if (start > addr && start < toaddr) 1249 irelscan->r_addend += count; 1250 1251 voff = bfd_get_signed_32 (abfd, ocontents + irelscan->r_offset); 1252 stop = (bfd_vma) ((bfd_signed_vma) start + voff); 1253 1254 if (start > addr 1255 && start < toaddr 1256 && (stop <= addr || stop >= toaddr)) 1257 bfd_put_signed_32 (abfd, (bfd_vma) voff + count, 1258 ocontents + irelscan->r_offset); 1259 else if (stop > addr 1260 && stop < toaddr 1261 && (start <= addr || start >= toaddr)) 1262 bfd_put_signed_32 (abfd, (bfd_vma) voff - count, 1263 ocontents + irelscan->r_offset); 1264 } 1265 1266 if (ELF32_R_TYPE (irelscan->r_info) != (int) R_SH_DIR32) 1267 continue; 1268 1269 if (ELF32_R_SYM (irelscan->r_info) >= symtab_hdr->sh_info) 1270 continue; 1271 1272 1273 isym = isymbuf + ELF32_R_SYM (irelscan->r_info); 1274 if (isym->st_shndx == sec_shndx 1275 && (isym->st_value <= addr 1276 || isym->st_value >= toaddr)) 1277 { 1278 bfd_vma val; 1279 1280 if (ocontents == NULL) 1281 { 1282 if (elf_section_data (o)->this_hdr.contents != NULL) 1283 ocontents = elf_section_data (o)->this_hdr.contents; 1284 else 1285 { 1286 /* We always cache the section contents. 1287 Perhaps, if info->keep_memory is FALSE, we 1288 should free them, if we are permitted to, 1289 when we leave sh_coff_relax_section. */ 1290 if (!bfd_malloc_and_get_section (abfd, o, &ocontents)) 1291 { 1292 if (ocontents != NULL) 1293 free (ocontents); 1294 return FALSE; 1295 } 1296 1297 elf_section_data (o)->this_hdr.contents = ocontents; 1298 } 1299 } 1300 1301 val = bfd_get_32 (abfd, ocontents + irelscan->r_offset); 1302 val += isym->st_value; 1303 if (val > addr && val < toaddr) 1304 bfd_put_32 (abfd, val - count, 1305 ocontents + irelscan->r_offset); 1306 } 1307 } 1308 } 1309 1310 /* Adjust the local symbols defined in this section. */ 1311 isymend = isymbuf + symtab_hdr->sh_info; 1312 for (isym = isymbuf; isym < isymend; isym++) 1313 { 1314 if (isym->st_shndx == sec_shndx 1315 && isym->st_value > addr 1316 && isym->st_value < toaddr) 1317 isym->st_value -= count; 1318 } 1319 1320 /* Now adjust the global symbols defined in this section. */ 1321 symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym) 1322 - symtab_hdr->sh_info); 1323 sym_hashes = elf_sym_hashes (abfd); 1324 end_hashes = sym_hashes + symcount; 1325 for (; sym_hashes < end_hashes; sym_hashes++) 1326 { 1327 struct elf_link_hash_entry *sym_hash = *sym_hashes; 1328 if ((sym_hash->root.type == bfd_link_hash_defined 1329 || sym_hash->root.type == bfd_link_hash_defweak) 1330 && sym_hash->root.u.def.section == sec 1331 && sym_hash->root.u.def.value > addr 1332 && sym_hash->root.u.def.value < toaddr) 1333 { 1334 sym_hash->root.u.def.value -= count; 1335 } 1336 } 1337 1338 /* See if we can move the ALIGN reloc forward. We have adjusted 1339 r_offset for it already. */ 1340 if (irelalign != NULL) 1341 { 1342 bfd_vma alignto, alignaddr; 1343 1344 alignto = BFD_ALIGN (toaddr, 1 << irelalign->r_addend); 1345 alignaddr = BFD_ALIGN (irelalign->r_offset, 1346 1 << irelalign->r_addend); 1347 if (alignto != alignaddr) 1348 { 1349 /* Tail recursion. */ 1350 return sh_elf_relax_delete_bytes (abfd, sec, alignaddr, 1351 (int) (alignto - alignaddr)); 1352 } 1353 } 1354 1355 return TRUE; 1356} 1357 1358/* Look for loads and stores which we can align to four byte 1359 boundaries. This is like sh_align_loads in coff-sh.c. */ 1360 1361static bfd_boolean 1362sh_elf_align_loads (bfd *abfd ATTRIBUTE_UNUSED, asection *sec, 1363 Elf_Internal_Rela *internal_relocs, 1364 bfd_byte *contents ATTRIBUTE_UNUSED, 1365 bfd_boolean *pswapped) 1366{ 1367 Elf_Internal_Rela *irel, *irelend; 1368 bfd_vma *labels = NULL; 1369 bfd_vma *label, *label_end; 1370 bfd_size_type amt; 1371 1372 *pswapped = FALSE; 1373 1374 irelend = internal_relocs + sec->reloc_count; 1375 1376 /* Get all the addresses with labels on them. */ 1377 amt = sec->reloc_count; 1378 amt *= sizeof (bfd_vma); 1379 labels = (bfd_vma *) bfd_malloc (amt); 1380 if (labels == NULL) 1381 goto error_return; 1382 label_end = labels; 1383 for (irel = internal_relocs; irel < irelend; irel++) 1384 { 1385 if (ELF32_R_TYPE (irel->r_info) == (int) R_SH_LABEL) 1386 { 1387 *label_end = irel->r_offset; 1388 ++label_end; 1389 } 1390 } 1391 1392 /* Note that the assembler currently always outputs relocs in 1393 address order. If that ever changes, this code will need to sort 1394 the label values and the relocs. */ 1395 1396 label = labels; 1397 1398 for (irel = internal_relocs; irel < irelend; irel++) 1399 { 1400 bfd_vma start, stop; 1401 1402 if (ELF32_R_TYPE (irel->r_info) != (int) R_SH_CODE) 1403 continue; 1404 1405 start = irel->r_offset; 1406 1407 for (irel++; irel < irelend; irel++) 1408 if (ELF32_R_TYPE (irel->r_info) == (int) R_SH_DATA) 1409 break; 1410 if (irel < irelend) 1411 stop = irel->r_offset; 1412 else 1413 stop = sec->size; 1414 1415 if (! _bfd_sh_align_load_span (abfd, sec, contents, sh_elf_swap_insns, 1416 internal_relocs, &label, 1417 label_end, start, stop, pswapped)) 1418 goto error_return; 1419 } 1420 1421 free (labels); 1422 1423 return TRUE; 1424 1425 error_return: 1426 if (labels != NULL) 1427 free (labels); 1428 return FALSE; 1429} 1430 1431#ifndef SH64_ELF 1432/* Swap two SH instructions. This is like sh_swap_insns in coff-sh.c. */ 1433 1434static bfd_boolean 1435sh_elf_swap_insns (bfd *abfd, asection *sec, void *relocs, 1436 bfd_byte *contents, bfd_vma addr) 1437{ 1438 Elf_Internal_Rela *internal_relocs = (Elf_Internal_Rela *) relocs; 1439 unsigned short i1, i2; 1440 Elf_Internal_Rela *irel, *irelend; 1441 1442 /* Swap the instructions themselves. */ 1443 i1 = bfd_get_16 (abfd, contents + addr); 1444 i2 = bfd_get_16 (abfd, contents + addr + 2); 1445 bfd_put_16 (abfd, (bfd_vma) i2, contents + addr); 1446 bfd_put_16 (abfd, (bfd_vma) i1, contents + addr + 2); 1447 1448 /* Adjust all reloc addresses. */ 1449 irelend = internal_relocs + sec->reloc_count; 1450 for (irel = internal_relocs; irel < irelend; irel++) 1451 { 1452 enum elf_sh_reloc_type type; 1453 int add; 1454 1455 /* There are a few special types of relocs that we don't want to 1456 adjust. These relocs do not apply to the instruction itself, 1457 but are only associated with the address. */ 1458 type = (enum elf_sh_reloc_type) ELF32_R_TYPE (irel->r_info); 1459 if (type == R_SH_ALIGN 1460 || type == R_SH_CODE 1461 || type == R_SH_DATA 1462 || type == R_SH_LABEL) 1463 continue; 1464 1465 /* If an R_SH_USES reloc points to one of the addresses being 1466 swapped, we must adjust it. It would be incorrect to do this 1467 for a jump, though, since we want to execute both 1468 instructions after the jump. (We have avoided swapping 1469 around a label, so the jump will not wind up executing an 1470 instruction it shouldn't). */ 1471 if (type == R_SH_USES) 1472 { 1473 bfd_vma off; 1474 1475 off = irel->r_offset + 4 + irel->r_addend; 1476 if (off == addr) 1477 irel->r_offset += 2; 1478 else if (off == addr + 2) 1479 irel->r_offset -= 2; 1480 } 1481 1482 if (irel->r_offset == addr) 1483 { 1484 irel->r_offset += 2; 1485 add = -2; 1486 } 1487 else if (irel->r_offset == addr + 2) 1488 { 1489 irel->r_offset -= 2; 1490 add = 2; 1491 } 1492 else 1493 add = 0; 1494 1495 if (add != 0) 1496 { 1497 bfd_byte *loc; 1498 unsigned short insn, oinsn; 1499 bfd_boolean overflow; 1500 1501 loc = contents + irel->r_offset; 1502 overflow = FALSE; 1503 switch (type) 1504 { 1505 default: 1506 break; 1507 1508 case R_SH_DIR8WPN: 1509 case R_SH_DIR8WPZ: 1510 insn = bfd_get_16 (abfd, loc); 1511 oinsn = insn; 1512 insn += add / 2; 1513 if ((oinsn & 0xff00) != (insn & 0xff00)) 1514 overflow = TRUE; 1515 bfd_put_16 (abfd, (bfd_vma) insn, loc); 1516 break; 1517 1518 case R_SH_IND12W: 1519 insn = bfd_get_16 (abfd, loc); 1520 oinsn = insn; 1521 insn += add / 2; 1522 if ((oinsn & 0xf000) != (insn & 0xf000)) 1523 overflow = TRUE; 1524 bfd_put_16 (abfd, (bfd_vma) insn, loc); 1525 break; 1526 1527 case R_SH_DIR8WPL: 1528 /* This reloc ignores the least significant 3 bits of 1529 the program counter before adding in the offset. 1530 This means that if ADDR is at an even address, the 1531 swap will not affect the offset. If ADDR is an at an 1532 odd address, then the instruction will be crossing a 1533 four byte boundary, and must be adjusted. */ 1534 if ((addr & 3) != 0) 1535 { 1536 insn = bfd_get_16 (abfd, loc); 1537 oinsn = insn; 1538 insn += add / 2; 1539 if ((oinsn & 0xff00) != (insn & 0xff00)) 1540 overflow = TRUE; 1541 bfd_put_16 (abfd, (bfd_vma) insn, loc); 1542 } 1543 1544 break; 1545 } 1546 1547 if (overflow) 1548 { 1549 ((*_bfd_error_handler) 1550 (_("%B: 0x%lx: fatal: reloc overflow while relaxing"), 1551 abfd, (unsigned long) irel->r_offset)); 1552 bfd_set_error (bfd_error_bad_value); 1553 return FALSE; 1554 } 1555 } 1556 } 1557 1558 return TRUE; 1559} 1560#endif /* defined SH64_ELF */ 1561 1562/* Describes one of the various PLT styles. */ 1563 1564struct elf_sh_plt_info 1565{ 1566 /* The template for the first PLT entry, or NULL if there is no special 1567 first entry. */ 1568 const bfd_byte *plt0_entry; 1569 1570 /* The size of PLT0_ENTRY in bytes, or 0 if PLT0_ENTRY is NULL. */ 1571 bfd_vma plt0_entry_size; 1572 1573 /* Index I is the offset into PLT0_ENTRY of a pointer to 1574 _GLOBAL_OFFSET_TABLE_ + I * 4. The value is MINUS_ONE 1575 if there is no such pointer. */ 1576 bfd_vma plt0_got_fields[3]; 1577 1578 /* The template for a symbol's PLT entry. */ 1579 const bfd_byte *symbol_entry; 1580 1581 /* The size of SYMBOL_ENTRY in bytes. */ 1582 bfd_vma symbol_entry_size; 1583 1584 /* Byte offsets of fields in SYMBOL_ENTRY. Not all fields are used 1585 on all targets. The comments by each member indicate the value 1586 that the field must hold. */ 1587 struct { 1588 bfd_vma got_entry; /* the address of the symbol's .got.plt entry */ 1589 bfd_vma plt; /* .plt (or a branch to .plt on VxWorks) */ 1590 bfd_vma reloc_offset; /* the offset of the symbol's JMP_SLOT reloc */ 1591 bfd_boolean got20; /* TRUE if got_entry points to a movi20 1592 instruction (instead of a constant pool 1593 entry). */ 1594 } symbol_fields; 1595 1596 /* The offset of the resolver stub from the start of SYMBOL_ENTRY. */ 1597 bfd_vma symbol_resolve_offset; 1598 1599 /* A different PLT layout which can be used for the first 1600 MAX_SHORT_PLT entries. It must share the same plt0. NULL in 1601 other cases. */ 1602 const struct elf_sh_plt_info *short_plt; 1603}; 1604 1605#ifdef INCLUDE_SHMEDIA 1606 1607/* The size in bytes of an entry in the procedure linkage table. */ 1608 1609#define ELF_PLT_ENTRY_SIZE 64 1610 1611/* First entry in an absolute procedure linkage table look like this. */ 1612 1613static const bfd_byte elf_sh_plt0_entry_be[ELF_PLT_ENTRY_SIZE] = 1614{ 1615 0xcc, 0x00, 0x01, 0x10, /* movi .got.plt >> 16, r17 */ 1616 0xc8, 0x00, 0x01, 0x10, /* shori .got.plt & 65535, r17 */ 1617 0x89, 0x10, 0x09, 0x90, /* ld.l r17, 8, r25 */ 1618 0x6b, 0xf1, 0x66, 0x00, /* ptabs r25, tr0 */ 1619 0x89, 0x10, 0x05, 0x10, /* ld.l r17, 4, r17 */ 1620 0x44, 0x01, 0xff, 0xf0, /* blink tr0, r63 */ 1621 0x6f, 0xf0, 0xff, 0xf0, /* nop */ 1622 0x6f, 0xf0, 0xff, 0xf0, /* nop */ 1623 0x6f, 0xf0, 0xff, 0xf0, /* nop */ 1624 0x6f, 0xf0, 0xff, 0xf0, /* nop */ 1625 0x6f, 0xf0, 0xff, 0xf0, /* nop */ 1626 0x6f, 0xf0, 0xff, 0xf0, /* nop */ 1627 0x6f, 0xf0, 0xff, 0xf0, /* nop */ 1628 0x6f, 0xf0, 0xff, 0xf0, /* nop */ 1629 0x6f, 0xf0, 0xff, 0xf0, /* nop */ 1630 0x6f, 0xf0, 0xff, 0xf0, /* nop */ 1631}; 1632 1633static const bfd_byte elf_sh_plt0_entry_le[ELF_PLT_ENTRY_SIZE] = 1634{ 1635 0x10, 0x01, 0x00, 0xcc, /* movi .got.plt >> 16, r17 */ 1636 0x10, 0x01, 0x00, 0xc8, /* shori .got.plt & 65535, r17 */ 1637 0x90, 0x09, 0x10, 0x89, /* ld.l r17, 8, r25 */ 1638 0x00, 0x66, 0xf1, 0x6b, /* ptabs r25, tr0 */ 1639 0x10, 0x05, 0x10, 0x89, /* ld.l r17, 4, r17 */ 1640 0xf0, 0xff, 0x01, 0x44, /* blink tr0, r63 */ 1641 0xf0, 0xff, 0xf0, 0x6f, /* nop */ 1642 0xf0, 0xff, 0xf0, 0x6f, /* nop */ 1643 0xf0, 0xff, 0xf0, 0x6f, /* nop */ 1644 0xf0, 0xff, 0xf0, 0x6f, /* nop */ 1645 0xf0, 0xff, 0xf0, 0x6f, /* nop */ 1646 0xf0, 0xff, 0xf0, 0x6f, /* nop */ 1647 0xf0, 0xff, 0xf0, 0x6f, /* nop */ 1648 0xf0, 0xff, 0xf0, 0x6f, /* nop */ 1649 0xf0, 0xff, 0xf0, 0x6f, /* nop */ 1650 0xf0, 0xff, 0xf0, 0x6f, /* nop */ 1651}; 1652 1653/* Sebsequent entries in an absolute procedure linkage table look like 1654 this. */ 1655 1656static const bfd_byte elf_sh_plt_entry_be[ELF_PLT_ENTRY_SIZE] = 1657{ 1658 0xcc, 0x00, 0x01, 0x90, /* movi nameN-in-GOT >> 16, r25 */ 1659 0xc8, 0x00, 0x01, 0x90, /* shori nameN-in-GOT & 65535, r25 */ 1660 0x89, 0x90, 0x01, 0x90, /* ld.l r25, 0, r25 */ 1661 0x6b, 0xf1, 0x66, 0x00, /* ptabs r25, tr0 */ 1662 0x44, 0x01, 0xff, 0xf0, /* blink tr0, r63 */ 1663 0x6f, 0xf0, 0xff, 0xf0, /* nop */ 1664 0x6f, 0xf0, 0xff, 0xf0, /* nop */ 1665 0x6f, 0xf0, 0xff, 0xf0, /* nop */ 1666 0xcc, 0x00, 0x01, 0x90, /* movi .PLT0 >> 16, r25 */ 1667 0xc8, 0x00, 0x01, 0x90, /* shori .PLT0 & 65535, r25 */ 1668 0x6b, 0xf1, 0x66, 0x00, /* ptabs r25, tr0 */ 1669 0xcc, 0x00, 0x01, 0x50, /* movi reloc-offset >> 16, r21 */ 1670 0xc8, 0x00, 0x01, 0x50, /* shori reloc-offset & 65535, r21 */ 1671 0x44, 0x01, 0xff, 0xf0, /* blink tr0, r63 */ 1672 0x6f, 0xf0, 0xff, 0xf0, /* nop */ 1673 0x6f, 0xf0, 0xff, 0xf0, /* nop */ 1674}; 1675 1676static const bfd_byte elf_sh_plt_entry_le[ELF_PLT_ENTRY_SIZE] = 1677{ 1678 0x90, 0x01, 0x00, 0xcc, /* movi nameN-in-GOT >> 16, r25 */ 1679 0x90, 0x01, 0x00, 0xc8, /* shori nameN-in-GOT & 65535, r25 */ 1680 0x90, 0x01, 0x90, 0x89, /* ld.l r25, 0, r25 */ 1681 0x00, 0x66, 0xf1, 0x6b, /* ptabs r25, tr0 */ 1682 0xf0, 0xff, 0x01, 0x44, /* blink tr0, r63 */ 1683 0xf0, 0xff, 0xf0, 0x6f, /* nop */ 1684 0xf0, 0xff, 0xf0, 0x6f, /* nop */ 1685 0xf0, 0xff, 0xf0, 0x6f, /* nop */ 1686 0x90, 0x01, 0x00, 0xcc, /* movi .PLT0 >> 16, r25 */ 1687 0x90, 0x01, 0x00, 0xc8, /* shori .PLT0 & 65535, r25 */ 1688 0x00, 0x66, 0xf1, 0x6b, /* ptabs r25, tr0 */ 1689 0x50, 0x01, 0x00, 0xcc, /* movi reloc-offset >> 16, r21 */ 1690 0x50, 0x01, 0x00, 0xc8, /* shori reloc-offset & 65535, r21 */ 1691 0xf0, 0xff, 0x01, 0x44, /* blink tr0, r63 */ 1692 0xf0, 0xff, 0xf0, 0x6f, /* nop */ 1693 0xf0, 0xff, 0xf0, 0x6f, /* nop */ 1694}; 1695 1696/* Entries in a PIC procedure linkage table look like this. */ 1697 1698static const bfd_byte elf_sh_pic_plt_entry_be[ELF_PLT_ENTRY_SIZE] = 1699{ 1700 0xcc, 0x00, 0x01, 0x90, /* movi nameN@GOT >> 16, r25 */ 1701 0xc8, 0x00, 0x01, 0x90, /* shori nameN@GOT & 65535, r25 */ 1702 0x40, 0xc2, 0x65, 0x90, /* ldx.l r12, r25, r25 */ 1703 0x6b, 0xf1, 0x66, 0x00, /* ptabs r25, tr0 */ 1704 0x44, 0x01, 0xff, 0xf0, /* blink tr0, r63 */ 1705 0x6f, 0xf0, 0xff, 0xf0, /* nop */ 1706 0x6f, 0xf0, 0xff, 0xf0, /* nop */ 1707 0x6f, 0xf0, 0xff, 0xf0, /* nop */ 1708 0xce, 0x00, 0x01, 0x10, /* movi -GOT_BIAS, r17 */ 1709 0x00, 0xc8, 0x45, 0x10, /* add.l r12, r17, r17 */ 1710 0x89, 0x10, 0x09, 0x90, /* ld.l r17, 8, r25 */ 1711 0x6b, 0xf1, 0x66, 0x00, /* ptabs r25, tr0 */ 1712 0x89, 0x10, 0x05, 0x10, /* ld.l r17, 4, r17 */ 1713 0xcc, 0x00, 0x01, 0x50, /* movi reloc-offset >> 16, r21 */ 1714 0xc8, 0x00, 0x01, 0x50, /* shori reloc-offset & 65535, r21 */ 1715 0x44, 0x01, 0xff, 0xf0, /* blink tr0, r63 */ 1716}; 1717 1718static const bfd_byte elf_sh_pic_plt_entry_le[ELF_PLT_ENTRY_SIZE] = 1719{ 1720 0x90, 0x01, 0x00, 0xcc, /* movi nameN@GOT >> 16, r25 */ 1721 0x90, 0x01, 0x00, 0xc8, /* shori nameN@GOT & 65535, r25 */ 1722 0x90, 0x65, 0xc2, 0x40, /* ldx.l r12, r25, r25 */ 1723 0x00, 0x66, 0xf1, 0x6b, /* ptabs r25, tr0 */ 1724 0xf0, 0xff, 0x01, 0x44, /* blink tr0, r63 */ 1725 0xf0, 0xff, 0xf0, 0x6f, /* nop */ 1726 0xf0, 0xff, 0xf0, 0x6f, /* nop */ 1727 0xf0, 0xff, 0xf0, 0x6f, /* nop */ 1728 0x10, 0x01, 0x00, 0xce, /* movi -GOT_BIAS, r17 */ 1729 0x10, 0x45, 0xc8, 0x00, /* add.l r12, r17, r17 */ 1730 0x90, 0x09, 0x10, 0x89, /* ld.l r17, 8, r25 */ 1731 0x00, 0x66, 0xf1, 0x6b, /* ptabs r25, tr0 */ 1732 0x10, 0x05, 0x10, 0x89, /* ld.l r17, 4, r17 */ 1733 0x50, 0x01, 0x00, 0xcc, /* movi reloc-offset >> 16, r21 */ 1734 0x50, 0x01, 0x00, 0xc8, /* shori reloc-offset & 65535, r21 */ 1735 0xf0, 0xff, 0x01, 0x44, /* blink tr0, r63 */ 1736}; 1737 1738static const struct elf_sh_plt_info elf_sh_plts[2][2] = { 1739 { 1740 { 1741 /* Big-endian non-PIC. */ 1742 elf_sh_plt0_entry_be, 1743 ELF_PLT_ENTRY_SIZE, 1744 { 0, MINUS_ONE, MINUS_ONE }, 1745 elf_sh_plt_entry_be, 1746 ELF_PLT_ENTRY_SIZE, 1747 { 0, 32, 48, FALSE }, 1748 33, /* includes ISA encoding */ 1749 NULL 1750 }, 1751 { 1752 /* Little-endian non-PIC. */ 1753 elf_sh_plt0_entry_le, 1754 ELF_PLT_ENTRY_SIZE, 1755 { 0, MINUS_ONE, MINUS_ONE }, 1756 elf_sh_plt_entry_le, 1757 ELF_PLT_ENTRY_SIZE, 1758 { 0, 32, 48, FALSE }, 1759 33, /* includes ISA encoding */ 1760 NULL 1761 }, 1762 }, 1763 { 1764 { 1765 /* Big-endian PIC. */ 1766 elf_sh_plt0_entry_be, 1767 ELF_PLT_ENTRY_SIZE, 1768 { MINUS_ONE, MINUS_ONE, MINUS_ONE }, 1769 elf_sh_pic_plt_entry_be, 1770 ELF_PLT_ENTRY_SIZE, 1771 { 0, MINUS_ONE, 52, FALSE }, 1772 33, /* includes ISA encoding */ 1773 NULL 1774 }, 1775 { 1776 /* Little-endian PIC. */ 1777 elf_sh_plt0_entry_le, 1778 ELF_PLT_ENTRY_SIZE, 1779 { MINUS_ONE, MINUS_ONE, MINUS_ONE }, 1780 elf_sh_pic_plt_entry_le, 1781 ELF_PLT_ENTRY_SIZE, 1782 { 0, MINUS_ONE, 52, FALSE }, 1783 33, /* includes ISA encoding */ 1784 NULL 1785 }, 1786 } 1787}; 1788 1789/* Return offset of the linker in PLT0 entry. */ 1790#define elf_sh_plt0_gotplt_offset(info) 0 1791 1792/* Install a 32-bit PLT field starting at ADDR, which occurs in OUTPUT_BFD. 1793 VALUE is the field's value and CODE_P is true if VALUE refers to code, 1794 not data. 1795 1796 On SH64, each 32-bit field is loaded by a movi/shori pair. */ 1797 1798inline static void 1799install_plt_field (bfd *output_bfd, bfd_boolean code_p, 1800 unsigned long value, bfd_byte *addr) 1801{ 1802 value |= code_p; 1803 bfd_put_32 (output_bfd, 1804 bfd_get_32 (output_bfd, addr) 1805 | ((value >> 6) & 0x3fffc00), 1806 addr); 1807 bfd_put_32 (output_bfd, 1808 bfd_get_32 (output_bfd, addr + 4) 1809 | ((value << 10) & 0x3fffc00), 1810 addr + 4); 1811} 1812 1813/* Return the type of PLT associated with ABFD. PIC_P is true if 1814 the object is position-independent. */ 1815 1816static const struct elf_sh_plt_info * 1817get_plt_info (bfd *abfd ATTRIBUTE_UNUSED, bfd_boolean pic_p) 1818{ 1819 return &elf_sh_plts[pic_p][!bfd_big_endian (abfd)]; 1820} 1821#else 1822/* The size in bytes of an entry in the procedure linkage table. */ 1823 1824#define ELF_PLT_ENTRY_SIZE 28 1825 1826/* First entry in an absolute procedure linkage table look like this. */ 1827 1828/* Note - this code has been "optimised" not to use r2. r2 is used by 1829 GCC to return the address of large structures, so it should not be 1830 corrupted here. This does mean however, that this PLT does not conform 1831 to the SH PIC ABI. That spec says that r0 contains the type of the PLT 1832 and r2 contains the GOT id. This version stores the GOT id in r0 and 1833 ignores the type. Loaders can easily detect this difference however, 1834 since the type will always be 0 or 8, and the GOT ids will always be 1835 greater than or equal to 12. */ 1836static const bfd_byte elf_sh_plt0_entry_be[ELF_PLT_ENTRY_SIZE] = 1837{ 1838 0xd0, 0x05, /* mov.l 2f,r0 */ 1839 0x60, 0x02, /* mov.l @r0,r0 */ 1840 0x2f, 0x06, /* mov.l r0,@-r15 */ 1841 0xd0, 0x03, /* mov.l 1f,r0 */ 1842 0x60, 0x02, /* mov.l @r0,r0 */ 1843 0x40, 0x2b, /* jmp @r0 */ 1844 0x60, 0xf6, /* mov.l @r15+,r0 */ 1845 0x00, 0x09, /* nop */ 1846 0x00, 0x09, /* nop */ 1847 0x00, 0x09, /* nop */ 1848 0, 0, 0, 0, /* 1: replaced with address of .got.plt + 8. */ 1849 0, 0, 0, 0, /* 2: replaced with address of .got.plt + 4. */ 1850}; 1851 1852static const bfd_byte elf_sh_plt0_entry_le[ELF_PLT_ENTRY_SIZE] = 1853{ 1854 0x05, 0xd0, /* mov.l 2f,r0 */ 1855 0x02, 0x60, /* mov.l @r0,r0 */ 1856 0x06, 0x2f, /* mov.l r0,@-r15 */ 1857 0x03, 0xd0, /* mov.l 1f,r0 */ 1858 0x02, 0x60, /* mov.l @r0,r0 */ 1859 0x2b, 0x40, /* jmp @r0 */ 1860 0xf6, 0x60, /* mov.l @r15+,r0 */ 1861 0x09, 0x00, /* nop */ 1862 0x09, 0x00, /* nop */ 1863 0x09, 0x00, /* nop */ 1864 0, 0, 0, 0, /* 1: replaced with address of .got.plt + 8. */ 1865 0, 0, 0, 0, /* 2: replaced with address of .got.plt + 4. */ 1866}; 1867 1868/* Sebsequent entries in an absolute procedure linkage table look like 1869 this. */ 1870 1871static const bfd_byte elf_sh_plt_entry_be[ELF_PLT_ENTRY_SIZE] = 1872{ 1873 0xd0, 0x04, /* mov.l 1f,r0 */ 1874 0x60, 0x02, /* mov.l @(r0,r12),r0 */ 1875 0xd1, 0x02, /* mov.l 0f,r1 */ 1876 0x40, 0x2b, /* jmp @r0 */ 1877 0x60, 0x13, /* mov r1,r0 */ 1878 0xd1, 0x03, /* mov.l 2f,r1 */ 1879 0x40, 0x2b, /* jmp @r0 */ 1880 0x00, 0x09, /* nop */ 1881 0, 0, 0, 0, /* 0: replaced with address of .PLT0. */ 1882 0, 0, 0, 0, /* 1: replaced with address of this symbol in .got. */ 1883 0, 0, 0, 0, /* 2: replaced with offset into relocation table. */ 1884}; 1885 1886static const bfd_byte elf_sh_plt_entry_le[ELF_PLT_ENTRY_SIZE] = 1887{ 1888 0x04, 0xd0, /* mov.l 1f,r0 */ 1889 0x02, 0x60, /* mov.l @r0,r0 */ 1890 0x02, 0xd1, /* mov.l 0f,r1 */ 1891 0x2b, 0x40, /* jmp @r0 */ 1892 0x13, 0x60, /* mov r1,r0 */ 1893 0x03, 0xd1, /* mov.l 2f,r1 */ 1894 0x2b, 0x40, /* jmp @r0 */ 1895 0x09, 0x00, /* nop */ 1896 0, 0, 0, 0, /* 0: replaced with address of .PLT0. */ 1897 0, 0, 0, 0, /* 1: replaced with address of this symbol in .got. */ 1898 0, 0, 0, 0, /* 2: replaced with offset into relocation table. */ 1899}; 1900 1901/* Entries in a PIC procedure linkage table look like this. */ 1902 1903static const bfd_byte elf_sh_pic_plt_entry_be[ELF_PLT_ENTRY_SIZE] = 1904{ 1905 0xd0, 0x04, /* mov.l 1f,r0 */ 1906 0x00, 0xce, /* mov.l @(r0,r12),r0 */ 1907 0x40, 0x2b, /* jmp @r0 */ 1908 0x00, 0x09, /* nop */ 1909 0x50, 0xc2, /* mov.l @(8,r12),r0 */ 1910 0xd1, 0x03, /* mov.l 2f,r1 */ 1911 0x40, 0x2b, /* jmp @r0 */ 1912 0x50, 0xc1, /* mov.l @(4,r12),r0 */ 1913 0x00, 0x09, /* nop */ 1914 0x00, 0x09, /* nop */ 1915 0, 0, 0, 0, /* 1: replaced with address of this symbol in .got. */ 1916 0, 0, 0, 0 /* 2: replaced with offset into relocation table. */ 1917}; 1918 1919static const bfd_byte elf_sh_pic_plt_entry_le[ELF_PLT_ENTRY_SIZE] = 1920{ 1921 0x04, 0xd0, /* mov.l 1f,r0 */ 1922 0xce, 0x00, /* mov.l @(r0,r12),r0 */ 1923 0x2b, 0x40, /* jmp @r0 */ 1924 0x09, 0x00, /* nop */ 1925 0xc2, 0x50, /* mov.l @(8,r12),r0 */ 1926 0x03, 0xd1, /* mov.l 2f,r1 */ 1927 0x2b, 0x40, /* jmp @r0 */ 1928 0xc1, 0x50, /* mov.l @(4,r12),r0 */ 1929 0x09, 0x00, /* nop */ 1930 0x09, 0x00, /* nop */ 1931 0, 0, 0, 0, /* 1: replaced with address of this symbol in .got. */ 1932 0, 0, 0, 0 /* 2: replaced with offset into relocation table. */ 1933}; 1934 1935static const struct elf_sh_plt_info elf_sh_plts[2][2] = { 1936 { 1937 { 1938 /* Big-endian non-PIC. */ 1939 elf_sh_plt0_entry_be, 1940 ELF_PLT_ENTRY_SIZE, 1941 { MINUS_ONE, 24, 20 }, 1942 elf_sh_plt_entry_be, 1943 ELF_PLT_ENTRY_SIZE, 1944 { 20, 16, 24, FALSE }, 1945 8, 1946 NULL 1947 }, 1948 { 1949 /* Little-endian non-PIC. */ 1950 elf_sh_plt0_entry_le, 1951 ELF_PLT_ENTRY_SIZE, 1952 { MINUS_ONE, 24, 20 }, 1953 elf_sh_plt_entry_le, 1954 ELF_PLT_ENTRY_SIZE, 1955 { 20, 16, 24, FALSE }, 1956 8, 1957 NULL 1958 }, 1959 }, 1960 { 1961 { 1962 /* Big-endian PIC. */ 1963 elf_sh_plt0_entry_be, 1964 ELF_PLT_ENTRY_SIZE, 1965 { MINUS_ONE, MINUS_ONE, MINUS_ONE }, 1966 elf_sh_pic_plt_entry_be, 1967 ELF_PLT_ENTRY_SIZE, 1968 { 20, MINUS_ONE, 24, FALSE }, 1969 8, 1970 NULL 1971 }, 1972 { 1973 /* Little-endian PIC. */ 1974 elf_sh_plt0_entry_le, 1975 ELF_PLT_ENTRY_SIZE, 1976 { MINUS_ONE, MINUS_ONE, MINUS_ONE }, 1977 elf_sh_pic_plt_entry_le, 1978 ELF_PLT_ENTRY_SIZE, 1979 { 20, MINUS_ONE, 24, FALSE }, 1980 8, 1981 NULL 1982 }, 1983 } 1984}; 1985 1986#define VXWORKS_PLT_HEADER_SIZE 12 1987#define VXWORKS_PLT_ENTRY_SIZE 24 1988 1989static const bfd_byte vxworks_sh_plt0_entry_be[VXWORKS_PLT_HEADER_SIZE] = 1990{ 1991 0xd1, 0x01, /* mov.l @(8,pc),r1 */ 1992 0x61, 0x12, /* mov.l @r1,r1 */ 1993 0x41, 0x2b, /* jmp @r1 */ 1994 0x00, 0x09, /* nop */ 1995 0, 0, 0, 0 /* 0: replaced with _GLOBAL_OFFSET_TABLE+8. */ 1996}; 1997 1998static const bfd_byte vxworks_sh_plt0_entry_le[VXWORKS_PLT_HEADER_SIZE] = 1999{ 2000 0x01, 0xd1, /* mov.l @(8,pc),r1 */ 2001 0x12, 0x61, /* mov.l @r1,r1 */ 2002 0x2b, 0x41, /* jmp @r1 */ 2003 0x09, 0x00, /* nop */ 2004 0, 0, 0, 0 /* 0: replaced with _GLOBAL_OFFSET_TABLE+8. */ 2005}; 2006 2007static const bfd_byte vxworks_sh_plt_entry_be[VXWORKS_PLT_ENTRY_SIZE] = 2008{ 2009 0xd0, 0x01, /* mov.l @(8,pc),r0 */ 2010 0x60, 0x02, /* mov.l @r0,r0 */ 2011 0x40, 0x2b, /* jmp @r0 */ 2012 0x00, 0x09, /* nop */ 2013 0, 0, 0, 0, /* 0: replaced with address of this symbol in .got. */ 2014 0xd0, 0x01, /* mov.l @(8,pc),r0 */ 2015 0xa0, 0x00, /* bra PLT (We need to fix the offset.) */ 2016 0x00, 0x09, /* nop */ 2017 0x00, 0x09, /* nop */ 2018 0, 0, 0, 0, /* 1: replaced with offset into relocation table. */ 2019}; 2020 2021static const bfd_byte vxworks_sh_plt_entry_le[VXWORKS_PLT_ENTRY_SIZE] = 2022{ 2023 0x01, 0xd0, /* mov.l @(8,pc),r0 */ 2024 0x02, 0x60, /* mov.l @r0,r0 */ 2025 0x2b, 0x40, /* jmp @r0 */ 2026 0x09, 0x00, /* nop */ 2027 0, 0, 0, 0, /* 0: replaced with address of this symbol in .got. */ 2028 0x01, 0xd0, /* mov.l @(8,pc),r0 */ 2029 0x00, 0xa0, /* bra PLT (We need to fix the offset.) */ 2030 0x09, 0x00, /* nop */ 2031 0x09, 0x00, /* nop */ 2032 0, 0, 0, 0, /* 1: replaced with offset into relocation table. */ 2033}; 2034 2035static const bfd_byte vxworks_sh_pic_plt_entry_be[VXWORKS_PLT_ENTRY_SIZE] = 2036{ 2037 0xd0, 0x01, /* mov.l @(8,pc),r0 */ 2038 0x00, 0xce, /* mov.l @(r0,r12),r0 */ 2039 0x40, 0x2b, /* jmp @r0 */ 2040 0x00, 0x09, /* nop */ 2041 0, 0, 0, 0, /* 0: replaced with offset of this symbol in .got. */ 2042 0xd0, 0x01, /* mov.l @(8,pc),r0 */ 2043 0x51, 0xc2, /* mov.l @(8,r12),r1 */ 2044 0x41, 0x2b, /* jmp @r1 */ 2045 0x00, 0x09, /* nop */ 2046 0, 0, 0, 0, /* 1: replaced with offset into relocation table. */ 2047}; 2048 2049static const bfd_byte vxworks_sh_pic_plt_entry_le[VXWORKS_PLT_ENTRY_SIZE] = 2050{ 2051 0x01, 0xd0, /* mov.l @(8,pc),r0 */ 2052 0xce, 0x00, /* mov.l @(r0,r12),r0 */ 2053 0x2b, 0x40, /* jmp @r0 */ 2054 0x09, 0x00, /* nop */ 2055 0, 0, 0, 0, /* 0: replaced with offset of this symbol in .got. */ 2056 0x01, 0xd0, /* mov.l @(8,pc),r0 */ 2057 0xc2, 0x51, /* mov.l @(8,r12),r1 */ 2058 0x2b, 0x41, /* jmp @r1 */ 2059 0x09, 0x00, /* nop */ 2060 0, 0, 0, 0, /* 1: replaced with offset into relocation table. */ 2061}; 2062 2063static const struct elf_sh_plt_info vxworks_sh_plts[2][2] = { 2064 { 2065 { 2066 /* Big-endian non-PIC. */ 2067 vxworks_sh_plt0_entry_be, 2068 VXWORKS_PLT_HEADER_SIZE, 2069 { MINUS_ONE, MINUS_ONE, 8 }, 2070 vxworks_sh_plt_entry_be, 2071 VXWORKS_PLT_ENTRY_SIZE, 2072 { 8, 14, 20, FALSE }, 2073 12, 2074 NULL 2075 }, 2076 { 2077 /* Little-endian non-PIC. */ 2078 vxworks_sh_plt0_entry_le, 2079 VXWORKS_PLT_HEADER_SIZE, 2080 { MINUS_ONE, MINUS_ONE, 8 }, 2081 vxworks_sh_plt_entry_le, 2082 VXWORKS_PLT_ENTRY_SIZE, 2083 { 8, 14, 20, FALSE }, 2084 12, 2085 NULL 2086 }, 2087 }, 2088 { 2089 { 2090 /* Big-endian PIC. */ 2091 NULL, 2092 0, 2093 { MINUS_ONE, MINUS_ONE, MINUS_ONE }, 2094 vxworks_sh_pic_plt_entry_be, 2095 VXWORKS_PLT_ENTRY_SIZE, 2096 { 8, MINUS_ONE, 20, FALSE }, 2097 12, 2098 NULL 2099 }, 2100 { 2101 /* Little-endian PIC. */ 2102 NULL, 2103 0, 2104 { MINUS_ONE, MINUS_ONE, MINUS_ONE }, 2105 vxworks_sh_pic_plt_entry_le, 2106 VXWORKS_PLT_ENTRY_SIZE, 2107 { 8, MINUS_ONE, 20, FALSE }, 2108 12, 2109 NULL 2110 }, 2111 } 2112}; 2113 2114/* FDPIC PLT entries. Two unimplemented optimizations for lazy 2115 binding are to omit the lazy binding stub when linking with -z now 2116 and to move lazy binding stubs into a separate region for better 2117 cache behavior. */ 2118 2119#define FDPIC_PLT_ENTRY_SIZE 28 2120#define FDPIC_PLT_LAZY_OFFSET 20 2121 2122/* FIXME: The lazy binding stub requires a plt0 - which may need to be 2123 duplicated if it is out of range, or which can be inlined. So 2124 right now it is always inlined, which wastes a word per stub. It 2125 might be easier to handle the duplication if we put the lazy 2126 stubs separately. */ 2127 2128static const bfd_byte fdpic_sh_plt_entry_be[FDPIC_PLT_ENTRY_SIZE] = 2129{ 2130 0xd0, 0x02, /* mov.l @(12,pc),r0 */ 2131 0x01, 0xce, /* mov.l @(r0,r12),r1 */ 2132 0x70, 0x04, /* add #4, r0 */ 2133 0x41, 0x2b, /* jmp @r1 */ 2134 0x0c, 0xce, /* mov.l @(r0,r12),r12 */ 2135 0x00, 0x09, /* nop */ 2136 0, 0, 0, 0, /* 0: replaced with offset of this symbol's funcdesc */ 2137 0, 0, 0, 0, /* 1: replaced with offset into relocation table. */ 2138 0x60, 0xc2, /* mov.l @r12,r0 */ 2139 0x40, 0x2b, /* jmp @r0 */ 2140 0x53, 0xc1, /* mov.l @(4,r12),r3 */ 2141 0x00, 0x09, /* nop */ 2142}; 2143 2144static const bfd_byte fdpic_sh_plt_entry_le[FDPIC_PLT_ENTRY_SIZE] = 2145{ 2146 0x02, 0xd0, /* mov.l @(12,pc),r0 */ 2147 0xce, 0x01, /* mov.l @(r0,r12),r1 */ 2148 0x04, 0x70, /* add #4, r0 */ 2149 0x2b, 0x41, /* jmp @r1 */ 2150 0xce, 0x0c, /* mov.l @(r0,r12),r12 */ 2151 0x09, 0x00, /* nop */ 2152 0, 0, 0, 0, /* 0: replaced with offset of this symbol's funcdesc */ 2153 0, 0, 0, 0, /* 1: replaced with offset into relocation table. */ 2154 0xc2, 0x60, /* mov.l @r12,r0 */ 2155 0x2b, 0x40, /* jmp @r0 */ 2156 0xc1, 0x53, /* mov.l @(4,r12),r3 */ 2157 0x09, 0x00, /* nop */ 2158}; 2159 2160static const struct elf_sh_plt_info fdpic_sh_plts[2] = { 2161 { 2162 /* Big-endian PIC. */ 2163 NULL, 2164 0, 2165 { MINUS_ONE, MINUS_ONE, MINUS_ONE }, 2166 fdpic_sh_plt_entry_be, 2167 FDPIC_PLT_ENTRY_SIZE, 2168 { 12, MINUS_ONE, 16, FALSE }, 2169 FDPIC_PLT_LAZY_OFFSET, 2170 NULL 2171 }, 2172 { 2173 /* Little-endian PIC. */ 2174 NULL, 2175 0, 2176 { MINUS_ONE, MINUS_ONE, MINUS_ONE }, 2177 fdpic_sh_plt_entry_le, 2178 FDPIC_PLT_ENTRY_SIZE, 2179 { 12, MINUS_ONE, 16, FALSE }, 2180 FDPIC_PLT_LAZY_OFFSET, 2181 NULL 2182 }, 2183}; 2184 2185/* On SH2A, we can use the movi20 instruction to generate shorter PLT 2186 entries for the first 64K slots. We use the normal FDPIC PLT entry 2187 past that point; we could also use movi20s, which might be faster, 2188 but would not be any smaller. */ 2189 2190#define FDPIC_SH2A_PLT_ENTRY_SIZE 24 2191#define FDPIC_SH2A_PLT_LAZY_OFFSET 16 2192 2193static const bfd_byte fdpic_sh2a_plt_entry_be[FDPIC_SH2A_PLT_ENTRY_SIZE] = 2194{ 2195 0, 0, 0, 0, /* movi20 #gotofffuncdesc,r0 */ 2196 0x01, 0xce, /* mov.l @(r0,r12),r1 */ 2197 0x70, 0x04, /* add #4, r0 */ 2198 0x41, 0x2b, /* jmp @r1 */ 2199 0x0c, 0xce, /* mov.l @(r0,r12),r12 */ 2200 0, 0, 0, 0, /* 1: replaced with offset into relocation table. */ 2201 0x60, 0xc2, /* mov.l @r12,r0 */ 2202 0x40, 0x2b, /* jmp @r0 */ 2203 0x53, 0xc1, /* mov.l @(4,r12),r3 */ 2204 0x00, 0x09, /* nop */ 2205}; 2206 2207static const bfd_byte fdpic_sh2a_plt_entry_le[FDPIC_SH2A_PLT_ENTRY_SIZE] = 2208{ 2209 0, 0, 0, 0, /* movi20 #gotofffuncdesc,r0 */ 2210 0xce, 0x01, /* mov.l @(r0,r12),r1 */ 2211 0x04, 0x70, /* add #4, r0 */ 2212 0x2b, 0x41, /* jmp @r1 */ 2213 0xce, 0x0c, /* mov.l @(r0,r12),r12 */ 2214 0, 0, 0, 0, /* 1: replaced with offset into relocation table. */ 2215 0xc2, 0x60, /* mov.l @r12,r0 */ 2216 0x2b, 0x40, /* jmp @r0 */ 2217 0xc1, 0x53, /* mov.l @(4,r12),r3 */ 2218 0x09, 0x00, /* nop */ 2219}; 2220 2221static const struct elf_sh_plt_info fdpic_sh2a_short_plt_be = { 2222 /* Big-endian FDPIC, max index 64K. */ 2223 NULL, 2224 0, 2225 { MINUS_ONE, MINUS_ONE, MINUS_ONE }, 2226 fdpic_sh2a_plt_entry_be, 2227 FDPIC_SH2A_PLT_ENTRY_SIZE, 2228 { 0, MINUS_ONE, 12, TRUE }, 2229 FDPIC_SH2A_PLT_LAZY_OFFSET, 2230 NULL 2231}; 2232 2233static const struct elf_sh_plt_info fdpic_sh2a_short_plt_le = { 2234 /* Little-endian FDPIC, max index 64K. */ 2235 NULL, 2236 0, 2237 { MINUS_ONE, MINUS_ONE, MINUS_ONE }, 2238 fdpic_sh2a_plt_entry_le, 2239 FDPIC_SH2A_PLT_ENTRY_SIZE, 2240 { 0, MINUS_ONE, 12, TRUE }, 2241 FDPIC_SH2A_PLT_LAZY_OFFSET, 2242 NULL 2243}; 2244 2245static const struct elf_sh_plt_info fdpic_sh2a_plts[2] = { 2246 { 2247 /* Big-endian PIC. */ 2248 NULL, 2249 0, 2250 { MINUS_ONE, MINUS_ONE, MINUS_ONE }, 2251 fdpic_sh_plt_entry_be, 2252 FDPIC_PLT_ENTRY_SIZE, 2253 { 12, MINUS_ONE, 16, FALSE }, 2254 FDPIC_PLT_LAZY_OFFSET, 2255 &fdpic_sh2a_short_plt_be 2256 }, 2257 { 2258 /* Little-endian PIC. */ 2259 NULL, 2260 0, 2261 { MINUS_ONE, MINUS_ONE, MINUS_ONE }, 2262 fdpic_sh_plt_entry_le, 2263 FDPIC_PLT_ENTRY_SIZE, 2264 { 12, MINUS_ONE, 16, FALSE }, 2265 FDPIC_PLT_LAZY_OFFSET, 2266 &fdpic_sh2a_short_plt_le 2267 }, 2268}; 2269 2270/* Return the type of PLT associated with ABFD. PIC_P is true if 2271 the object is position-independent. */ 2272 2273static const struct elf_sh_plt_info * 2274get_plt_info (bfd *abfd, bfd_boolean pic_p) 2275{ 2276 if (fdpic_object_p (abfd)) 2277 { 2278 /* If any input file requires SH2A we can use a shorter PLT 2279 sequence. */ 2280 if (sh_get_arch_from_bfd_mach (bfd_get_mach (abfd)) & arch_sh2a_base) 2281 return &fdpic_sh2a_plts[!bfd_big_endian (abfd)]; 2282 else 2283 return &fdpic_sh_plts[!bfd_big_endian (abfd)]; 2284 } 2285 if (vxworks_object_p (abfd)) 2286 return &vxworks_sh_plts[pic_p][!bfd_big_endian (abfd)]; 2287 return &elf_sh_plts[pic_p][!bfd_big_endian (abfd)]; 2288} 2289 2290/* Install a 32-bit PLT field starting at ADDR, which occurs in OUTPUT_BFD. 2291 VALUE is the field's value and CODE_P is true if VALUE refers to code, 2292 not data. */ 2293 2294inline static void 2295install_plt_field (bfd *output_bfd, bfd_boolean code_p ATTRIBUTE_UNUSED, 2296 unsigned long value, bfd_byte *addr) 2297{ 2298 bfd_put_32 (output_bfd, value, addr); 2299} 2300#endif 2301 2302/* The number of PLT entries which can use a shorter PLT, if any. 2303 Currently always 64K, since only SH-2A FDPIC uses this; a 2304 20-bit movi20 can address that many function descriptors below 2305 _GLOBAL_OFFSET_TABLE_. */ 2306#define MAX_SHORT_PLT 65536 2307 2308/* Return the index of the PLT entry at byte offset OFFSET. */ 2309 2310static bfd_vma 2311get_plt_index (const struct elf_sh_plt_info *info, bfd_vma offset) 2312{ 2313 bfd_vma plt_index = 0; 2314 2315 offset -= info->plt0_entry_size; 2316 if (info->short_plt != NULL) 2317 { 2318 if (offset > MAX_SHORT_PLT * info->short_plt->symbol_entry_size) 2319 { 2320 plt_index = MAX_SHORT_PLT; 2321 offset -= MAX_SHORT_PLT * info->short_plt->symbol_entry_size; 2322 } 2323 else 2324 info = info->short_plt; 2325 } 2326 return plt_index + offset / info->symbol_entry_size; 2327} 2328 2329/* Do the inverse operation. */ 2330 2331static bfd_vma 2332get_plt_offset (const struct elf_sh_plt_info *info, bfd_vma plt_index) 2333{ 2334 bfd_vma offset = 0; 2335 2336 if (info->short_plt != NULL) 2337 { 2338 if (plt_index > MAX_SHORT_PLT) 2339 { 2340 offset = MAX_SHORT_PLT * info->short_plt->symbol_entry_size; 2341 plt_index -= MAX_SHORT_PLT; 2342 } 2343 else 2344 info = info->short_plt; 2345 } 2346 return (offset + info->plt0_entry_size 2347 + (plt_index * info->symbol_entry_size)); 2348} 2349 2350/* The sh linker needs to keep track of the number of relocs that it 2351 decides to copy as dynamic relocs in check_relocs for each symbol. 2352 This is so that it can later discard them if they are found to be 2353 unnecessary. We store the information in a field extending the 2354 regular ELF linker hash table. */ 2355 2356struct elf_sh_dyn_relocs 2357{ 2358 struct elf_sh_dyn_relocs *next; 2359 2360 /* The input section of the reloc. */ 2361 asection *sec; 2362 2363 /* Total number of relocs copied for the input section. */ 2364 bfd_size_type count; 2365 2366 /* Number of pc-relative relocs copied for the input section. */ 2367 bfd_size_type pc_count; 2368}; 2369 2370union gotref 2371{ 2372 bfd_signed_vma refcount; 2373 bfd_vma offset; 2374}; 2375 2376/* sh ELF linker hash entry. */ 2377 2378struct elf_sh_link_hash_entry 2379{ 2380 struct elf_link_hash_entry root; 2381 2382#ifdef INCLUDE_SHMEDIA 2383 union 2384 { 2385 bfd_signed_vma refcount; 2386 bfd_vma offset; 2387 } datalabel_got; 2388#endif 2389 2390 /* Track dynamic relocs copied for this symbol. */ 2391 struct elf_sh_dyn_relocs *dyn_relocs; 2392 2393 bfd_signed_vma gotplt_refcount; 2394 2395 /* A local function descriptor, for FDPIC. The refcount counts 2396 R_SH_FUNCDESC, R_SH_GOTOFFFUNCDESC, and R_SH_GOTOFFFUNCDESC20 2397 relocations; the PLT and GOT entry are accounted 2398 for separately. After adjust_dynamic_symbol, the offset is 2399 MINUS_ONE if there is no local descriptor (dynamic linker 2400 managed and no PLT entry, or undefined weak non-dynamic). 2401 During check_relocs we do not yet know whether the local 2402 descriptor will be canonical. */ 2403 union gotref funcdesc; 2404 2405 /* How many of the above refcounted relocations were R_SH_FUNCDESC, 2406 and thus require fixups or relocations. */ 2407 bfd_signed_vma abs_funcdesc_refcount; 2408 2409 enum got_type { 2410 GOT_UNKNOWN = 0, GOT_NORMAL, GOT_TLS_GD, GOT_TLS_IE, GOT_FUNCDESC 2411 } got_type; 2412}; 2413 2414#define sh_elf_hash_entry(ent) ((struct elf_sh_link_hash_entry *)(ent)) 2415 2416struct sh_elf_obj_tdata 2417{ 2418 struct elf_obj_tdata root; 2419 2420 /* got_type for each local got entry. */ 2421 char *local_got_type; 2422 2423 /* Function descriptor refcount and offset for each local symbol. */ 2424 union gotref *local_funcdesc; 2425}; 2426 2427#define sh_elf_tdata(abfd) \ 2428 ((struct sh_elf_obj_tdata *) (abfd)->tdata.any) 2429 2430#define sh_elf_local_got_type(abfd) \ 2431 (sh_elf_tdata (abfd)->local_got_type) 2432 2433#define sh_elf_local_funcdesc(abfd) \ 2434 (sh_elf_tdata (abfd)->local_funcdesc) 2435 2436#define is_sh_elf(bfd) \ 2437 (bfd_get_flavour (bfd) == bfd_target_elf_flavour \ 2438 && elf_tdata (bfd) != NULL \ 2439 && elf_object_id (bfd) == SH_ELF_DATA) 2440 2441/* Override the generic function because we need to store sh_elf_obj_tdata 2442 as the specific tdata. */ 2443 2444static bfd_boolean 2445sh_elf_mkobject (bfd *abfd) 2446{ 2447 return bfd_elf_allocate_object (abfd, sizeof (struct sh_elf_obj_tdata), 2448 SH_ELF_DATA); 2449} 2450 2451/* sh ELF linker hash table. */ 2452 2453struct elf_sh_link_hash_table 2454{ 2455 struct elf_link_hash_table root; 2456 2457 /* Short-cuts to get to dynamic linker sections. */ 2458 asection *sgot; 2459 asection *sgotplt; 2460 asection *srelgot; 2461 asection *splt; 2462 asection *srelplt; 2463 asection *sdynbss; 2464 asection *srelbss; 2465 asection *sfuncdesc; 2466 asection *srelfuncdesc; 2467 asection *srofixup; 2468 2469 /* The (unloaded but important) VxWorks .rela.plt.unloaded section. */ 2470 asection *srelplt2; 2471 2472 /* Small local sym cache. */ 2473 struct sym_cache sym_cache; 2474 2475 /* A counter or offset to track a TLS got entry. */ 2476 union 2477 { 2478 bfd_signed_vma refcount; 2479 bfd_vma offset; 2480 } tls_ldm_got; 2481 2482 /* The type of PLT to use. */ 2483 const struct elf_sh_plt_info *plt_info; 2484 2485 /* True if the target system is VxWorks. */ 2486 bfd_boolean vxworks_p; 2487 2488 /* True if the target system uses FDPIC. */ 2489 bfd_boolean fdpic_p; 2490}; 2491 2492/* Traverse an sh ELF linker hash table. */ 2493 2494#define sh_elf_link_hash_traverse(table, func, info) \ 2495 (elf_link_hash_traverse \ 2496 (&(table)->root, \ 2497 (bfd_boolean (*) (struct elf_link_hash_entry *, void *)) (func), \ 2498 (info))) 2499 2500/* Get the sh ELF linker hash table from a link_info structure. */ 2501 2502#define sh_elf_hash_table(p) \ 2503 (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \ 2504 == SH_ELF_DATA ? ((struct elf_sh_link_hash_table *) ((p)->hash)) : NULL) 2505 2506/* Create an entry in an sh ELF linker hash table. */ 2507 2508static struct bfd_hash_entry * 2509sh_elf_link_hash_newfunc (struct bfd_hash_entry *entry, 2510 struct bfd_hash_table *table, 2511 const char *string) 2512{ 2513 struct elf_sh_link_hash_entry *ret = 2514 (struct elf_sh_link_hash_entry *) entry; 2515 2516 /* Allocate the structure if it has not already been allocated by a 2517 subclass. */ 2518 if (ret == (struct elf_sh_link_hash_entry *) NULL) 2519 ret = ((struct elf_sh_link_hash_entry *) 2520 bfd_hash_allocate (table, 2521 sizeof (struct elf_sh_link_hash_entry))); 2522 if (ret == (struct elf_sh_link_hash_entry *) NULL) 2523 return (struct bfd_hash_entry *) ret; 2524 2525 /* Call the allocation method of the superclass. */ 2526 ret = ((struct elf_sh_link_hash_entry *) 2527 _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret, 2528 table, string)); 2529 if (ret != (struct elf_sh_link_hash_entry *) NULL) 2530 { 2531 ret->dyn_relocs = NULL; 2532 ret->gotplt_refcount = 0; 2533#ifdef INCLUDE_SHMEDIA 2534 ret->datalabel_got.refcount = ret->root.got.refcount; 2535#endif 2536 ret->funcdesc.refcount = 0; 2537 ret->abs_funcdesc_refcount = 0; 2538 ret->got_type = GOT_UNKNOWN; 2539 } 2540 2541 return (struct bfd_hash_entry *) ret; 2542} 2543 2544/* Create an sh ELF linker hash table. */ 2545 2546static struct bfd_link_hash_table * 2547sh_elf_link_hash_table_create (bfd *abfd) 2548{ 2549 struct elf_sh_link_hash_table *ret; 2550 bfd_size_type amt = sizeof (struct elf_sh_link_hash_table); 2551 2552 ret = (struct elf_sh_link_hash_table *) bfd_zmalloc (amt); 2553 if (ret == (struct elf_sh_link_hash_table *) NULL) 2554 return NULL; 2555 2556 if (!_bfd_elf_link_hash_table_init (&ret->root, abfd, 2557 sh_elf_link_hash_newfunc, 2558 sizeof (struct elf_sh_link_hash_entry), 2559 SH_ELF_DATA)) 2560 { 2561 free (ret); 2562 return NULL; 2563 } 2564 2565 ret->vxworks_p = vxworks_object_p (abfd); 2566 ret->fdpic_p = fdpic_object_p (abfd); 2567 2568 return &ret->root.root; 2569} 2570 2571static bfd_boolean 2572sh_elf_omit_section_dynsym (bfd *output_bfd ATTRIBUTE_UNUSED, 2573 struct bfd_link_info *info, asection *p) 2574{ 2575 struct elf_sh_link_hash_table *htab = sh_elf_hash_table (info); 2576 2577 /* Non-FDPIC binaries do not need dynamic symbols for sections. */ 2578 if (!htab->fdpic_p) 2579 return TRUE; 2580 2581 /* We need dynamic symbols for every section, since segments can 2582 relocate independently. */ 2583 switch (elf_section_data (p)->this_hdr.sh_type) 2584 { 2585 case SHT_PROGBITS: 2586 case SHT_NOBITS: 2587 /* If sh_type is yet undecided, assume it could be 2588 SHT_PROGBITS/SHT_NOBITS. */ 2589 case SHT_NULL: 2590 return FALSE; 2591 2592 /* There shouldn't be section relative relocations 2593 against any other section. */ 2594 default: 2595 return TRUE; 2596 } 2597} 2598 2599/* Create .got, .gotplt, and .rela.got sections in DYNOBJ, and set up 2600 shortcuts to them in our hash table. */ 2601 2602static bfd_boolean 2603create_got_section (bfd *dynobj, struct bfd_link_info *info) 2604{ 2605 struct elf_sh_link_hash_table *htab; 2606 2607 if (! _bfd_elf_create_got_section (dynobj, info)) 2608 return FALSE; 2609 2610 htab = sh_elf_hash_table (info); 2611 if (htab == NULL) 2612 return FALSE; 2613 2614 htab->sgot = bfd_get_linker_section (dynobj, ".got"); 2615 htab->sgotplt = bfd_get_linker_section (dynobj, ".got.plt"); 2616 htab->srelgot = bfd_get_linker_section (dynobj, ".rela.got"); 2617 if (! htab->sgot || ! htab->sgotplt || ! htab->srelgot) 2618 abort (); 2619 2620 htab->sfuncdesc = bfd_make_section_anyway_with_flags (dynobj, ".got.funcdesc", 2621 (SEC_ALLOC | SEC_LOAD 2622 | SEC_HAS_CONTENTS 2623 | SEC_IN_MEMORY 2624 | SEC_LINKER_CREATED)); 2625 if (htab->sfuncdesc == NULL 2626 || ! bfd_set_section_alignment (dynobj, htab->sfuncdesc, 2)) 2627 return FALSE; 2628 2629 htab->srelfuncdesc = bfd_make_section_anyway_with_flags (dynobj, 2630 ".rela.got.funcdesc", 2631 (SEC_ALLOC | SEC_LOAD 2632 | SEC_HAS_CONTENTS 2633 | SEC_IN_MEMORY 2634 | SEC_LINKER_CREATED 2635 | SEC_READONLY)); 2636 if (htab->srelfuncdesc == NULL 2637 || ! bfd_set_section_alignment (dynobj, htab->srelfuncdesc, 2)) 2638 return FALSE; 2639 2640 /* Also create .rofixup. */ 2641 htab->srofixup = bfd_make_section_anyway_with_flags (dynobj, ".rofixup", 2642 (SEC_ALLOC | SEC_LOAD 2643 | SEC_HAS_CONTENTS 2644 | SEC_IN_MEMORY 2645 | SEC_LINKER_CREATED 2646 | SEC_READONLY)); 2647 if (htab->srofixup == NULL 2648 || ! bfd_set_section_alignment (dynobj, htab->srofixup, 2)) 2649 return FALSE; 2650 2651 return TRUE; 2652} 2653 2654/* Create dynamic sections when linking against a dynamic object. */ 2655 2656static bfd_boolean 2657sh_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info) 2658{ 2659 struct elf_sh_link_hash_table *htab; 2660 flagword flags, pltflags; 2661 asection *s; 2662 const struct elf_backend_data *bed = get_elf_backend_data (abfd); 2663 int ptralign = 0; 2664 2665 switch (bed->s->arch_size) 2666 { 2667 case 32: 2668 ptralign = 2; 2669 break; 2670 2671 case 64: 2672 ptralign = 3; 2673 break; 2674 2675 default: 2676 bfd_set_error (bfd_error_bad_value); 2677 return FALSE; 2678 } 2679 2680 htab = sh_elf_hash_table (info); 2681 if (htab == NULL) 2682 return FALSE; 2683 2684 if (htab->root.dynamic_sections_created) 2685 return TRUE; 2686 2687 /* We need to create .plt, .rel[a].plt, .got, .got.plt, .dynbss, and 2688 .rel[a].bss sections. */ 2689 2690 flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY 2691 | SEC_LINKER_CREATED); 2692 2693 pltflags = flags; 2694 pltflags |= SEC_CODE; 2695 if (bed->plt_not_loaded) 2696 pltflags &= ~ (SEC_LOAD | SEC_HAS_CONTENTS); 2697 if (bed->plt_readonly) 2698 pltflags |= SEC_READONLY; 2699 2700 s = bfd_make_section_anyway_with_flags (abfd, ".plt", pltflags); 2701 htab->splt = s; 2702 if (s == NULL 2703 || ! bfd_set_section_alignment (abfd, s, bed->plt_alignment)) 2704 return FALSE; 2705 2706 if (bed->want_plt_sym) 2707 { 2708 /* Define the symbol _PROCEDURE_LINKAGE_TABLE_ at the start of the 2709 .plt section. */ 2710 struct elf_link_hash_entry *h; 2711 struct bfd_link_hash_entry *bh = NULL; 2712 2713 if (! (_bfd_generic_link_add_one_symbol 2714 (info, abfd, "_PROCEDURE_LINKAGE_TABLE_", BSF_GLOBAL, s, 2715 (bfd_vma) 0, (const char *) NULL, FALSE, 2716 get_elf_backend_data (abfd)->collect, &bh))) 2717 return FALSE; 2718 2719 h = (struct elf_link_hash_entry *) bh; 2720 h->def_regular = 1; 2721 h->type = STT_OBJECT; 2722 htab->root.hplt = h; 2723 2724 if (info->shared 2725 && ! bfd_elf_link_record_dynamic_symbol (info, h)) 2726 return FALSE; 2727 } 2728 2729 s = bfd_make_section_anyway_with_flags (abfd, 2730 bed->default_use_rela_p 2731 ? ".rela.plt" : ".rel.plt", 2732 flags | SEC_READONLY); 2733 htab->srelplt = s; 2734 if (s == NULL 2735 || ! bfd_set_section_alignment (abfd, s, ptralign)) 2736 return FALSE; 2737 2738 if (htab->sgot == NULL 2739 && !create_got_section (abfd, info)) 2740 return FALSE; 2741 2742 if (bed->want_dynbss) 2743 { 2744 /* The .dynbss section is a place to put symbols which are defined 2745 by dynamic objects, are referenced by regular objects, and are 2746 not functions. We must allocate space for them in the process 2747 image and use a R_*_COPY reloc to tell the dynamic linker to 2748 initialize them at run time. The linker script puts the .dynbss 2749 section into the .bss section of the final image. */ 2750 s = bfd_make_section_anyway_with_flags (abfd, ".dynbss", 2751 SEC_ALLOC | SEC_LINKER_CREATED); 2752 htab->sdynbss = s; 2753 if (s == NULL) 2754 return FALSE; 2755 2756 /* The .rel[a].bss section holds copy relocs. This section is not 2757 normally needed. We need to create it here, though, so that the 2758 linker will map it to an output section. We can't just create it 2759 only if we need it, because we will not know whether we need it 2760 until we have seen all the input files, and the first time the 2761 main linker code calls BFD after examining all the input files 2762 (size_dynamic_sections) the input sections have already been 2763 mapped to the output sections. If the section turns out not to 2764 be needed, we can discard it later. We will never need this 2765 section when generating a shared object, since they do not use 2766 copy relocs. */ 2767 if (! info->shared) 2768 { 2769 s = bfd_make_section_anyway_with_flags (abfd, 2770 (bed->default_use_rela_p 2771 ? ".rela.bss" : ".rel.bss"), 2772 flags | SEC_READONLY); 2773 htab->srelbss = s; 2774 if (s == NULL 2775 || ! bfd_set_section_alignment (abfd, s, ptralign)) 2776 return FALSE; 2777 } 2778 } 2779 2780 if (htab->vxworks_p) 2781 { 2782 if (!elf_vxworks_create_dynamic_sections (abfd, info, &htab->srelplt2)) 2783 return FALSE; 2784 } 2785 2786 return TRUE; 2787} 2788 2789/* Adjust a symbol defined by a dynamic object and referenced by a 2790 regular object. The current definition is in some section of the 2791 dynamic object, but we're not including those sections. We have to 2792 change the definition to something the rest of the link can 2793 understand. */ 2794 2795static bfd_boolean 2796sh_elf_adjust_dynamic_symbol (struct bfd_link_info *info, 2797 struct elf_link_hash_entry *h) 2798{ 2799 struct elf_sh_link_hash_table *htab; 2800 struct elf_sh_link_hash_entry *eh; 2801 struct elf_sh_dyn_relocs *p; 2802 asection *s; 2803 2804 htab = sh_elf_hash_table (info); 2805 if (htab == NULL) 2806 return FALSE; 2807 2808 /* Make sure we know what is going on here. */ 2809 BFD_ASSERT (htab->root.dynobj != NULL 2810 && (h->needs_plt 2811 || h->type == STT_GNU_IFUNC 2812 || h->u.weakdef != NULL 2813 || (h->def_dynamic 2814 && h->ref_regular 2815 && !h->def_regular))); 2816 2817 /* If this is a function, put it in the procedure linkage table. We 2818 will fill in the contents of the procedure linkage table later, 2819 when we know the address of the .got section. */ 2820 if ((h->type == STT_FUNC || h->type == STT_GNU_IFUNC) 2821 || h->needs_plt) 2822 { 2823 if (h->plt.refcount <= 0 2824 || SYMBOL_CALLS_LOCAL (info, h) 2825 || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT 2826 && h->root.type == bfd_link_hash_undefweak)) 2827 { 2828 /* This case can occur if we saw a PLT reloc in an input 2829 file, but the symbol was never referred to by a dynamic 2830 object. In such a case, we don't actually need to build 2831 a procedure linkage table, and we can just do a REL32 2832 reloc instead. */ 2833 h->plt.offset = (bfd_vma) -1; 2834 h->needs_plt = 0; 2835 } 2836 2837 return TRUE; 2838 } 2839 else 2840 h->plt.offset = (bfd_vma) -1; 2841 2842 /* If this is a weak symbol, and there is a real definition, the 2843 processor independent code will have arranged for us to see the 2844 real definition first, and we can just use the same value. */ 2845 if (h->u.weakdef != NULL) 2846 { 2847 BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined 2848 || h->u.weakdef->root.type == bfd_link_hash_defweak); 2849 h->root.u.def.section = h->u.weakdef->root.u.def.section; 2850 h->root.u.def.value = h->u.weakdef->root.u.def.value; 2851 if (info->nocopyreloc) 2852 h->non_got_ref = h->u.weakdef->non_got_ref; 2853 return TRUE; 2854 } 2855 2856 /* This is a reference to a symbol defined by a dynamic object which 2857 is not a function. */ 2858 2859 /* If we are creating a shared library, we must presume that the 2860 only references to the symbol are via the global offset table. 2861 For such cases we need not do anything here; the relocations will 2862 be handled correctly by relocate_section. */ 2863 if (info->shared) 2864 return TRUE; 2865 2866 /* If there are no references to this symbol that do not use the 2867 GOT, we don't need to generate a copy reloc. */ 2868 if (!h->non_got_ref) 2869 return TRUE; 2870 2871 /* If -z nocopyreloc was given, we won't generate them either. */ 2872 if (info->nocopyreloc) 2873 { 2874 h->non_got_ref = 0; 2875 return TRUE; 2876 } 2877 2878 eh = (struct elf_sh_link_hash_entry *) h; 2879 for (p = eh->dyn_relocs; p != NULL; p = p->next) 2880 { 2881 s = p->sec->output_section; 2882 if (s != NULL && (s->flags & (SEC_READONLY | SEC_HAS_CONTENTS)) != 0) 2883 break; 2884 } 2885 2886 /* If we didn't find any dynamic relocs in sections which needs the 2887 copy reloc, then we'll be keeping the dynamic relocs and avoiding 2888 the copy reloc. */ 2889 if (p == NULL) 2890 { 2891 h->non_got_ref = 0; 2892 return TRUE; 2893 } 2894 2895 /* We must allocate the symbol in our .dynbss section, which will 2896 become part of the .bss section of the executable. There will be 2897 an entry for this symbol in the .dynsym section. The dynamic 2898 object will contain position independent code, so all references 2899 from the dynamic object to this symbol will go through the global 2900 offset table. The dynamic linker will use the .dynsym entry to 2901 determine the address it must put in the global offset table, so 2902 both the dynamic object and the regular object will refer to the 2903 same memory location for the variable. */ 2904 2905 s = htab->sdynbss; 2906 BFD_ASSERT (s != NULL); 2907 2908 /* We must generate a R_SH_COPY reloc to tell the dynamic linker to 2909 copy the initial value out of the dynamic object and into the 2910 runtime process image. We need to remember the offset into the 2911 .rela.bss section we are going to use. */ 2912 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0) 2913 { 2914 asection *srel; 2915 2916 srel = htab->srelbss; 2917 BFD_ASSERT (srel != NULL); 2918 srel->size += sizeof (Elf32_External_Rela); 2919 h->needs_copy = 1; 2920 } 2921 2922 return _bfd_elf_adjust_dynamic_copy (h, s); 2923} 2924 2925/* Allocate space in .plt, .got and associated reloc sections for 2926 dynamic relocs. */ 2927 2928static bfd_boolean 2929allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf) 2930{ 2931 struct bfd_link_info *info; 2932 struct elf_sh_link_hash_table *htab; 2933 struct elf_sh_link_hash_entry *eh; 2934 struct elf_sh_dyn_relocs *p; 2935 2936 if (h->root.type == bfd_link_hash_indirect) 2937 return TRUE; 2938 2939 info = (struct bfd_link_info *) inf; 2940 htab = sh_elf_hash_table (info); 2941 if (htab == NULL) 2942 return FALSE; 2943 2944 eh = (struct elf_sh_link_hash_entry *) h; 2945 if ((h->got.refcount > 0 2946 || h->forced_local) 2947 && eh->gotplt_refcount > 0) 2948 { 2949 /* The symbol has been forced local, or we have some direct got refs, 2950 so treat all the gotplt refs as got refs. */ 2951 h->got.refcount += eh->gotplt_refcount; 2952 if (h->plt.refcount >= eh->gotplt_refcount) 2953 h->plt.refcount -= eh->gotplt_refcount; 2954 } 2955 2956 if (htab->root.dynamic_sections_created 2957 && h->plt.refcount > 0 2958 && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT 2959 || h->root.type != bfd_link_hash_undefweak)) 2960 { 2961 /* Make sure this symbol is output as a dynamic symbol. 2962 Undefined weak syms won't yet be marked as dynamic. */ 2963 if (h->dynindx == -1 2964 && !h->forced_local) 2965 { 2966 if (! bfd_elf_link_record_dynamic_symbol (info, h)) 2967 return FALSE; 2968 } 2969 2970 if (info->shared 2971 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h)) 2972 { 2973 asection *s = htab->splt; 2974 const struct elf_sh_plt_info *plt_info; 2975 2976 /* If this is the first .plt entry, make room for the special 2977 first entry. */ 2978 if (s->size == 0) 2979 s->size += htab->plt_info->plt0_entry_size; 2980 2981 h->plt.offset = s->size; 2982 2983 /* If this symbol is not defined in a regular file, and we are 2984 not generating a shared library, then set the symbol to this 2985 location in the .plt. This is required to make function 2986 pointers compare as equal between the normal executable and 2987 the shared library. Skip this for FDPIC, since the 2988 function's address will be the address of the canonical 2989 function descriptor. */ 2990 if (!htab->fdpic_p && !info->shared && !h->def_regular) 2991 { 2992 h->root.u.def.section = s; 2993 h->root.u.def.value = h->plt.offset; 2994 } 2995 2996 /* Make room for this entry. */ 2997 plt_info = htab->plt_info; 2998 if (plt_info->short_plt != NULL 2999 && (get_plt_index (plt_info->short_plt, s->size) < MAX_SHORT_PLT)) 3000 plt_info = plt_info->short_plt; 3001 s->size += plt_info->symbol_entry_size; 3002 3003 /* We also need to make an entry in the .got.plt section, which 3004 will be placed in the .got section by the linker script. */ 3005 if (!htab->fdpic_p) 3006 htab->sgotplt->size += 4; 3007 else 3008 htab->sgotplt->size += 8; 3009 3010 /* We also need to make an entry in the .rel.plt section. */ 3011 htab->srelplt->size += sizeof (Elf32_External_Rela); 3012 3013 if (htab->vxworks_p && !info->shared) 3014 { 3015 /* VxWorks executables have a second set of relocations 3016 for each PLT entry. They go in a separate relocation 3017 section, which is processed by the kernel loader. */ 3018 3019 /* There is a relocation for the initial PLT entry: 3020 an R_SH_DIR32 relocation for _GLOBAL_OFFSET_TABLE_. */ 3021 if (h->plt.offset == htab->plt_info->plt0_entry_size) 3022 htab->srelplt2->size += sizeof (Elf32_External_Rela); 3023 3024 /* There are two extra relocations for each subsequent 3025 PLT entry: an R_SH_DIR32 relocation for the GOT entry, 3026 and an R_SH_DIR32 relocation for the PLT entry. */ 3027 htab->srelplt2->size += sizeof (Elf32_External_Rela) * 2; 3028 } 3029 } 3030 else 3031 { 3032 h->plt.offset = (bfd_vma) -1; 3033 h->needs_plt = 0; 3034 } 3035 } 3036 else 3037 { 3038 h->plt.offset = (bfd_vma) -1; 3039 h->needs_plt = 0; 3040 } 3041 3042 if (h->got.refcount > 0) 3043 { 3044 asection *s; 3045 bfd_boolean dyn; 3046 enum got_type got_type = sh_elf_hash_entry (h)->got_type; 3047 3048 /* Make sure this symbol is output as a dynamic symbol. 3049 Undefined weak syms won't yet be marked as dynamic. */ 3050 if (h->dynindx == -1 3051 && !h->forced_local) 3052 { 3053 if (! bfd_elf_link_record_dynamic_symbol (info, h)) 3054 return FALSE; 3055 } 3056 3057 s = htab->sgot; 3058 h->got.offset = s->size; 3059 s->size += 4; 3060 /* R_SH_TLS_GD needs 2 consecutive GOT slots. */ 3061 if (got_type == GOT_TLS_GD) 3062 s->size += 4; 3063 dyn = htab->root.dynamic_sections_created; 3064 if (!dyn) 3065 { 3066 /* No dynamic relocations required. */ 3067 if (htab->fdpic_p && !info->shared 3068 && h->root.type != bfd_link_hash_undefweak 3069 && (got_type == GOT_NORMAL || got_type == GOT_FUNCDESC)) 3070 htab->srofixup->size += 4; 3071 } 3072 /* No dynamic relocations required when IE->LE conversion happens. */ 3073 else if (got_type == GOT_TLS_IE && !h->def_dynamic && !info->shared) 3074 ; 3075 /* R_SH_TLS_IE_32 needs one dynamic relocation if dynamic, 3076 R_SH_TLS_GD needs one if local symbol and two if global. */ 3077 else if ((got_type == GOT_TLS_GD && h->dynindx == -1) 3078 || got_type == GOT_TLS_IE) 3079 htab->srelgot->size += sizeof (Elf32_External_Rela); 3080 else if (got_type == GOT_TLS_GD) 3081 htab->srelgot->size += 2 * sizeof (Elf32_External_Rela); 3082 else if (got_type == GOT_FUNCDESC) 3083 { 3084 if (!info->shared && SYMBOL_FUNCDESC_LOCAL (info, h)) 3085 htab->srofixup->size += 4; 3086 else 3087 htab->srelgot->size += sizeof (Elf32_External_Rela); 3088 } 3089 else if ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT 3090 || h->root.type != bfd_link_hash_undefweak) 3091 && (info->shared 3092 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h))) 3093 htab->srelgot->size += sizeof (Elf32_External_Rela); 3094 else if (htab->fdpic_p && !info->shared && got_type == GOT_NORMAL 3095 && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT 3096 || h->root.type != bfd_link_hash_undefweak)) 3097 htab->srofixup->size += 4; 3098 } 3099 else 3100 h->got.offset = (bfd_vma) -1; 3101 3102#ifdef INCLUDE_SHMEDIA 3103 if (eh->datalabel_got.refcount > 0) 3104 { 3105 asection *s; 3106 bfd_boolean dyn; 3107 3108 /* Make sure this symbol is output as a dynamic symbol. 3109 Undefined weak syms won't yet be marked as dynamic. */ 3110 if (h->dynindx == -1 3111 && !h->forced_local) 3112 { 3113 if (! bfd_elf_link_record_dynamic_symbol (info, h)) 3114 return FALSE; 3115 } 3116 3117 s = htab->sgot; 3118 eh->datalabel_got.offset = s->size; 3119 s->size += 4; 3120 dyn = htab->root.dynamic_sections_created; 3121 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)) 3122 htab->srelgot->size += sizeof (Elf32_External_Rela); 3123 } 3124 else 3125 eh->datalabel_got.offset = (bfd_vma) -1; 3126#endif 3127 3128 /* Allocate space for any dynamic relocations to function 3129 descriptors, canonical or otherwise. We need to relocate the 3130 reference unless it resolves to zero, which only happens for 3131 undefined weak symbols (either non-default visibility, or when 3132 static linking). Any GOT slot is accounted for elsewhere. */ 3133 if (eh->abs_funcdesc_refcount > 0 3134 && (h->root.type != bfd_link_hash_undefweak 3135 || (htab->root.dynamic_sections_created 3136 && ! SYMBOL_CALLS_LOCAL (info, h)))) 3137 { 3138 if (!info->shared && SYMBOL_FUNCDESC_LOCAL (info, h)) 3139 htab->srofixup->size += eh->abs_funcdesc_refcount * 4; 3140 else 3141 htab->srelgot->size 3142 += eh->abs_funcdesc_refcount * sizeof (Elf32_External_Rela); 3143 } 3144 3145 /* We must allocate a function descriptor if there are references to 3146 a canonical descriptor (R_SH_GOTFUNCDESC or R_SH_FUNCDESC) and 3147 the dynamic linker isn't going to allocate it. None of this 3148 applies if we already created one in .got.plt, but if the 3149 canonical function descriptor can be in this object, there 3150 won't be a PLT entry at all. */ 3151 if ((eh->funcdesc.refcount > 0 3152 || (h->got.offset != MINUS_ONE && eh->got_type == GOT_FUNCDESC)) 3153 && h->root.type != bfd_link_hash_undefweak 3154 && SYMBOL_FUNCDESC_LOCAL (info, h)) 3155 { 3156 /* Make room for this function descriptor. */ 3157 eh->funcdesc.offset = htab->sfuncdesc->size; 3158 htab->sfuncdesc->size += 8; 3159 3160 /* We will need a relocation or two fixups to initialize the 3161 function descriptor, so allocate those too. */ 3162 if (!info->shared && SYMBOL_CALLS_LOCAL (info, h)) 3163 htab->srofixup->size += 8; 3164 else 3165 htab->srelfuncdesc->size += sizeof (Elf32_External_Rela); 3166 } 3167 3168 if (eh->dyn_relocs == NULL) 3169 return TRUE; 3170 3171 /* In the shared -Bsymbolic case, discard space allocated for 3172 dynamic pc-relative relocs against symbols which turn out to be 3173 defined in regular objects. For the normal shared case, discard 3174 space for pc-relative relocs that have become local due to symbol 3175 visibility changes. */ 3176 3177 if (info->shared) 3178 { 3179 if (SYMBOL_CALLS_LOCAL (info, h)) 3180 { 3181 struct elf_sh_dyn_relocs **pp; 3182 3183 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; ) 3184 { 3185 p->count -= p->pc_count; 3186 p->pc_count = 0; 3187 if (p->count == 0) 3188 *pp = p->next; 3189 else 3190 pp = &p->next; 3191 } 3192 } 3193 3194 if (htab->vxworks_p) 3195 { 3196 struct elf_sh_dyn_relocs **pp; 3197 3198 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; ) 3199 { 3200 if (strcmp (p->sec->output_section->name, ".tls_vars") == 0) 3201 *pp = p->next; 3202 else 3203 pp = &p->next; 3204 } 3205 } 3206 3207 /* Also discard relocs on undefined weak syms with non-default 3208 visibility. */ 3209 if (eh->dyn_relocs != NULL 3210 && h->root.type == bfd_link_hash_undefweak) 3211 { 3212 if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT) 3213 eh->dyn_relocs = NULL; 3214 3215 /* Make sure undefined weak symbols are output as a dynamic 3216 symbol in PIEs. */ 3217 else if (h->dynindx == -1 3218 && !h->forced_local) 3219 { 3220 if (! bfd_elf_link_record_dynamic_symbol (info, h)) 3221 return FALSE; 3222 } 3223 } 3224 } 3225 else 3226 { 3227 /* For the non-shared case, discard space for relocs against 3228 symbols which turn out to need copy relocs or are not 3229 dynamic. */ 3230 3231 if (!h->non_got_ref 3232 && ((h->def_dynamic 3233 && !h->def_regular) 3234 || (htab->root.dynamic_sections_created 3235 && (h->root.type == bfd_link_hash_undefweak 3236 || h->root.type == bfd_link_hash_undefined)))) 3237 { 3238 /* Make sure this symbol is output as a dynamic symbol. 3239 Undefined weak syms won't yet be marked as dynamic. */ 3240 if (h->dynindx == -1 3241 && !h->forced_local) 3242 { 3243 if (! bfd_elf_link_record_dynamic_symbol (info, h)) 3244 return FALSE; 3245 } 3246 3247 /* If that succeeded, we know we'll be keeping all the 3248 relocs. */ 3249 if (h->dynindx != -1) 3250 goto keep; 3251 } 3252 3253 eh->dyn_relocs = NULL; 3254 3255 keep: ; 3256 } 3257 3258 /* Finally, allocate space. */ 3259 for (p = eh->dyn_relocs; p != NULL; p = p->next) 3260 { 3261 asection *sreloc = elf_section_data (p->sec)->sreloc; 3262 sreloc->size += p->count * sizeof (Elf32_External_Rela); 3263 3264 /* If we need relocations, we do not need fixups. */ 3265 if (htab->fdpic_p && !info->shared) 3266 htab->srofixup->size -= 4 * (p->count - p->pc_count); 3267 } 3268 3269 return TRUE; 3270} 3271 3272/* Find any dynamic relocs that apply to read-only sections. */ 3273 3274static bfd_boolean 3275readonly_dynrelocs (struct elf_link_hash_entry *h, void *inf) 3276{ 3277 struct elf_sh_link_hash_entry *eh; 3278 struct elf_sh_dyn_relocs *p; 3279 3280 eh = (struct elf_sh_link_hash_entry *) h; 3281 for (p = eh->dyn_relocs; p != NULL; p = p->next) 3282 { 3283 asection *s = p->sec->output_section; 3284 3285 if (s != NULL && (s->flags & SEC_READONLY) != 0) 3286 { 3287 struct bfd_link_info *info = (struct bfd_link_info *) inf; 3288 3289 if (info->warn_shared_textrel) 3290 (*_bfd_error_handler) 3291 (_("warning: dynamic relocation in readonly section `%s'"), 3292 h->root.root.string); 3293 info->flags |= DF_TEXTREL; 3294 3295 /* Not an error, just cut short the traversal. */ 3296 return FALSE; 3297 } 3298 } 3299 return TRUE; 3300} 3301 3302/* This function is called after all the input files have been read, 3303 and the input sections have been assigned to output sections. 3304 It's a convenient place to determine the PLT style. */ 3305 3306static bfd_boolean 3307sh_elf_always_size_sections (bfd *output_bfd, struct bfd_link_info *info) 3308{ 3309 sh_elf_hash_table (info)->plt_info = get_plt_info (output_bfd, info->shared); 3310 3311 if (sh_elf_hash_table (info)->fdpic_p && !info->relocatable) 3312 { 3313 struct elf_link_hash_entry *h; 3314 3315 /* Force a PT_GNU_STACK segment to be created. */ 3316 if (! elf_tdata (output_bfd)->stack_flags) 3317 elf_tdata (output_bfd)->stack_flags = PF_R | PF_W | PF_X; 3318 3319 /* Define __stacksize if it's not defined yet. */ 3320 h = elf_link_hash_lookup (elf_hash_table (info), "__stacksize", 3321 FALSE, FALSE, FALSE); 3322 if (! h || h->root.type != bfd_link_hash_defined 3323 || h->type != STT_OBJECT 3324 || !h->def_regular) 3325 { 3326 struct bfd_link_hash_entry *bh = NULL; 3327 3328 if (!(_bfd_generic_link_add_one_symbol 3329 (info, output_bfd, "__stacksize", 3330 BSF_GLOBAL, bfd_abs_section_ptr, DEFAULT_STACK_SIZE, 3331 (const char *) NULL, FALSE, 3332 get_elf_backend_data (output_bfd)->collect, &bh))) 3333 return FALSE; 3334 3335 h = (struct elf_link_hash_entry *) bh; 3336 h->def_regular = 1; 3337 h->type = STT_OBJECT; 3338 } 3339 } 3340 return TRUE; 3341} 3342 3343#if !defined INCLUDE_SHMEDIA && !defined SH_TARGET_ALREADY_DEFINED 3344 3345static bfd_boolean 3346sh_elf_modify_program_headers (bfd *output_bfd, struct bfd_link_info *info) 3347{ 3348 struct elf_obj_tdata *tdata = elf_tdata (output_bfd); 3349 struct elf_segment_map *m; 3350 Elf_Internal_Phdr *p; 3351 3352 /* objcopy and strip preserve what's already there using 3353 sh_elf_copy_private_bfd_data (). */ 3354 if (! info) 3355 return TRUE; 3356 3357 for (p = tdata->phdr, m = tdata->segment_map; m != NULL; m = m->next, p++) 3358 if (m->p_type == PT_GNU_STACK) 3359 break; 3360 3361 if (m) 3362 { 3363 struct elf_link_hash_entry *h; 3364 3365 /* Obtain the pointer to the __stacksize symbol. */ 3366 h = elf_link_hash_lookup (elf_hash_table (info), "__stacksize", 3367 FALSE, FALSE, FALSE); 3368 if (h) 3369 { 3370 while (h->root.type == bfd_link_hash_indirect 3371 || h->root.type == bfd_link_hash_warning) 3372 h = (struct elf_link_hash_entry *) h->root.u.i.link; 3373 BFD_ASSERT (h->root.type == bfd_link_hash_defined); 3374 } 3375 3376 /* Set the header p_memsz from the symbol value. We 3377 intentionally ignore the symbol section. */ 3378 if (h && h->root.type == bfd_link_hash_defined) 3379 p->p_memsz = h->root.u.def.value; 3380 else 3381 p->p_memsz = DEFAULT_STACK_SIZE; 3382 3383 p->p_align = 8; 3384 } 3385 3386 return TRUE; 3387} 3388 3389#endif 3390 3391/* Set the sizes of the dynamic sections. */ 3392 3393static bfd_boolean 3394sh_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, 3395 struct bfd_link_info *info) 3396{ 3397 struct elf_sh_link_hash_table *htab; 3398 bfd *dynobj; 3399 asection *s; 3400 bfd_boolean relocs; 3401 bfd *ibfd; 3402 3403 htab = sh_elf_hash_table (info); 3404 if (htab == NULL) 3405 return FALSE; 3406 3407 dynobj = htab->root.dynobj; 3408 BFD_ASSERT (dynobj != NULL); 3409 3410 if (htab->root.dynamic_sections_created) 3411 { 3412 /* Set the contents of the .interp section to the interpreter. */ 3413 if (info->executable) 3414 { 3415 s = bfd_get_linker_section (dynobj, ".interp"); 3416 BFD_ASSERT (s != NULL); 3417 s->size = sizeof ELF_DYNAMIC_INTERPRETER; 3418 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER; 3419 } 3420 } 3421 3422 /* Set up .got offsets for local syms, and space for local dynamic 3423 relocs. */ 3424 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next) 3425 { 3426 bfd_signed_vma *local_got; 3427 bfd_signed_vma *end_local_got; 3428 union gotref *local_funcdesc, *end_local_funcdesc; 3429 char *local_got_type; 3430 bfd_size_type locsymcount; 3431 Elf_Internal_Shdr *symtab_hdr; 3432 asection *srel; 3433 3434 if (! is_sh_elf (ibfd)) 3435 continue; 3436 3437 for (s = ibfd->sections; s != NULL; s = s->next) 3438 { 3439 struct elf_sh_dyn_relocs *p; 3440 3441 for (p = ((struct elf_sh_dyn_relocs *) 3442 elf_section_data (s)->local_dynrel); 3443 p != NULL; 3444 p = p->next) 3445 { 3446 if (! bfd_is_abs_section (p->sec) 3447 && bfd_is_abs_section (p->sec->output_section)) 3448 { 3449 /* Input section has been discarded, either because 3450 it is a copy of a linkonce section or due to 3451 linker script /DISCARD/, so we'll be discarding 3452 the relocs too. */ 3453 } 3454 else if (htab->vxworks_p 3455 && strcmp (p->sec->output_section->name, 3456 ".tls_vars") == 0) 3457 { 3458 /* Relocations in vxworks .tls_vars sections are 3459 handled specially by the loader. */ 3460 } 3461 else if (p->count != 0) 3462 { 3463 srel = elf_section_data (p->sec)->sreloc; 3464 srel->size += p->count * sizeof (Elf32_External_Rela); 3465 if ((p->sec->output_section->flags & SEC_READONLY) != 0) 3466 info->flags |= DF_TEXTREL; 3467 3468 /* If we need relocations, we do not need fixups. */ 3469 if (htab->fdpic_p && !info->shared) 3470 htab->srofixup->size -= 4 * (p->count - p->pc_count); 3471 } 3472 } 3473 } 3474 3475 symtab_hdr = &elf_symtab_hdr (ibfd); 3476 locsymcount = symtab_hdr->sh_info; 3477#ifdef INCLUDE_SHMEDIA 3478 /* Count datalabel local GOT. */ 3479 locsymcount *= 2; 3480#endif 3481 s = htab->sgot; 3482 srel = htab->srelgot; 3483 3484 local_got = elf_local_got_refcounts (ibfd); 3485 if (local_got) 3486 { 3487 end_local_got = local_got + locsymcount; 3488 local_got_type = sh_elf_local_got_type (ibfd); 3489 local_funcdesc = sh_elf_local_funcdesc (ibfd); 3490 for (; local_got < end_local_got; ++local_got) 3491 { 3492 if (*local_got > 0) 3493 { 3494 *local_got = s->size; 3495 s->size += 4; 3496 if (*local_got_type == GOT_TLS_GD) 3497 s->size += 4; 3498 if (info->shared) 3499 srel->size += sizeof (Elf32_External_Rela); 3500 else 3501 htab->srofixup->size += 4; 3502 3503 if (*local_got_type == GOT_FUNCDESC) 3504 { 3505 if (local_funcdesc == NULL) 3506 { 3507 bfd_size_type size; 3508 3509 size = locsymcount * sizeof (union gotref); 3510 local_funcdesc = (union gotref *) bfd_zalloc (ibfd, 3511 size); 3512 if (local_funcdesc == NULL) 3513 return FALSE; 3514 sh_elf_local_funcdesc (ibfd) = local_funcdesc; 3515 local_funcdesc += (local_got 3516 - elf_local_got_refcounts (ibfd)); 3517 } 3518 local_funcdesc->refcount++; 3519 ++local_funcdesc; 3520 } 3521 } 3522 else 3523 *local_got = (bfd_vma) -1; 3524 ++local_got_type; 3525 } 3526 } 3527 3528 local_funcdesc = sh_elf_local_funcdesc (ibfd); 3529 if (local_funcdesc) 3530 { 3531 end_local_funcdesc = local_funcdesc + locsymcount; 3532 3533 for (; local_funcdesc < end_local_funcdesc; ++local_funcdesc) 3534 { 3535 if (local_funcdesc->refcount > 0) 3536 { 3537 local_funcdesc->offset = htab->sfuncdesc->size; 3538 htab->sfuncdesc->size += 8; 3539 if (!info->shared) 3540 htab->srofixup->size += 8; 3541 else 3542 htab->srelfuncdesc->size += sizeof (Elf32_External_Rela); 3543 } 3544 else 3545 local_funcdesc->offset = MINUS_ONE; 3546 } 3547 } 3548 3549 } 3550 3551 if (htab->tls_ldm_got.refcount > 0) 3552 { 3553 /* Allocate 2 got entries and 1 dynamic reloc for R_SH_TLS_LD_32 3554 relocs. */ 3555 htab->tls_ldm_got.offset = htab->sgot->size; 3556 htab->sgot->size += 8; 3557 htab->srelgot->size += sizeof (Elf32_External_Rela); 3558 } 3559 else 3560 htab->tls_ldm_got.offset = -1; 3561 3562 /* Only the reserved entries should be present. For FDPIC, they go at 3563 the end of .got.plt. */ 3564 if (htab->fdpic_p) 3565 { 3566 BFD_ASSERT (htab->sgotplt && htab->sgotplt->size == 12); 3567 htab->sgotplt->size = 0; 3568 } 3569 3570 /* Allocate global sym .plt and .got entries, and space for global 3571 sym dynamic relocs. */ 3572 elf_link_hash_traverse (&htab->root, allocate_dynrelocs, info); 3573 3574 /* Move the reserved entries and the _GLOBAL_OFFSET_TABLE_ symbol to the 3575 end of the FDPIC .got.plt. */ 3576 if (htab->fdpic_p) 3577 { 3578 htab->root.hgot->root.u.def.value = htab->sgotplt->size; 3579 htab->sgotplt->size += 12; 3580 } 3581 3582 /* At the very end of the .rofixup section is a pointer to the GOT. */ 3583 if (htab->fdpic_p && htab->srofixup != NULL) 3584 htab->srofixup->size += 4; 3585 3586 /* We now have determined the sizes of the various dynamic sections. 3587 Allocate memory for them. */ 3588 relocs = FALSE; 3589 for (s = dynobj->sections; s != NULL; s = s->next) 3590 { 3591 if ((s->flags & SEC_LINKER_CREATED) == 0) 3592 continue; 3593 3594 if (s == htab->splt 3595 || s == htab->sgot 3596 || s == htab->sgotplt 3597 || s == htab->sfuncdesc 3598 || s == htab->srofixup 3599 || s == htab->sdynbss) 3600 { 3601 /* Strip this section if we don't need it; see the 3602 comment below. */ 3603 } 3604 else if (CONST_STRNEQ (bfd_get_section_name (dynobj, s), ".rela")) 3605 { 3606 if (s->size != 0 && s != htab->srelplt && s != htab->srelplt2) 3607 relocs = TRUE; 3608 3609 /* We use the reloc_count field as a counter if we need 3610 to copy relocs into the output file. */ 3611 s->reloc_count = 0; 3612 } 3613 else 3614 { 3615 /* It's not one of our sections, so don't allocate space. */ 3616 continue; 3617 } 3618 3619 if (s->size == 0) 3620 { 3621 /* If we don't need this section, strip it from the 3622 output file. This is mostly to handle .rela.bss and 3623 .rela.plt. We must create both sections in 3624 create_dynamic_sections, because they must be created 3625 before the linker maps input sections to output 3626 sections. The linker does that before 3627 adjust_dynamic_symbol is called, and it is that 3628 function which decides whether anything needs to go 3629 into these sections. */ 3630 3631 s->flags |= SEC_EXCLUDE; 3632 continue; 3633 } 3634 3635 if ((s->flags & SEC_HAS_CONTENTS) == 0) 3636 continue; 3637 3638 /* Allocate memory for the section contents. We use bfd_zalloc 3639 here in case unused entries are not reclaimed before the 3640 section's contents are written out. This should not happen, 3641 but this way if it does, we get a R_SH_NONE reloc instead 3642 of garbage. */ 3643 s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size); 3644 if (s->contents == NULL) 3645 return FALSE; 3646 } 3647 3648 if (htab->root.dynamic_sections_created) 3649 { 3650 /* Add some entries to the .dynamic section. We fill in the 3651 values later, in sh_elf_finish_dynamic_sections, but we 3652 must add the entries now so that we get the correct size for 3653 the .dynamic section. The DT_DEBUG entry is filled in by the 3654 dynamic linker and used by the debugger. */ 3655#define add_dynamic_entry(TAG, VAL) \ 3656 _bfd_elf_add_dynamic_entry (info, TAG, VAL) 3657 3658 if (info->executable) 3659 { 3660 if (! add_dynamic_entry (DT_DEBUG, 0)) 3661 return FALSE; 3662 } 3663 3664 if (htab->splt->size != 0) 3665 { 3666 if (! add_dynamic_entry (DT_PLTGOT, 0) 3667 || ! add_dynamic_entry (DT_PLTRELSZ, 0) 3668 || ! add_dynamic_entry (DT_PLTREL, DT_RELA) 3669 || ! add_dynamic_entry (DT_JMPREL, 0)) 3670 return FALSE; 3671 } 3672 else if ((elf_elfheader (output_bfd)->e_flags & EF_SH_FDPIC) 3673 && htab->sgot->size != 0) 3674 { 3675 if (! add_dynamic_entry (DT_PLTGOT, 0)) 3676 return FALSE; 3677 } 3678 3679 if (relocs) 3680 { 3681 if (! add_dynamic_entry (DT_RELA, 0) 3682 || ! add_dynamic_entry (DT_RELASZ, 0) 3683 || ! add_dynamic_entry (DT_RELAENT, 3684 sizeof (Elf32_External_Rela))) 3685 return FALSE; 3686 3687 /* If any dynamic relocs apply to a read-only section, 3688 then we need a DT_TEXTREL entry. */ 3689 if ((info->flags & DF_TEXTREL) == 0) 3690 elf_link_hash_traverse (&htab->root, readonly_dynrelocs, info); 3691 3692 if ((info->flags & DF_TEXTREL) != 0) 3693 { 3694 if (! add_dynamic_entry (DT_TEXTREL, 0)) 3695 return FALSE; 3696 } 3697 } 3698 if (htab->vxworks_p 3699 && !elf_vxworks_add_dynamic_entries (output_bfd, info)) 3700 return FALSE; 3701 } 3702#undef add_dynamic_entry 3703 3704 return TRUE; 3705} 3706 3707/* Add a dynamic relocation to the SRELOC section. */ 3708 3709inline static bfd_vma 3710sh_elf_add_dyn_reloc (bfd *output_bfd, asection *sreloc, bfd_vma offset, 3711 int reloc_type, long dynindx, bfd_vma addend) 3712{ 3713 Elf_Internal_Rela outrel; 3714 bfd_vma reloc_offset; 3715 3716 outrel.r_offset = offset; 3717 outrel.r_info = ELF32_R_INFO (dynindx, reloc_type); 3718 outrel.r_addend = addend; 3719 3720 reloc_offset = sreloc->reloc_count * sizeof (Elf32_External_Rela); 3721 BFD_ASSERT (reloc_offset < sreloc->size); 3722 bfd_elf32_swap_reloca_out (output_bfd, &outrel, 3723 sreloc->contents + reloc_offset); 3724 sreloc->reloc_count++; 3725 3726 return reloc_offset; 3727} 3728 3729/* Add an FDPIC read-only fixup. */ 3730 3731inline static void 3732sh_elf_add_rofixup (bfd *output_bfd, asection *srofixup, bfd_vma offset) 3733{ 3734 bfd_vma fixup_offset; 3735 3736 fixup_offset = srofixup->reloc_count++ * 4; 3737 BFD_ASSERT (fixup_offset < srofixup->size); 3738 bfd_put_32 (output_bfd, offset, srofixup->contents + fixup_offset); 3739} 3740 3741/* Return the offset of the generated .got section from the 3742 _GLOBAL_OFFSET_TABLE_ symbol. */ 3743 3744static bfd_signed_vma 3745sh_elf_got_offset (struct elf_sh_link_hash_table *htab) 3746{ 3747 return (htab->sgot->output_offset - htab->sgotplt->output_offset 3748 - htab->root.hgot->root.u.def.value); 3749} 3750 3751/* Find the segment number in which OSEC, and output section, is 3752 located. */ 3753 3754static unsigned 3755sh_elf_osec_to_segment (bfd *output_bfd, asection *osec) 3756{ 3757 Elf_Internal_Phdr *p = NULL; 3758 3759 if (output_bfd->xvec->flavour == bfd_target_elf_flavour) 3760 p = _bfd_elf_find_segment_containing_section (output_bfd, osec); 3761 3762 /* FIXME: Nothing ever says what this index is relative to. The kernel 3763 supplies data in terms of the number of load segments but this is 3764 a phdr index and the first phdr may not be a load segment. */ 3765 return (p != NULL) ? p - elf_tdata (output_bfd)->phdr : -1; 3766} 3767 3768static bfd_boolean 3769sh_elf_osec_readonly_p (bfd *output_bfd, asection *osec) 3770{ 3771 unsigned seg = sh_elf_osec_to_segment (output_bfd, osec); 3772 3773 return (seg != (unsigned) -1 3774 && ! (elf_tdata (output_bfd)->phdr[seg].p_flags & PF_W)); 3775} 3776 3777/* Generate the initial contents of a local function descriptor, along 3778 with any relocations or fixups required. */ 3779static bfd_boolean 3780sh_elf_initialize_funcdesc (bfd *output_bfd, 3781 struct bfd_link_info *info, 3782 struct elf_link_hash_entry *h, 3783 bfd_vma offset, 3784 asection *section, 3785 bfd_vma value) 3786{ 3787 struct elf_sh_link_hash_table *htab; 3788 int dynindx; 3789 bfd_vma addr, seg; 3790 3791 htab = sh_elf_hash_table (info); 3792 3793 /* FIXME: The ABI says that the offset to the function goes in the 3794 descriptor, along with the segment index. We're RELA, so it could 3795 go in the reloc instead... */ 3796 3797 if (h != NULL && SYMBOL_CALLS_LOCAL (info, h)) 3798 { 3799 section = h->root.u.def.section; 3800 value = h->root.u.def.value; 3801 } 3802 3803 if (h == NULL || SYMBOL_CALLS_LOCAL (info, h)) 3804 { 3805 dynindx = elf_section_data (section->output_section)->dynindx; 3806 addr = value + section->output_offset; 3807 seg = sh_elf_osec_to_segment (output_bfd, section->output_section); 3808 } 3809 else 3810 { 3811 BFD_ASSERT (h->dynindx != -1); 3812 dynindx = h->dynindx; 3813 addr = seg = 0; 3814 } 3815 3816 if (!info->shared && SYMBOL_CALLS_LOCAL (info, h)) 3817 { 3818 if (h == NULL || h->root.type != bfd_link_hash_undefweak) 3819 { 3820 sh_elf_add_rofixup (output_bfd, htab->srofixup, 3821 offset 3822 + htab->sfuncdesc->output_section->vma 3823 + htab->sfuncdesc->output_offset); 3824 sh_elf_add_rofixup (output_bfd, htab->srofixup, 3825 offset + 4 3826 + htab->sfuncdesc->output_section->vma 3827 + htab->sfuncdesc->output_offset); 3828 } 3829 3830 /* There are no dynamic relocations so fill in the final 3831 address and gp value (barring fixups). */ 3832 addr += section->output_section->vma; 3833 seg = htab->root.hgot->root.u.def.value 3834 + htab->root.hgot->root.u.def.section->output_section->vma 3835 + htab->root.hgot->root.u.def.section->output_offset; 3836 } 3837 else 3838 sh_elf_add_dyn_reloc (output_bfd, htab->srelfuncdesc, 3839 offset 3840 + htab->sfuncdesc->output_section->vma 3841 + htab->sfuncdesc->output_offset, 3842 R_SH_FUNCDESC_VALUE, dynindx, 0); 3843 3844 bfd_put_32 (output_bfd, addr, htab->sfuncdesc->contents + offset); 3845 bfd_put_32 (output_bfd, seg, htab->sfuncdesc->contents + offset + 4); 3846 3847 return TRUE; 3848} 3849 3850/* Install a 20-bit movi20 field starting at ADDR, which occurs in OUTPUT_BFD. 3851 VALUE is the field's value. Return bfd_reloc_ok if successful or an error 3852 otherwise. */ 3853 3854static bfd_reloc_status_type 3855install_movi20_field (bfd *output_bfd, unsigned long relocation, 3856 bfd *input_bfd, asection *input_section, 3857 bfd_byte *contents, bfd_vma offset) 3858{ 3859 unsigned long cur_val; 3860 bfd_byte *addr; 3861 bfd_reloc_status_type r; 3862 3863 if (offset > bfd_get_section_limit (input_bfd, input_section)) 3864 return bfd_reloc_outofrange; 3865 3866 r = bfd_check_overflow (complain_overflow_signed, 20, 0, 3867 bfd_arch_bits_per_address (input_bfd), relocation); 3868 if (r != bfd_reloc_ok) 3869 return r; 3870 3871 addr = contents + offset; 3872 cur_val = bfd_get_16 (output_bfd, addr); 3873 bfd_put_16 (output_bfd, cur_val | ((relocation & 0xf0000) >> 12), addr); 3874 bfd_put_16 (output_bfd, relocation & 0xffff, addr + 2); 3875 3876 return bfd_reloc_ok; 3877} 3878 3879/* Relocate an SH ELF section. */ 3880 3881static bfd_boolean 3882sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, 3883 bfd *input_bfd, asection *input_section, 3884 bfd_byte *contents, Elf_Internal_Rela *relocs, 3885 Elf_Internal_Sym *local_syms, 3886 asection **local_sections) 3887{ 3888 struct elf_sh_link_hash_table *htab; 3889 Elf_Internal_Shdr *symtab_hdr; 3890 struct elf_link_hash_entry **sym_hashes; 3891 Elf_Internal_Rela *rel, *relend; 3892 bfd *dynobj = NULL; 3893 bfd_vma *local_got_offsets; 3894 asection *sgot = NULL; 3895 asection *sgotplt = NULL; 3896 asection *splt = NULL; 3897 asection *sreloc = NULL; 3898 asection *srelgot = NULL; 3899 bfd_boolean is_vxworks_tls; 3900 unsigned isec_segment, got_segment, plt_segment, check_segment[2]; 3901 bfd_boolean fdpic_p = FALSE; 3902 3903 BFD_ASSERT (is_sh_elf (input_bfd)); 3904 3905 htab = sh_elf_hash_table (info); 3906 if (htab != NULL) 3907 { 3908 dynobj = htab->root.dynobj; 3909 sgot = htab->sgot; 3910 sgotplt = htab->sgotplt; 3911 splt = htab->splt; 3912 fdpic_p = htab->fdpic_p; 3913 } 3914 symtab_hdr = &elf_symtab_hdr (input_bfd); 3915 sym_hashes = elf_sym_hashes (input_bfd); 3916 local_got_offsets = elf_local_got_offsets (input_bfd); 3917 3918 isec_segment = sh_elf_osec_to_segment (output_bfd, 3919 input_section->output_section); 3920 if (fdpic_p && sgot) 3921 got_segment = sh_elf_osec_to_segment (output_bfd, 3922 sgot->output_section); 3923 else 3924 got_segment = -1; 3925 if (fdpic_p && splt) 3926 plt_segment = sh_elf_osec_to_segment (output_bfd, 3927 splt->output_section); 3928 else 3929 plt_segment = -1; 3930 3931 /* We have to handle relocations in vxworks .tls_vars sections 3932 specially, because the dynamic loader is 'weird'. */ 3933 is_vxworks_tls = (htab && htab->vxworks_p && info->shared 3934 && !strcmp (input_section->output_section->name, 3935 ".tls_vars")); 3936 3937 rel = relocs; 3938 relend = relocs + input_section->reloc_count; 3939 for (; rel < relend; rel++) 3940 { 3941 int r_type; 3942 reloc_howto_type *howto; 3943 unsigned long r_symndx; 3944 Elf_Internal_Sym *sym; 3945 asection *sec; 3946 struct elf_link_hash_entry *h; 3947 bfd_vma relocation; 3948 bfd_vma addend = (bfd_vma) 0; 3949 bfd_reloc_status_type r; 3950 int seen_stt_datalabel = 0; 3951 bfd_vma off; 3952 enum got_type got_type; 3953 const char *symname = NULL; 3954 3955 r_symndx = ELF32_R_SYM (rel->r_info); 3956 3957 r_type = ELF32_R_TYPE (rel->r_info); 3958 3959 /* Many of the relocs are only used for relaxing, and are 3960 handled entirely by the relaxation code. */ 3961 if (r_type >= (int) R_SH_GNU_VTINHERIT 3962 && r_type <= (int) R_SH_LABEL) 3963 continue; 3964 if (r_type == (int) R_SH_NONE) 3965 continue; 3966 3967 if (r_type < 0 3968 || r_type >= R_SH_max 3969 || (r_type >= (int) R_SH_FIRST_INVALID_RELOC 3970 && r_type <= (int) R_SH_LAST_INVALID_RELOC) 3971 || (r_type >= (int) R_SH_FIRST_INVALID_RELOC_2 3972 && r_type <= (int) R_SH_LAST_INVALID_RELOC_2) 3973 || ( r_type >= (int) R_SH_FIRST_INVALID_RELOC_3 3974 && r_type <= (int) R_SH_LAST_INVALID_RELOC_3) 3975 || ( r_type >= (int) R_SH_FIRST_INVALID_RELOC_4 3976 && r_type <= (int) R_SH_LAST_INVALID_RELOC_4) 3977 || ( r_type >= (int) R_SH_FIRST_INVALID_RELOC_5 3978 && r_type <= (int) R_SH_LAST_INVALID_RELOC_5) 3979 || ( r_type >= (int) R_SH_FIRST_INVALID_RELOC_6 3980 && r_type <= (int) R_SH_LAST_INVALID_RELOC_6)) 3981 { 3982 bfd_set_error (bfd_error_bad_value); 3983 return FALSE; 3984 } 3985 3986 howto = get_howto_table (output_bfd) + r_type; 3987 3988 /* For relocs that aren't partial_inplace, we get the addend from 3989 the relocation. */ 3990 if (! howto->partial_inplace) 3991 addend = rel->r_addend; 3992 3993 h = NULL; 3994 sym = NULL; 3995 sec = NULL; 3996 check_segment[0] = -1; 3997 check_segment[1] = -1; 3998 if (r_symndx < symtab_hdr->sh_info) 3999 { 4000 sym = local_syms + r_symndx; 4001 sec = local_sections[r_symndx]; 4002 4003 symname = bfd_elf_string_from_elf_section 4004 (input_bfd, symtab_hdr->sh_link, sym->st_name); 4005 if (symname == NULL || *symname == '\0') 4006 symname = bfd_section_name (input_bfd, sec); 4007 4008 relocation = (sec->output_section->vma 4009 + sec->output_offset 4010 + sym->st_value); 4011 /* A local symbol never has STO_SH5_ISA32, so we don't need 4012 datalabel processing here. Make sure this does not change 4013 without notice. */ 4014 if ((sym->st_other & STO_SH5_ISA32) != 0) 4015 ((*info->callbacks->reloc_dangerous) 4016 (info, 4017 _("Unexpected STO_SH5_ISA32 on local symbol is not handled"), 4018 input_bfd, input_section, rel->r_offset)); 4019 4020 if (sec != NULL && discarded_section (sec)) 4021 /* Handled below. */ 4022 ; 4023 else if (info->relocatable) 4024 { 4025 /* This is a relocatable link. We don't have to change 4026 anything, unless the reloc is against a section symbol, 4027 in which case we have to adjust according to where the 4028 section symbol winds up in the output section. */ 4029 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION) 4030 { 4031 if (! howto->partial_inplace) 4032 { 4033 /* For relocations with the addend in the 4034 relocation, we need just to update the addend. 4035 All real relocs are of type partial_inplace; this 4036 code is mostly for completeness. */ 4037 rel->r_addend += sec->output_offset; 4038 4039 continue; 4040 } 4041 4042 /* Relocs of type partial_inplace need to pick up the 4043 contents in the contents and add the offset resulting 4044 from the changed location of the section symbol. 4045 Using _bfd_final_link_relocate (e.g. goto 4046 final_link_relocate) here would be wrong, because 4047 relocations marked pc_relative would get the current 4048 location subtracted, and we must only do that at the 4049 final link. */ 4050 r = _bfd_relocate_contents (howto, input_bfd, 4051 sec->output_offset 4052 + sym->st_value, 4053 contents + rel->r_offset); 4054 goto relocation_done; 4055 } 4056 4057 continue; 4058 } 4059 else if (! howto->partial_inplace) 4060 { 4061 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); 4062 addend = rel->r_addend; 4063 } 4064 else if ((sec->flags & SEC_MERGE) 4065 && ELF_ST_TYPE (sym->st_info) == STT_SECTION) 4066 { 4067 asection *msec; 4068 4069 if (howto->rightshift || howto->src_mask != 0xffffffff) 4070 { 4071 (*_bfd_error_handler) 4072 (_("%B(%A+0x%lx): %s relocation against SEC_MERGE section"), 4073 input_bfd, input_section, 4074 (long) rel->r_offset, howto->name); 4075 return FALSE; 4076 } 4077 4078 addend = bfd_get_32 (input_bfd, contents + rel->r_offset); 4079 msec = sec; 4080 addend = 4081 _bfd_elf_rel_local_sym (output_bfd, sym, &msec, addend) 4082 - relocation; 4083 addend += msec->output_section->vma + msec->output_offset; 4084 bfd_put_32 (input_bfd, addend, contents + rel->r_offset); 4085 addend = 0; 4086 } 4087 } 4088 else 4089 { 4090 /* FIXME: Ought to make use of the RELOC_FOR_GLOBAL_SYMBOL macro. */ 4091 4092 relocation = 0; 4093 h = sym_hashes[r_symndx - symtab_hdr->sh_info]; 4094 symname = h->root.root.string; 4095 while (h->root.type == bfd_link_hash_indirect 4096 || h->root.type == bfd_link_hash_warning) 4097 { 4098#ifdef INCLUDE_SHMEDIA 4099 /* If the reference passes a symbol marked with 4100 STT_DATALABEL, then any STO_SH5_ISA32 on the final value 4101 doesn't count. */ 4102 seen_stt_datalabel |= h->type == STT_DATALABEL; 4103#endif 4104 h = (struct elf_link_hash_entry *) h->root.u.i.link; 4105 } 4106 if (h->root.type == bfd_link_hash_defined 4107 || h->root.type == bfd_link_hash_defweak) 4108 { 4109 bfd_boolean dyn; 4110 4111 dyn = htab ? htab->root.dynamic_sections_created : FALSE; 4112 sec = h->root.u.def.section; 4113 /* In these cases, we don't need the relocation value. 4114 We check specially because in some obscure cases 4115 sec->output_section will be NULL. */ 4116 if (r_type == R_SH_GOTPC 4117 || r_type == R_SH_GOTPC_LOW16 4118 || r_type == R_SH_GOTPC_MEDLOW16 4119 || r_type == R_SH_GOTPC_MEDHI16 4120 || r_type == R_SH_GOTPC_HI16 4121 || ((r_type == R_SH_PLT32 4122 || r_type == R_SH_PLT_LOW16 4123 || r_type == R_SH_PLT_MEDLOW16 4124 || r_type == R_SH_PLT_MEDHI16 4125 || r_type == R_SH_PLT_HI16) 4126 && h->plt.offset != (bfd_vma) -1) 4127 || ((r_type == R_SH_GOT32 4128 || r_type == R_SH_GOT20 4129 || r_type == R_SH_GOTFUNCDESC 4130 || r_type == R_SH_GOTFUNCDESC20 4131 || r_type == R_SH_GOTOFFFUNCDESC 4132 || r_type == R_SH_GOTOFFFUNCDESC20 4133 || r_type == R_SH_FUNCDESC 4134 || r_type == R_SH_GOT_LOW16 4135 || r_type == R_SH_GOT_MEDLOW16 4136 || r_type == R_SH_GOT_MEDHI16 4137 || r_type == R_SH_GOT_HI16) 4138 && WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h) 4139 && (! info->shared 4140 || (! info->symbolic && h->dynindx != -1) 4141 || !h->def_regular)) 4142 /* The cases above are those in which relocation is 4143 overwritten in the switch block below. The cases 4144 below are those in which we must defer relocation 4145 to run-time, because we can't resolve absolute 4146 addresses when creating a shared library. */ 4147 || (info->shared 4148 && ((! info->symbolic && h->dynindx != -1) 4149 || !h->def_regular) 4150 && ((r_type == R_SH_DIR32 4151 && !h->forced_local) 4152 || (r_type == R_SH_REL32 4153 && !SYMBOL_CALLS_LOCAL (info, h))) 4154 && ((input_section->flags & SEC_ALLOC) != 0 4155 /* DWARF will emit R_SH_DIR32 relocations in its 4156 sections against symbols defined externally 4157 in shared libraries. We can't do anything 4158 with them here. */ 4159 || ((input_section->flags & SEC_DEBUGGING) != 0 4160 && h->def_dynamic))) 4161 /* Dynamic relocs are not propagated for SEC_DEBUGGING 4162 sections because such sections are not SEC_ALLOC and 4163 thus ld.so will not process them. */ 4164 || (sec->output_section == NULL 4165 && ((input_section->flags & SEC_DEBUGGING) != 0 4166 && h->def_dynamic)) 4167 || (sec->output_section == NULL 4168 && (sh_elf_hash_entry (h)->got_type == GOT_TLS_IE 4169 || sh_elf_hash_entry (h)->got_type == GOT_TLS_GD))) 4170 ; 4171 else if (sec->output_section != NULL) 4172 relocation = ((h->root.u.def.value 4173 + sec->output_section->vma 4174 + sec->output_offset) 4175 /* A STO_SH5_ISA32 causes a "bitor 1" to the 4176 symbol value, unless we've seen 4177 STT_DATALABEL on the way to it. */ 4178 | ((h->other & STO_SH5_ISA32) != 0 4179 && ! seen_stt_datalabel)); 4180 else if (!info->relocatable 4181 && (_bfd_elf_section_offset (output_bfd, info, 4182 input_section, 4183 rel->r_offset) 4184 != (bfd_vma) -1)) 4185 { 4186 (*_bfd_error_handler) 4187 (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"), 4188 input_bfd, 4189 input_section, 4190 (long) rel->r_offset, 4191 howto->name, 4192 h->root.root.string); 4193 return FALSE; 4194 } 4195 } 4196 else if (h->root.type == bfd_link_hash_undefweak) 4197 ; 4198 else if (info->unresolved_syms_in_objects == RM_IGNORE 4199 && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT) 4200 ; 4201 else if (!info->relocatable) 4202 { 4203 if (! info->callbacks->undefined_symbol 4204 (info, h->root.root.string, input_bfd, 4205 input_section, rel->r_offset, 4206 (info->unresolved_syms_in_objects == RM_GENERATE_ERROR 4207 || ELF_ST_VISIBILITY (h->other)))) 4208 return FALSE; 4209 } 4210 } 4211 4212 if (sec != NULL && discarded_section (sec)) 4213 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section, 4214 rel, 1, relend, howto, 0, contents); 4215 4216 if (info->relocatable) 4217 continue; 4218 4219 /* Check for inter-segment relocations in FDPIC files. Most 4220 relocations connect the relocation site to the location of 4221 the target symbol, but there are some exceptions below. */ 4222 check_segment[0] = isec_segment; 4223 if (sec != NULL) 4224 check_segment[1] = sh_elf_osec_to_segment (output_bfd, 4225 sec->output_section); 4226 else 4227 check_segment[1] = -1; 4228 4229 switch ((int) r_type) 4230 { 4231 final_link_relocate: 4232 /* COFF relocs don't use the addend. The addend is used for 4233 R_SH_DIR32 to be compatible with other compilers. */ 4234 r = _bfd_final_link_relocate (howto, input_bfd, input_section, 4235 contents, rel->r_offset, 4236 relocation, addend); 4237 break; 4238 4239 case R_SH_IND12W: 4240 goto final_link_relocate; 4241 4242 case R_SH_DIR8WPN: 4243 case R_SH_DIR8WPZ: 4244 case R_SH_DIR8WPL: 4245 /* If the reloc is against the start of this section, then 4246 the assembler has already taken care of it and the reloc 4247 is here only to assist in relaxing. If the reloc is not 4248 against the start of this section, then it's against an 4249 external symbol and we must deal with it ourselves. */ 4250 if (input_section->output_section->vma + input_section->output_offset 4251 != relocation) 4252 { 4253 int disp = (relocation 4254 - input_section->output_section->vma 4255 - input_section->output_offset 4256 - rel->r_offset); 4257 int mask = 0; 4258 switch (r_type) 4259 { 4260 case R_SH_DIR8WPN: 4261 case R_SH_DIR8WPZ: mask = 1; break; 4262 case R_SH_DIR8WPL: mask = 3; break; 4263 default: mask = 0; break; 4264 } 4265 if (disp & mask) 4266 { 4267 ((*_bfd_error_handler) 4268 (_("%B: 0x%lx: fatal: unaligned branch target for relax-support relocation"), 4269 input_section->owner, 4270 (unsigned long) rel->r_offset)); 4271 bfd_set_error (bfd_error_bad_value); 4272 return FALSE; 4273 } 4274 relocation -= 4; 4275 goto final_link_relocate; 4276 } 4277 r = bfd_reloc_ok; 4278 break; 4279 4280 default: 4281#ifdef INCLUDE_SHMEDIA 4282 if (shmedia_prepare_reloc (info, input_bfd, input_section, 4283 contents, rel, &relocation)) 4284 goto final_link_relocate; 4285#endif 4286 bfd_set_error (bfd_error_bad_value); 4287 return FALSE; 4288 4289 case R_SH_DIR16: 4290 case R_SH_DIR8: 4291 case R_SH_DIR8U: 4292 case R_SH_DIR8S: 4293 case R_SH_DIR4U: 4294 goto final_link_relocate; 4295 4296 case R_SH_DIR8UL: 4297 case R_SH_DIR4UL: 4298 if (relocation & 3) 4299 { 4300 ((*_bfd_error_handler) 4301 (_("%B: 0x%lx: fatal: unaligned %s relocation 0x%lx"), 4302 input_section->owner, 4303 (unsigned long) rel->r_offset, howto->name, 4304 (unsigned long) relocation)); 4305 bfd_set_error (bfd_error_bad_value); 4306 return FALSE; 4307 } 4308 goto final_link_relocate; 4309 4310 case R_SH_DIR8UW: 4311 case R_SH_DIR8SW: 4312 case R_SH_DIR4UW: 4313 if (relocation & 1) 4314 { 4315 ((*_bfd_error_handler) 4316 (_("%B: 0x%lx: fatal: unaligned %s relocation 0x%lx"), 4317 input_section->owner, 4318 (unsigned long) rel->r_offset, howto->name, 4319 (unsigned long) relocation)); 4320 bfd_set_error (bfd_error_bad_value); 4321 return FALSE; 4322 } 4323 goto final_link_relocate; 4324 4325 case R_SH_PSHA: 4326 if ((signed int)relocation < -32 4327 || (signed int)relocation > 32) 4328 { 4329 ((*_bfd_error_handler) 4330 (_("%B: 0x%lx: fatal: R_SH_PSHA relocation %d not in range -32..32"), 4331 input_section->owner, 4332 (unsigned long) rel->r_offset, 4333 (unsigned long) relocation)); 4334 bfd_set_error (bfd_error_bad_value); 4335 return FALSE; 4336 } 4337 goto final_link_relocate; 4338 4339 case R_SH_PSHL: 4340 if ((signed int)relocation < -16 4341 || (signed int)relocation > 16) 4342 { 4343 ((*_bfd_error_handler) 4344 (_("%B: 0x%lx: fatal: R_SH_PSHL relocation %d not in range -32..32"), 4345 input_section->owner, 4346 (unsigned long) rel->r_offset, 4347 (unsigned long) relocation)); 4348 bfd_set_error (bfd_error_bad_value); 4349 return FALSE; 4350 } 4351 goto final_link_relocate; 4352 4353 case R_SH_DIR32: 4354 case R_SH_REL32: 4355#ifdef INCLUDE_SHMEDIA 4356 case R_SH_IMM_LOW16_PCREL: 4357 case R_SH_IMM_MEDLOW16_PCREL: 4358 case R_SH_IMM_MEDHI16_PCREL: 4359 case R_SH_IMM_HI16_PCREL: 4360#endif 4361 if (info->shared 4362 && (h == NULL 4363 || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT 4364 || h->root.type != bfd_link_hash_undefweak) 4365 && r_symndx != STN_UNDEF 4366 && (input_section->flags & SEC_ALLOC) != 0 4367 && !is_vxworks_tls 4368 && (r_type == R_SH_DIR32 4369 || !SYMBOL_CALLS_LOCAL (info, h))) 4370 { 4371 Elf_Internal_Rela outrel; 4372 bfd_byte *loc; 4373 bfd_boolean skip, relocate; 4374 4375 /* When generating a shared object, these relocations 4376 are copied into the output file to be resolved at run 4377 time. */ 4378 4379 if (sreloc == NULL) 4380 { 4381 sreloc = _bfd_elf_get_dynamic_reloc_section 4382 (input_bfd, input_section, /*rela?*/ TRUE); 4383 if (sreloc == NULL) 4384 return FALSE; 4385 } 4386 4387 skip = FALSE; 4388 relocate = FALSE; 4389 4390 outrel.r_offset = 4391 _bfd_elf_section_offset (output_bfd, info, input_section, 4392 rel->r_offset); 4393 if (outrel.r_offset == (bfd_vma) -1) 4394 skip = TRUE; 4395 else if (outrel.r_offset == (bfd_vma) -2) 4396 skip = TRUE, relocate = TRUE; 4397 outrel.r_offset += (input_section->output_section->vma 4398 + input_section->output_offset); 4399 4400 if (skip) 4401 memset (&outrel, 0, sizeof outrel); 4402 else if (r_type == R_SH_REL32) 4403 { 4404 BFD_ASSERT (h != NULL && h->dynindx != -1); 4405 outrel.r_info = ELF32_R_INFO (h->dynindx, R_SH_REL32); 4406 outrel.r_addend 4407 = (howto->partial_inplace 4408 ? bfd_get_32 (input_bfd, contents + rel->r_offset) 4409 : addend); 4410 } 4411#ifdef INCLUDE_SHMEDIA 4412 else if (r_type == R_SH_IMM_LOW16_PCREL 4413 || r_type == R_SH_IMM_MEDLOW16_PCREL 4414 || r_type == R_SH_IMM_MEDHI16_PCREL 4415 || r_type == R_SH_IMM_HI16_PCREL) 4416 { 4417 BFD_ASSERT (h != NULL && h->dynindx != -1); 4418 outrel.r_info = ELF32_R_INFO (h->dynindx, r_type); 4419 outrel.r_addend = addend; 4420 } 4421#endif 4422 else if (fdpic_p 4423 && (h == NULL 4424 || ((info->symbolic || h->dynindx == -1) 4425 && h->def_regular))) 4426 { 4427 int dynindx; 4428 4429 BFD_ASSERT (sec != NULL); 4430 BFD_ASSERT (sec->output_section != NULL); 4431 dynindx = elf_section_data (sec->output_section)->dynindx; 4432 outrel.r_info = ELF32_R_INFO (dynindx, R_SH_DIR32); 4433 outrel.r_addend = relocation; 4434 outrel.r_addend 4435 += (howto->partial_inplace 4436 ? bfd_get_32 (input_bfd, contents + rel->r_offset) 4437 : addend); 4438 outrel.r_addend -= sec->output_section->vma; 4439 } 4440 else 4441 { 4442 /* h->dynindx may be -1 if this symbol was marked to 4443 become local. */ 4444 if (h == NULL 4445 || ((info->symbolic || h->dynindx == -1) 4446 && h->def_regular)) 4447 { 4448 relocate = howto->partial_inplace; 4449 outrel.r_info = ELF32_R_INFO (0, R_SH_RELATIVE); 4450 } 4451 else 4452 { 4453 BFD_ASSERT (h->dynindx != -1); 4454 outrel.r_info = ELF32_R_INFO (h->dynindx, R_SH_DIR32); 4455 } 4456 outrel.r_addend = relocation; 4457 outrel.r_addend 4458 += (howto->partial_inplace 4459 ? bfd_get_32 (input_bfd, contents + rel->r_offset) 4460 : addend); 4461 } 4462 4463 loc = sreloc->contents; 4464 loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela); 4465 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc); 4466 4467 check_segment[0] = check_segment[1] = -1; 4468 4469 /* If this reloc is against an external symbol, we do 4470 not want to fiddle with the addend. Otherwise, we 4471 need to include the symbol value so that it becomes 4472 an addend for the dynamic reloc. */ 4473 if (! relocate) 4474 continue; 4475 } 4476 else if (fdpic_p && !info->shared 4477 && r_type == R_SH_DIR32 4478 && (input_section->flags & SEC_ALLOC) != 0) 4479 { 4480 bfd_vma offset; 4481 4482 BFD_ASSERT (htab); 4483 4484 if (sh_elf_osec_readonly_p (output_bfd, 4485 input_section->output_section)) 4486 { 4487 (*_bfd_error_handler) 4488 (_("%B(%A+0x%lx): cannot emit fixup to `%s' in read-only section"), 4489 input_bfd, 4490 input_section, 4491 (long) rel->r_offset, 4492 symname); 4493 return FALSE; 4494 } 4495 4496 offset = _bfd_elf_section_offset (output_bfd, info, 4497 input_section, rel->r_offset); 4498 if (offset != (bfd_vma)-1) 4499 sh_elf_add_rofixup (output_bfd, htab->srofixup, 4500 input_section->output_section->vma 4501 + input_section->output_offset 4502 + rel->r_offset); 4503 4504 check_segment[0] = check_segment[1] = -1; 4505 } 4506 goto final_link_relocate; 4507 4508 case R_SH_GOTPLT32: 4509#ifdef INCLUDE_SHMEDIA 4510 case R_SH_GOTPLT_LOW16: 4511 case R_SH_GOTPLT_MEDLOW16: 4512 case R_SH_GOTPLT_MEDHI16: 4513 case R_SH_GOTPLT_HI16: 4514 case R_SH_GOTPLT10BY4: 4515 case R_SH_GOTPLT10BY8: 4516#endif 4517 /* Relocation is to the entry for this symbol in the 4518 procedure linkage table. */ 4519 4520 if (h == NULL 4521 || h->forced_local 4522 || ! info->shared 4523 || info->symbolic 4524 || h->dynindx == -1 4525 || h->plt.offset == (bfd_vma) -1 4526 || h->got.offset != (bfd_vma) -1) 4527 goto force_got; 4528 4529 /* Relocation is to the entry for this symbol in the global 4530 offset table extension for the procedure linkage table. */ 4531 4532 BFD_ASSERT (htab); 4533 BFD_ASSERT (sgotplt != NULL); 4534 relocation = (sgotplt->output_offset 4535 + (get_plt_index (htab->plt_info, h->plt.offset) 4536 + 3) * 4); 4537 4538#ifdef GOT_BIAS 4539 relocation -= GOT_BIAS; 4540#endif 4541 4542 goto final_link_relocate; 4543 4544 force_got: 4545 case R_SH_GOT32: 4546 case R_SH_GOT20: 4547#ifdef INCLUDE_SHMEDIA 4548 case R_SH_GOT_LOW16: 4549 case R_SH_GOT_MEDLOW16: 4550 case R_SH_GOT_MEDHI16: 4551 case R_SH_GOT_HI16: 4552 case R_SH_GOT10BY4: 4553 case R_SH_GOT10BY8: 4554#endif 4555 /* Relocation is to the entry for this symbol in the global 4556 offset table. */ 4557 4558 BFD_ASSERT (htab); 4559 BFD_ASSERT (sgot != NULL); 4560 check_segment[0] = check_segment[1] = -1; 4561 4562 if (h != NULL) 4563 { 4564 bfd_boolean dyn; 4565 4566 off = h->got.offset; 4567#ifdef INCLUDE_SHMEDIA 4568 if (seen_stt_datalabel) 4569 { 4570 struct elf_sh_link_hash_entry *hsh; 4571 4572 hsh = (struct elf_sh_link_hash_entry *)h; 4573 off = hsh->datalabel_got.offset; 4574 } 4575#endif 4576 BFD_ASSERT (off != (bfd_vma) -1); 4577 4578 dyn = htab->root.dynamic_sections_created; 4579 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h) 4580 || (info->shared 4581 && SYMBOL_REFERENCES_LOCAL (info, h)) 4582 || (ELF_ST_VISIBILITY (h->other) 4583 && h->root.type == bfd_link_hash_undefweak)) 4584 { 4585 /* This is actually a static link, or it is a 4586 -Bsymbolic link and the symbol is defined 4587 locally, or the symbol was forced to be local 4588 because of a version file. We must initialize 4589 this entry in the global offset table. Since the 4590 offset must always be a multiple of 4, we use the 4591 least significant bit to record whether we have 4592 initialized it already. 4593 4594 When doing a dynamic link, we create a .rela.got 4595 relocation entry to initialize the value. This 4596 is done in the finish_dynamic_symbol routine. */ 4597 if ((off & 1) != 0) 4598 off &= ~1; 4599 else 4600 { 4601 bfd_put_32 (output_bfd, relocation, 4602 sgot->contents + off); 4603#ifdef INCLUDE_SHMEDIA 4604 if (seen_stt_datalabel) 4605 { 4606 struct elf_sh_link_hash_entry *hsh; 4607 4608 hsh = (struct elf_sh_link_hash_entry *)h; 4609 hsh->datalabel_got.offset |= 1; 4610 } 4611 else 4612#endif 4613 h->got.offset |= 1; 4614 4615 /* If we initialize the GOT entry here with a valid 4616 symbol address, also add a fixup. */ 4617 if (fdpic_p && !info->shared 4618 && sh_elf_hash_entry (h)->got_type == GOT_NORMAL 4619 && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT 4620 || h->root.type != bfd_link_hash_undefweak)) 4621 sh_elf_add_rofixup (output_bfd, htab->srofixup, 4622 sgot->output_section->vma 4623 + sgot->output_offset 4624 + off); 4625 } 4626 } 4627 4628 relocation = sh_elf_got_offset (htab) + off; 4629 } 4630 else 4631 { 4632#ifdef INCLUDE_SHMEDIA 4633 if (rel->r_addend) 4634 { 4635 BFD_ASSERT (local_got_offsets != NULL 4636 && (local_got_offsets[symtab_hdr->sh_info 4637 + r_symndx] 4638 != (bfd_vma) -1)); 4639 4640 off = local_got_offsets[symtab_hdr->sh_info 4641 + r_symndx]; 4642 } 4643 else 4644 { 4645#endif 4646 BFD_ASSERT (local_got_offsets != NULL 4647 && local_got_offsets[r_symndx] != (bfd_vma) -1); 4648 4649 off = local_got_offsets[r_symndx]; 4650#ifdef INCLUDE_SHMEDIA 4651 } 4652#endif 4653 4654 /* The offset must always be a multiple of 4. We use 4655 the least significant bit to record whether we have 4656 already generated the necessary reloc. */ 4657 if ((off & 1) != 0) 4658 off &= ~1; 4659 else 4660 { 4661 bfd_put_32 (output_bfd, relocation, sgot->contents + off); 4662 4663 if (info->shared) 4664 { 4665 Elf_Internal_Rela outrel; 4666 bfd_byte *loc; 4667 4668 if (srelgot == NULL) 4669 { 4670 srelgot = bfd_get_linker_section (dynobj, 4671 ".rela.got"); 4672 BFD_ASSERT (srelgot != NULL); 4673 } 4674 4675 outrel.r_offset = (sgot->output_section->vma 4676 + sgot->output_offset 4677 + off); 4678 if (fdpic_p) 4679 { 4680 int dynindx 4681 = elf_section_data (sec->output_section)->dynindx; 4682 outrel.r_info = ELF32_R_INFO (dynindx, R_SH_DIR32); 4683 outrel.r_addend = relocation; 4684 outrel.r_addend -= sec->output_section->vma; 4685 } 4686 else 4687 { 4688 outrel.r_info = ELF32_R_INFO (0, R_SH_RELATIVE); 4689 outrel.r_addend = relocation; 4690 } 4691 loc = srelgot->contents; 4692 loc += srelgot->reloc_count++ * sizeof (Elf32_External_Rela); 4693 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc); 4694 } 4695 else if (fdpic_p 4696 && (sh_elf_local_got_type (input_bfd) [r_symndx] 4697 == GOT_NORMAL)) 4698 sh_elf_add_rofixup (output_bfd, htab->srofixup, 4699 sgot->output_section->vma 4700 + sgot->output_offset 4701 + off); 4702 4703#ifdef INCLUDE_SHMEDIA 4704 if (rel->r_addend) 4705 local_got_offsets[symtab_hdr->sh_info + r_symndx] |= 1; 4706 else 4707#endif 4708 local_got_offsets[r_symndx] |= 1; 4709 } 4710 4711 relocation = sh_elf_got_offset (htab) + off; 4712 } 4713 4714#ifdef GOT_BIAS 4715 relocation -= GOT_BIAS; 4716#endif 4717 4718 if (r_type == R_SH_GOT20) 4719 { 4720 r = install_movi20_field (output_bfd, relocation + addend, 4721 input_bfd, input_section, contents, 4722 rel->r_offset); 4723 break; 4724 } 4725 else 4726 goto final_link_relocate; 4727 4728 case R_SH_GOTOFF: 4729 case R_SH_GOTOFF20: 4730#ifdef INCLUDE_SHMEDIA 4731 case R_SH_GOTOFF_LOW16: 4732 case R_SH_GOTOFF_MEDLOW16: 4733 case R_SH_GOTOFF_MEDHI16: 4734 case R_SH_GOTOFF_HI16: 4735#endif 4736 /* GOTOFF relocations are relative to _GLOBAL_OFFSET_TABLE_, which 4737 we place at the start of the .got.plt section. This is the same 4738 as the start of the output .got section, unless there are function 4739 descriptors in front of it. */ 4740 BFD_ASSERT (htab); 4741 BFD_ASSERT (sgotplt != NULL); 4742 check_segment[0] = got_segment; 4743 relocation -= sgotplt->output_section->vma + sgotplt->output_offset 4744 + htab->root.hgot->root.u.def.value; 4745 4746#ifdef GOT_BIAS 4747 relocation -= GOT_BIAS; 4748#endif 4749 4750 addend = rel->r_addend; 4751 4752 if (r_type == R_SH_GOTOFF20) 4753 { 4754 r = install_movi20_field (output_bfd, relocation + addend, 4755 input_bfd, input_section, contents, 4756 rel->r_offset); 4757 break; 4758 } 4759 else 4760 goto final_link_relocate; 4761 4762 case R_SH_GOTPC: 4763#ifdef INCLUDE_SHMEDIA 4764 case R_SH_GOTPC_LOW16: 4765 case R_SH_GOTPC_MEDLOW16: 4766 case R_SH_GOTPC_MEDHI16: 4767 case R_SH_GOTPC_HI16: 4768#endif 4769 /* Use global offset table as symbol value. */ 4770 4771 BFD_ASSERT (sgotplt != NULL); 4772 relocation = sgotplt->output_section->vma + sgotplt->output_offset; 4773 4774#ifdef GOT_BIAS 4775 relocation += GOT_BIAS; 4776#endif 4777 4778 addend = rel->r_addend; 4779 4780 goto final_link_relocate; 4781 4782 case R_SH_PLT32: 4783#ifdef INCLUDE_SHMEDIA 4784 case R_SH_PLT_LOW16: 4785 case R_SH_PLT_MEDLOW16: 4786 case R_SH_PLT_MEDHI16: 4787 case R_SH_PLT_HI16: 4788#endif 4789 /* Relocation is to the entry for this symbol in the 4790 procedure linkage table. */ 4791 4792 /* Resolve a PLT reloc against a local symbol directly, 4793 without using the procedure linkage table. */ 4794 if (h == NULL) 4795 goto final_link_relocate; 4796 4797 /* We don't want to warn on calls to undefined weak symbols, 4798 as calls to them must be protected by non-NULL tests 4799 anyway, and unprotected calls would invoke undefined 4800 behavior. */ 4801 if (h->root.type == bfd_link_hash_undefweak) 4802 check_segment[0] = check_segment[1] = -1; 4803 4804 if (h->forced_local) 4805 goto final_link_relocate; 4806 4807 if (h->plt.offset == (bfd_vma) -1) 4808 { 4809 /* We didn't make a PLT entry for this symbol. This 4810 happens when statically linking PIC code, or when 4811 using -Bsymbolic. */ 4812 goto final_link_relocate; 4813 } 4814 4815 BFD_ASSERT (splt != NULL); 4816 check_segment[1] = plt_segment; 4817 relocation = (splt->output_section->vma 4818 + splt->output_offset 4819 + h->plt.offset); 4820 4821#ifdef INCLUDE_SHMEDIA 4822 relocation++; 4823#endif 4824 4825 addend = rel->r_addend; 4826 4827 goto final_link_relocate; 4828 4829 /* Relocation is to the canonical function descriptor for this 4830 symbol, possibly via the GOT. Initialize the GOT 4831 entry and function descriptor if necessary. */ 4832 case R_SH_GOTFUNCDESC: 4833 case R_SH_GOTFUNCDESC20: 4834 case R_SH_FUNCDESC: 4835 { 4836 int dynindx = -1; 4837 asection *reloc_section; 4838 bfd_vma reloc_offset; 4839 int reloc_type = R_SH_FUNCDESC; 4840 4841 BFD_ASSERT (htab); 4842 4843 check_segment[0] = check_segment[1] = -1; 4844 4845 /* FIXME: See what FRV does for global symbols in the 4846 executable, with --export-dynamic. Do they need ld.so 4847 to allocate official descriptors? See what this code 4848 does. */ 4849 4850 relocation = 0; 4851 addend = 0; 4852 4853 if (r_type == R_SH_FUNCDESC) 4854 { 4855 reloc_section = input_section; 4856 reloc_offset = rel->r_offset; 4857 } 4858 else 4859 { 4860 reloc_section = sgot; 4861 4862 if (h != NULL) 4863 reloc_offset = h->got.offset; 4864 else 4865 { 4866 BFD_ASSERT (local_got_offsets != NULL); 4867 reloc_offset = local_got_offsets[r_symndx]; 4868 } 4869 BFD_ASSERT (reloc_offset != MINUS_ONE); 4870 4871 if (reloc_offset & 1) 4872 { 4873 reloc_offset &= ~1; 4874 goto funcdesc_done_got; 4875 } 4876 } 4877 4878 if (h && h->root.type == bfd_link_hash_undefweak 4879 && (SYMBOL_CALLS_LOCAL (info, h) 4880 || !htab->root.dynamic_sections_created)) 4881 /* Undefined weak symbol which will not be dynamically 4882 resolved later; leave it at zero. */ 4883 goto funcdesc_leave_zero; 4884 else if (SYMBOL_CALLS_LOCAL (info, h) 4885 && ! SYMBOL_FUNCDESC_LOCAL (info, h)) 4886 { 4887 /* If the symbol needs a non-local function descriptor 4888 but binds locally (i.e., its visibility is 4889 protected), emit a dynamic relocation decayed to 4890 section+offset. This is an optimization; the dynamic 4891 linker would resolve our function descriptor request 4892 to our copy of the function anyway. */ 4893 dynindx = elf_section_data (h->root.u.def.section 4894 ->output_section)->dynindx; 4895 relocation += h->root.u.def.section->output_offset 4896 + h->root.u.def.value; 4897 } 4898 else if (! SYMBOL_FUNCDESC_LOCAL (info, h)) 4899 { 4900 /* If the symbol is dynamic and there will be dynamic 4901 symbol resolution because we are or are linked with a 4902 shared library, emit a FUNCDESC relocation such that 4903 the dynamic linker will allocate the function 4904 descriptor. */ 4905 BFD_ASSERT (h->dynindx != -1); 4906 dynindx = h->dynindx; 4907 } 4908 else 4909 { 4910 bfd_vma offset; 4911 4912 /* Otherwise, we know we have a private function 4913 descriptor, so reference it directly. */ 4914 reloc_type = R_SH_DIR32; 4915 dynindx = elf_section_data (htab->sfuncdesc 4916 ->output_section)->dynindx; 4917 4918 if (h) 4919 { 4920 offset = sh_elf_hash_entry (h)->funcdesc.offset; 4921 BFD_ASSERT (offset != MINUS_ONE); 4922 if ((offset & 1) == 0) 4923 { 4924 if (!sh_elf_initialize_funcdesc (output_bfd, info, h, 4925 offset, NULL, 0)) 4926 return FALSE; 4927 sh_elf_hash_entry (h)->funcdesc.offset |= 1; 4928 } 4929 } 4930 else 4931 { 4932 union gotref *local_funcdesc; 4933 4934 local_funcdesc = sh_elf_local_funcdesc (input_bfd); 4935 offset = local_funcdesc[r_symndx].offset; 4936 BFD_ASSERT (offset != MINUS_ONE); 4937 if ((offset & 1) == 0) 4938 { 4939 if (!sh_elf_initialize_funcdesc (output_bfd, info, NULL, 4940 offset, sec, 4941 sym->st_value)) 4942 return FALSE; 4943 local_funcdesc[r_symndx].offset |= 1; 4944 } 4945 } 4946 4947 relocation = htab->sfuncdesc->output_offset + (offset & ~1); 4948 } 4949 4950 if (!info->shared && SYMBOL_FUNCDESC_LOCAL (info, h)) 4951 { 4952 bfd_vma offset; 4953 4954 if (sh_elf_osec_readonly_p (output_bfd, 4955 reloc_section->output_section)) 4956 { 4957 (*_bfd_error_handler) 4958 (_("%B(%A+0x%lx): cannot emit fixup to `%s' in read-only section"), 4959 input_bfd, 4960 input_section, 4961 (long) rel->r_offset, 4962 symname); 4963 return FALSE; 4964 } 4965 4966 offset = _bfd_elf_section_offset (output_bfd, info, 4967 reloc_section, reloc_offset); 4968 4969 if (offset != (bfd_vma)-1) 4970 sh_elf_add_rofixup (output_bfd, htab->srofixup, 4971 offset 4972 + reloc_section->output_section->vma 4973 + reloc_section->output_offset); 4974 } 4975 else if ((reloc_section->output_section->flags 4976 & (SEC_ALLOC | SEC_LOAD)) == (SEC_ALLOC | SEC_LOAD)) 4977 { 4978 bfd_vma offset; 4979 4980 if (sh_elf_osec_readonly_p (output_bfd, 4981 reloc_section->output_section)) 4982 { 4983 info->callbacks->warning 4984 (info, 4985 _("cannot emit dynamic relocations in read-only section"), 4986 symname, input_bfd, reloc_section, reloc_offset); 4987 return FALSE; 4988 } 4989 4990 if (srelgot == NULL) 4991 { 4992 srelgot = bfd_get_linker_section (dynobj, ".rela.got"); 4993 BFD_ASSERT (srelgot != NULL); 4994 } 4995 4996 offset = _bfd_elf_section_offset (output_bfd, info, 4997 reloc_section, reloc_offset); 4998 4999 if (offset != (bfd_vma)-1) 5000 sh_elf_add_dyn_reloc (output_bfd, srelgot, 5001 offset 5002 + reloc_section->output_section->vma 5003 + reloc_section->output_offset, 5004 reloc_type, dynindx, relocation); 5005 5006 if (r_type == R_SH_FUNCDESC) 5007 { 5008 r = bfd_reloc_ok; 5009 break; 5010 } 5011 else 5012 { 5013 relocation = 0; 5014 goto funcdesc_leave_zero; 5015 } 5016 } 5017 5018 if (SYMBOL_FUNCDESC_LOCAL (info, h)) 5019 relocation += htab->sfuncdesc->output_section->vma; 5020 funcdesc_leave_zero: 5021 if (r_type != R_SH_FUNCDESC) 5022 { 5023 bfd_put_32 (output_bfd, relocation, 5024 reloc_section->contents + reloc_offset); 5025 if (h != NULL) 5026 h->got.offset |= 1; 5027 else 5028 local_got_offsets[r_symndx] |= 1; 5029 5030 funcdesc_done_got: 5031 5032 relocation = sh_elf_got_offset (htab) + reloc_offset; 5033#ifdef GOT_BIAS 5034 relocation -= GOT_BIAS; 5035#endif 5036 } 5037 if (r_type == R_SH_GOTFUNCDESC20) 5038 { 5039 r = install_movi20_field (output_bfd, relocation + addend, 5040 input_bfd, input_section, contents, 5041 rel->r_offset); 5042 break; 5043 } 5044 else 5045 goto final_link_relocate; 5046 } 5047 break; 5048 5049 case R_SH_GOTOFFFUNCDESC: 5050 case R_SH_GOTOFFFUNCDESC20: 5051 /* FIXME: See R_SH_FUNCDESC comment about global symbols in the 5052 executable and --export-dynamic. If such symbols get 5053 ld.so-allocated descriptors we can not use R_SH_GOTOFFFUNCDESC 5054 for them. */ 5055 BFD_ASSERT (htab); 5056 5057 check_segment[0] = check_segment[1] = -1; 5058 relocation = 0; 5059 addend = rel->r_addend; 5060 5061 if (h && (h->root.type == bfd_link_hash_undefweak 5062 || !SYMBOL_FUNCDESC_LOCAL (info, h))) 5063 { 5064 _bfd_error_handler 5065 (_("%B(%A+0x%lx): %s relocation against external symbol \"%s\""), 5066 input_bfd, input_section, (long) rel->r_offset, howto->name, 5067 h->root.root.string); 5068 return FALSE; 5069 } 5070 else 5071 { 5072 bfd_vma offset; 5073 5074 /* Otherwise, we know we have a private function 5075 descriptor, so reference it directly. */ 5076 if (h) 5077 { 5078 offset = sh_elf_hash_entry (h)->funcdesc.offset; 5079 BFD_ASSERT (offset != MINUS_ONE); 5080 if ((offset & 1) == 0) 5081 { 5082 if (!sh_elf_initialize_funcdesc (output_bfd, info, h, 5083 offset, NULL, 0)) 5084 return FALSE; 5085 sh_elf_hash_entry (h)->funcdesc.offset |= 1; 5086 } 5087 } 5088 else 5089 { 5090 union gotref *local_funcdesc; 5091 5092 local_funcdesc = sh_elf_local_funcdesc (input_bfd); 5093 offset = local_funcdesc[r_symndx].offset; 5094 BFD_ASSERT (offset != MINUS_ONE); 5095 if ((offset & 1) == 0) 5096 { 5097 if (!sh_elf_initialize_funcdesc (output_bfd, info, NULL, 5098 offset, sec, 5099 sym->st_value)) 5100 return FALSE; 5101 local_funcdesc[r_symndx].offset |= 1; 5102 } 5103 } 5104 5105 relocation = htab->sfuncdesc->output_offset + (offset & ~1); 5106 } 5107 5108 relocation -= (htab->root.hgot->root.u.def.value 5109 + sgotplt->output_offset); 5110#ifdef GOT_BIAS 5111 relocation -= GOT_BIAS; 5112#endif 5113 5114 if (r_type == R_SH_GOTOFFFUNCDESC20) 5115 { 5116 r = install_movi20_field (output_bfd, relocation + addend, 5117 input_bfd, input_section, contents, 5118 rel->r_offset); 5119 break; 5120 } 5121 else 5122 goto final_link_relocate; 5123 5124 case R_SH_LOOP_START: 5125 { 5126 static bfd_vma start, end; 5127 5128 start = (relocation + rel->r_addend 5129 - (sec->output_section->vma + sec->output_offset)); 5130 r = sh_elf_reloc_loop (r_type, input_bfd, input_section, contents, 5131 rel->r_offset, sec, start, end); 5132 break; 5133 5134 case R_SH_LOOP_END: 5135 end = (relocation + rel->r_addend 5136 - (sec->output_section->vma + sec->output_offset)); 5137 r = sh_elf_reloc_loop (r_type, input_bfd, input_section, contents, 5138 rel->r_offset, sec, start, end); 5139 break; 5140 } 5141 5142 case R_SH_TLS_GD_32: 5143 case R_SH_TLS_IE_32: 5144 BFD_ASSERT (htab); 5145 check_segment[0] = check_segment[1] = -1; 5146 r_type = sh_elf_optimized_tls_reloc (info, r_type, h == NULL); 5147 got_type = GOT_UNKNOWN; 5148 if (h == NULL && local_got_offsets) 5149 got_type = sh_elf_local_got_type (input_bfd) [r_symndx]; 5150 else if (h != NULL) 5151 { 5152 got_type = sh_elf_hash_entry (h)->got_type; 5153 if (! info->shared 5154 && (h->dynindx == -1 5155 || h->def_regular)) 5156 r_type = R_SH_TLS_LE_32; 5157 } 5158 5159 if (r_type == R_SH_TLS_GD_32 && got_type == GOT_TLS_IE) 5160 r_type = R_SH_TLS_IE_32; 5161 5162 if (r_type == R_SH_TLS_LE_32) 5163 { 5164 bfd_vma offset; 5165 unsigned short insn; 5166 5167 if (ELF32_R_TYPE (rel->r_info) == R_SH_TLS_GD_32) 5168 { 5169 /* GD->LE transition: 5170 mov.l 1f,r4; mova 2f,r0; mov.l 2f,r1; add r0,r1; 5171 jsr @r1; add r12,r4; bra 3f; nop; .align 2; 5172 1: .long x$TLSGD; 2: .long __tls_get_addr@PLT; 3: 5173 We change it into: 5174 mov.l 1f,r4; stc gbr,r0; add r4,r0; nop; 5175 nop; nop; ... 5176 1: .long x@TPOFF; 2: .long __tls_get_addr@PLT; 3:. */ 5177 5178 offset = rel->r_offset; 5179 BFD_ASSERT (offset >= 16); 5180 /* Size of GD instructions is 16 or 18. */ 5181 offset -= 16; 5182 insn = bfd_get_16 (input_bfd, contents + offset + 0); 5183 if ((insn & 0xff00) == 0xc700) 5184 { 5185 BFD_ASSERT (offset >= 2); 5186 offset -= 2; 5187 insn = bfd_get_16 (input_bfd, contents + offset + 0); 5188 } 5189 5190 BFD_ASSERT ((insn & 0xff00) == 0xd400); 5191 insn = bfd_get_16 (input_bfd, contents + offset + 2); 5192 BFD_ASSERT ((insn & 0xff00) == 0xc700); 5193 insn = bfd_get_16 (input_bfd, contents + offset + 4); 5194 BFD_ASSERT ((insn & 0xff00) == 0xd100); 5195 insn = bfd_get_16 (input_bfd, contents + offset + 6); 5196 BFD_ASSERT (insn == 0x310c); 5197 insn = bfd_get_16 (input_bfd, contents + offset + 8); 5198 BFD_ASSERT (insn == 0x410b); 5199 insn = bfd_get_16 (input_bfd, contents + offset + 10); 5200 BFD_ASSERT (insn == 0x34cc); 5201 5202 bfd_put_16 (output_bfd, 0x0012, contents + offset + 2); 5203 bfd_put_16 (output_bfd, 0x304c, contents + offset + 4); 5204 bfd_put_16 (output_bfd, 0x0009, contents + offset + 6); 5205 bfd_put_16 (output_bfd, 0x0009, contents + offset + 8); 5206 bfd_put_16 (output_bfd, 0x0009, contents + offset + 10); 5207 } 5208 else 5209 { 5210 int target; 5211 5212 /* IE->LE transition: 5213 mov.l 1f,r0; stc gbr,rN; mov.l @(r0,r12),rM; 5214 bra 2f; add ...; .align 2; 1: x@GOTTPOFF; 2: 5215 We change it into: 5216 mov.l .Ln,rM; stc gbr,rN; nop; ...; 5217 1: x@TPOFF; 2:. */ 5218 5219 offset = rel->r_offset; 5220 BFD_ASSERT (offset >= 16); 5221 /* Size of IE instructions is 10 or 12. */ 5222 offset -= 10; 5223 insn = bfd_get_16 (input_bfd, contents + offset + 0); 5224 if ((insn & 0xf0ff) == 0x0012) 5225 { 5226 BFD_ASSERT (offset >= 2); 5227 offset -= 2; 5228 insn = bfd_get_16 (input_bfd, contents + offset + 0); 5229 } 5230 5231 BFD_ASSERT ((insn & 0xff00) == 0xd000); 5232 target = insn & 0x00ff; 5233 insn = bfd_get_16 (input_bfd, contents + offset + 2); 5234 BFD_ASSERT ((insn & 0xf0ff) == 0x0012); 5235 insn = bfd_get_16 (input_bfd, contents + offset + 4); 5236 BFD_ASSERT ((insn & 0xf0ff) == 0x00ce); 5237 insn = 0xd000 | (insn & 0x0f00) | target; 5238 bfd_put_16 (output_bfd, insn, contents + offset + 0); 5239 bfd_put_16 (output_bfd, 0x0009, contents + offset + 4); 5240 } 5241 5242 bfd_put_32 (output_bfd, tpoff (info, relocation), 5243 contents + rel->r_offset); 5244 continue; 5245 } 5246 5247 if (sgot == NULL || sgotplt == NULL) 5248 abort (); 5249 5250 if (h != NULL) 5251 off = h->got.offset; 5252 else 5253 { 5254 if (local_got_offsets == NULL) 5255 abort (); 5256 5257 off = local_got_offsets[r_symndx]; 5258 } 5259 5260 /* Relocate R_SH_TLS_IE_32 directly when statically linking. */ 5261 if (r_type == R_SH_TLS_IE_32 5262 && ! htab->root.dynamic_sections_created) 5263 { 5264 off &= ~1; 5265 bfd_put_32 (output_bfd, tpoff (info, relocation), 5266 sgot->contents + off); 5267 bfd_put_32 (output_bfd, sh_elf_got_offset (htab) + off, 5268 contents + rel->r_offset); 5269 continue; 5270 } 5271 5272 if ((off & 1) != 0) 5273 off &= ~1; 5274 else 5275 { 5276 Elf_Internal_Rela outrel; 5277 bfd_byte *loc; 5278 int dr_type, indx; 5279 5280 if (srelgot == NULL) 5281 { 5282 srelgot = bfd_get_linker_section (dynobj, ".rela.got"); 5283 BFD_ASSERT (srelgot != NULL); 5284 } 5285 5286 outrel.r_offset = (sgot->output_section->vma 5287 + sgot->output_offset + off); 5288 5289 if (h == NULL || h->dynindx == -1) 5290 indx = 0; 5291 else 5292 indx = h->dynindx; 5293 5294 dr_type = (r_type == R_SH_TLS_GD_32 ? R_SH_TLS_DTPMOD32 : 5295 R_SH_TLS_TPOFF32); 5296 if (dr_type == R_SH_TLS_TPOFF32 && indx == 0) 5297 outrel.r_addend = relocation - dtpoff_base (info); 5298 else 5299 outrel.r_addend = 0; 5300 outrel.r_info = ELF32_R_INFO (indx, dr_type); 5301 loc = srelgot->contents; 5302 loc += srelgot->reloc_count++ * sizeof (Elf32_External_Rela); 5303 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc); 5304 5305 if (r_type == R_SH_TLS_GD_32) 5306 { 5307 if (indx == 0) 5308 { 5309 bfd_put_32 (output_bfd, 5310 relocation - dtpoff_base (info), 5311 sgot->contents + off + 4); 5312 } 5313 else 5314 { 5315 outrel.r_info = ELF32_R_INFO (indx, 5316 R_SH_TLS_DTPOFF32); 5317 outrel.r_offset += 4; 5318 outrel.r_addend = 0; 5319 srelgot->reloc_count++; 5320 loc += sizeof (Elf32_External_Rela); 5321 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc); 5322 } 5323 } 5324 5325 if (h != NULL) 5326 h->got.offset |= 1; 5327 else 5328 local_got_offsets[r_symndx] |= 1; 5329 } 5330 5331 if (off >= (bfd_vma) -2) 5332 abort (); 5333 5334 if (r_type == (int) ELF32_R_TYPE (rel->r_info)) 5335 relocation = sh_elf_got_offset (htab) + off; 5336 else 5337 { 5338 bfd_vma offset; 5339 unsigned short insn; 5340 5341 /* GD->IE transition: 5342 mov.l 1f,r4; mova 2f,r0; mov.l 2f,r1; add r0,r1; 5343 jsr @r1; add r12,r4; bra 3f; nop; .align 2; 5344 1: .long x$TLSGD; 2: .long __tls_get_addr@PLT; 3: 5345 We change it into: 5346 mov.l 1f,r0; stc gbr,r4; mov.l @(r0,r12),r0; add r4,r0; 5347 nop; nop; bra 3f; nop; .align 2; 5348 1: .long x@TPOFF; 2:...; 3:. */ 5349 5350 offset = rel->r_offset; 5351 BFD_ASSERT (offset >= 16); 5352 /* Size of GD instructions is 16 or 18. */ 5353 offset -= 16; 5354 insn = bfd_get_16 (input_bfd, contents + offset + 0); 5355 if ((insn & 0xff00) == 0xc700) 5356 { 5357 BFD_ASSERT (offset >= 2); 5358 offset -= 2; 5359 insn = bfd_get_16 (input_bfd, contents + offset + 0); 5360 } 5361 5362 BFD_ASSERT ((insn & 0xff00) == 0xd400); 5363 5364 /* Replace mov.l 1f,R4 with mov.l 1f,r0. */ 5365 bfd_put_16 (output_bfd, insn & 0xf0ff, contents + offset); 5366 5367 insn = bfd_get_16 (input_bfd, contents + offset + 2); 5368 BFD_ASSERT ((insn & 0xff00) == 0xc700); 5369 insn = bfd_get_16 (input_bfd, contents + offset + 4); 5370 BFD_ASSERT ((insn & 0xff00) == 0xd100); 5371 insn = bfd_get_16 (input_bfd, contents + offset + 6); 5372 BFD_ASSERT (insn == 0x310c); 5373 insn = bfd_get_16 (input_bfd, contents + offset + 8); 5374 BFD_ASSERT (insn == 0x410b); 5375 insn = bfd_get_16 (input_bfd, contents + offset + 10); 5376 BFD_ASSERT (insn == 0x34cc); 5377 5378 bfd_put_16 (output_bfd, 0x0412, contents + offset + 2); 5379 bfd_put_16 (output_bfd, 0x00ce, contents + offset + 4); 5380 bfd_put_16 (output_bfd, 0x304c, contents + offset + 6); 5381 bfd_put_16 (output_bfd, 0x0009, contents + offset + 8); 5382 bfd_put_16 (output_bfd, 0x0009, contents + offset + 10); 5383 5384 bfd_put_32 (output_bfd, sh_elf_got_offset (htab) + off, 5385 contents + rel->r_offset); 5386 5387 continue; 5388 } 5389 5390 addend = rel->r_addend; 5391 5392 goto final_link_relocate; 5393 5394 case R_SH_TLS_LD_32: 5395 BFD_ASSERT (htab); 5396 check_segment[0] = check_segment[1] = -1; 5397 if (! info->shared) 5398 { 5399 bfd_vma offset; 5400 unsigned short insn; 5401 5402 /* LD->LE transition: 5403 mov.l 1f,r4; mova 2f,r0; mov.l 2f,r1; add r0,r1; 5404 jsr @r1; add r12,r4; bra 3f; nop; .align 2; 5405 1: .long x$TLSLD; 2: .long __tls_get_addr@PLT; 3: 5406 We change it into: 5407 stc gbr,r0; nop; nop; nop; 5408 nop; nop; bra 3f; ...; 3:. */ 5409 5410 offset = rel->r_offset; 5411 BFD_ASSERT (offset >= 16); 5412 /* Size of LD instructions is 16 or 18. */ 5413 offset -= 16; 5414 insn = bfd_get_16 (input_bfd, contents + offset + 0); 5415 if ((insn & 0xff00) == 0xc700) 5416 { 5417 BFD_ASSERT (offset >= 2); 5418 offset -= 2; 5419 insn = bfd_get_16 (input_bfd, contents + offset + 0); 5420 } 5421 5422 BFD_ASSERT ((insn & 0xff00) == 0xd400); 5423 insn = bfd_get_16 (input_bfd, contents + offset + 2); 5424 BFD_ASSERT ((insn & 0xff00) == 0xc700); 5425 insn = bfd_get_16 (input_bfd, contents + offset + 4); 5426 BFD_ASSERT ((insn & 0xff00) == 0xd100); 5427 insn = bfd_get_16 (input_bfd, contents + offset + 6); 5428 BFD_ASSERT (insn == 0x310c); 5429 insn = bfd_get_16 (input_bfd, contents + offset + 8); 5430 BFD_ASSERT (insn == 0x410b); 5431 insn = bfd_get_16 (input_bfd, contents + offset + 10); 5432 BFD_ASSERT (insn == 0x34cc); 5433 5434 bfd_put_16 (output_bfd, 0x0012, contents + offset + 0); 5435 bfd_put_16 (output_bfd, 0x0009, contents + offset + 2); 5436 bfd_put_16 (output_bfd, 0x0009, contents + offset + 4); 5437 bfd_put_16 (output_bfd, 0x0009, contents + offset + 6); 5438 bfd_put_16 (output_bfd, 0x0009, contents + offset + 8); 5439 bfd_put_16 (output_bfd, 0x0009, contents + offset + 10); 5440 5441 continue; 5442 } 5443 5444 if (sgot == NULL || sgotplt == NULL) 5445 abort (); 5446 5447 off = htab->tls_ldm_got.offset; 5448 if (off & 1) 5449 off &= ~1; 5450 else 5451 { 5452 Elf_Internal_Rela outrel; 5453 bfd_byte *loc; 5454 5455 srelgot = htab->srelgot; 5456 if (srelgot == NULL) 5457 abort (); 5458 5459 outrel.r_offset = (sgot->output_section->vma 5460 + sgot->output_offset + off); 5461 outrel.r_addend = 0; 5462 outrel.r_info = ELF32_R_INFO (0, R_SH_TLS_DTPMOD32); 5463 loc = srelgot->contents; 5464 loc += srelgot->reloc_count++ * sizeof (Elf32_External_Rela); 5465 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc); 5466 htab->tls_ldm_got.offset |= 1; 5467 } 5468 5469 relocation = sh_elf_got_offset (htab) + off; 5470 addend = rel->r_addend; 5471 5472 goto final_link_relocate; 5473 5474 case R_SH_TLS_LDO_32: 5475 check_segment[0] = check_segment[1] = -1; 5476 if (! info->shared) 5477 relocation = tpoff (info, relocation); 5478 else 5479 relocation -= dtpoff_base (info); 5480 5481 addend = rel->r_addend; 5482 goto final_link_relocate; 5483 5484 case R_SH_TLS_LE_32: 5485 { 5486 int indx; 5487 Elf_Internal_Rela outrel; 5488 bfd_byte *loc; 5489 5490 check_segment[0] = check_segment[1] = -1; 5491 5492 if (! info->shared || info->pie) 5493 { 5494 relocation = tpoff (info, relocation); 5495 addend = rel->r_addend; 5496 goto final_link_relocate; 5497 } 5498 5499 if (sreloc == NULL) 5500 { 5501 sreloc = _bfd_elf_get_dynamic_reloc_section 5502 (input_bfd, input_section, /*rela?*/ TRUE); 5503 if (sreloc == NULL) 5504 return FALSE; 5505 } 5506 5507 if (h == NULL || h->dynindx == -1) 5508 indx = 0; 5509 else 5510 indx = h->dynindx; 5511 5512 outrel.r_offset = (input_section->output_section->vma 5513 + input_section->output_offset 5514 + rel->r_offset); 5515 outrel.r_info = ELF32_R_INFO (indx, R_SH_TLS_TPOFF32); 5516 if (indx == 0) 5517 outrel.r_addend = relocation - dtpoff_base (info); 5518 else 5519 outrel.r_addend = 0; 5520 5521 loc = sreloc->contents; 5522 loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela); 5523 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc); 5524 continue; 5525 } 5526 } 5527 5528 relocation_done: 5529 if (fdpic_p && check_segment[0] != (unsigned) -1 5530 && check_segment[0] != check_segment[1]) 5531 { 5532 /* We don't want duplicate errors for undefined symbols. */ 5533 if (!h || h->root.type != bfd_link_hash_undefined) 5534 { 5535 if (info->shared) 5536 { 5537 info->callbacks->einfo 5538 (_("%X%C: relocation to \"%s\" references a different segment\n"), 5539 input_bfd, input_section, rel->r_offset, symname); 5540 return FALSE; 5541 } 5542 else 5543 info->callbacks->einfo 5544 (_("%C: warning: relocation to \"%s\" references a different segment\n"), 5545 input_bfd, input_section, rel->r_offset, symname); 5546 } 5547 5548 elf_elfheader (output_bfd)->e_flags &= ~EF_SH_PIC; 5549 } 5550 5551 if (r != bfd_reloc_ok) 5552 { 5553 switch (r) 5554 { 5555 default: 5556 case bfd_reloc_outofrange: 5557 abort (); 5558 case bfd_reloc_overflow: 5559 { 5560 const char *name; 5561 5562 if (h != NULL) 5563 name = NULL; 5564 else 5565 { 5566 name = (bfd_elf_string_from_elf_section 5567 (input_bfd, symtab_hdr->sh_link, sym->st_name)); 5568 if (name == NULL) 5569 return FALSE; 5570 if (*name == '\0') 5571 name = bfd_section_name (input_bfd, sec); 5572 } 5573 if (! ((*info->callbacks->reloc_overflow) 5574 (info, (h ? &h->root : NULL), name, howto->name, 5575 (bfd_vma) 0, input_bfd, input_section, 5576 rel->r_offset))) 5577 return FALSE; 5578 } 5579 break; 5580 } 5581 } 5582 } 5583 5584 return TRUE; 5585} 5586 5587/* This is a version of bfd_generic_get_relocated_section_contents 5588 which uses sh_elf_relocate_section. */ 5589 5590static bfd_byte * 5591sh_elf_get_relocated_section_contents (bfd *output_bfd, 5592 struct bfd_link_info *link_info, 5593 struct bfd_link_order *link_order, 5594 bfd_byte *data, 5595 bfd_boolean relocatable, 5596 asymbol **symbols) 5597{ 5598 Elf_Internal_Shdr *symtab_hdr; 5599 asection *input_section = link_order->u.indirect.section; 5600 bfd *input_bfd = input_section->owner; 5601 asection **sections = NULL; 5602 Elf_Internal_Rela *internal_relocs = NULL; 5603 Elf_Internal_Sym *isymbuf = NULL; 5604 5605 /* We only need to handle the case of relaxing, or of having a 5606 particular set of section contents, specially. */ 5607 if (relocatable 5608 || elf_section_data (input_section)->this_hdr.contents == NULL) 5609 return bfd_generic_get_relocated_section_contents (output_bfd, link_info, 5610 link_order, data, 5611 relocatable, 5612 symbols); 5613 5614 symtab_hdr = &elf_symtab_hdr (input_bfd); 5615 5616 memcpy (data, elf_section_data (input_section)->this_hdr.contents, 5617 (size_t) input_section->size); 5618 5619 if ((input_section->flags & SEC_RELOC) != 0 5620 && input_section->reloc_count > 0) 5621 { 5622 asection **secpp; 5623 Elf_Internal_Sym *isym, *isymend; 5624 bfd_size_type amt; 5625 5626 internal_relocs = (_bfd_elf_link_read_relocs 5627 (input_bfd, input_section, NULL, 5628 (Elf_Internal_Rela *) NULL, FALSE)); 5629 if (internal_relocs == NULL) 5630 goto error_return; 5631 5632 if (symtab_hdr->sh_info != 0) 5633 { 5634 isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents; 5635 if (isymbuf == NULL) 5636 isymbuf = bfd_elf_get_elf_syms (input_bfd, symtab_hdr, 5637 symtab_hdr->sh_info, 0, 5638 NULL, NULL, NULL); 5639 if (isymbuf == NULL) 5640 goto error_return; 5641 } 5642 5643 amt = symtab_hdr->sh_info; 5644 amt *= sizeof (asection *); 5645 sections = (asection **) bfd_malloc (amt); 5646 if (sections == NULL && amt != 0) 5647 goto error_return; 5648 5649 isymend = isymbuf + symtab_hdr->sh_info; 5650 for (isym = isymbuf, secpp = sections; isym < isymend; ++isym, ++secpp) 5651 { 5652 asection *isec; 5653 5654 if (isym->st_shndx == SHN_UNDEF) 5655 isec = bfd_und_section_ptr; 5656 else if (isym->st_shndx == SHN_ABS) 5657 isec = bfd_abs_section_ptr; 5658 else if (isym->st_shndx == SHN_COMMON) 5659 isec = bfd_com_section_ptr; 5660 else 5661 isec = bfd_section_from_elf_index (input_bfd, isym->st_shndx); 5662 5663 *secpp = isec; 5664 } 5665 5666 if (! sh_elf_relocate_section (output_bfd, link_info, input_bfd, 5667 input_section, data, internal_relocs, 5668 isymbuf, sections)) 5669 goto error_return; 5670 5671 if (sections != NULL) 5672 free (sections); 5673 if (isymbuf != NULL 5674 && symtab_hdr->contents != (unsigned char *) isymbuf) 5675 free (isymbuf); 5676 if (elf_section_data (input_section)->relocs != internal_relocs) 5677 free (internal_relocs); 5678 } 5679 5680 return data; 5681 5682 error_return: 5683 if (sections != NULL) 5684 free (sections); 5685 if (isymbuf != NULL 5686 && symtab_hdr->contents != (unsigned char *) isymbuf) 5687 free (isymbuf); 5688 if (internal_relocs != NULL 5689 && elf_section_data (input_section)->relocs != internal_relocs) 5690 free (internal_relocs); 5691 return NULL; 5692} 5693 5694/* Return the base VMA address which should be subtracted from real addresses 5695 when resolving @dtpoff relocation. 5696 This is PT_TLS segment p_vaddr. */ 5697 5698static bfd_vma 5699dtpoff_base (struct bfd_link_info *info) 5700{ 5701 /* If tls_sec is NULL, we should have signalled an error already. */ 5702 if (elf_hash_table (info)->tls_sec == NULL) 5703 return 0; 5704 return elf_hash_table (info)->tls_sec->vma; 5705} 5706 5707/* Return the relocation value for R_SH_TLS_TPOFF32.. */ 5708 5709static bfd_vma 5710tpoff (struct bfd_link_info *info, bfd_vma address) 5711{ 5712 /* If tls_sec is NULL, we should have signalled an error already. */ 5713 if (elf_hash_table (info)->tls_sec == NULL) 5714 return 0; 5715 /* SH TLS ABI is variant I and static TLS block start just after tcbhead 5716 structure which has 2 pointer fields. */ 5717 return (address - elf_hash_table (info)->tls_sec->vma 5718 + align_power ((bfd_vma) 8, 5719 elf_hash_table (info)->tls_sec->alignment_power)); 5720} 5721 5722static asection * 5723sh_elf_gc_mark_hook (asection *sec, 5724 struct bfd_link_info *info, 5725 Elf_Internal_Rela *rel, 5726 struct elf_link_hash_entry *h, 5727 Elf_Internal_Sym *sym) 5728{ 5729 if (h != NULL) 5730 switch (ELF32_R_TYPE (rel->r_info)) 5731 { 5732 case R_SH_GNU_VTINHERIT: 5733 case R_SH_GNU_VTENTRY: 5734 return NULL; 5735 } 5736 5737 return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym); 5738} 5739 5740/* Update the got entry reference counts for the section being removed. */ 5741 5742static bfd_boolean 5743sh_elf_gc_sweep_hook (bfd *abfd, struct bfd_link_info *info, 5744 asection *sec, const Elf_Internal_Rela *relocs) 5745{ 5746 Elf_Internal_Shdr *symtab_hdr; 5747 struct elf_link_hash_entry **sym_hashes; 5748 bfd_signed_vma *local_got_refcounts; 5749 union gotref *local_funcdesc; 5750 const Elf_Internal_Rela *rel, *relend; 5751 5752 if (info->relocatable) 5753 return TRUE; 5754 5755 elf_section_data (sec)->local_dynrel = NULL; 5756 5757 symtab_hdr = &elf_symtab_hdr (abfd); 5758 sym_hashes = elf_sym_hashes (abfd); 5759 local_got_refcounts = elf_local_got_refcounts (abfd); 5760 local_funcdesc = sh_elf_local_funcdesc (abfd); 5761 5762 relend = relocs + sec->reloc_count; 5763 for (rel = relocs; rel < relend; rel++) 5764 { 5765 unsigned long r_symndx; 5766 unsigned int r_type; 5767 struct elf_link_hash_entry *h = NULL; 5768#ifdef INCLUDE_SHMEDIA 5769 int seen_stt_datalabel = 0; 5770#endif 5771 5772 r_symndx = ELF32_R_SYM (rel->r_info); 5773 if (r_symndx >= symtab_hdr->sh_info) 5774 { 5775 struct elf_sh_link_hash_entry *eh; 5776 struct elf_sh_dyn_relocs **pp; 5777 struct elf_sh_dyn_relocs *p; 5778 5779 h = sym_hashes[r_symndx - symtab_hdr->sh_info]; 5780 while (h->root.type == bfd_link_hash_indirect 5781 || h->root.type == bfd_link_hash_warning) 5782 { 5783#ifdef INCLUDE_SHMEDIA 5784 seen_stt_datalabel |= h->type == STT_DATALABEL; 5785#endif 5786 h = (struct elf_link_hash_entry *) h->root.u.i.link; 5787 } 5788 eh = (struct elf_sh_link_hash_entry *) h; 5789 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next) 5790 if (p->sec == sec) 5791 { 5792 /* Everything must go for SEC. */ 5793 *pp = p->next; 5794 break; 5795 } 5796 } 5797 5798 r_type = ELF32_R_TYPE (rel->r_info); 5799 switch (sh_elf_optimized_tls_reloc (info, r_type, h != NULL)) 5800 { 5801 case R_SH_TLS_LD_32: 5802 if (sh_elf_hash_table (info)->tls_ldm_got.refcount > 0) 5803 sh_elf_hash_table (info)->tls_ldm_got.refcount -= 1; 5804 break; 5805 5806 case R_SH_GOT32: 5807 case R_SH_GOT20: 5808 case R_SH_GOTOFF: 5809 case R_SH_GOTOFF20: 5810 case R_SH_GOTPC: 5811#ifdef INCLUDE_SHMEDIA 5812 case R_SH_GOT_LOW16: 5813 case R_SH_GOT_MEDLOW16: 5814 case R_SH_GOT_MEDHI16: 5815 case R_SH_GOT_HI16: 5816 case R_SH_GOT10BY4: 5817 case R_SH_GOT10BY8: 5818 case R_SH_GOTOFF_LOW16: 5819 case R_SH_GOTOFF_MEDLOW16: 5820 case R_SH_GOTOFF_MEDHI16: 5821 case R_SH_GOTOFF_HI16: 5822 case R_SH_GOTPC_LOW16: 5823 case R_SH_GOTPC_MEDLOW16: 5824 case R_SH_GOTPC_MEDHI16: 5825 case R_SH_GOTPC_HI16: 5826#endif 5827 case R_SH_TLS_GD_32: 5828 case R_SH_TLS_IE_32: 5829 case R_SH_GOTFUNCDESC: 5830 case R_SH_GOTFUNCDESC20: 5831 if (h != NULL) 5832 { 5833#ifdef INCLUDE_SHMEDIA 5834 if (seen_stt_datalabel) 5835 { 5836 struct elf_sh_link_hash_entry *eh; 5837 eh = (struct elf_sh_link_hash_entry *) h; 5838 if (eh->datalabel_got.refcount > 0) 5839 eh->datalabel_got.refcount -= 1; 5840 } 5841 else 5842#endif 5843 if (h->got.refcount > 0) 5844 h->got.refcount -= 1; 5845 } 5846 else if (local_got_refcounts != NULL) 5847 { 5848#ifdef INCLUDE_SHMEDIA 5849 if (rel->r_addend & 1) 5850 { 5851 if (local_got_refcounts[symtab_hdr->sh_info + r_symndx] > 0) 5852 local_got_refcounts[symtab_hdr->sh_info + r_symndx] -= 1; 5853 } 5854 else 5855#endif 5856 if (local_got_refcounts[r_symndx] > 0) 5857 local_got_refcounts[r_symndx] -= 1; 5858 } 5859 break; 5860 5861 case R_SH_FUNCDESC: 5862 if (h != NULL) 5863 sh_elf_hash_entry (h)->abs_funcdesc_refcount -= 1; 5864 else if (sh_elf_hash_table (info)->fdpic_p && !info->shared) 5865 sh_elf_hash_table (info)->srofixup->size -= 4; 5866 5867 /* Fall through. */ 5868 5869 case R_SH_GOTOFFFUNCDESC: 5870 case R_SH_GOTOFFFUNCDESC20: 5871 if (h != NULL) 5872 sh_elf_hash_entry (h)->funcdesc.refcount -= 1; 5873 else 5874 local_funcdesc[r_symndx].refcount -= 1; 5875 break; 5876 5877 case R_SH_DIR32: 5878 if (sh_elf_hash_table (info)->fdpic_p && !info->shared 5879 && (sec->flags & SEC_ALLOC) != 0) 5880 sh_elf_hash_table (info)->srofixup->size -= 4; 5881 /* Fall thru */ 5882 5883 case R_SH_REL32: 5884 if (info->shared) 5885 break; 5886 /* Fall thru */ 5887 5888 case R_SH_PLT32: 5889#ifdef INCLUDE_SHMEDIA 5890 case R_SH_PLT_LOW16: 5891 case R_SH_PLT_MEDLOW16: 5892 case R_SH_PLT_MEDHI16: 5893 case R_SH_PLT_HI16: 5894#endif 5895 if (h != NULL) 5896 { 5897 if (h->plt.refcount > 0) 5898 h->plt.refcount -= 1; 5899 } 5900 break; 5901 5902 case R_SH_GOTPLT32: 5903#ifdef INCLUDE_SHMEDIA 5904 case R_SH_GOTPLT_LOW16: 5905 case R_SH_GOTPLT_MEDLOW16: 5906 case R_SH_GOTPLT_MEDHI16: 5907 case R_SH_GOTPLT_HI16: 5908 case R_SH_GOTPLT10BY4: 5909 case R_SH_GOTPLT10BY8: 5910#endif 5911 if (h != NULL) 5912 { 5913 struct elf_sh_link_hash_entry *eh; 5914 eh = (struct elf_sh_link_hash_entry *) h; 5915 if (eh->gotplt_refcount > 0) 5916 { 5917 eh->gotplt_refcount -= 1; 5918 if (h->plt.refcount > 0) 5919 h->plt.refcount -= 1; 5920 } 5921#ifdef INCLUDE_SHMEDIA 5922 else if (seen_stt_datalabel) 5923 { 5924 if (eh->datalabel_got.refcount > 0) 5925 eh->datalabel_got.refcount -= 1; 5926 } 5927#endif 5928 else if (h->got.refcount > 0) 5929 h->got.refcount -= 1; 5930 } 5931 else if (local_got_refcounts != NULL) 5932 { 5933#ifdef INCLUDE_SHMEDIA 5934 if (rel->r_addend & 1) 5935 { 5936 if (local_got_refcounts[symtab_hdr->sh_info + r_symndx] > 0) 5937 local_got_refcounts[symtab_hdr->sh_info + r_symndx] -= 1; 5938 } 5939 else 5940#endif 5941 if (local_got_refcounts[r_symndx] > 0) 5942 local_got_refcounts[r_symndx] -= 1; 5943 } 5944 break; 5945 5946 default: 5947 break; 5948 } 5949 } 5950 5951 return TRUE; 5952} 5953 5954/* Copy the extra info we tack onto an elf_link_hash_entry. */ 5955 5956static void 5957sh_elf_copy_indirect_symbol (struct bfd_link_info *info, 5958 struct elf_link_hash_entry *dir, 5959 struct elf_link_hash_entry *ind) 5960{ 5961 struct elf_sh_link_hash_entry *edir, *eind; 5962 5963 edir = (struct elf_sh_link_hash_entry *) dir; 5964 eind = (struct elf_sh_link_hash_entry *) ind; 5965 5966 if (eind->dyn_relocs != NULL) 5967 { 5968 if (edir->dyn_relocs != NULL) 5969 { 5970 struct elf_sh_dyn_relocs **pp; 5971 struct elf_sh_dyn_relocs *p; 5972 5973 /* Add reloc counts against the indirect sym to the direct sym 5974 list. Merge any entries against the same section. */ 5975 for (pp = &eind->dyn_relocs; (p = *pp) != NULL; ) 5976 { 5977 struct elf_sh_dyn_relocs *q; 5978 5979 for (q = edir->dyn_relocs; q != NULL; q = q->next) 5980 if (q->sec == p->sec) 5981 { 5982 q->pc_count += p->pc_count; 5983 q->count += p->count; 5984 *pp = p->next; 5985 break; 5986 } 5987 if (q == NULL) 5988 pp = &p->next; 5989 } 5990 *pp = edir->dyn_relocs; 5991 } 5992 5993 edir->dyn_relocs = eind->dyn_relocs; 5994 eind->dyn_relocs = NULL; 5995 } 5996 edir->gotplt_refcount = eind->gotplt_refcount; 5997 eind->gotplt_refcount = 0; 5998#ifdef INCLUDE_SHMEDIA 5999 edir->datalabel_got.refcount += eind->datalabel_got.refcount; 6000 eind->datalabel_got.refcount = 0; 6001#endif 6002 edir->funcdesc.refcount += eind->funcdesc.refcount; 6003 eind->funcdesc.refcount = 0; 6004 edir->abs_funcdesc_refcount += eind->abs_funcdesc_refcount; 6005 eind->abs_funcdesc_refcount = 0; 6006 6007 if (ind->root.type == bfd_link_hash_indirect 6008 && dir->got.refcount <= 0) 6009 { 6010 edir->got_type = eind->got_type; 6011 eind->got_type = GOT_UNKNOWN; 6012 } 6013 6014 if (ind->root.type != bfd_link_hash_indirect 6015 && dir->dynamic_adjusted) 6016 { 6017 /* If called to transfer flags for a weakdef during processing 6018 of elf_adjust_dynamic_symbol, don't copy non_got_ref. 6019 We clear it ourselves for ELIMINATE_COPY_RELOCS. */ 6020 dir->ref_dynamic |= ind->ref_dynamic; 6021 dir->ref_regular |= ind->ref_regular; 6022 dir->ref_regular_nonweak |= ind->ref_regular_nonweak; 6023 dir->needs_plt |= ind->needs_plt; 6024 } 6025 else 6026 _bfd_elf_link_hash_copy_indirect (info, dir, ind); 6027} 6028 6029static int 6030sh_elf_optimized_tls_reloc (struct bfd_link_info *info, int r_type, 6031 int is_local) 6032{ 6033 if (info->shared) 6034 return r_type; 6035 6036 switch (r_type) 6037 { 6038 case R_SH_TLS_GD_32: 6039 case R_SH_TLS_IE_32: 6040 if (is_local) 6041 return R_SH_TLS_LE_32; 6042 return R_SH_TLS_IE_32; 6043 case R_SH_TLS_LD_32: 6044 return R_SH_TLS_LE_32; 6045 } 6046 6047 return r_type; 6048} 6049 6050/* Look through the relocs for a section during the first phase. 6051 Since we don't do .gots or .plts, we just need to consider the 6052 virtual table relocs for gc. */ 6053 6054static bfd_boolean 6055sh_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec, 6056 const Elf_Internal_Rela *relocs) 6057{ 6058 Elf_Internal_Shdr *symtab_hdr; 6059 struct elf_link_hash_entry **sym_hashes; 6060 struct elf_sh_link_hash_table *htab; 6061 const Elf_Internal_Rela *rel; 6062 const Elf_Internal_Rela *rel_end; 6063 asection *sreloc; 6064 unsigned int r_type; 6065 enum got_type got_type, old_got_type; 6066 6067 sreloc = NULL; 6068 6069 if (info->relocatable) 6070 return TRUE; 6071 6072 BFD_ASSERT (is_sh_elf (abfd)); 6073 6074 symtab_hdr = &elf_symtab_hdr (abfd); 6075 sym_hashes = elf_sym_hashes (abfd); 6076 6077 htab = sh_elf_hash_table (info); 6078 if (htab == NULL) 6079 return FALSE; 6080 6081 rel_end = relocs + sec->reloc_count; 6082 for (rel = relocs; rel < rel_end; rel++) 6083 { 6084 struct elf_link_hash_entry *h; 6085 unsigned long r_symndx; 6086#ifdef INCLUDE_SHMEDIA 6087 int seen_stt_datalabel = 0; 6088#endif 6089 6090 r_symndx = ELF32_R_SYM (rel->r_info); 6091 r_type = ELF32_R_TYPE (rel->r_info); 6092 6093 if (r_symndx < symtab_hdr->sh_info) 6094 h = NULL; 6095 else 6096 { 6097 h = sym_hashes[r_symndx - symtab_hdr->sh_info]; 6098 while (h->root.type == bfd_link_hash_indirect 6099 || h->root.type == bfd_link_hash_warning) 6100 { 6101#ifdef INCLUDE_SHMEDIA 6102 seen_stt_datalabel |= h->type == STT_DATALABEL; 6103#endif 6104 h = (struct elf_link_hash_entry *) h->root.u.i.link; 6105 } 6106 } 6107 6108 r_type = sh_elf_optimized_tls_reloc (info, r_type, h == NULL); 6109 if (! info->shared 6110 && r_type == R_SH_TLS_IE_32 6111 && h != NULL 6112 && h->root.type != bfd_link_hash_undefined 6113 && h->root.type != bfd_link_hash_undefweak 6114 && (h->dynindx == -1 6115 || h->def_regular)) 6116 r_type = R_SH_TLS_LE_32; 6117 6118 if (htab->fdpic_p) 6119 switch (r_type) 6120 { 6121 case R_SH_GOTOFFFUNCDESC: 6122 case R_SH_GOTOFFFUNCDESC20: 6123 case R_SH_FUNCDESC: 6124 case R_SH_GOTFUNCDESC: 6125 case R_SH_GOTFUNCDESC20: 6126 if (h != NULL) 6127 { 6128 if (h->dynindx == -1) 6129 switch (ELF_ST_VISIBILITY (h->other)) 6130 { 6131 case STV_INTERNAL: 6132 case STV_HIDDEN: 6133 break; 6134 default: 6135 bfd_elf_link_record_dynamic_symbol (info, h); 6136 break; 6137 } 6138 } 6139 break; 6140 } 6141 6142 /* Some relocs require a global offset table. */ 6143 if (htab->sgot == NULL) 6144 { 6145 switch (r_type) 6146 { 6147 case R_SH_DIR32: 6148 /* This may require an rofixup. */ 6149 if (!htab->fdpic_p) 6150 break; 6151 case R_SH_GOTPLT32: 6152 case R_SH_GOT32: 6153 case R_SH_GOT20: 6154 case R_SH_GOTOFF: 6155 case R_SH_GOTOFF20: 6156 case R_SH_FUNCDESC: 6157 case R_SH_GOTFUNCDESC: 6158 case R_SH_GOTFUNCDESC20: 6159 case R_SH_GOTOFFFUNCDESC: 6160 case R_SH_GOTOFFFUNCDESC20: 6161 case R_SH_GOTPC: 6162#ifdef INCLUDE_SHMEDIA 6163 case R_SH_GOTPLT_LOW16: 6164 case R_SH_GOTPLT_MEDLOW16: 6165 case R_SH_GOTPLT_MEDHI16: 6166 case R_SH_GOTPLT_HI16: 6167 case R_SH_GOTPLT10BY4: 6168 case R_SH_GOTPLT10BY8: 6169 case R_SH_GOT_LOW16: 6170 case R_SH_GOT_MEDLOW16: 6171 case R_SH_GOT_MEDHI16: 6172 case R_SH_GOT_HI16: 6173 case R_SH_GOT10BY4: 6174 case R_SH_GOT10BY8: 6175 case R_SH_GOTOFF_LOW16: 6176 case R_SH_GOTOFF_MEDLOW16: 6177 case R_SH_GOTOFF_MEDHI16: 6178 case R_SH_GOTOFF_HI16: 6179 case R_SH_GOTPC_LOW16: 6180 case R_SH_GOTPC_MEDLOW16: 6181 case R_SH_GOTPC_MEDHI16: 6182 case R_SH_GOTPC_HI16: 6183#endif 6184 case R_SH_TLS_GD_32: 6185 case R_SH_TLS_LD_32: 6186 case R_SH_TLS_IE_32: 6187 if (htab->root.dynobj == NULL) 6188 htab->root.dynobj = abfd; 6189 if (!create_got_section (htab->root.dynobj, info)) 6190 return FALSE; 6191 break; 6192 6193 default: 6194 break; 6195 } 6196 } 6197 6198 switch (r_type) 6199 { 6200 /* This relocation describes the C++ object vtable hierarchy. 6201 Reconstruct it for later use during GC. */ 6202 case R_SH_GNU_VTINHERIT: 6203 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset)) 6204 return FALSE; 6205 break; 6206 6207 /* This relocation describes which C++ vtable entries are actually 6208 used. Record for later use during GC. */ 6209 case R_SH_GNU_VTENTRY: 6210 BFD_ASSERT (h != NULL); 6211 if (h != NULL 6212 && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend)) 6213 return FALSE; 6214 break; 6215 6216 case R_SH_TLS_IE_32: 6217 if (info->shared) 6218 info->flags |= DF_STATIC_TLS; 6219 6220 /* FALLTHROUGH */ 6221 force_got: 6222 case R_SH_TLS_GD_32: 6223 case R_SH_GOT32: 6224 case R_SH_GOT20: 6225#ifdef INCLUDE_SHMEDIA 6226 case R_SH_GOT_LOW16: 6227 case R_SH_GOT_MEDLOW16: 6228 case R_SH_GOT_MEDHI16: 6229 case R_SH_GOT_HI16: 6230 case R_SH_GOT10BY4: 6231 case R_SH_GOT10BY8: 6232#endif 6233 case R_SH_GOTFUNCDESC: 6234 case R_SH_GOTFUNCDESC20: 6235 switch (r_type) 6236 { 6237 default: 6238 got_type = GOT_NORMAL; 6239 break; 6240 case R_SH_TLS_GD_32: 6241 got_type = GOT_TLS_GD; 6242 break; 6243 case R_SH_TLS_IE_32: 6244 got_type = GOT_TLS_IE; 6245 break; 6246 case R_SH_GOTFUNCDESC: 6247 case R_SH_GOTFUNCDESC20: 6248 got_type = GOT_FUNCDESC; 6249 break; 6250 } 6251 6252 if (h != NULL) 6253 { 6254#ifdef INCLUDE_SHMEDIA 6255 if (seen_stt_datalabel) 6256 { 6257 struct elf_sh_link_hash_entry *eh 6258 = (struct elf_sh_link_hash_entry *) h; 6259 6260 eh->datalabel_got.refcount += 1; 6261 } 6262 else 6263#endif 6264 h->got.refcount += 1; 6265 old_got_type = sh_elf_hash_entry (h)->got_type; 6266 } 6267 else 6268 { 6269 bfd_signed_vma *local_got_refcounts; 6270 6271 /* This is a global offset table entry for a local 6272 symbol. */ 6273 local_got_refcounts = elf_local_got_refcounts (abfd); 6274 if (local_got_refcounts == NULL) 6275 { 6276 bfd_size_type size; 6277 6278 size = symtab_hdr->sh_info; 6279 size *= sizeof (bfd_signed_vma); 6280#ifdef INCLUDE_SHMEDIA 6281 /* Reserve space for both the datalabel and 6282 codelabel local GOT offsets. */ 6283 size *= 2; 6284#endif 6285 size += symtab_hdr->sh_info; 6286 local_got_refcounts = ((bfd_signed_vma *) 6287 bfd_zalloc (abfd, size)); 6288 if (local_got_refcounts == NULL) 6289 return FALSE; 6290 elf_local_got_refcounts (abfd) = local_got_refcounts; 6291#ifdef INCLUDE_SHMEDIA 6292 /* Take care of both the datalabel and codelabel local 6293 GOT offsets. */ 6294 sh_elf_local_got_type (abfd) 6295 = (char *) (local_got_refcounts + 2 * symtab_hdr->sh_info); 6296#else 6297 sh_elf_local_got_type (abfd) 6298 = (char *) (local_got_refcounts + symtab_hdr->sh_info); 6299#endif 6300 } 6301#ifdef INCLUDE_SHMEDIA 6302 if (rel->r_addend & 1) 6303 local_got_refcounts[symtab_hdr->sh_info + r_symndx] += 1; 6304 else 6305#endif 6306 local_got_refcounts[r_symndx] += 1; 6307 old_got_type = sh_elf_local_got_type (abfd) [r_symndx]; 6308 } 6309 6310 /* If a TLS symbol is accessed using IE at least once, 6311 there is no point to use dynamic model for it. */ 6312 if (old_got_type != got_type && old_got_type != GOT_UNKNOWN 6313 && (old_got_type != GOT_TLS_GD || got_type != GOT_TLS_IE)) 6314 { 6315 if (old_got_type == GOT_TLS_IE && got_type == GOT_TLS_GD) 6316 got_type = GOT_TLS_IE; 6317 else 6318 { 6319 if ((old_got_type == GOT_FUNCDESC || got_type == GOT_FUNCDESC) 6320 && (old_got_type == GOT_NORMAL || got_type == GOT_NORMAL)) 6321 (*_bfd_error_handler) 6322 (_("%B: `%s' accessed both as normal and FDPIC symbol"), 6323 abfd, h->root.root.string); 6324 else if (old_got_type == GOT_FUNCDESC 6325 || got_type == GOT_FUNCDESC) 6326 (*_bfd_error_handler) 6327 (_("%B: `%s' accessed both as FDPIC and thread local symbol"), 6328 abfd, h->root.root.string); 6329 else 6330 (*_bfd_error_handler) 6331 (_("%B: `%s' accessed both as normal and thread local symbol"), 6332 abfd, h->root.root.string); 6333 return FALSE; 6334 } 6335 } 6336 6337 if (old_got_type != got_type) 6338 { 6339 if (h != NULL) 6340 sh_elf_hash_entry (h)->got_type = got_type; 6341 else 6342 sh_elf_local_got_type (abfd) [r_symndx] = got_type; 6343 } 6344 6345 break; 6346 6347 case R_SH_TLS_LD_32: 6348 sh_elf_hash_table(info)->tls_ldm_got.refcount += 1; 6349 break; 6350 6351 case R_SH_FUNCDESC: 6352 case R_SH_GOTOFFFUNCDESC: 6353 case R_SH_GOTOFFFUNCDESC20: 6354 if (rel->r_addend) 6355 { 6356 (*_bfd_error_handler) 6357 (_("%B: Function descriptor relocation with non-zero addend"), 6358 abfd); 6359 return FALSE; 6360 } 6361 6362 if (h == NULL) 6363 { 6364 union gotref *local_funcdesc; 6365 6366 /* We need a function descriptor for a local symbol. */ 6367 local_funcdesc = sh_elf_local_funcdesc (abfd); 6368 if (local_funcdesc == NULL) 6369 { 6370 bfd_size_type size; 6371 6372 size = symtab_hdr->sh_info * sizeof (union gotref); 6373#ifdef INCLUDE_SHMEDIA 6374 /* Count datalabel local GOT. */ 6375 size *= 2; 6376#endif 6377 local_funcdesc = (union gotref *) bfd_zalloc (abfd, size); 6378 if (local_funcdesc == NULL) 6379 return FALSE; 6380 sh_elf_local_funcdesc (abfd) = local_funcdesc; 6381 } 6382 local_funcdesc[r_symndx].refcount += 1; 6383 6384 if (r_type == R_SH_FUNCDESC) 6385 { 6386 if (!info->shared) 6387 htab->srofixup->size += 4; 6388 else 6389 htab->srelgot->size += sizeof (Elf32_External_Rela); 6390 } 6391 } 6392 else 6393 { 6394 sh_elf_hash_entry (h)->funcdesc.refcount++; 6395 if (r_type == R_SH_FUNCDESC) 6396 sh_elf_hash_entry (h)->abs_funcdesc_refcount++; 6397 6398 /* If there is a function descriptor reference, then 6399 there should not be any non-FDPIC references. */ 6400 old_got_type = sh_elf_hash_entry (h)->got_type; 6401 if (old_got_type != GOT_FUNCDESC && old_got_type != GOT_UNKNOWN) 6402 { 6403 if (old_got_type == GOT_NORMAL) 6404 (*_bfd_error_handler) 6405 (_("%B: `%s' accessed both as normal and FDPIC symbol"), 6406 abfd, h->root.root.string); 6407 else 6408 (*_bfd_error_handler) 6409 (_("%B: `%s' accessed both as FDPIC and thread local symbol"), 6410 abfd, h->root.root.string); 6411 } 6412 } 6413 break; 6414 6415 case R_SH_GOTPLT32: 6416#ifdef INCLUDE_SHMEDIA 6417 case R_SH_GOTPLT_LOW16: 6418 case R_SH_GOTPLT_MEDLOW16: 6419 case R_SH_GOTPLT_MEDHI16: 6420 case R_SH_GOTPLT_HI16: 6421 case R_SH_GOTPLT10BY4: 6422 case R_SH_GOTPLT10BY8: 6423#endif 6424 /* If this is a local symbol, we resolve it directly without 6425 creating a procedure linkage table entry. */ 6426 6427 if (h == NULL 6428 || h->forced_local 6429 || ! info->shared 6430 || info->symbolic 6431 || h->dynindx == -1) 6432 goto force_got; 6433 6434 h->needs_plt = 1; 6435 h->plt.refcount += 1; 6436 ((struct elf_sh_link_hash_entry *) h)->gotplt_refcount += 1; 6437 6438 break; 6439 6440 case R_SH_PLT32: 6441#ifdef INCLUDE_SHMEDIA 6442 case R_SH_PLT_LOW16: 6443 case R_SH_PLT_MEDLOW16: 6444 case R_SH_PLT_MEDHI16: 6445 case R_SH_PLT_HI16: 6446#endif 6447 /* This symbol requires a procedure linkage table entry. We 6448 actually build the entry in adjust_dynamic_symbol, 6449 because this might be a case of linking PIC code which is 6450 never referenced by a dynamic object, in which case we 6451 don't need to generate a procedure linkage table entry 6452 after all. */ 6453 6454 /* If this is a local symbol, we resolve it directly without 6455 creating a procedure linkage table entry. */ 6456 if (h == NULL) 6457 continue; 6458 6459 if (h->forced_local) 6460 break; 6461 6462 h->needs_plt = 1; 6463 h->plt.refcount += 1; 6464 break; 6465 6466 case R_SH_DIR32: 6467 case R_SH_REL32: 6468#ifdef INCLUDE_SHMEDIA 6469 case R_SH_IMM_LOW16_PCREL: 6470 case R_SH_IMM_MEDLOW16_PCREL: 6471 case R_SH_IMM_MEDHI16_PCREL: 6472 case R_SH_IMM_HI16_PCREL: 6473#endif 6474 if (h != NULL && ! info->shared) 6475 { 6476 h->non_got_ref = 1; 6477 h->plt.refcount += 1; 6478 } 6479 6480 /* If we are creating a shared library, and this is a reloc 6481 against a global symbol, or a non PC relative reloc 6482 against a local symbol, then we need to copy the reloc 6483 into the shared library. However, if we are linking with 6484 -Bsymbolic, we do not need to copy a reloc against a 6485 global symbol which is defined in an object we are 6486 including in the link (i.e., DEF_REGULAR is set). At 6487 this point we have not seen all the input files, so it is 6488 possible that DEF_REGULAR is not set now but will be set 6489 later (it is never cleared). We account for that 6490 possibility below by storing information in the 6491 dyn_relocs field of the hash table entry. A similar 6492 situation occurs when creating shared libraries and symbol 6493 visibility changes render the symbol local. 6494 6495 If on the other hand, we are creating an executable, we 6496 may need to keep relocations for symbols satisfied by a 6497 dynamic library if we manage to avoid copy relocs for the 6498 symbol. */ 6499 if ((info->shared 6500 && (sec->flags & SEC_ALLOC) != 0 6501 && (r_type != R_SH_REL32 6502 || (h != NULL 6503 && (! info->symbolic 6504 || h->root.type == bfd_link_hash_defweak 6505 || !h->def_regular)))) 6506 || (! info->shared 6507 && (sec->flags & SEC_ALLOC) != 0 6508 && h != NULL 6509 && (h->root.type == bfd_link_hash_defweak 6510 || !h->def_regular))) 6511 { 6512 struct elf_sh_dyn_relocs *p; 6513 struct elf_sh_dyn_relocs **head; 6514 6515 if (htab->root.dynobj == NULL) 6516 htab->root.dynobj = abfd; 6517 6518 /* When creating a shared object, we must copy these 6519 reloc types into the output file. We create a reloc 6520 section in dynobj and make room for this reloc. */ 6521 if (sreloc == NULL) 6522 { 6523 sreloc = _bfd_elf_make_dynamic_reloc_section 6524 (sec, htab->root.dynobj, 2, abfd, /*rela?*/ TRUE); 6525 6526 if (sreloc == NULL) 6527 return FALSE; 6528 } 6529 6530 /* If this is a global symbol, we count the number of 6531 relocations we need for this symbol. */ 6532 if (h != NULL) 6533 head = &((struct elf_sh_link_hash_entry *) h)->dyn_relocs; 6534 else 6535 { 6536 /* Track dynamic relocs needed for local syms too. */ 6537 asection *s; 6538 void *vpp; 6539 Elf_Internal_Sym *isym; 6540 6541 isym = bfd_sym_from_r_symndx (&htab->sym_cache, 6542 abfd, r_symndx); 6543 if (isym == NULL) 6544 return FALSE; 6545 6546 s = bfd_section_from_elf_index (abfd, isym->st_shndx); 6547 if (s == NULL) 6548 s = sec; 6549 6550 vpp = &elf_section_data (s)->local_dynrel; 6551 head = (struct elf_sh_dyn_relocs **) vpp; 6552 } 6553 6554 p = *head; 6555 if (p == NULL || p->sec != sec) 6556 { 6557 bfd_size_type amt = sizeof (*p); 6558 p = bfd_alloc (htab->root.dynobj, amt); 6559 if (p == NULL) 6560 return FALSE; 6561 p->next = *head; 6562 *head = p; 6563 p->sec = sec; 6564 p->count = 0; 6565 p->pc_count = 0; 6566 } 6567 6568 p->count += 1; 6569 if (r_type == R_SH_REL32 6570#ifdef INCLUDE_SHMEDIA 6571 || r_type == R_SH_IMM_LOW16_PCREL 6572 || r_type == R_SH_IMM_MEDLOW16_PCREL 6573 || r_type == R_SH_IMM_MEDHI16_PCREL 6574 || r_type == R_SH_IMM_HI16_PCREL 6575#endif 6576 ) 6577 p->pc_count += 1; 6578 } 6579 6580 /* Allocate the fixup regardless of whether we need a relocation. 6581 If we end up generating the relocation, we'll unallocate the 6582 fixup. */ 6583 if (htab->fdpic_p && !info->shared 6584 && r_type == R_SH_DIR32 6585 && (sec->flags & SEC_ALLOC) != 0) 6586 htab->srofixup->size += 4; 6587 break; 6588 6589 case R_SH_TLS_LE_32: 6590 if (info->shared && !info->pie) 6591 { 6592 (*_bfd_error_handler) 6593 (_("%B: TLS local exec code cannot be linked into shared objects"), 6594 abfd); 6595 return FALSE; 6596 } 6597 6598 break; 6599 6600 case R_SH_TLS_LDO_32: 6601 /* Nothing to do. */ 6602 break; 6603 6604 default: 6605 break; 6606 } 6607 } 6608 6609 return TRUE; 6610} 6611 6612#ifndef sh_elf_set_mach_from_flags 6613static unsigned int sh_ef_bfd_table[] = { EF_SH_BFD_TABLE }; 6614 6615static bfd_boolean 6616sh_elf_set_mach_from_flags (bfd *abfd) 6617{ 6618 flagword flags = elf_elfheader (abfd)->e_flags & EF_SH_MACH_MASK; 6619 6620 if (flags >= sizeof(sh_ef_bfd_table)) 6621 return FALSE; 6622 6623 if (sh_ef_bfd_table[flags] == 0) 6624 return FALSE; 6625 6626 bfd_default_set_arch_mach (abfd, bfd_arch_sh, sh_ef_bfd_table[flags]); 6627 6628 return TRUE; 6629} 6630 6631 6632/* Reverse table lookup for sh_ef_bfd_table[]. 6633 Given a bfd MACH value from archures.c 6634 return the equivalent ELF flags from the table. 6635 Return -1 if no match is found. */ 6636 6637int 6638sh_elf_get_flags_from_mach (unsigned long mach) 6639{ 6640 int i = ARRAY_SIZE (sh_ef_bfd_table) - 1; 6641 6642 for (; i>0; i--) 6643 if (sh_ef_bfd_table[i] == mach) 6644 return i; 6645 6646 /* shouldn't get here */ 6647 BFD_FAIL(); 6648 6649 return -1; 6650} 6651#endif /* not sh_elf_set_mach_from_flags */ 6652 6653#ifndef sh_elf_set_private_flags 6654/* Function to keep SH specific file flags. */ 6655 6656static bfd_boolean 6657sh_elf_set_private_flags (bfd *abfd, flagword flags) 6658{ 6659 BFD_ASSERT (! elf_flags_init (abfd) 6660 || elf_elfheader (abfd)->e_flags == flags); 6661 6662 elf_elfheader (abfd)->e_flags = flags; 6663 elf_flags_init (abfd) = TRUE; 6664 return sh_elf_set_mach_from_flags (abfd); 6665} 6666#endif /* not sh_elf_set_private_flags */ 6667 6668#ifndef sh_elf_copy_private_data 6669/* Copy backend specific data from one object module to another */ 6670 6671static bfd_boolean 6672sh_elf_copy_private_data (bfd * ibfd, bfd * obfd) 6673{ 6674 /* Copy object attributes. */ 6675 _bfd_elf_copy_obj_attributes (ibfd, obfd); 6676 6677 if (! is_sh_elf (ibfd) || ! is_sh_elf (obfd)) 6678 return TRUE; 6679 6680 /* Copy the stack size. */ 6681 if (elf_tdata (ibfd)->phdr && elf_tdata (obfd)->phdr 6682 && fdpic_object_p (ibfd) && fdpic_object_p (obfd)) 6683 { 6684 unsigned i; 6685 6686 for (i = 0; i < elf_elfheader (ibfd)->e_phnum; i++) 6687 if (elf_tdata (ibfd)->phdr[i].p_type == PT_GNU_STACK) 6688 { 6689 Elf_Internal_Phdr *iphdr = &elf_tdata (ibfd)->phdr[i]; 6690 6691 for (i = 0; i < elf_elfheader (obfd)->e_phnum; i++) 6692 if (elf_tdata (obfd)->phdr[i].p_type == PT_GNU_STACK) 6693 { 6694 memcpy (&elf_tdata (obfd)->phdr[i], iphdr, sizeof (*iphdr)); 6695 6696 /* Rewrite the phdrs, since we're only called after they 6697 were first written. */ 6698 if (bfd_seek (obfd, 6699 (bfd_signed_vma) get_elf_backend_data (obfd) 6700 ->s->sizeof_ehdr, SEEK_SET) != 0 6701 || get_elf_backend_data (obfd)->s 6702 ->write_out_phdrs (obfd, elf_tdata (obfd)->phdr, 6703 elf_elfheader (obfd)->e_phnum) != 0) 6704 return FALSE; 6705 break; 6706 } 6707 6708 break; 6709 } 6710 } 6711 6712 return sh_elf_set_private_flags (obfd, elf_elfheader (ibfd)->e_flags); 6713} 6714#endif /* not sh_elf_copy_private_data */ 6715 6716#ifndef sh_elf_merge_private_data 6717 6718/* This function returns the ELF architecture number that 6719 corresponds to the given arch_sh* flags. */ 6720 6721int 6722sh_find_elf_flags (unsigned int arch_set) 6723{ 6724 extern unsigned long sh_get_bfd_mach_from_arch_set (unsigned int); 6725 unsigned long bfd_mach = sh_get_bfd_mach_from_arch_set (arch_set); 6726 6727 return sh_elf_get_flags_from_mach (bfd_mach); 6728} 6729 6730/* This routine initialises the elf flags when required and 6731 calls sh_merge_bfd_arch() to check dsp/fpu compatibility. */ 6732 6733static bfd_boolean 6734sh_elf_merge_private_data (bfd *ibfd, bfd *obfd) 6735{ 6736 extern bfd_boolean sh_merge_bfd_arch (bfd *, bfd *); 6737 6738 if (! is_sh_elf (ibfd) || ! is_sh_elf (obfd)) 6739 return TRUE; 6740 6741 if (! elf_flags_init (obfd)) 6742 { 6743 /* This happens when ld starts out with a 'blank' output file. */ 6744 elf_flags_init (obfd) = TRUE; 6745 elf_elfheader (obfd)->e_flags = elf_elfheader (ibfd)->e_flags; 6746 sh_elf_set_mach_from_flags (obfd); 6747 if (elf_elfheader (obfd)->e_flags & EF_SH_FDPIC) 6748 elf_elfheader (obfd)->e_flags |= EF_SH_PIC; 6749 } 6750 6751 if (! sh_merge_bfd_arch (ibfd, obfd)) 6752 { 6753 _bfd_error_handler ("%B: uses instructions which are incompatible " 6754 "with instructions used in previous modules", 6755 ibfd); 6756 bfd_set_error (bfd_error_bad_value); 6757 return FALSE; 6758 } 6759 6760 elf_elfheader (obfd)->e_flags &= ~EF_SH_MACH_MASK; 6761 elf_elfheader (obfd)->e_flags |= 6762 sh_elf_get_flags_from_mach (bfd_get_mach (obfd)); 6763 6764 if (fdpic_object_p (ibfd) != fdpic_object_p (obfd)) 6765 { 6766 _bfd_error_handler ("%B: attempt to mix FDPIC and non-FDPIC objects", 6767 ibfd); 6768 bfd_set_error (bfd_error_bad_value); 6769 return FALSE; 6770 } 6771 6772 return TRUE; 6773} 6774#endif /* not sh_elf_merge_private_data */ 6775 6776/* Override the generic function because we need to store sh_elf_obj_tdata 6777 as the specific tdata. We set also the machine architecture from flags 6778 here. */ 6779 6780static bfd_boolean 6781sh_elf_object_p (bfd *abfd) 6782{ 6783 if (! sh_elf_set_mach_from_flags (abfd)) 6784 return FALSE; 6785 6786 return (((elf_elfheader (abfd)->e_flags & EF_SH_FDPIC) != 0) 6787 == fdpic_object_p (abfd)); 6788} 6789 6790/* Finish up dynamic symbol handling. We set the contents of various 6791 dynamic sections here. */ 6792 6793static bfd_boolean 6794sh_elf_finish_dynamic_symbol (bfd *output_bfd, struct bfd_link_info *info, 6795 struct elf_link_hash_entry *h, 6796 Elf_Internal_Sym *sym) 6797{ 6798 struct elf_sh_link_hash_table *htab; 6799 6800 htab = sh_elf_hash_table (info); 6801 if (htab == NULL) 6802 return FALSE; 6803 6804 if (h->plt.offset != (bfd_vma) -1) 6805 { 6806 asection *splt; 6807 asection *sgotplt; 6808 asection *srelplt; 6809 6810 bfd_vma plt_index; 6811 bfd_vma got_offset; 6812 Elf_Internal_Rela rel; 6813 bfd_byte *loc; 6814 const struct elf_sh_plt_info *plt_info; 6815 6816 /* This symbol has an entry in the procedure linkage table. Set 6817 it up. */ 6818 6819 BFD_ASSERT (h->dynindx != -1); 6820 6821 splt = htab->splt; 6822 sgotplt = htab->sgotplt; 6823 srelplt = htab->srelplt; 6824 BFD_ASSERT (splt != NULL && sgotplt != NULL && srelplt != NULL); 6825 6826 /* Get the index in the procedure linkage table which 6827 corresponds to this symbol. This is the index of this symbol 6828 in all the symbols for which we are making plt entries. The 6829 first entry in the procedure linkage table is reserved. */ 6830 plt_index = get_plt_index (htab->plt_info, h->plt.offset); 6831 6832 plt_info = htab->plt_info; 6833 if (plt_info->short_plt != NULL && plt_index <= MAX_SHORT_PLT) 6834 plt_info = plt_info->short_plt; 6835 6836 /* Get the offset into the .got table of the entry that 6837 corresponds to this function. */ 6838 if (htab->fdpic_p) 6839 /* The offset must be relative to the GOT symbol, twelve bytes 6840 before the end of .got.plt. Each descriptor is eight 6841 bytes. */ 6842 got_offset = plt_index * 8 + 12 - sgotplt->size; 6843 else 6844 /* Each .got entry is 4 bytes. The first three are 6845 reserved. */ 6846 got_offset = (plt_index + 3) * 4; 6847 6848#ifdef GOT_BIAS 6849 if (info->shared) 6850 got_offset -= GOT_BIAS; 6851#endif 6852 6853 /* Fill in the entry in the procedure linkage table. */ 6854 memcpy (splt->contents + h->plt.offset, 6855 plt_info->symbol_entry, 6856 plt_info->symbol_entry_size); 6857 6858 if (info->shared || htab->fdpic_p) 6859 { 6860 if (plt_info->symbol_fields.got20) 6861 { 6862 bfd_reloc_status_type r; 6863 r = install_movi20_field (output_bfd, got_offset, 6864 splt->owner, splt, splt->contents, 6865 h->plt.offset 6866 + plt_info->symbol_fields.got_entry); 6867 BFD_ASSERT (r == bfd_reloc_ok); 6868 } 6869 else 6870 install_plt_field (output_bfd, FALSE, got_offset, 6871 (splt->contents 6872 + h->plt.offset 6873 + plt_info->symbol_fields.got_entry)); 6874 } 6875 else 6876 { 6877 BFD_ASSERT (!plt_info->symbol_fields.got20); 6878 6879 install_plt_field (output_bfd, FALSE, 6880 (sgotplt->output_section->vma 6881 + sgotplt->output_offset 6882 + got_offset), 6883 (splt->contents 6884 + h->plt.offset 6885 + plt_info->symbol_fields.got_entry)); 6886 if (htab->vxworks_p) 6887 { 6888 unsigned int reachable_plts, plts_per_4k; 6889 int distance; 6890 6891 /* Divide the PLT into groups. The first group contains 6892 REACHABLE_PLTS entries and the other groups contain 6893 PLTS_PER_4K entries. Entries in the first group can 6894 branch directly to .plt; those in later groups branch 6895 to the last element of the previous group. */ 6896 /* ??? It would be better to create multiple copies of 6897 the common resolver stub. */ 6898 reachable_plts = ((4096 6899 - plt_info->plt0_entry_size 6900 - (plt_info->symbol_fields.plt + 4)) 6901 / plt_info->symbol_entry_size) + 1; 6902 plts_per_4k = (4096 / plt_info->symbol_entry_size); 6903 if (plt_index < reachable_plts) 6904 distance = -(h->plt.offset 6905 + plt_info->symbol_fields.plt); 6906 else 6907 distance = -(((plt_index - reachable_plts) % plts_per_4k + 1) 6908 * plt_info->symbol_entry_size); 6909 6910 /* Install the 'bra' with this offset. */ 6911 bfd_put_16 (output_bfd, 6912 0xa000 | (0x0fff & ((distance - 4) / 2)), 6913 (splt->contents 6914 + h->plt.offset 6915 + plt_info->symbol_fields.plt)); 6916 } 6917 else 6918 install_plt_field (output_bfd, TRUE, 6919 splt->output_section->vma + splt->output_offset, 6920 (splt->contents 6921 + h->plt.offset 6922 + plt_info->symbol_fields.plt)); 6923 } 6924 6925 /* Make got_offset relative to the start of .got.plt. */ 6926#ifdef GOT_BIAS 6927 if (info->shared) 6928 got_offset += GOT_BIAS; 6929#endif 6930 if (htab->fdpic_p) 6931 got_offset = plt_index * 8; 6932 6933 if (plt_info->symbol_fields.reloc_offset != MINUS_ONE) 6934 install_plt_field (output_bfd, FALSE, 6935 plt_index * sizeof (Elf32_External_Rela), 6936 (splt->contents 6937 + h->plt.offset 6938 + plt_info->symbol_fields.reloc_offset)); 6939 6940 /* Fill in the entry in the global offset table. */ 6941 bfd_put_32 (output_bfd, 6942 (splt->output_section->vma 6943 + splt->output_offset 6944 + h->plt.offset 6945 + plt_info->symbol_resolve_offset), 6946 sgotplt->contents + got_offset); 6947 if (htab->fdpic_p) 6948 bfd_put_32 (output_bfd, 6949 sh_elf_osec_to_segment (output_bfd, 6950 htab->splt->output_section), 6951 sgotplt->contents + got_offset + 4); 6952 6953 /* Fill in the entry in the .rela.plt section. */ 6954 rel.r_offset = (sgotplt->output_section->vma 6955 + sgotplt->output_offset 6956 + got_offset); 6957 if (htab->fdpic_p) 6958 rel.r_info = ELF32_R_INFO (h->dynindx, R_SH_FUNCDESC_VALUE); 6959 else 6960 rel.r_info = ELF32_R_INFO (h->dynindx, R_SH_JMP_SLOT); 6961 rel.r_addend = 0; 6962#ifdef GOT_BIAS 6963 rel.r_addend = GOT_BIAS; 6964#endif 6965 loc = srelplt->contents + plt_index * sizeof (Elf32_External_Rela); 6966 bfd_elf32_swap_reloca_out (output_bfd, &rel, loc); 6967 6968 if (htab->vxworks_p && !info->shared) 6969 { 6970 /* Create the .rela.plt.unloaded relocations for this PLT entry. 6971 Begin by pointing LOC to the first such relocation. */ 6972 loc = (htab->srelplt2->contents 6973 + (plt_index * 2 + 1) * sizeof (Elf32_External_Rela)); 6974 6975 /* Create a .rela.plt.unloaded R_SH_DIR32 relocation 6976 for the PLT entry's pointer to the .got.plt entry. */ 6977 rel.r_offset = (htab->splt->output_section->vma 6978 + htab->splt->output_offset 6979 + h->plt.offset 6980 + plt_info->symbol_fields.got_entry); 6981 rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_SH_DIR32); 6982 rel.r_addend = got_offset; 6983 bfd_elf32_swap_reloca_out (output_bfd, &rel, loc); 6984 loc += sizeof (Elf32_External_Rela); 6985 6986 /* Create a .rela.plt.unloaded R_SH_DIR32 relocation for 6987 the .got.plt entry, which initially points to .plt. */ 6988 rel.r_offset = (sgotplt->output_section->vma 6989 + sgotplt->output_offset 6990 + got_offset); 6991 rel.r_info = ELF32_R_INFO (htab->root.hplt->indx, R_SH_DIR32); 6992 rel.r_addend = 0; 6993 bfd_elf32_swap_reloc_out (output_bfd, &rel, loc); 6994 } 6995 6996 if (!h->def_regular) 6997 { 6998 /* Mark the symbol as undefined, rather than as defined in 6999 the .plt section. Leave the value alone. */ 7000 sym->st_shndx = SHN_UNDEF; 7001 } 7002 } 7003 7004 if (h->got.offset != (bfd_vma) -1 7005 && sh_elf_hash_entry (h)->got_type != GOT_TLS_GD 7006 && sh_elf_hash_entry (h)->got_type != GOT_TLS_IE 7007 && sh_elf_hash_entry (h)->got_type != GOT_FUNCDESC) 7008 { 7009 asection *sgot; 7010 asection *srelgot; 7011 Elf_Internal_Rela rel; 7012 bfd_byte *loc; 7013 7014 /* This symbol has an entry in the global offset table. Set it 7015 up. */ 7016 7017 sgot = htab->sgot; 7018 srelgot = htab->srelgot; 7019 BFD_ASSERT (sgot != NULL && srelgot != NULL); 7020 7021 rel.r_offset = (sgot->output_section->vma 7022 + sgot->output_offset 7023 + (h->got.offset &~ (bfd_vma) 1)); 7024 7025 /* If this is a static link, or it is a -Bsymbolic link and the 7026 symbol is defined locally or was forced to be local because 7027 of a version file, we just want to emit a RELATIVE reloc. 7028 The entry in the global offset table will already have been 7029 initialized in the relocate_section function. */ 7030 if (info->shared 7031 && SYMBOL_REFERENCES_LOCAL (info, h)) 7032 { 7033 if (htab->fdpic_p) 7034 { 7035 asection *sec = h->root.u.def.section; 7036 int dynindx 7037 = elf_section_data (sec->output_section)->dynindx; 7038 7039 rel.r_info = ELF32_R_INFO (dynindx, R_SH_DIR32); 7040 rel.r_addend = (h->root.u.def.value 7041 + h->root.u.def.section->output_offset); 7042 } 7043 else 7044 { 7045 rel.r_info = ELF32_R_INFO (0, R_SH_RELATIVE); 7046 rel.r_addend = (h->root.u.def.value 7047 + h->root.u.def.section->output_section->vma 7048 + h->root.u.def.section->output_offset); 7049 } 7050 } 7051 else 7052 { 7053 bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + h->got.offset); 7054 rel.r_info = ELF32_R_INFO (h->dynindx, R_SH_GLOB_DAT); 7055 rel.r_addend = 0; 7056 } 7057 7058 loc = srelgot->contents; 7059 loc += srelgot->reloc_count++ * sizeof (Elf32_External_Rela); 7060 bfd_elf32_swap_reloca_out (output_bfd, &rel, loc); 7061 } 7062 7063#ifdef INCLUDE_SHMEDIA 7064 { 7065 struct elf_sh_link_hash_entry *eh; 7066 7067 eh = (struct elf_sh_link_hash_entry *) h; 7068 if (eh->datalabel_got.offset != (bfd_vma) -1) 7069 { 7070 asection *sgot; 7071 asection *srelgot; 7072 Elf_Internal_Rela rel; 7073 bfd_byte *loc; 7074 7075 /* This symbol has a datalabel entry in the global offset table. 7076 Set it up. */ 7077 7078 sgot = htab->sgot; 7079 srelgot = htab->srelgot; 7080 BFD_ASSERT (sgot != NULL && srelgot != NULL); 7081 7082 rel.r_offset = (sgot->output_section->vma 7083 + sgot->output_offset 7084 + (eh->datalabel_got.offset &~ (bfd_vma) 1)); 7085 7086 /* If this is a static link, or it is a -Bsymbolic link and the 7087 symbol is defined locally or was forced to be local because 7088 of a version file, we just want to emit a RELATIVE reloc. 7089 The entry in the global offset table will already have been 7090 initialized in the relocate_section function. */ 7091 if (info->shared 7092 && SYMBOL_REFERENCES_LOCAL (info, h)) 7093 { 7094 if (htab->fdpic_p) 7095 { 7096 asection *sec = h->root.u.def.section; 7097 int dynindx 7098 = elf_section_data (sec->output_section)->dynindx; 7099 7100 rel.r_info = ELF32_R_INFO (dynindx, R_SH_DIR32); 7101 rel.r_addend = (h->root.u.def.value 7102 + h->root.u.def.section->output_offset); 7103 } 7104 else 7105 { 7106 rel.r_info = ELF32_R_INFO (0, R_SH_RELATIVE); 7107 rel.r_addend = (h->root.u.def.value 7108 + h->root.u.def.section->output_section->vma 7109 + h->root.u.def.section->output_offset); 7110 } 7111 } 7112 else 7113 { 7114 bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents 7115 + eh->datalabel_got.offset); 7116 rel.r_info = ELF32_R_INFO (h->dynindx, R_SH_GLOB_DAT); 7117 rel.r_addend = 0; 7118 } 7119 7120 loc = srelgot->contents; 7121 loc += srelgot->reloc_count++ * sizeof (Elf32_External_Rela); 7122 bfd_elf32_swap_reloca_out (output_bfd, &rel, loc); 7123 } 7124 } 7125#endif 7126 7127 if (h->needs_copy) 7128 { 7129 asection *s; 7130 Elf_Internal_Rela rel; 7131 bfd_byte *loc; 7132 7133 /* This symbol needs a copy reloc. Set it up. */ 7134 7135 BFD_ASSERT (h->dynindx != -1 7136 && (h->root.type == bfd_link_hash_defined 7137 || h->root.type == bfd_link_hash_defweak)); 7138 7139 s = bfd_get_linker_section (htab->root.dynobj, ".rela.bss"); 7140 BFD_ASSERT (s != NULL); 7141 7142 rel.r_offset = (h->root.u.def.value 7143 + h->root.u.def.section->output_section->vma 7144 + h->root.u.def.section->output_offset); 7145 rel.r_info = ELF32_R_INFO (h->dynindx, R_SH_COPY); 7146 rel.r_addend = 0; 7147 loc = s->contents + s->reloc_count++ * sizeof (Elf32_External_Rela); 7148 bfd_elf32_swap_reloca_out (output_bfd, &rel, loc); 7149 } 7150 7151 /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute. On VxWorks, 7152 _GLOBAL_OFFSET_TABLE_ is not absolute: it is relative to the 7153 ".got" section. */ 7154 if (strcmp (h->root.root.string, "_DYNAMIC") == 0 7155 || (!htab->vxworks_p && h == htab->root.hgot)) 7156 sym->st_shndx = SHN_ABS; 7157 7158 return TRUE; 7159} 7160 7161/* Finish up the dynamic sections. */ 7162 7163static bfd_boolean 7164sh_elf_finish_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info) 7165{ 7166 struct elf_sh_link_hash_table *htab; 7167 asection *sgotplt; 7168 asection *sdyn; 7169 7170 htab = sh_elf_hash_table (info); 7171 if (htab == NULL) 7172 return FALSE; 7173 7174 sgotplt = htab->sgotplt; 7175 sdyn = bfd_get_linker_section (htab->root.dynobj, ".dynamic"); 7176 7177 if (htab->root.dynamic_sections_created) 7178 { 7179 asection *splt; 7180 Elf32_External_Dyn *dyncon, *dynconend; 7181 7182 BFD_ASSERT (sgotplt != NULL && sdyn != NULL); 7183 7184 dyncon = (Elf32_External_Dyn *) sdyn->contents; 7185 dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size); 7186 for (; dyncon < dynconend; dyncon++) 7187 { 7188 Elf_Internal_Dyn dyn; 7189 asection *s; 7190#ifdef INCLUDE_SHMEDIA 7191 const char *name; 7192#endif 7193 7194 bfd_elf32_swap_dyn_in (htab->root.dynobj, dyncon, &dyn); 7195 7196 switch (dyn.d_tag) 7197 { 7198 default: 7199 if (htab->vxworks_p 7200 && elf_vxworks_finish_dynamic_entry (output_bfd, &dyn)) 7201 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); 7202 break; 7203 7204#ifdef INCLUDE_SHMEDIA 7205 case DT_INIT: 7206 name = info->init_function; 7207 goto get_sym; 7208 7209 case DT_FINI: 7210 name = info->fini_function; 7211 get_sym: 7212 if (dyn.d_un.d_val != 0) 7213 { 7214 struct elf_link_hash_entry *h; 7215 7216 h = elf_link_hash_lookup (&htab->root, name, 7217 FALSE, FALSE, TRUE); 7218 if (h != NULL && (h->other & STO_SH5_ISA32)) 7219 { 7220 dyn.d_un.d_val |= 1; 7221 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); 7222 } 7223 } 7224 break; 7225#endif 7226 7227 case DT_PLTGOT: 7228 BFD_ASSERT (htab->root.hgot != NULL); 7229 s = htab->root.hgot->root.u.def.section; 7230 dyn.d_un.d_ptr = htab->root.hgot->root.u.def.value 7231 + s->output_section->vma + s->output_offset; 7232 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); 7233 break; 7234 7235 case DT_JMPREL: 7236 s = htab->srelplt->output_section; 7237 BFD_ASSERT (s != NULL); 7238 dyn.d_un.d_ptr = s->vma; 7239 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); 7240 break; 7241 7242 case DT_PLTRELSZ: 7243 s = htab->srelplt->output_section; 7244 BFD_ASSERT (s != NULL); 7245 dyn.d_un.d_val = s->size; 7246 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); 7247 break; 7248 7249 case DT_RELASZ: 7250 /* My reading of the SVR4 ABI indicates that the 7251 procedure linkage table relocs (DT_JMPREL) should be 7252 included in the overall relocs (DT_RELA). This is 7253 what Solaris does. However, UnixWare can not handle 7254 that case. Therefore, we override the DT_RELASZ entry 7255 here to make it not include the JMPREL relocs. Since 7256 the linker script arranges for .rela.plt to follow all 7257 other relocation sections, we don't have to worry 7258 about changing the DT_RELA entry. */ 7259 if (htab->srelplt != NULL) 7260 { 7261 s = htab->srelplt->output_section; 7262 dyn.d_un.d_val -= s->size; 7263 } 7264 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); 7265 break; 7266 } 7267 } 7268 7269 /* Fill in the first entry in the procedure linkage table. */ 7270 splt = htab->splt; 7271 if (splt && splt->size > 0 && htab->plt_info->plt0_entry) 7272 { 7273 unsigned int i; 7274 7275 memcpy (splt->contents, 7276 htab->plt_info->plt0_entry, 7277 htab->plt_info->plt0_entry_size); 7278 for (i = 0; i < ARRAY_SIZE (htab->plt_info->plt0_got_fields); i++) 7279 if (htab->plt_info->plt0_got_fields[i] != MINUS_ONE) 7280 install_plt_field (output_bfd, FALSE, 7281 (sgotplt->output_section->vma 7282 + sgotplt->output_offset 7283 + (i * 4)), 7284 (splt->contents 7285 + htab->plt_info->plt0_got_fields[i])); 7286 7287 if (htab->vxworks_p) 7288 { 7289 /* Finalize the .rela.plt.unloaded contents. */ 7290 Elf_Internal_Rela rel; 7291 bfd_byte *loc; 7292 7293 /* Create a .rela.plt.unloaded R_SH_DIR32 relocation for the 7294 first PLT entry's pointer to _GLOBAL_OFFSET_TABLE_ + 8. */ 7295 loc = htab->srelplt2->contents; 7296 rel.r_offset = (splt->output_section->vma 7297 + splt->output_offset 7298 + htab->plt_info->plt0_got_fields[2]); 7299 rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_SH_DIR32); 7300 rel.r_addend = 8; 7301 bfd_elf32_swap_reloca_out (output_bfd, &rel, loc); 7302 loc += sizeof (Elf32_External_Rela); 7303 7304 /* Fix up the remaining .rela.plt.unloaded relocations. 7305 They may have the wrong symbol index for _G_O_T_ or 7306 _P_L_T_ depending on the order in which symbols were 7307 output. */ 7308 while (loc < htab->srelplt2->contents + htab->srelplt2->size) 7309 { 7310 /* The PLT entry's pointer to the .got.plt slot. */ 7311 bfd_elf32_swap_reloc_in (output_bfd, loc, &rel); 7312 rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, 7313 R_SH_DIR32); 7314 bfd_elf32_swap_reloc_out (output_bfd, &rel, loc); 7315 loc += sizeof (Elf32_External_Rela); 7316 7317 /* The .got.plt slot's pointer to .plt. */ 7318 bfd_elf32_swap_reloc_in (output_bfd, loc, &rel); 7319 rel.r_info = ELF32_R_INFO (htab->root.hplt->indx, 7320 R_SH_DIR32); 7321 bfd_elf32_swap_reloc_out (output_bfd, &rel, loc); 7322 loc += sizeof (Elf32_External_Rela); 7323 } 7324 } 7325 7326 /* UnixWare sets the entsize of .plt to 4, although that doesn't 7327 really seem like the right value. */ 7328 elf_section_data (splt->output_section)->this_hdr.sh_entsize = 4; 7329 } 7330 } 7331 7332 /* Fill in the first three entries in the global offset table. */ 7333 if (sgotplt && sgotplt->size > 0 && !htab->fdpic_p) 7334 { 7335 if (sdyn == NULL) 7336 bfd_put_32 (output_bfd, (bfd_vma) 0, sgotplt->contents); 7337 else 7338 bfd_put_32 (output_bfd, 7339 sdyn->output_section->vma + sdyn->output_offset, 7340 sgotplt->contents); 7341 bfd_put_32 (output_bfd, (bfd_vma) 0, sgotplt->contents + 4); 7342 bfd_put_32 (output_bfd, (bfd_vma) 0, sgotplt->contents + 8); 7343 } 7344 7345 if (sgotplt && sgotplt->size > 0) 7346 elf_section_data (sgotplt->output_section)->this_hdr.sh_entsize = 4; 7347 7348 /* At the very end of the .rofixup section is a pointer to the GOT. */ 7349 if (htab->fdpic_p && htab->srofixup != NULL) 7350 { 7351 struct elf_link_hash_entry *hgot = htab->root.hgot; 7352 bfd_vma got_value = hgot->root.u.def.value 7353 + hgot->root.u.def.section->output_section->vma 7354 + hgot->root.u.def.section->output_offset; 7355 7356 sh_elf_add_rofixup (output_bfd, htab->srofixup, got_value); 7357 7358 /* Make sure we allocated and generated the same number of fixups. */ 7359 BFD_ASSERT (htab->srofixup->reloc_count * 4 == htab->srofixup->size); 7360 } 7361 7362 if (htab->srelfuncdesc) 7363 BFD_ASSERT (htab->srelfuncdesc->reloc_count * sizeof (Elf32_External_Rela) 7364 == htab->srelfuncdesc->size); 7365 7366 if (htab->srelgot) 7367 BFD_ASSERT (htab->srelgot->reloc_count * sizeof (Elf32_External_Rela) 7368 == htab->srelgot->size); 7369 7370 return TRUE; 7371} 7372 7373static enum elf_reloc_type_class 7374sh_elf_reloc_type_class (const Elf_Internal_Rela *rela) 7375{ 7376 switch ((int) ELF32_R_TYPE (rela->r_info)) 7377 { 7378 case R_SH_RELATIVE: 7379 return reloc_class_relative; 7380 case R_SH_JMP_SLOT: 7381 return reloc_class_plt; 7382 case R_SH_COPY: 7383 return reloc_class_copy; 7384 default: 7385 return reloc_class_normal; 7386 } 7387} 7388 7389#if !defined SH_TARGET_ALREADY_DEFINED 7390/* Support for Linux core dump NOTE sections. */ 7391 7392static bfd_boolean 7393elf32_shlin_grok_prstatus (bfd *abfd, Elf_Internal_Note *note) 7394{ 7395 int offset; 7396 unsigned int size; 7397 7398 switch (note->descsz) 7399 { 7400 default: 7401 return FALSE; 7402 7403 case 168: /* Linux/SH */ 7404 /* pr_cursig */ 7405 elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12); 7406 7407 /* pr_pid */ 7408 elf_tdata (abfd)->core_lwpid = bfd_get_32 (abfd, note->descdata + 24); 7409 7410 /* pr_reg */ 7411 offset = 72; 7412 size = 92; 7413 7414 break; 7415 } 7416 7417 /* Make a ".reg/999" section. */ 7418 return _bfd_elfcore_make_pseudosection (abfd, ".reg", 7419 size, note->descpos + offset); 7420} 7421 7422static bfd_boolean 7423elf32_shlin_grok_psinfo (bfd *abfd, Elf_Internal_Note *note) 7424{ 7425 switch (note->descsz) 7426 { 7427 default: 7428 return FALSE; 7429 7430 case 124: /* Linux/SH elf_prpsinfo */ 7431 elf_tdata (abfd)->core_program 7432 = _bfd_elfcore_strndup (abfd, note->descdata + 28, 16); 7433 elf_tdata (abfd)->core_command 7434 = _bfd_elfcore_strndup (abfd, note->descdata + 44, 80); 7435 } 7436 7437 /* Note that for some reason, a spurious space is tacked 7438 onto the end of the args in some (at least one anyway) 7439 implementations, so strip it off if it exists. */ 7440 7441 { 7442 char *command = elf_tdata (abfd)->core_command; 7443 int n = strlen (command); 7444 7445 if (0 < n && command[n - 1] == ' ') 7446 command[n - 1] = '\0'; 7447 } 7448 7449 return TRUE; 7450} 7451#endif /* not SH_TARGET_ALREADY_DEFINED */ 7452 7453 7454/* Return address for Ith PLT stub in section PLT, for relocation REL 7455 or (bfd_vma) -1 if it should not be included. */ 7456 7457static bfd_vma 7458sh_elf_plt_sym_val (bfd_vma i, const asection *plt, 7459 const arelent *rel ATTRIBUTE_UNUSED) 7460{ 7461 const struct elf_sh_plt_info *plt_info; 7462 7463 plt_info = get_plt_info (plt->owner, (plt->owner->flags & DYNAMIC) != 0); 7464 return plt->vma + get_plt_offset (plt_info, i); 7465} 7466 7467/* Decide whether to attempt to turn absptr or lsda encodings in 7468 shared libraries into pcrel within the given input section. */ 7469 7470static bfd_boolean 7471sh_elf_use_relative_eh_frame (bfd *input_bfd ATTRIBUTE_UNUSED, 7472 struct bfd_link_info *info, 7473 asection *eh_frame_section ATTRIBUTE_UNUSED) 7474{ 7475 struct elf_sh_link_hash_table *htab = sh_elf_hash_table (info); 7476 7477 /* We can't use PC-relative encodings in FDPIC binaries, in general. */ 7478 if (htab->fdpic_p) 7479 return FALSE; 7480 7481 return TRUE; 7482} 7483 7484/* Adjust the contents of an eh_frame_hdr section before they're output. */ 7485 7486static bfd_byte 7487sh_elf_encode_eh_address (bfd *abfd, 7488 struct bfd_link_info *info, 7489 asection *osec, bfd_vma offset, 7490 asection *loc_sec, bfd_vma loc_offset, 7491 bfd_vma *encoded) 7492{ 7493 struct elf_sh_link_hash_table *htab = sh_elf_hash_table (info); 7494 struct elf_link_hash_entry *h; 7495 7496 if (!htab->fdpic_p) 7497 return _bfd_elf_encode_eh_address (abfd, info, osec, offset, loc_sec, 7498 loc_offset, encoded); 7499 7500 h = htab->root.hgot; 7501 BFD_ASSERT (h && h->root.type == bfd_link_hash_defined); 7502 7503 if (! h || (sh_elf_osec_to_segment (abfd, osec) 7504 == sh_elf_osec_to_segment (abfd, loc_sec->output_section))) 7505 return _bfd_elf_encode_eh_address (abfd, info, osec, offset, 7506 loc_sec, loc_offset, encoded); 7507 7508 BFD_ASSERT (sh_elf_osec_to_segment (abfd, osec) 7509 == (sh_elf_osec_to_segment 7510 (abfd, h->root.u.def.section->output_section))); 7511 7512 *encoded = osec->vma + offset 7513 - (h->root.u.def.value 7514 + h->root.u.def.section->output_section->vma 7515 + h->root.u.def.section->output_offset); 7516 7517 return DW_EH_PE_datarel | DW_EH_PE_sdata4; 7518} 7519 7520#if !defined SH_TARGET_ALREADY_DEFINED 7521#define TARGET_BIG_SYM bfd_elf32_sh_vec 7522#define TARGET_BIG_NAME "elf32-sh" 7523#define TARGET_LITTLE_SYM bfd_elf32_shl_vec 7524#define TARGET_LITTLE_NAME "elf32-shl" 7525#endif 7526 7527#define ELF_ARCH bfd_arch_sh 7528#define ELF_TARGET_ID SH_ELF_DATA 7529#define ELF_MACHINE_CODE EM_SH 7530#ifdef __QNXTARGET__ 7531#define ELF_MAXPAGESIZE 0x1000 7532#else 7533#define ELF_MAXPAGESIZE 0x80 7534#endif 7535 7536#define elf_symbol_leading_char '_' 7537 7538#define bfd_elf32_bfd_reloc_type_lookup sh_elf_reloc_type_lookup 7539#define bfd_elf32_bfd_reloc_name_lookup \ 7540 sh_elf_reloc_name_lookup 7541#define elf_info_to_howto sh_elf_info_to_howto 7542#define bfd_elf32_bfd_relax_section sh_elf_relax_section 7543#define elf_backend_relocate_section sh_elf_relocate_section 7544#define bfd_elf32_bfd_get_relocated_section_contents \ 7545 sh_elf_get_relocated_section_contents 7546#define bfd_elf32_mkobject sh_elf_mkobject 7547#define elf_backend_object_p sh_elf_object_p 7548#define bfd_elf32_bfd_set_private_bfd_flags \ 7549 sh_elf_set_private_flags 7550#define bfd_elf32_bfd_copy_private_bfd_data \ 7551 sh_elf_copy_private_data 7552#define bfd_elf32_bfd_merge_private_bfd_data \ 7553 sh_elf_merge_private_data 7554 7555#define elf_backend_gc_mark_hook sh_elf_gc_mark_hook 7556#define elf_backend_gc_sweep_hook sh_elf_gc_sweep_hook 7557#define elf_backend_check_relocs sh_elf_check_relocs 7558#define elf_backend_copy_indirect_symbol \ 7559 sh_elf_copy_indirect_symbol 7560#define elf_backend_create_dynamic_sections \ 7561 sh_elf_create_dynamic_sections 7562#define bfd_elf32_bfd_link_hash_table_create \ 7563 sh_elf_link_hash_table_create 7564#define elf_backend_adjust_dynamic_symbol \ 7565 sh_elf_adjust_dynamic_symbol 7566#define elf_backend_always_size_sections \ 7567 sh_elf_always_size_sections 7568#define elf_backend_size_dynamic_sections \ 7569 sh_elf_size_dynamic_sections 7570#define elf_backend_omit_section_dynsym sh_elf_omit_section_dynsym 7571#define elf_backend_finish_dynamic_symbol \ 7572 sh_elf_finish_dynamic_symbol 7573#define elf_backend_finish_dynamic_sections \ 7574 sh_elf_finish_dynamic_sections 7575#define elf_backend_reloc_type_class sh_elf_reloc_type_class 7576#define elf_backend_plt_sym_val sh_elf_plt_sym_val 7577#define elf_backend_can_make_relative_eh_frame \ 7578 sh_elf_use_relative_eh_frame 7579#define elf_backend_can_make_lsda_relative_eh_frame \ 7580 sh_elf_use_relative_eh_frame 7581#define elf_backend_encode_eh_address \ 7582 sh_elf_encode_eh_address 7583 7584#define elf_backend_can_gc_sections 1 7585#define elf_backend_can_refcount 1 7586#define elf_backend_want_got_plt 1 7587#define elf_backend_plt_readonly 1 7588#define elf_backend_want_plt_sym 0 7589#define elf_backend_got_header_size 12 7590 7591#if !defined INCLUDE_SHMEDIA && !defined SH_TARGET_ALREADY_DEFINED 7592 7593#include "elf32-target.h" 7594 7595/* NetBSD support. */ 7596#undef TARGET_BIG_SYM 7597#define TARGET_BIG_SYM bfd_elf32_shnbsd_vec 7598#undef TARGET_BIG_NAME 7599#define TARGET_BIG_NAME "elf32-sh-nbsd" 7600#undef TARGET_LITTLE_SYM 7601#define TARGET_LITTLE_SYM bfd_elf32_shlnbsd_vec 7602#undef TARGET_LITTLE_NAME 7603#define TARGET_LITTLE_NAME "elf32-shl-nbsd" 7604#undef ELF_MAXPAGESIZE 7605#define ELF_MAXPAGESIZE 0x10000 7606#undef ELF_COMMONPAGESIZE 7607#undef elf_symbol_leading_char 7608#define elf_symbol_leading_char 0 7609#undef elf32_bed 7610#define elf32_bed elf32_sh_nbsd_bed 7611 7612#include "elf32-target.h" 7613 7614 7615/* Linux support. */ 7616#undef TARGET_BIG_SYM 7617#define TARGET_BIG_SYM bfd_elf32_shblin_vec 7618#undef TARGET_BIG_NAME 7619#define TARGET_BIG_NAME "elf32-shbig-linux" 7620#undef TARGET_LITTLE_SYM 7621#define TARGET_LITTLE_SYM bfd_elf32_shlin_vec 7622#undef TARGET_LITTLE_NAME 7623#define TARGET_LITTLE_NAME "elf32-sh-linux" 7624#undef ELF_COMMONPAGESIZE 7625#define ELF_COMMONPAGESIZE 0x1000 7626 7627#undef elf_backend_grok_prstatus 7628#define elf_backend_grok_prstatus elf32_shlin_grok_prstatus 7629#undef elf_backend_grok_psinfo 7630#define elf_backend_grok_psinfo elf32_shlin_grok_psinfo 7631#undef elf32_bed 7632#define elf32_bed elf32_sh_lin_bed 7633 7634#include "elf32-target.h" 7635 7636 7637/* FDPIC support. */ 7638#undef TARGET_BIG_SYM 7639#define TARGET_BIG_SYM bfd_elf32_shbfd_vec 7640#undef TARGET_BIG_NAME 7641#define TARGET_BIG_NAME "elf32-shbig-fdpic" 7642#undef TARGET_LITTLE_SYM 7643#define TARGET_LITTLE_SYM bfd_elf32_shfd_vec 7644#undef TARGET_LITTLE_NAME 7645#define TARGET_LITTLE_NAME "elf32-sh-fdpic" 7646#undef elf_backend_modify_program_headers 7647#define elf_backend_modify_program_headers \ 7648 sh_elf_modify_program_headers 7649 7650#undef elf32_bed 7651#define elf32_bed elf32_sh_fd_bed 7652 7653#include "elf32-target.h" 7654 7655#undef elf_backend_modify_program_headers 7656 7657/* VxWorks support. */ 7658#undef TARGET_BIG_SYM 7659#define TARGET_BIG_SYM bfd_elf32_shvxworks_vec 7660#undef TARGET_BIG_NAME 7661#define TARGET_BIG_NAME "elf32-sh-vxworks" 7662#undef TARGET_LITTLE_SYM 7663#define TARGET_LITTLE_SYM bfd_elf32_shlvxworks_vec 7664#undef TARGET_LITTLE_NAME 7665#define TARGET_LITTLE_NAME "elf32-shl-vxworks" 7666#undef elf32_bed 7667#define elf32_bed elf32_sh_vxworks_bed 7668 7669#undef elf_backend_want_plt_sym 7670#define elf_backend_want_plt_sym 1 7671#undef elf_symbol_leading_char 7672#define elf_symbol_leading_char '_' 7673#define elf_backend_want_got_underscore 1 7674#undef elf_backend_grok_prstatus 7675#undef elf_backend_grok_psinfo 7676#undef elf_backend_add_symbol_hook 7677#define elf_backend_add_symbol_hook elf_vxworks_add_symbol_hook 7678#undef elf_backend_link_output_symbol_hook 7679#define elf_backend_link_output_symbol_hook \ 7680 elf_vxworks_link_output_symbol_hook 7681#undef elf_backend_emit_relocs 7682#define elf_backend_emit_relocs elf_vxworks_emit_relocs 7683#undef elf_backend_final_write_processing 7684#define elf_backend_final_write_processing \ 7685 elf_vxworks_final_write_processing 7686#undef ELF_MAXPAGESIZE 7687#define ELF_MAXPAGESIZE 0x1000 7688#undef ELF_COMMONPAGESIZE 7689 7690#include "elf32-target.h" 7691 7692#endif /* neither INCLUDE_SHMEDIA nor SH_TARGET_ALREADY_DEFINED */ 7693