1 1.1 skrll /* CRIS-specific support for 32-bit ELF. 2 1.1.1.12 christos Copyright (C) 2000-2026 Free Software Foundation, Inc. 3 1.1 skrll Contributed by Axis Communications AB. 4 1.1 skrll Written by Hans-Peter Nilsson, based on elf32-fr30.c 5 1.1 skrll PIC and shlib bits based primarily on elf32-m68k.c and elf32-i386.c. 6 1.1 skrll 7 1.1 skrll This file is part of BFD, the Binary File Descriptor library. 8 1.1 skrll 9 1.1 skrll This program is free software; you can redistribute it and/or modify 10 1.1 skrll it under the terms of the GNU General Public License as published by 11 1.1 skrll the Free Software Foundation; either version 3 of the License, or 12 1.1 skrll (at your option) any later version. 13 1.1 skrll 14 1.1 skrll This program is distributed in the hope that it will be useful, 15 1.1 skrll but WITHOUT ANY WARRANTY; without even the implied warranty of 16 1.1 skrll MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 1.1 skrll GNU General Public License for more details. 18 1.1 skrll 19 1.1 skrll You should have received a copy of the GNU General Public License 20 1.1 skrll along with this program; if not, write to the Free Software 21 1.1 skrll Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, 22 1.1 skrll MA 02110-1301, USA. */ 23 1.1 skrll 24 1.1 skrll #include "sysdep.h" 25 1.1 skrll #include "bfd.h" 26 1.1 skrll #include "libbfd.h" 27 1.1 skrll #include "elf-bfd.h" 28 1.1 skrll #include "elf/cris.h" 29 1.1.1.2 christos #include <limits.h> 30 1.1 skrll 31 1.1.1.3 christos bfd_reloc_status_type 32 1.1.1.3 christos cris_elf_pcrel_reloc (bfd *, arelent *, asymbol *, void *, 33 1.1.1.3 christos asection *, bfd *, char **); 34 1.1.1.9 christos static bool 35 1.1.1.3 christos cris_elf_set_mach_from_flags (bfd *, unsigned long); 36 1.1 skrll 37 1.1.1.3 christos /* Forward declarations. */ 38 1.1 skrll static reloc_howto_type cris_elf_howto_table [] = 39 1.1 skrll { 40 1.1 skrll /* This reloc does nothing. */ 41 1.1 skrll HOWTO (R_CRIS_NONE, /* type */ 42 1.1 skrll 0, /* rightshift */ 43 1.1.1.9 christos 0, /* size */ 44 1.1.1.4 christos 0, /* bitsize */ 45 1.1.1.9 christos false, /* pc_relative */ 46 1.1 skrll 0, /* bitpos */ 47 1.1.1.4 christos complain_overflow_dont, /* complain_on_overflow */ 48 1.1 skrll bfd_elf_generic_reloc, /* special_function */ 49 1.1 skrll "R_CRIS_NONE", /* name */ 50 1.1.1.9 christos false, /* partial_inplace */ 51 1.1 skrll 0, /* src_mask */ 52 1.1 skrll 0, /* dst_mask */ 53 1.1.1.9 christos false), /* pcrel_offset */ 54 1.1 skrll 55 1.1 skrll /* An 8 bit absolute relocation. */ 56 1.1 skrll HOWTO (R_CRIS_8, /* type */ 57 1.1 skrll 0, /* rightshift */ 58 1.1.1.9 christos 1, /* size */ 59 1.1 skrll 8, /* bitsize */ 60 1.1.1.9 christos false, /* pc_relative */ 61 1.1 skrll 0, /* bitpos */ 62 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */ 63 1.1 skrll bfd_elf_generic_reloc, /* special_function */ 64 1.1 skrll "R_CRIS_8", /* name */ 65 1.1.1.9 christos false, /* partial_inplace */ 66 1.1 skrll 0x0000, /* src_mask */ 67 1.1 skrll 0x00ff, /* dst_mask */ 68 1.1.1.9 christos false), /* pcrel_offset */ 69 1.1 skrll 70 1.1 skrll /* A 16 bit absolute relocation. */ 71 1.1 skrll HOWTO (R_CRIS_16, /* type */ 72 1.1 skrll 0, /* rightshift */ 73 1.1.1.9 christos 2, /* size */ 74 1.1 skrll 16, /* bitsize */ 75 1.1.1.9 christos false, /* pc_relative */ 76 1.1 skrll 0, /* bitpos */ 77 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */ 78 1.1 skrll bfd_elf_generic_reloc, /* special_function */ 79 1.1 skrll "R_CRIS_16", /* name */ 80 1.1.1.9 christos false, /* partial_inplace */ 81 1.1 skrll 0x00000000, /* src_mask */ 82 1.1 skrll 0x0000ffff, /* dst_mask */ 83 1.1.1.9 christos false), /* pcrel_offset */ 84 1.1 skrll 85 1.1 skrll /* A 32 bit absolute relocation. */ 86 1.1 skrll HOWTO (R_CRIS_32, /* type */ 87 1.1 skrll 0, /* rightshift */ 88 1.1.1.9 christos 4, /* size */ 89 1.1 skrll 32, /* bitsize */ 90 1.1.1.9 christos false, /* pc_relative */ 91 1.1 skrll 0, /* bitpos */ 92 1.1 skrll /* We don't want overflow complaints for 64-bit vma builds 93 1.1 skrll for e.g. sym+0x40000000 (or actually sym-0xc0000000 in 94 1.1 skrll 32-bit ELF) where sym=0xc0001234. 95 1.1 skrll Don't do this for the PIC relocs, as we don't expect to 96 1.1 skrll see them with large offsets. */ 97 1.1 skrll complain_overflow_dont, /* complain_on_overflow */ 98 1.1 skrll bfd_elf_generic_reloc, /* special_function */ 99 1.1 skrll "R_CRIS_32", /* name */ 100 1.1.1.9 christos false, /* partial_inplace */ 101 1.1 skrll 0x00000000, /* src_mask */ 102 1.1 skrll 0xffffffff, /* dst_mask */ 103 1.1.1.9 christos false), /* pcrel_offset */ 104 1.1 skrll 105 1.1 skrll /* An 8 bit PC-relative relocation. */ 106 1.1 skrll HOWTO (R_CRIS_8_PCREL, /* type */ 107 1.1 skrll 0, /* rightshift */ 108 1.1.1.9 christos 1, /* size */ 109 1.1 skrll 8, /* bitsize */ 110 1.1.1.9 christos true, /* pc_relative */ 111 1.1 skrll 0, /* bitpos */ 112 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */ 113 1.1 skrll cris_elf_pcrel_reloc, /* special_function */ 114 1.1 skrll "R_CRIS_8_PCREL", /* name */ 115 1.1.1.9 christos false, /* partial_inplace */ 116 1.1 skrll 0x0000, /* src_mask */ 117 1.1 skrll 0x00ff, /* dst_mask */ 118 1.1.1.9 christos true), /* pcrel_offset */ 119 1.1 skrll 120 1.1 skrll /* A 16 bit PC-relative relocation. */ 121 1.1 skrll HOWTO (R_CRIS_16_PCREL, /* type */ 122 1.1 skrll 0, /* rightshift */ 123 1.1.1.9 christos 2, /* size */ 124 1.1 skrll 16, /* bitsize */ 125 1.1.1.9 christos true, /* pc_relative */ 126 1.1 skrll 0, /* bitpos */ 127 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */ 128 1.1 skrll cris_elf_pcrel_reloc, /* special_function */ 129 1.1 skrll "R_CRIS_16_PCREL", /* name */ 130 1.1.1.9 christos false, /* partial_inplace */ 131 1.1 skrll 0x00000000, /* src_mask */ 132 1.1 skrll 0x0000ffff, /* dst_mask */ 133 1.1.1.9 christos true), /* pcrel_offset */ 134 1.1 skrll 135 1.1 skrll /* A 32 bit PC-relative relocation. */ 136 1.1 skrll HOWTO (R_CRIS_32_PCREL, /* type */ 137 1.1 skrll 0, /* rightshift */ 138 1.1.1.9 christos 4, /* size */ 139 1.1 skrll 32, /* bitsize */ 140 1.1.1.9 christos true, /* pc_relative */ 141 1.1 skrll 0, /* bitpos */ 142 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */ 143 1.1 skrll cris_elf_pcrel_reloc, /* special_function */ 144 1.1 skrll "R_CRIS_32_PCREL", /* name */ 145 1.1.1.9 christos false, /* partial_inplace */ 146 1.1 skrll 0x00000000, /* src_mask */ 147 1.1 skrll 0xffffffff, /* dst_mask */ 148 1.1.1.9 christos true), /* pcrel_offset */ 149 1.1 skrll 150 1.1 skrll /* GNU extension to record C++ vtable hierarchy. */ 151 1.1 skrll HOWTO (R_CRIS_GNU_VTINHERIT, /* type */ 152 1.1 skrll 0, /* rightshift */ 153 1.1.1.9 christos 4, /* size */ 154 1.1 skrll 0, /* bitsize */ 155 1.1.1.9 christos false, /* pc_relative */ 156 1.1 skrll 0, /* bitpos */ 157 1.1 skrll complain_overflow_dont, /* complain_on_overflow */ 158 1.1 skrll NULL, /* special_function */ 159 1.1 skrll "R_CRIS_GNU_VTINHERIT", /* name */ 160 1.1.1.9 christos false, /* partial_inplace */ 161 1.1 skrll 0, /* src_mask */ 162 1.1 skrll 0, /* dst_mask */ 163 1.1.1.9 christos false), /* pcrel_offset */ 164 1.1 skrll 165 1.1 skrll /* GNU extension to record C++ vtable member usage. */ 166 1.1 skrll HOWTO (R_CRIS_GNU_VTENTRY, /* type */ 167 1.1 skrll 0, /* rightshift */ 168 1.1.1.9 christos 4, /* size */ 169 1.1 skrll 0, /* bitsize */ 170 1.1.1.9 christos false, /* pc_relative */ 171 1.1 skrll 0, /* bitpos */ 172 1.1 skrll complain_overflow_dont, /* complain_on_overflow */ 173 1.1 skrll _bfd_elf_rel_vtable_reloc_fn, /* special_function */ 174 1.1 skrll "R_CRIS_GNU_VTENTRY", /* name */ 175 1.1.1.9 christos false, /* partial_inplace */ 176 1.1 skrll 0, /* src_mask */ 177 1.1 skrll 0, /* dst_mask */ 178 1.1.1.9 christos false), /* pcrel_offset */ 179 1.1 skrll 180 1.1 skrll /* This is used only by the dynamic linker. The symbol should exist 181 1.1 skrll both in the object being run and in some shared library. The 182 1.1 skrll dynamic linker copies the data addressed by the symbol from the 183 1.1 skrll shared library into the object, because the object being 184 1.1 skrll run has to have the data at some particular address. */ 185 1.1 skrll HOWTO (R_CRIS_COPY, /* type */ 186 1.1 skrll 0, /* rightshift */ 187 1.1.1.9 christos 4, /* size */ 188 1.1 skrll 32, /* bitsize */ 189 1.1.1.9 christos false, /* pc_relative */ 190 1.1 skrll 0, /* bitpos */ 191 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */ 192 1.1 skrll bfd_elf_generic_reloc, /* special_function */ 193 1.1 skrll "R_CRIS_COPY", /* name */ 194 1.1.1.9 christos false, /* partial_inplace */ 195 1.1 skrll 0, /* src_mask */ 196 1.1 skrll 0, /* dst_mask */ 197 1.1.1.9 christos false), /* pcrel_offset */ 198 1.1 skrll 199 1.1 skrll /* Like R_CRIS_32, but used when setting global offset table entries. */ 200 1.1 skrll HOWTO (R_CRIS_GLOB_DAT, /* type */ 201 1.1 skrll 0, /* rightshift */ 202 1.1.1.9 christos 4, /* size */ 203 1.1 skrll 32, /* bitsize */ 204 1.1.1.9 christos false, /* pc_relative */ 205 1.1 skrll 0, /* bitpos */ 206 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */ 207 1.1 skrll bfd_elf_generic_reloc, /* special_function */ 208 1.1 skrll "R_CRIS_GLOB_DAT", /* name */ 209 1.1.1.9 christos false, /* partial_inplace */ 210 1.1 skrll 0, /* src_mask */ 211 1.1 skrll 0xffffffff, /* dst_mask */ 212 1.1.1.9 christos false), /* pcrel_offset */ 213 1.1 skrll 214 1.1 skrll /* Marks a procedure linkage table entry for a symbol. */ 215 1.1 skrll HOWTO (R_CRIS_JUMP_SLOT, /* type */ 216 1.1 skrll 0, /* rightshift */ 217 1.1.1.9 christos 4, /* size */ 218 1.1 skrll 32, /* bitsize */ 219 1.1.1.9 christos false, /* pc_relative */ 220 1.1 skrll 0, /* bitpos */ 221 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */ 222 1.1 skrll bfd_elf_generic_reloc, /* special_function */ 223 1.1 skrll "R_CRIS_JUMP_SLOT", /* name */ 224 1.1.1.9 christos false, /* partial_inplace */ 225 1.1 skrll 0, /* src_mask */ 226 1.1 skrll 0, /* dst_mask */ 227 1.1.1.9 christos false), /* pcrel_offset */ 228 1.1 skrll 229 1.1 skrll /* Used only by the dynamic linker. When the object is run, this 230 1.1 skrll longword is set to the load address of the object, plus the 231 1.1 skrll addend. */ 232 1.1 skrll HOWTO (R_CRIS_RELATIVE, /* type */ 233 1.1 skrll 0, /* rightshift */ 234 1.1.1.9 christos 4, /* size */ 235 1.1 skrll 32, /* bitsize */ 236 1.1.1.9 christos false, /* pc_relative */ 237 1.1 skrll 0, /* bitpos */ 238 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */ 239 1.1 skrll bfd_elf_generic_reloc, /* special_function */ 240 1.1 skrll "R_CRIS_RELATIVE", /* name */ 241 1.1.1.9 christos false, /* partial_inplace */ 242 1.1 skrll 0, /* src_mask */ 243 1.1 skrll 0xffffffff, /* dst_mask */ 244 1.1.1.9 christos false), /* pcrel_offset */ 245 1.1 skrll 246 1.1 skrll /* Like R_CRIS_32, but referring to the GOT table entry for the symbol. */ 247 1.1 skrll HOWTO (R_CRIS_16_GOT, /* type */ 248 1.1 skrll 0, /* rightshift */ 249 1.1.1.9 christos 2, /* size */ 250 1.1 skrll 16, /* bitsize */ 251 1.1.1.9 christos false, /* pc_relative */ 252 1.1 skrll 0, /* bitpos */ 253 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */ 254 1.1 skrll bfd_elf_generic_reloc, /* special_function */ 255 1.1 skrll "R_CRIS_16_GOT", /* name */ 256 1.1.1.9 christos false, /* partial_inplace */ 257 1.1 skrll 0, /* src_mask */ 258 1.1 skrll 0xffff, /* dst_mask */ 259 1.1.1.9 christos false), /* pcrel_offset */ 260 1.1 skrll 261 1.1 skrll HOWTO (R_CRIS_32_GOT, /* type */ 262 1.1 skrll 0, /* rightshift */ 263 1.1.1.9 christos 4, /* size */ 264 1.1 skrll 32, /* bitsize */ 265 1.1.1.9 christos false, /* pc_relative */ 266 1.1 skrll 0, /* bitpos */ 267 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */ 268 1.1 skrll bfd_elf_generic_reloc, /* special_function */ 269 1.1 skrll "R_CRIS_32_GOT", /* name */ 270 1.1.1.9 christos false, /* partial_inplace */ 271 1.1 skrll 0, /* src_mask */ 272 1.1 skrll 0xffffffff, /* dst_mask */ 273 1.1.1.9 christos false), /* pcrel_offset */ 274 1.1 skrll 275 1.1 skrll /* Like R_CRIS_32_GOT, but referring to (and requesting a) PLT part of 276 1.1 skrll the GOT table for the symbol. */ 277 1.1 skrll HOWTO (R_CRIS_16_GOTPLT, /* type */ 278 1.1 skrll 0, /* rightshift */ 279 1.1.1.9 christos 2, /* size */ 280 1.1 skrll 16, /* bitsize */ 281 1.1.1.9 christos false, /* pc_relative */ 282 1.1 skrll 0, /* bitpos */ 283 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */ 284 1.1 skrll bfd_elf_generic_reloc, /* special_function */ 285 1.1 skrll "R_CRIS_16_GOTPLT", /* name */ 286 1.1.1.9 christos false, /* partial_inplace */ 287 1.1 skrll 0, /* src_mask */ 288 1.1 skrll 0xffff, /* dst_mask */ 289 1.1.1.9 christos false), /* pcrel_offset */ 290 1.1 skrll 291 1.1 skrll HOWTO (R_CRIS_32_GOTPLT, /* type */ 292 1.1 skrll 0, /* rightshift */ 293 1.1.1.9 christos 4, /* size */ 294 1.1 skrll 32, /* bitsize */ 295 1.1.1.9 christos false, /* pc_relative */ 296 1.1 skrll 0, /* bitpos */ 297 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */ 298 1.1 skrll bfd_elf_generic_reloc, /* special_function */ 299 1.1 skrll "R_CRIS_32_GOTPLT", /* name */ 300 1.1.1.9 christos false, /* partial_inplace */ 301 1.1 skrll 0, /* src_mask */ 302 1.1 skrll 0xffffffff, /* dst_mask */ 303 1.1.1.9 christos false), /* pcrel_offset */ 304 1.1 skrll 305 1.1 skrll /* A 32-bit offset from GOT to (local const) symbol: no GOT entry should 306 1.1 skrll be necessary. */ 307 1.1 skrll HOWTO (R_CRIS_32_GOTREL, /* type */ 308 1.1 skrll 0, /* rightshift */ 309 1.1.1.9 christos 4, /* size */ 310 1.1 skrll 32, /* bitsize */ 311 1.1.1.9 christos false, /* pc_relative */ 312 1.1 skrll 0, /* bitpos */ 313 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */ 314 1.1 skrll bfd_elf_generic_reloc, /* special_function */ 315 1.1 skrll "R_CRIS_32_GOTREL", /* name */ 316 1.1.1.9 christos false, /* partial_inplace */ 317 1.1 skrll 0, /* src_mask */ 318 1.1 skrll 0xffffffff, /* dst_mask */ 319 1.1.1.9 christos false), /* pcrel_offset */ 320 1.1 skrll 321 1.1 skrll /* A 32-bit offset from GOT to entry for this symbol in PLT and request 322 1.1 skrll to create PLT entry for symbol. */ 323 1.1 skrll HOWTO (R_CRIS_32_PLT_GOTREL, /* type */ 324 1.1 skrll 0, /* rightshift */ 325 1.1.1.9 christos 4, /* size */ 326 1.1 skrll 32, /* bitsize */ 327 1.1.1.9 christos false, /* pc_relative */ 328 1.1 skrll 0, /* bitpos */ 329 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */ 330 1.1 skrll bfd_elf_generic_reloc, /* special_function */ 331 1.1 skrll "R_CRIS_32_PLT_GOTREL", /* name */ 332 1.1.1.9 christos false, /* partial_inplace */ 333 1.1 skrll 0, /* src_mask */ 334 1.1 skrll 0xffffffff, /* dst_mask */ 335 1.1.1.9 christos false), /* pcrel_offset */ 336 1.1 skrll 337 1.1 skrll /* A 32-bit offset from PC (location after the relocation) + addend to 338 1.1 skrll entry for this symbol in PLT and request to create PLT entry for 339 1.1 skrll symbol. */ 340 1.1 skrll HOWTO (R_CRIS_32_PLT_PCREL, /* type */ 341 1.1 skrll 0, /* rightshift */ 342 1.1.1.9 christos 4, /* size */ 343 1.1 skrll 32, /* bitsize */ 344 1.1.1.9 christos true, /* pc_relative */ 345 1.1 skrll 0, /* bitpos */ 346 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */ 347 1.1 skrll cris_elf_pcrel_reloc, /* special_function */ 348 1.1 skrll "R_CRIS_32_PLT_PCREL", /* name */ 349 1.1.1.9 christos false, /* partial_inplace */ 350 1.1 skrll 0, /* src_mask */ 351 1.1 skrll 0xffffffff, /* dst_mask */ 352 1.1.1.9 christos true), /* pcrel_offset */ 353 1.1.1.2 christos 354 1.1.1.2 christos /* We don't handle these in any special manner and cross-format 355 1.1.1.2 christos linking is not supported; just recognize them enough to pass them 356 1.1.1.2 christos around. FIXME: do the same for most PIC relocs and add sanity 357 1.1.1.2 christos tests to actually refuse gracefully to handle these and PIC 358 1.1.1.2 christos relocs for cross-format linking. */ 359 1.1.1.2 christos #define TLSHOWTO32(name) \ 360 1.1.1.9 christos HOWTO (name, 0, 4, 32, false, 0, complain_overflow_bitfield, \ 361 1.1.1.9 christos bfd_elf_generic_reloc, #name, false, 0, 0xffffffff, false) 362 1.1.1.2 christos #define TLSHOWTO16X(name, X) \ 363 1.1.1.9 christos HOWTO (name, 0, 2, 16, false, 0, complain_overflow_ ## X, \ 364 1.1.1.9 christos bfd_elf_generic_reloc, #name, false, 0, 0xffff, false) 365 1.1.1.2 christos #define TLSHOWTO16(name) TLSHOWTO16X(name, unsigned) 366 1.1.1.2 christos #define TLSHOWTO16S(name) TLSHOWTO16X(name, signed) 367 1.1.1.2 christos 368 1.1.1.2 christos TLSHOWTO32 (R_CRIS_32_GOT_GD), 369 1.1.1.2 christos TLSHOWTO16 (R_CRIS_16_GOT_GD), 370 1.1.1.2 christos TLSHOWTO32 (R_CRIS_32_GD), 371 1.1.1.2 christos TLSHOWTO32 (R_CRIS_DTP), 372 1.1.1.2 christos TLSHOWTO32 (R_CRIS_32_DTPREL), 373 1.1.1.2 christos TLSHOWTO16S (R_CRIS_16_DTPREL), 374 1.1.1.2 christos TLSHOWTO32 (R_CRIS_32_GOT_TPREL), 375 1.1.1.2 christos TLSHOWTO16S (R_CRIS_16_GOT_TPREL), 376 1.1.1.2 christos TLSHOWTO32 (R_CRIS_32_TPREL), 377 1.1.1.2 christos TLSHOWTO16S (R_CRIS_16_TPREL), 378 1.1.1.2 christos TLSHOWTO32 (R_CRIS_DTPMOD), 379 1.1.1.2 christos TLSHOWTO32 (R_CRIS_32_IE) 380 1.1 skrll }; 381 1.1 skrll 382 1.1 skrll /* Map BFD reloc types to CRIS ELF reloc types. */ 384 1.1 skrll 385 1.1 skrll struct cris_reloc_map 386 1.1 skrll { 387 1.1 skrll bfd_reloc_code_real_type bfd_reloc_val; 388 1.1 skrll unsigned int cris_reloc_val; 389 1.1 skrll }; 390 1.1 skrll 391 1.1 skrll static const struct cris_reloc_map cris_reloc_map [] = 392 1.1 skrll { 393 1.1 skrll { BFD_RELOC_NONE, R_CRIS_NONE }, 394 1.1 skrll { BFD_RELOC_8, R_CRIS_8 }, 395 1.1 skrll { BFD_RELOC_16, R_CRIS_16 }, 396 1.1 skrll { BFD_RELOC_32, R_CRIS_32 }, 397 1.1 skrll { BFD_RELOC_8_PCREL, R_CRIS_8_PCREL }, 398 1.1 skrll { BFD_RELOC_16_PCREL, R_CRIS_16_PCREL }, 399 1.1 skrll { BFD_RELOC_32_PCREL, R_CRIS_32_PCREL }, 400 1.1 skrll { BFD_RELOC_VTABLE_INHERIT, R_CRIS_GNU_VTINHERIT }, 401 1.1.1.12 christos { BFD_RELOC_VTABLE_ENTRY, R_CRIS_GNU_VTENTRY }, 402 1.1.1.12 christos { BFD_RELOC_COPY, R_CRIS_COPY }, 403 1.1.1.12 christos { BFD_RELOC_GLOB_DAT, R_CRIS_GLOB_DAT }, 404 1.1.1.12 christos { BFD_RELOC_JMP_SLOT, R_CRIS_JUMP_SLOT }, 405 1.1 skrll { BFD_RELOC_RELATIVE, R_CRIS_RELATIVE }, 406 1.1 skrll { BFD_RELOC_CRIS_16_GOT, R_CRIS_16_GOT }, 407 1.1 skrll { BFD_RELOC_CRIS_32_GOT, R_CRIS_32_GOT }, 408 1.1 skrll { BFD_RELOC_CRIS_16_GOTPLT, R_CRIS_16_GOTPLT }, 409 1.1 skrll { BFD_RELOC_CRIS_32_GOTPLT, R_CRIS_32_GOTPLT }, 410 1.1 skrll { BFD_RELOC_CRIS_32_GOTREL, R_CRIS_32_GOTREL }, 411 1.1.1.2 christos { BFD_RELOC_CRIS_32_PLT_GOTREL, R_CRIS_32_PLT_GOTREL }, 412 1.1.1.2 christos { BFD_RELOC_CRIS_32_PLT_PCREL, R_CRIS_32_PLT_PCREL }, 413 1.1.1.2 christos { BFD_RELOC_CRIS_32_GOT_GD, R_CRIS_32_GOT_GD }, 414 1.1.1.2 christos { BFD_RELOC_CRIS_16_GOT_GD, R_CRIS_16_GOT_GD }, 415 1.1.1.2 christos { BFD_RELOC_CRIS_32_GD, R_CRIS_32_GD }, 416 1.1.1.2 christos { BFD_RELOC_CRIS_DTP, R_CRIS_DTP }, 417 1.1.1.2 christos { BFD_RELOC_CRIS_32_DTPREL, R_CRIS_32_DTPREL }, 418 1.1.1.2 christos { BFD_RELOC_CRIS_16_DTPREL, R_CRIS_16_DTPREL }, 419 1.1.1.2 christos { BFD_RELOC_CRIS_32_GOT_TPREL, R_CRIS_32_GOT_TPREL }, 420 1.1.1.2 christos { BFD_RELOC_CRIS_16_GOT_TPREL, R_CRIS_16_GOT_TPREL }, 421 1.1.1.2 christos { BFD_RELOC_CRIS_32_TPREL, R_CRIS_32_TPREL }, 422 1.1.1.2 christos { BFD_RELOC_CRIS_16_TPREL, R_CRIS_16_TPREL }, 423 1.1.1.2 christos { BFD_RELOC_CRIS_DTPMOD, R_CRIS_DTPMOD }, 424 1.1 skrll { BFD_RELOC_CRIS_32_IE, R_CRIS_32_IE } 425 1.1 skrll }; 426 1.1 skrll 427 1.1.1.3 christos static reloc_howto_type * 428 1.1.1.3 christos cris_reloc_type_lookup (bfd * abfd ATTRIBUTE_UNUSED, 429 1.1 skrll bfd_reloc_code_real_type code) 430 1.1 skrll { 431 1.1 skrll unsigned int i; 432 1.1 skrll 433 1.1 skrll for (i = 0; i < sizeof (cris_reloc_map) / sizeof (cris_reloc_map[0]); i++) 434 1.1 skrll if (cris_reloc_map [i].bfd_reloc_val == code) 435 1.1 skrll return & cris_elf_howto_table [cris_reloc_map[i].cris_reloc_val]; 436 1.1 skrll 437 1.1 skrll return NULL; 438 1.1 skrll } 439 1.1 skrll 440 1.1 skrll static reloc_howto_type * 441 1.1 skrll cris_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED, const char *r_name) 442 1.1 skrll { 443 1.1 skrll unsigned int i; 444 1.1 skrll 445 1.1 skrll for (i = 0; 446 1.1 skrll i < sizeof (cris_elf_howto_table) / sizeof (cris_elf_howto_table[0]); 447 1.1 skrll i++) 448 1.1 skrll if (cris_elf_howto_table[i].name != NULL 449 1.1 skrll && strcasecmp (cris_elf_howto_table[i].name, r_name) == 0) 450 1.1 skrll return &cris_elf_howto_table[i]; 451 1.1 skrll 452 1.1 skrll return NULL; 453 1.1 skrll } 454 1.1 skrll 455 1.1 skrll /* Set the howto pointer for an CRIS ELF reloc. */ 456 1.1.1.9 christos 457 1.1.1.3 christos static bool 458 1.1.1.3 christos cris_info_to_howto_rela (bfd * abfd ATTRIBUTE_UNUSED, 459 1.1.1.3 christos arelent * cache_ptr, 460 1.1 skrll Elf_Internal_Rela * dst) 461 1.1.1.2 christos { 462 1.1 skrll enum elf_cris_reloc_type r_type; 463 1.1 skrll 464 1.1.1.4 christos r_type = ELF32_R_TYPE (dst->r_info); 465 1.1.1.4 christos if (r_type >= R_CRIS_max) 466 1.1.1.6 christos { 467 1.1.1.7 christos /* xgettext:c-format */ 468 1.1.1.7 christos _bfd_error_handler (_("%pB: unsupported relocation type %#x"), 469 1.1.1.7 christos abfd, r_type); 470 1.1.1.9 christos bfd_set_error (bfd_error_bad_value); 471 1.1.1.4 christos return false; 472 1.1 skrll } 473 1.1.1.9 christos cache_ptr->howto = & cris_elf_howto_table [r_type]; 474 1.1 skrll return true; 475 1.1 skrll } 476 1.1 skrll 477 1.1.1.3 christos bfd_reloc_status_type 478 1.1.1.3 christos cris_elf_pcrel_reloc (bfd *abfd ATTRIBUTE_UNUSED, 479 1.1.1.3 christos arelent *reloc_entry, 480 1.1.1.3 christos asymbol *symbol, 481 1.1.1.3 christos void * data ATTRIBUTE_UNUSED, 482 1.1.1.3 christos asection *input_section, 483 1.1.1.3 christos bfd *output_bfd, 484 1.1 skrll char **error_message ATTRIBUTE_UNUSED) 485 1.1 skrll { 486 1.1 skrll /* By default (using only bfd_elf_generic_reloc when linking to 487 1.1 skrll non-ELF formats) PC-relative relocs are relative to the beginning 488 1.1 skrll of the reloc. CRIS PC-relative relocs are relative to the position 489 1.1 skrll *after* the reloc because that's what pre-CRISv32 PC points to 490 1.1 skrll after reading an insn field with that reloc. (For CRISv32, PC is 491 1.1 skrll actually relative to the start of the insn, but we keep the old 492 1.1 skrll definition.) Still, we use as much generic machinery as we can. 493 1.1 skrll 494 1.1 skrll Only adjust when doing a final link. */ 495 1.1.1.9 christos if (output_bfd == (bfd *) NULL) 496 1.1 skrll reloc_entry->addend -= bfd_get_reloc_size (reloc_entry->howto); 497 1.1 skrll 498 1.1 skrll return 499 1.1 skrll bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data, 500 1.1 skrll input_section, output_bfd, error_message); 501 1.1 skrll } 502 1.1 skrll 503 1.1 skrll /* Support for core dump NOTE sections. 505 1.1 skrll The slightly unintuitive code layout is an attempt to keep at least 506 1.1 skrll some similarities with other ports, hoping to simplify general 507 1.1.1.9 christos changes, while still keeping Linux/CRIS and Linux/CRISv32 code apart. */ 508 1.1.1.3 christos 509 1.1 skrll static bool 510 1.1 skrll cris_elf_grok_prstatus (bfd *abfd, Elf_Internal_Note *note) 511 1.1 skrll { 512 1.1 skrll int offset; 513 1.1 skrll size_t size; 514 1.1 skrll 515 1.1 skrll if (bfd_get_mach (abfd) == bfd_mach_cris_v32) 516 1.1 skrll switch (note->descsz) 517 1.1.1.9 christos { 518 1.1 skrll default: 519 1.1 skrll return false; 520 1.1 skrll 521 1.1.1.4 christos case 202: /* Linux/CRISv32 */ 522 1.1 skrll /* pr_cursig */ 523 1.1 skrll elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12); 524 1.1.1.4 christos 525 1.1 skrll /* pr_pid */ 526 1.1 skrll elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 22); 527 1.1 skrll 528 1.1 skrll /* pr_reg */ 529 1.1 skrll offset = 70; 530 1.1 skrll size = 128; 531 1.1 skrll 532 1.1 skrll break; 533 1.1 skrll } 534 1.1 skrll else 535 1.1 skrll switch (note->descsz) 536 1.1.1.9 christos { 537 1.1 skrll default: 538 1.1 skrll return false; 539 1.1 skrll 540 1.1.1.4 christos case 214: /* Linux/CRIS */ 541 1.1 skrll /* pr_cursig */ 542 1.1 skrll elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12); 543 1.1.1.4 christos 544 1.1 skrll /* pr_pid */ 545 1.1 skrll elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 22); 546 1.1 skrll 547 1.1 skrll /* pr_reg */ 548 1.1 skrll offset = 70; 549 1.1 skrll size = 140; 550 1.1 skrll 551 1.1 skrll break; 552 1.1 skrll } 553 1.1 skrll 554 1.1 skrll /* Make a ".reg/999" section. */ 555 1.1 skrll return _bfd_elfcore_make_pseudosection (abfd, ".reg", 556 1.1 skrll size, note->descpos + offset); 557 1.1.1.9 christos } 558 1.1.1.3 christos 559 1.1 skrll static bool 560 1.1 skrll cris_elf_grok_psinfo (bfd *abfd, Elf_Internal_Note *note) 561 1.1 skrll { 562 1.1 skrll if (bfd_get_mach (abfd) == bfd_mach_cris_v32) 563 1.1 skrll switch (note->descsz) 564 1.1.1.9 christos { 565 1.1 skrll default: 566 1.1 skrll return false; 567 1.1.1.4 christos 568 1.1 skrll case 124: /* Linux/CRISv32 elf_prpsinfo */ 569 1.1.1.4 christos elf_tdata (abfd)->core->program 570 1.1 skrll = _bfd_elfcore_strndup (abfd, note->descdata + 28, 16); 571 1.1 skrll elf_tdata (abfd)->core->command 572 1.1 skrll = _bfd_elfcore_strndup (abfd, note->descdata + 44, 80); 573 1.1 skrll } 574 1.1 skrll else 575 1.1 skrll switch (note->descsz) 576 1.1.1.9 christos { 577 1.1 skrll default: 578 1.1 skrll return false; 579 1.1.1.4 christos 580 1.1 skrll case 124: /* Linux/CRIS elf_prpsinfo */ 581 1.1.1.4 christos elf_tdata (abfd)->core->program 582 1.1 skrll = _bfd_elfcore_strndup (abfd, note->descdata + 28, 16); 583 1.1 skrll elf_tdata (abfd)->core->command 584 1.1 skrll = _bfd_elfcore_strndup (abfd, note->descdata + 44, 80); 585 1.1 skrll } 586 1.1 skrll 587 1.1 skrll /* Note that for some reason, a spurious space is tacked 588 1.1 skrll onto the end of the args in some (at least one anyway) 589 1.1 skrll implementations, so strip it off if it exists. */ 590 1.1.1.4 christos 591 1.1 skrll { 592 1.1 skrll char *command = elf_tdata (abfd)->core->command; 593 1.1 skrll int n = strlen (command); 594 1.1 skrll 595 1.1 skrll if (0 < n && command[n - 1] == ' ') 596 1.1 skrll command[n - 1] = '\0'; 597 1.1.1.9 christos } 598 1.1 skrll 599 1.1 skrll return true; 600 1.1 skrll } 601 1.1 skrll 602 1.1 skrll /* The name of the dynamic interpreter. This is put in the .interp 604 1.1 skrll section. */ 605 1.1 skrll 606 1.1 skrll #define ELF_DYNAMIC_INTERPRETER "/lib/ld.so.1" 607 1.1 skrll 608 1.1 skrll /* The size in bytes of an entry in the procedure linkage table. */ 609 1.1 skrll 610 1.1 skrll #define PLT_ENTRY_SIZE 20 611 1.1 skrll #define PLT_ENTRY_SIZE_V32 26 612 1.1 skrll 613 1.1 skrll /* The first entry in an absolute procedure linkage table looks like this. */ 614 1.1 skrll 615 1.1 skrll static const bfd_byte elf_cris_plt0_entry[PLT_ENTRY_SIZE] = 616 1.1 skrll { 617 1.1 skrll 0xfc, 0xe1, 618 1.1 skrll 0x7e, 0x7e, /* push mof. */ 619 1.1 skrll 0x7f, 0x0d, /* (dip [pc+]) */ 620 1.1 skrll 0, 0, 0, 0, /* Replaced with address of .got + 4. */ 621 1.1 skrll 0x30, 0x7a, /* move [...],mof */ 622 1.1 skrll 0x7f, 0x0d, /* (dip [pc+]) */ 623 1.1 skrll 0, 0, 0, 0, /* Replaced with address of .got + 8. */ 624 1.1 skrll 0x30, 0x09 /* jump [...] */ 625 1.1 skrll }; 626 1.1 skrll 627 1.1 skrll static const bfd_byte elf_cris_plt0_entry_v32[PLT_ENTRY_SIZE_V32] = 628 1.1 skrll { 629 1.1 skrll 0x84, 0xe2, /* subq 4,$sp */ 630 1.1 skrll 0x6f, 0xfe, /* move.d 0,$acr */ 631 1.1 skrll 0, 0, 0, 0, /* Replaced by address of .got + 4. */ 632 1.1 skrll 0x7e, 0x7a, /* move $mof,[$sp] */ 633 1.1 skrll 0x3f, 0x7a, /* move [$acr],$mof */ 634 1.1 skrll 0x04, 0xf2, /* addq 4,acr */ 635 1.1 skrll 0x6f, 0xfa, /* move.d [$acr],$acr */ 636 1.1 skrll 0xbf, 0x09, /* jump $acr */ 637 1.1 skrll 0xb0, 0x05, /* nop */ 638 1.1 skrll 0, 0 /* Pad out to 26 bytes. */ 639 1.1 skrll }; 640 1.1 skrll 641 1.1 skrll /* Subsequent entries in an absolute procedure linkage table look like 642 1.1 skrll this. */ 643 1.1 skrll 644 1.1 skrll static const bfd_byte elf_cris_plt_entry[PLT_ENTRY_SIZE] = 645 1.1 skrll { 646 1.1 skrll 0x7f, 0x0d, /* (dip [pc+]) */ 647 1.1 skrll 0, 0, 0, 0, /* Replaced with address of this symbol in .got. */ 648 1.1 skrll 0x30, 0x09, /* jump [...] */ 649 1.1 skrll 0x3f, 0x7e, /* move [pc+],mof */ 650 1.1 skrll 0, 0, 0, 0, /* Replaced with offset into relocation table. */ 651 1.1 skrll 0x2f, 0xfe, /* add.d [pc+],pc */ 652 1.1 skrll 0xec, 0xff, 653 1.1 skrll 0xff, 0xff /* Replaced with offset to start of .plt. */ 654 1.1 skrll }; 655 1.1 skrll 656 1.1 skrll static const bfd_byte elf_cris_plt_entry_v32[PLT_ENTRY_SIZE_V32] = 657 1.1 skrll { 658 1.1 skrll 0x6f, 0xfe, /* move.d 0,$acr */ 659 1.1 skrll 0, 0, 0, 0, /* Replaced with address of this symbol in .got. */ 660 1.1 skrll 0x6f, 0xfa, /* move.d [$acr],$acr */ 661 1.1 skrll 0xbf, 0x09, /* jump $acr */ 662 1.1 skrll 0xb0, 0x05, /* nop */ 663 1.1 skrll 0x3f, 0x7e, /* move 0,mof */ 664 1.1 skrll 0, 0, 0, 0, /* Replaced with offset into relocation table. */ 665 1.1 skrll 0xbf, 0x0e, /* ba start_of_plt0_entry */ 666 1.1 skrll 0, 0, 0, 0, /* Replaced with offset to plt0 entry. */ 667 1.1 skrll 0xb0, 0x05 /* nop */ 668 1.1 skrll }; 669 1.1 skrll 670 1.1 skrll /* The first entry in a PIC procedure linkage table looks like this. */ 671 1.1 skrll 672 1.1 skrll static const bfd_byte elf_cris_pic_plt0_entry[PLT_ENTRY_SIZE] = 673 1.1 skrll { 674 1.1 skrll 0xfc, 0xe1, 0x7e, 0x7e, /* push mof */ 675 1.1 skrll 0x04, 0x01, 0x30, 0x7a, /* move [r0+4],mof */ 676 1.1 skrll 0x08, 0x01, 0x30, 0x09, /* jump [r0+8] */ 677 1.1 skrll 0, 0, 0, 0, 0, 0, 0, 0, /* Pad out to 20 bytes. */ 678 1.1 skrll }; 679 1.1 skrll 680 1.1 skrll static const bfd_byte elf_cris_pic_plt0_entry_v32[PLT_ENTRY_SIZE_V32] = 681 1.1 skrll { 682 1.1 skrll 0x84, 0xe2, /* subq 4,$sp */ 683 1.1 skrll 0x04, 0x01, /* addoq 4,$r0,$acr */ 684 1.1 skrll 0x7e, 0x7a, /* move $mof,[$sp] */ 685 1.1 skrll 0x3f, 0x7a, /* move [$acr],$mof */ 686 1.1 skrll 0x04, 0xf2, /* addq 4,$acr */ 687 1.1 skrll 0x6f, 0xfa, /* move.d [$acr],$acr */ 688 1.1 skrll 0xbf, 0x09, /* jump $acr */ 689 1.1 skrll 0xb0, 0x05, /* nop */ 690 1.1 skrll 0, 0, /* Pad out to 26 bytes. */ 691 1.1 skrll 0, 0, 0, 0, 692 1.1 skrll 0, 0, 0, 0 693 1.1 skrll }; 694 1.1 skrll 695 1.1 skrll /* Subsequent entries in a PIC procedure linkage table look like this. */ 696 1.1 skrll 697 1.1 skrll static const bfd_byte elf_cris_pic_plt_entry[PLT_ENTRY_SIZE] = 698 1.1 skrll { 699 1.1 skrll 0x6f, 0x0d, /* (bdap [pc+].d,r0) */ 700 1.1 skrll 0, 0, 0, 0, /* Replaced with offset of this symbol in .got. */ 701 1.1 skrll 0x30, 0x09, /* jump [...] */ 702 1.1 skrll 0x3f, 0x7e, /* move [pc+],mof */ 703 1.1 skrll 0, 0, 0, 0, /* Replaced with offset into relocation table. */ 704 1.1 skrll 0x2f, 0xfe, /* add.d [pc+],pc */ 705 1.1 skrll 0xec, 0xff, /* Replaced with offset to start of .plt. */ 706 1.1 skrll 0xff, 0xff 707 1.1 skrll }; 708 1.1 skrll 709 1.1 skrll static const bfd_byte elf_cris_pic_plt_entry_v32[PLT_ENTRY_SIZE_V32] = 710 1.1 skrll { 711 1.1 skrll 0x6f, 0x0d, /* addo.d 0,$r0,$acr */ 712 1.1 skrll 0, 0, 0, 0, /* Replaced with offset of this symbol in .got. */ 713 1.1 skrll 0x6f, 0xfa, /* move.d [$acr],$acr */ 714 1.1 skrll 0xbf, 0x09, /* jump $acr */ 715 1.1 skrll 0xb0, 0x05, /* nop */ 716 1.1 skrll 0x3f, 0x7e, /* move relocoffs,$mof */ 717 1.1 skrll 0, 0, 0, 0, /* Replaced with offset into relocation table. */ 718 1.1 skrll 0xbf, 0x0e, /* ba start_of_plt */ 719 1.1 skrll 0, 0, 0, 0, /* Replaced with offset to start of .plt. */ 720 1.1 skrll 0xb0, 0x05 /* nop */ 721 1.1 skrll }; 722 1.1 skrll 723 1.1 skrll /* We copy elf32-m68k.c and elf32-i386.c for the basic linker hash bits 725 1.1 skrll (and most other PIC/shlib stuff). Check that we don't drift away 726 1.1 skrll without reason. 727 1.1 skrll 728 1.1 skrll The CRIS linker, like the m68k and i386 linkers (and probably the rest 729 1.1 skrll too) needs to keep track of the number of relocs that it decides to 730 1.1 skrll copy in check_relocs for each symbol. This is so that it can discard 731 1.1 skrll PC relative relocs if it doesn't need them when linking with 732 1.1 skrll -Bsymbolic. We store the information in a field extending the regular 733 1.1 skrll ELF linker hash table. */ 734 1.1 skrll 735 1.1 skrll /* This structure keeps track of the number of PC relative relocs we have 736 1.1 skrll copied for a given symbol. */ 737 1.1 skrll 738 1.1.1.2 christos struct elf_cris_pcrel_relocs_copied 739 1.1 skrll { 740 1.1 skrll /* Next section. */ 741 1.1.1.2 christos struct elf_cris_pcrel_relocs_copied *next; 742 1.1 skrll 743 1.1 skrll /* A section in dynobj. */ 744 1.1.1.2 christos asection *section; 745 1.1.1.2 christos 746 1.1.1.2 christos /* Number of relocs copied in this section. */ 747 1.1 skrll bfd_size_type count; 748 1.1 skrll 749 1.1 skrll /* Example of reloc being copied, for message. */ 750 1.1 skrll enum elf_cris_reloc_type r_type; 751 1.1 skrll }; 752 1.1 skrll 753 1.1 skrll /* CRIS ELF linker hash entry. */ 754 1.1 skrll 755 1.1 skrll struct elf_cris_link_hash_entry 756 1.1 skrll { 757 1.1 skrll struct elf_link_hash_entry root; 758 1.1 skrll 759 1.1 skrll /* Number of PC relative relocs copied for this symbol. */ 760 1.1 skrll struct elf_cris_pcrel_relocs_copied *pcrel_relocs_copied; 761 1.1 skrll 762 1.1 skrll /* The GOTPLT references are CRIS-specific; the goal is to avoid having 763 1.1 skrll both a general GOT and a PLT-specific GOT entry for the same symbol, 764 1.1 skrll when it is referenced both as a function and as a function pointer. 765 1.1 skrll 766 1.1 skrll Number of GOTPLT references for a function. */ 767 1.1 skrll bfd_signed_vma gotplt_refcount; 768 1.1 skrll 769 1.1 skrll /* Actual GOTPLT index for this symbol, if applicable, or zero if not 770 1.1.1.2 christos (zero is never used as an index). FIXME: We should be able to fold 771 1.1.1.2 christos this with gotplt_refcount in a union, like the got and plt unions in 772 1.1.1.2 christos elf_link_hash_entry. */ 773 1.1.1.2 christos bfd_size_type gotplt_offset; 774 1.1.1.2 christos 775 1.1.1.2 christos /* The root.got.refcount is the sum of the regular reference counts 776 1.1.1.2 christos (this) and those members below. We have to keep a separate count 777 1.1.1.2 christos to track when we've found the first (or last) reference to a 778 1.1.1.2 christos regular got entry. The offset is in root.got.offset. */ 779 1.1.1.2 christos bfd_signed_vma reg_got_refcount; 780 1.1.1.2 christos 781 1.1.1.2 christos /* Similar to the above, the number of reloc references to this 782 1.1.1.2 christos symbols that need a R_CRIS_32_TPREL slot. The offset is in 783 1.1.1.2 christos root.got.offset, because this and .dtp_refcount can't validly 784 1.1.1.2 christos happen when there's also a regular GOT entry; that's invalid 785 1.1.1.2 christos input for which an error is emitted. */ 786 1.1.1.2 christos bfd_signed_vma tprel_refcount; 787 1.1.1.2 christos 788 1.1 skrll /* Similar to the above, the number of reloc references to this 789 1.1 skrll symbols that need a R_CRIS_DTP slot. The offset is in 790 1.1.1.9 christos root.got.offset; plus 4 if .tprel_refcount > 0. */ 791 1.1.1.3 christos bfd_signed_vma dtp_refcount; 792 1.1.1.3 christos }; 793 1.1.1.9 christos 794 1.1.1.3 christos static bool 795 1.1.1.3 christos elf_cris_discard_excess_dso_dynamics (struct elf_cris_link_hash_entry *, 796 1.1.1.3 christos void * ); 797 1.1.1.2 christos static bool 798 1.1.1.2 christos elf_cris_discard_excess_program_dynamics (struct elf_cris_link_hash_entry *, 799 1.1.1.2 christos void *); 800 1.1.1.2 christos 801 1.1.1.2 christos /* The local_got_refcounts and local_got_offsets are a multiple of 802 1.1.1.2 christos LSNUM in size, namely LGOT_ALLOC_NELTS_FOR(LSNUM) (plus one for the 803 1.1.1.2 christos refcount for GOT itself, see code), with the summary / group offset 804 1.1.1.2 christos for local symbols located at offset N, reference counts for 805 1.1.1.2 christos ordinary (address) relocs at offset N + LSNUM, for R_CRIS_DTP 806 1.1.1.2 christos relocs at offset N + 2*LSNUM, and for R_CRIS_32_TPREL relocs at N + 807 1.1.1.2 christos 3*LSNUM. */ 808 1.1.1.2 christos 809 1.1.1.2 christos #define LGOT_REG_NDX(x) ((x) + symtab_hdr->sh_info) 810 1.1 skrll #define LGOT_DTP_NDX(x) ((x) + 2 * symtab_hdr->sh_info) 811 1.1 skrll #define LGOT_TPREL_NDX(x) ((x) + 3 * symtab_hdr->sh_info) 812 1.1 skrll #define LGOT_ALLOC_NELTS_FOR(x) ((x) * 4) 813 1.1 skrll 814 1.1 skrll /* CRIS ELF linker hash table. */ 815 1.1 skrll 816 1.1 skrll struct elf_cris_link_hash_table 817 1.1 skrll { 818 1.1 skrll struct elf_link_hash_table root; 819 1.1 skrll 820 1.1.1.2 christos /* We can't use the PLT offset and calculate to get the GOTPLT offset, 821 1.1.1.2 christos since we try and avoid creating GOTPLT:s when there's already a GOT. 822 1.1.1.2 christos Instead, we keep and update the next available index here. */ 823 1.1.1.2 christos bfd_size_type next_gotplt_entry; 824 1.1.1.2 christos 825 1.1.1.2 christos /* The number of R_CRIS_32_DTPREL and R_CRIS_16_DTPREL that have 826 1.1.1.2 christos been seen for any input; if != 0, then the constant-offset 827 1.1 skrll R_CRIS_DTPMOD is needed for this DSO/executable. This turns 828 1.1 skrll negative at relocation, so that we don't need an extra flag for 829 1.1 skrll when the reloc is output. */ 830 1.1 skrll bfd_signed_vma dtpmod_refcount; 831 1.1 skrll }; 832 1.1 skrll 833 1.1 skrll /* Traverse a CRIS ELF linker hash table. */ 834 1.1.1.9 christos 835 1.1 skrll #define elf_cris_link_hash_traverse(table, func, info) \ 836 1.1 skrll (elf_link_hash_traverse \ 837 1.1 skrll (&(table)->root, \ 838 1.1 skrll (bool (*) (struct elf_link_hash_entry *, void *)) (func), \ 839 1.1 skrll (info))) 840 1.1.1.9 christos 841 1.1.1.9 christos /* Get the CRIS ELF linker hash table from a link_info structure. */ 842 1.1.1.9 christos 843 1.1.1.2 christos #define elf_cris_hash_table(p) \ 844 1.1.1.2 christos ((is_elf_hash_table ((p)->hash) \ 845 1.1.1.2 christos && elf_hash_table_id (elf_hash_table (p)) == CRIS_ELF_DATA) \ 846 1.1.1.2 christos ? (struct elf_cris_link_hash_table *) (p)->hash : NULL) 847 1.1.1.2 christos 848 1.1.1.2 christos /* Get the CRIS ELF linker hash entry from a regular hash entry (the 849 1.1.1.2 christos "parent class"). The .root reference is just a simple type 850 1.1 skrll check on the argument. */ 851 1.1 skrll 852 1.1 skrll #define elf_cris_hash_entry(p) \ 853 1.1 skrll ((struct elf_cris_link_hash_entry *) (&(p)->root)) 854 1.1.1.2 christos 855 1.1.1.2 christos /* Create an entry in a CRIS ELF linker hash table. */ 856 1.1.1.2 christos 857 1.1 skrll static struct bfd_hash_entry * 858 1.1 skrll elf_cris_link_hash_newfunc (struct bfd_hash_entry *entry, 859 1.1 skrll struct bfd_hash_table *table, 860 1.1 skrll const char *string) 861 1.1 skrll { 862 1.1 skrll struct elf_cris_link_hash_entry *ret = 863 1.1 skrll (struct elf_cris_link_hash_entry *) entry; 864 1.1 skrll 865 1.1 skrll /* Allocate the structure if it has not already been allocated by a 866 1.1 skrll subclass. */ 867 1.1 skrll if (ret == (struct elf_cris_link_hash_entry *) NULL) 868 1.1 skrll ret = ((struct elf_cris_link_hash_entry *) 869 1.1 skrll bfd_hash_allocate (table, 870 1.1 skrll sizeof (struct elf_cris_link_hash_entry))); 871 1.1 skrll if (ret == (struct elf_cris_link_hash_entry *) NULL) 872 1.1 skrll return (struct bfd_hash_entry *) ret; 873 1.1 skrll 874 1.1 skrll /* Call the allocation method of the superclass. */ 875 1.1 skrll ret = ((struct elf_cris_link_hash_entry *) 876 1.1 skrll _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret, 877 1.1 skrll table, string)); 878 1.1 skrll if (ret != (struct elf_cris_link_hash_entry *) NULL) 879 1.1.1.2 christos { 880 1.1.1.2 christos ret->pcrel_relocs_copied = NULL; 881 1.1.1.2 christos ret->gotplt_refcount = 0; 882 1.1 skrll ret->gotplt_offset = 0; 883 1.1 skrll ret->dtp_refcount = 0; 884 1.1 skrll ret->tprel_refcount = 0; 885 1.1 skrll ret->reg_got_refcount = 0; 886 1.1 skrll } 887 1.1 skrll 888 1.1 skrll return (struct bfd_hash_entry *) ret; 889 1.1 skrll } 890 1.1.1.2 christos 891 1.1 skrll /* Create a CRIS ELF linker hash table. */ 892 1.1 skrll 893 1.1.1.9 christos static struct bfd_link_hash_table * 894 1.1 skrll elf_cris_link_hash_table_create (bfd *abfd) 895 1.1.1.4 christos { 896 1.1 skrll struct elf_cris_link_hash_table *ret; 897 1.1 skrll size_t amt = sizeof (struct elf_cris_link_hash_table); 898 1.1 skrll 899 1.1 skrll ret = ((struct elf_cris_link_hash_table *) bfd_zmalloc (amt)); 900 1.1 skrll if (ret == (struct elf_cris_link_hash_table *) NULL) 901 1.1.1.11 christos return NULL; 902 1.1 skrll 903 1.1 skrll if (!_bfd_elf_link_hash_table_init (&ret->root, abfd, 904 1.1 skrll elf_cris_link_hash_newfunc, 905 1.1 skrll sizeof (struct elf_cris_link_hash_entry))) 906 1.1 skrll { 907 1.1 skrll free (ret); 908 1.1 skrll return NULL; 909 1.1 skrll } 910 1.1 skrll 911 1.1 skrll /* Initialize to skip over the first three entries in the gotplt; they 912 1.1 skrll are used for run-time symbol evaluation. */ 913 1.1 skrll ret->next_gotplt_entry = 12; 914 1.1 skrll 915 1.1 skrll return &ret->root.root; 916 1.1 skrll } 917 1.1 skrll 918 1.1.1.3 christos /* Perform a single relocation. By default we use the standard BFD 920 1.1.1.6 christos routines, with a few tweaks. */ 921 1.1.1.6 christos 922 1.1.1.3 christos static bfd_reloc_status_type 923 1.1.1.6 christos cris_final_link_relocate (reloc_howto_type * howto, 924 1.1 skrll bfd * input_bfd, 925 1.1 skrll asection * input_section, 926 1.1.1.2 christos bfd_byte * contents, 927 1.1 skrll Elf_Internal_Rela * rel, 928 1.1 skrll bfd_vma relocation) 929 1.1 skrll { 930 1.1 skrll bfd_reloc_status_type r; 931 1.1.1.2 christos enum elf_cris_reloc_type r_type = ELF32_R_TYPE (rel->r_info); 932 1.1 skrll 933 1.1 skrll /* PC-relative relocations are relative to the position *after* 934 1.1 skrll the reloc. Note that for R_CRIS_8_PCREL the adjustment is 935 1.1 skrll not a single byte, since PC must be 16-bit-aligned. */ 936 1.1 skrll switch (r_type) 937 1.1 skrll { 938 1.1 skrll /* Check that the 16-bit GOT relocs are positive. */ 939 1.1 skrll case R_CRIS_16_GOTPLT: 940 1.1 skrll case R_CRIS_16_GOT: 941 1.1 skrll if ((bfd_signed_vma) relocation < 0) 942 1.1 skrll return bfd_reloc_overflow; 943 1.1 skrll break; 944 1.1 skrll 945 1.1 skrll case R_CRIS_32_PLT_PCREL: 946 1.1 skrll case R_CRIS_32_PCREL: 947 1.1 skrll relocation -= 2; 948 1.1 skrll /* Fall through. */ 949 1.1 skrll case R_CRIS_8_PCREL: 950 1.1 skrll case R_CRIS_16_PCREL: 951 1.1 skrll relocation -= 2; 952 1.1 skrll break; 953 1.1 skrll 954 1.1 skrll default: 955 1.1 skrll break; 956 1.1 skrll } 957 1.1 skrll 958 1.1 skrll r = _bfd_final_link_relocate (howto, input_bfd, input_section, 959 1.1.1.2 christos contents, rel->r_offset, 960 1.1.1.2 christos relocation, rel->r_addend); 961 1.1.1.2 christos return r; 962 1.1.1.2 christos } 963 1.1.1.2 christos 964 1.1.1.2 christos 966 1.1.1.2 christos /* The number of errors left before we stop outputting reloc-specific 967 1.1 skrll explanatory messages. By coincidence, this works nicely together 968 1.1 skrll with the default number of messages you'll get from LD about 969 1.1 skrll "relocation truncated to fit" messages before you get an 970 1.1.1.9 christos "additional relocation overflows omitted from the output". */ 971 1.1.1.2 christos static int additional_relocation_error_msg_count = 10; 972 1.1.1.2 christos 973 1.1.1.2 christos /* Relocate an CRIS ELF section. See elf32-fr30.c, from where this was 974 1.1.1.2 christos copied, for further comments. */ 975 1.1.1.2 christos 976 1.1.1.2 christos static int 977 1.1.1.2 christos cris_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED, 978 1.1.1.2 christos struct bfd_link_info *info, 979 1.1 skrll bfd *input_bfd, 980 1.1.1.2 christos asection *input_section, 981 1.1 skrll bfd_byte *contents, 982 1.1 skrll Elf_Internal_Rela *relocs, 983 1.1 skrll Elf_Internal_Sym *local_syms, 984 1.1 skrll asection **local_sections) 985 1.1 skrll { 986 1.1 skrll struct elf_cris_link_hash_table * htab; 987 1.1 skrll bfd *dynobj; 988 1.1 skrll Elf_Internal_Shdr *symtab_hdr; 989 1.1 skrll struct elf_link_hash_entry **sym_hashes; 990 1.1.1.2 christos bfd_vma *local_got_offsets; 991 1.1.1.2 christos asection *sgot; 992 1.1.1.2 christos asection *splt; 993 1.1.1.2 christos asection *sreloc; 994 1.1.1.9 christos Elf_Internal_Rela *rel; 995 1.1 skrll Elf_Internal_Rela *relend; 996 1.1.1.6 christos asection *srelgot; 997 1.1 skrll 998 1.1 skrll htab = elf_cris_hash_table (info); 999 1.1 skrll if (htab == NULL) 1000 1.1 skrll return false; 1001 1.1 skrll 1002 1.1 skrll dynobj = htab->root.dynobj; 1003 1.1 skrll local_got_offsets = elf_local_got_offsets (input_bfd); 1004 1.1 skrll symtab_hdr = & elf_tdata (input_bfd)->symtab_hdr; 1005 1.1.1.2 christos sym_hashes = elf_sym_hashes (input_bfd); 1006 1.1 skrll relend = relocs + input_section->reloc_count; 1007 1.1 skrll 1008 1.1 skrll sgot = NULL; 1009 1.1.1.6 christos splt = NULL; 1010 1.1.1.6 christos sreloc = NULL; 1011 1.1 skrll srelgot = NULL; 1012 1.1 skrll 1013 1.1 skrll if (dynobj != NULL) 1014 1.1 skrll { 1015 1.1 skrll splt = htab->root.splt; 1016 1.1 skrll sgot = htab->root.sgot; 1017 1.1 skrll } 1018 1.1 skrll 1019 1.1 skrll for (rel = relocs; rel < relend; rel ++) 1020 1.1 skrll { 1021 1.1 skrll reloc_howto_type *howto; 1022 1.1 skrll unsigned long r_symndx; 1023 1.1.1.2 christos Elf_Internal_Sym *sym; 1024 1.1.1.9 christos asection *sec; 1025 1.1 skrll struct elf_link_hash_entry *h; 1026 1.1 skrll bfd_vma relocation; 1027 1.1 skrll bfd_reloc_status_type r; 1028 1.1 skrll const char *symname = NULL; 1029 1.1 skrll enum elf_cris_reloc_type r_type; 1030 1.1 skrll bool resolved_to_zero; 1031 1.1 skrll 1032 1.1 skrll r_type = ELF32_R_TYPE (rel->r_info); 1033 1.1 skrll 1034 1.1 skrll if ( r_type == R_CRIS_GNU_VTINHERIT 1035 1.1 skrll || r_type == R_CRIS_GNU_VTENTRY) 1036 1.1 skrll continue; 1037 1.1 skrll 1038 1.1 skrll r_symndx = ELF32_R_SYM (rel->r_info); 1039 1.1 skrll howto = cris_elf_howto_table + r_type; 1040 1.1 skrll h = NULL; 1041 1.1 skrll sym = NULL; 1042 1.1 skrll sec = NULL; 1043 1.1 skrll 1044 1.1 skrll if (r_symndx < symtab_hdr->sh_info) 1045 1.1 skrll { 1046 1.1 skrll sym = local_syms + r_symndx; 1047 1.1.1.8 christos sec = local_sections [r_symndx]; 1048 1.1 skrll relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); 1049 1.1 skrll 1050 1.1 skrll symname = (bfd_elf_string_from_elf_section 1051 1.1.1.9 christos (input_bfd, symtab_hdr->sh_link, sym->st_name)); 1052 1.1.1.9 christos if (symname == NULL) 1053 1.1 skrll symname = bfd_section_name (sec); 1054 1.1 skrll } 1055 1.1 skrll else 1056 1.1 skrll { 1057 1.1.1.4 christos bool warned, ignored; 1058 1.1 skrll bool unresolved_reloc; 1059 1.1.1.2 christos 1060 1.1.1.2 christos RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel, 1061 1.1 skrll r_symndx, symtab_hdr, sym_hashes, 1062 1.1 skrll h, sec, relocation, 1063 1.1 skrll unresolved_reloc, warned, ignored); 1064 1.1 skrll 1065 1.1 skrll symname = h->root.root.string; 1066 1.1 skrll 1067 1.1 skrll if (unresolved_reloc 1068 1.1 skrll /* Perhaps we should detect the cases that 1069 1.1 skrll sec->output_section is expected to be NULL like i386 and 1070 1.1 skrll m68k, but apparently (and according to elfxx-ia64.c) all 1071 1.1 skrll valid cases are where the symbol is defined in a shared 1072 1.1 skrll object which we link dynamically against. This includes 1073 1.1 skrll PLT relocs for which we've created a PLT entry and other 1074 1.1 skrll relocs for which we're prepared to create dynamic 1075 1.1 skrll relocations. 1076 1.1 skrll 1077 1.1 skrll For now, new situations cause us to just err when 1078 1.1 skrll sec->output_offset is NULL but the object with the symbol 1079 1.1 skrll is *not* dynamically linked against. Thus this will 1080 1.1 skrll automatically remind us so we can see if there are other 1081 1.1 skrll valid cases we need to revisit. */ 1082 1.1 skrll && (sec->owner->flags & DYNAMIC) != 0) 1083 1.1 skrll relocation = 0; 1084 1.1 skrll 1085 1.1 skrll else if (h->root.type == bfd_link_hash_defined 1086 1.1 skrll || h->root.type == bfd_link_hash_defweak) 1087 1.1 skrll { 1088 1.1 skrll /* Here follow the cases where the relocation value must 1089 1.1 skrll be zero (or when further handling is simplified when 1090 1.1 skrll zero). I can't claim to understand the various 1091 1.1 skrll conditions and they weren't described in the files 1092 1.1 skrll where I copied them from (elf32-m68k.c and 1093 1.1 skrll elf32-i386.c), but let's mention examples of where 1094 1.1 skrll they happen. FIXME: Perhaps define and use a 1095 1.1 skrll dynamic_symbol_p function like ia64. 1096 1.1 skrll 1097 1.1 skrll - When creating a shared library, we can have an 1098 1.1 skrll ordinary relocation for a symbol defined in a shared 1099 1.1 skrll library (perhaps the one we create). We then make 1100 1.1.1.4 christos the relocation value zero, as the value seen now will 1101 1.1.1.4 christos be added into the relocation addend in this shared 1102 1.1 skrll library, but must be handled only at dynamic-link 1103 1.1 skrll time. FIXME: Not sure this example covers the 1104 1.1 skrll h->elf_link_hash_flags test, though it's there in 1105 1.1 skrll other targets. */ 1106 1.1 skrll if (bfd_link_pic (info) 1107 1.1 skrll && ((!SYMBOLIC_BIND (info, h) && h->dynindx != -1) 1108 1.1 skrll || !h->def_regular) 1109 1.1 skrll && (input_section->flags & SEC_ALLOC) != 0 1110 1.1 skrll && (r_type == R_CRIS_8 1111 1.1.1.4 christos || r_type == R_CRIS_16 1112 1.1.1.3 christos || r_type == R_CRIS_32 1113 1.1.1.3 christos || r_type == R_CRIS_8_PCREL 1114 1.1.1.3 christos || r_type == R_CRIS_16_PCREL 1115 1.1.1.3 christos || r_type == R_CRIS_32_PCREL)) 1116 1.1 skrll relocation = 0; 1117 1.1 skrll else if (!bfd_link_relocatable (info) && unresolved_reloc 1118 1.1.1.6 christos && (_bfd_elf_section_offset (output_bfd, info, 1119 1.1.1.7 christos input_section, 1120 1.1 skrll rel->r_offset) 1121 1.1 skrll != (bfd_vma) -1)) 1122 1.1 skrll { 1123 1.1 skrll _bfd_error_handler 1124 1.1 skrll /* xgettext:c-format */ 1125 1.1.1.9 christos (_("%pB, section %pA: unresolvable relocation %s against symbol `%s'"), 1126 1.1 skrll input_bfd, 1127 1.1 skrll input_section, 1128 1.1 skrll cris_elf_howto_table[r_type].name, 1129 1.1 skrll symname); 1130 1.1.1.3 christos bfd_set_error (bfd_error_bad_value); 1131 1.1.1.2 christos return false; 1132 1.1.1.12 christos } 1133 1.1.1.12 christos } 1134 1.1 skrll } 1135 1.1.1.4 christos 1136 1.1 skrll if (sec != NULL && discarded_section (sec)) 1137 1.1 skrll RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section, 1138 1.1.1.6 christos rel, 1, relend, R_CRIS_NONE, 1139 1.1.1.6 christos howto, 0, contents); 1140 1.1.1.6 christos 1141 1.1 skrll if (bfd_link_relocatable (info)) 1142 1.1 skrll continue; 1143 1.1 skrll 1144 1.1 skrll resolved_to_zero = (h != NULL 1145 1.1 skrll && UNDEFWEAK_NO_DYNAMIC_RELOC (info, h)); 1146 1.1 skrll 1147 1.1 skrll switch (r_type) 1148 1.1 skrll { 1149 1.1 skrll case R_CRIS_16_GOTPLT: 1150 1.1 skrll case R_CRIS_32_GOTPLT: 1151 1.1 skrll /* This is like the case for R_CRIS_32_GOT and R_CRIS_16_GOT, 1152 1.1 skrll but we require a PLT, and the PLT handling will take care of 1153 1.1.1.6 christos filling in the PLT-specific GOT entry. For the GOT offset, 1154 1.1 skrll calculate it as we do when filling it in for the .got.plt 1155 1.1 skrll section. If we don't have a PLT, punt to GOT handling. */ 1156 1.1 skrll if (h != NULL 1157 1.1 skrll && ((struct elf_cris_link_hash_entry *) h)->gotplt_offset != 0) 1158 1.1 skrll { 1159 1.1 skrll asection *sgotplt = htab->root.sgotplt; 1160 1.1 skrll bfd_vma got_offset; 1161 1.1 skrll 1162 1.1 skrll BFD_ASSERT (h->dynindx != -1); 1163 1.1 skrll BFD_ASSERT (sgotplt != NULL); 1164 1.1 skrll 1165 1.1 skrll got_offset 1166 1.1 skrll = ((struct elf_cris_link_hash_entry *) h)->gotplt_offset; 1167 1.1 skrll 1168 1.1 skrll relocation = got_offset; 1169 1.1 skrll break; 1170 1.1 skrll } 1171 1.1 skrll 1172 1.1 skrll /* We didn't make a PLT entry for this symbol. Maybe everything is 1173 1.1 skrll folded into the GOT. Other than folding, this happens when 1174 1.1 skrll statically linking PIC code, or when using -Bsymbolic. Check 1175 1.1 skrll that we instead have a GOT entry as done for us by 1176 1.1 skrll elf_cris_adjust_dynamic_symbol, and drop through into the 1177 1.1.1.4 christos ordinary GOT cases. This must not happen for the 1178 1.1 skrll executable, because any reference it does to a function 1179 1.1 skrll that is satisfied by a DSO must generate a PLT. We assume 1180 1.1 skrll these call-specific relocs don't address non-functions. */ 1181 1.1 skrll if (h != NULL 1182 1.1.1.6 christos && (h->got.offset == (bfd_vma) -1 1183 1.1 skrll || (!bfd_link_pic (info) 1184 1.1.1.6 christos && !(h->def_regular 1185 1.1.1.7 christos || (!h->def_dynamic 1186 1.1 skrll && h->root.type == bfd_link_hash_undefweak))))) 1187 1.1.1.6 christos { 1188 1.1.1.7 christos _bfd_error_handler 1189 1.1 skrll ((h->got.offset == (bfd_vma) -1) 1190 1.1 skrll /* xgettext:c-format */ 1191 1.1 skrll ? _("%pB, section %pA: no PLT nor GOT for relocation %s" 1192 1.1 skrll " against symbol `%s'") 1193 1.1 skrll /* xgettext:c-format */ 1194 1.1 skrll : _("%pB, section %pA: no PLT for relocation %s" 1195 1.1 skrll " against symbol `%s'"), 1196 1.1 skrll input_bfd, 1197 1.1 skrll input_section, 1198 1.1 skrll cris_elf_howto_table[r_type].name, 1199 1.1 skrll (symname != NULL && symname[0] != '\0' 1200 1.1.1.9 christos ? symname : _("[whose name is lost]"))); 1201 1.1 skrll 1202 1.1 skrll /* FIXME: Perhaps blaming input is not the right thing to 1203 1.1 skrll do; this is probably an internal error. But it is true 1204 1.1 skrll that we didn't like that particular input. */ 1205 1.1 skrll bfd_set_error (bfd_error_bad_value); 1206 1.1 skrll return false; 1207 1.1 skrll } 1208 1.1 skrll /* Fall through. */ 1209 1.1 skrll 1210 1.1 skrll /* The size of the actual relocation is not used here; we only 1211 1.1 skrll fill in the GOT table here. */ 1212 1.1 skrll case R_CRIS_16_GOT: 1213 1.1 skrll case R_CRIS_32_GOT: 1214 1.1 skrll { 1215 1.1 skrll bfd_vma off; 1216 1.1 skrll 1217 1.1 skrll /* Note that despite using RELA relocations, the .got contents 1218 1.1 skrll is always filled in with the link-relative relocation 1219 1.1 skrll value; the addend. */ 1220 1.1 skrll 1221 1.1.1.4 christos if (h != NULL) 1222 1.1 skrll { 1223 1.1 skrll off = h->got.offset; 1224 1.1 skrll BFD_ASSERT (off != (bfd_vma) -1); 1225 1.1.1.4 christos 1226 1.1.1.4 christos if (!elf_hash_table (info)->dynamic_sections_created 1227 1.1 skrll || (! bfd_link_pic (info) 1228 1.1 skrll && (h->def_regular 1229 1.1.1.4 christos || h->type == STT_FUNC 1230 1.1 skrll || h->needs_plt)) 1231 1.1 skrll || (bfd_link_pic (info) 1232 1.1 skrll && (SYMBOLIC_BIND (info, h) || h->dynindx == -1) 1233 1.1 skrll && h->def_regular)) 1234 1.1.1.4 christos { 1235 1.1 skrll /* This wasn't checked above for ! bfd_link_pic (info), but 1236 1.1 skrll must hold there if we get here; the symbol must 1237 1.1 skrll be defined in the regular program or be undefweak 1238 1.1 skrll or be a function or otherwise need a PLT. */ 1239 1.1 skrll BFD_ASSERT (!elf_hash_table (info)->dynamic_sections_created 1240 1.1 skrll || bfd_link_pic (info) 1241 1.1 skrll || h->def_regular 1242 1.1 skrll || h->type == STT_FUNC 1243 1.1 skrll || h->needs_plt 1244 1.1 skrll || h->root.type == bfd_link_hash_undefweak); 1245 1.1 skrll 1246 1.1 skrll /* This is actually a static link, or it is a 1247 1.1 skrll -Bsymbolic link and the symbol is defined locally, 1248 1.1 skrll or is undefweak, or the symbol was forced to be 1249 1.1 skrll local because of a version file, or we're not 1250 1.1 skrll creating a dynamic object. We must initialize this 1251 1.1 skrll entry in the global offset table. Since the offset 1252 1.1 skrll must always be a multiple of 4, we use the least 1253 1.1 skrll significant bit to record whether we have 1254 1.1 skrll initialized it already. 1255 1.1 skrll 1256 1.1 skrll If this GOT entry should be runtime-initialized, we 1257 1.1 skrll will create a .rela.got relocation entry to 1258 1.1 skrll initialize the value. This is done in the 1259 1.1 skrll finish_dynamic_symbol routine. */ 1260 1.1 skrll if ((off & 1) != 0) 1261 1.1 skrll off &= ~1; 1262 1.1 skrll else 1263 1.1 skrll { 1264 1.1 skrll bfd_put_32 (output_bfd, relocation, 1265 1.1 skrll sgot->contents + off); 1266 1.1 skrll h->got.offset |= 1; 1267 1.1 skrll } 1268 1.1 skrll } 1269 1.1 skrll } 1270 1.1 skrll else 1271 1.1 skrll { 1272 1.1 skrll BFD_ASSERT (local_got_offsets != NULL 1273 1.1 skrll && local_got_offsets[r_symndx] != (bfd_vma) -1); 1274 1.1 skrll 1275 1.1 skrll off = local_got_offsets[r_symndx]; 1276 1.1 skrll 1277 1.1 skrll /* The offset must always be a multiple of 4. We use 1278 1.1 skrll the least significant bit to record whether we have 1279 1.1 skrll already generated the necessary reloc. */ 1280 1.1.1.4 christos if ((off & 1) != 0) 1281 1.1 skrll off &= ~1; 1282 1.1 skrll else 1283 1.1 skrll { 1284 1.1 skrll bfd_put_32 (output_bfd, relocation, sgot->contents + off); 1285 1.1.1.6 christos 1286 1.1.1.2 christos if (bfd_link_pic (info)) 1287 1.1 skrll { 1288 1.1 skrll Elf_Internal_Rela outrel; 1289 1.1 skrll bfd_byte *loc; 1290 1.1 skrll 1291 1.1 skrll srelgot = htab->root.srelgot; 1292 1.1 skrll BFD_ASSERT (srelgot != NULL); 1293 1.1.1.2 christos 1294 1.1.1.2 christos outrel.r_offset = (sgot->output_section->vma 1295 1.1 skrll + sgot->output_offset 1296 1.1 skrll + off); 1297 1.1 skrll outrel.r_info = ELF32_R_INFO (0, R_CRIS_RELATIVE); 1298 1.1 skrll outrel.r_addend = relocation; 1299 1.1 skrll loc = srelgot->contents; 1300 1.1 skrll loc += srelgot->reloc_count++ * sizeof (Elf32_External_Rela); 1301 1.1 skrll bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc); 1302 1.1 skrll } 1303 1.1 skrll 1304 1.1 skrll local_got_offsets[r_symndx] |= 1; 1305 1.1 skrll } 1306 1.1 skrll } 1307 1.1 skrll 1308 1.1 skrll relocation = sgot->output_offset + off; 1309 1.1 skrll if (rel->r_addend != 0) 1310 1.1.1.6 christos { 1311 1.1.1.6 christos /* We can't do anything for a relocation which is against 1312 1.1.1.7 christos a symbol *plus offset*. GOT holds relocations for 1313 1.1.1.7 christos symbols. Make this an error; the compiler isn't 1314 1.1 skrll allowed to pass us these kinds of things. */ 1315 1.1 skrll if (h == NULL) 1316 1.1 skrll _bfd_error_handler 1317 1.1.1.7 christos /* xgettext:c-format */ 1318 1.1 skrll (_("%pB, section %pA: relocation %s with non-zero addend" 1319 1.1.1.6 christos " %" PRId64 " against local symbol"), 1320 1.1.1.6 christos input_bfd, 1321 1.1.1.7 christos input_section, 1322 1.1.1.7 christos cris_elf_howto_table[r_type].name, 1323 1.1 skrll (int64_t) rel->r_addend); 1324 1.1 skrll else 1325 1.1 skrll _bfd_error_handler 1326 1.1.1.7 christos /* xgettext:c-format */ 1327 1.1 skrll (_("%pB, section %pA: relocation %s with non-zero addend" 1328 1.1 skrll " %" PRId64 " against symbol `%s'"), 1329 1.1 skrll input_bfd, 1330 1.1.1.9 christos input_section, 1331 1.1 skrll cris_elf_howto_table[r_type].name, 1332 1.1 skrll (int64_t) rel->r_addend, 1333 1.1 skrll symname[0] != '\0' ? symname : _("[whose name is lost]")); 1334 1.1 skrll 1335 1.1 skrll bfd_set_error (bfd_error_bad_value); 1336 1.1 skrll return false; 1337 1.1 skrll } 1338 1.1 skrll } 1339 1.1 skrll break; 1340 1.1 skrll 1341 1.1.1.4 christos case R_CRIS_32_GOTREL: 1342 1.1 skrll /* This relocation must only be performed against local symbols. 1343 1.1 skrll It's also ok when we link a program and the symbol is either 1344 1.1 skrll defined in an ordinary (non-DSO) object or is undefined weak. */ 1345 1.1 skrll if (h != NULL 1346 1.1.1.6 christos && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT 1347 1.1.1.6 christos && !(!bfd_link_pic (info) 1348 1.1.1.7 christos && (h->def_regular 1349 1.1 skrll || (!h->def_dynamic 1350 1.1 skrll && h->root.type == bfd_link_hash_undefweak)))) 1351 1.1 skrll { 1352 1.1 skrll _bfd_error_handler 1353 1.1 skrll /* xgettext:c-format */ 1354 1.1 skrll (_("%pB, section %pA: relocation %s is" 1355 1.1.1.9 christos " not allowed for global symbol: `%s'"), 1356 1.1 skrll input_bfd, 1357 1.1 skrll input_section, 1358 1.1 skrll cris_elf_howto_table[r_type].name, 1359 1.1 skrll symname); 1360 1.1 skrll bfd_set_error (bfd_error_bad_value); 1361 1.1 skrll return false; 1362 1.1 skrll } 1363 1.1.1.6 christos 1364 1.1.1.6 christos /* This can happen if we get a link error with the input ELF 1365 1.1.1.7 christos variant mismatching the output variant. Emit an error so 1366 1.1 skrll it's noticed if it happens elsewhere. */ 1367 1.1 skrll if (sgot == NULL) 1368 1.1 skrll { 1369 1.1 skrll _bfd_error_handler 1370 1.1.1.9 christos /* xgettext:c-format */ 1371 1.1 skrll (_("%pB, section %pA: relocation %s with no GOT created"), 1372 1.1 skrll input_bfd, 1373 1.1 skrll input_section, 1374 1.1 skrll cris_elf_howto_table[r_type].name); 1375 1.1 skrll bfd_set_error (bfd_error_bad_value); 1376 1.1 skrll return false; 1377 1.1 skrll } 1378 1.1 skrll 1379 1.1 skrll /* This relocation is like a PC-relative one, except the 1380 1.1 skrll reference point is the location of GOT. Note that 1381 1.1 skrll sgot->output_offset is not involved in this calculation. We 1382 1.1 skrll always want the start of entire .got section, not the 1383 1.1 skrll position after the reserved header. */ 1384 1.1 skrll relocation -= sgot->output_section->vma; 1385 1.1 skrll break; 1386 1.1 skrll 1387 1.1 skrll case R_CRIS_32_PLT_PCREL: 1388 1.1 skrll /* Relocation is to the entry for this symbol in the 1389 1.1 skrll procedure linkage table. */ 1390 1.1 skrll 1391 1.1 skrll /* Resolve a PLT_PCREL reloc against a local symbol directly, 1392 1.1 skrll without using the procedure linkage table. */ 1393 1.1 skrll if (h == NULL || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT) 1394 1.1 skrll break; 1395 1.1 skrll 1396 1.1 skrll if (h->plt.offset == (bfd_vma) -1 1397 1.1 skrll || splt == NULL) 1398 1.1 skrll { 1399 1.1 skrll /* We didn't make a PLT entry for this symbol. This 1400 1.1 skrll happens when statically linking PIC code, or when 1401 1.1 skrll using -Bsymbolic. */ 1402 1.1 skrll break; 1403 1.1 skrll } 1404 1.1 skrll 1405 1.1 skrll relocation = (splt->output_section->vma 1406 1.1 skrll + splt->output_offset 1407 1.1 skrll + h->plt.offset); 1408 1.1 skrll break; 1409 1.1 skrll 1410 1.1 skrll case R_CRIS_32_PLT_GOTREL: 1411 1.1 skrll /* Like R_CRIS_32_PLT_PCREL, but the reference point is the 1412 1.1 skrll start of the .got section. See also comment at 1413 1.1 skrll R_CRIS_32_GOT. */ 1414 1.1 skrll relocation -= sgot->output_section->vma; 1415 1.1 skrll 1416 1.1 skrll /* Resolve a PLT_GOTREL reloc against a local symbol directly, 1417 1.1 skrll without using the procedure linkage table. */ 1418 1.1 skrll if (h == NULL || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT) 1419 1.1 skrll break; 1420 1.1 skrll 1421 1.1 skrll if (h->plt.offset == (bfd_vma) -1 1422 1.1 skrll || splt == NULL) 1423 1.1 skrll { 1424 1.1 skrll /* We didn't make a PLT entry for this symbol. This 1425 1.1 skrll happens when statically linking PIC code, or when 1426 1.1 skrll using -Bsymbolic. */ 1427 1.1 skrll break; 1428 1.1 skrll } 1429 1.1 skrll 1430 1.1 skrll relocation = (splt->output_section->vma 1431 1.1 skrll + splt->output_offset 1432 1.1 skrll + h->plt.offset 1433 1.1 skrll - sgot->output_section->vma); 1434 1.1.1.2 christos break; 1435 1.1.1.2 christos 1436 1.1 skrll case R_CRIS_8_PCREL: 1437 1.1 skrll case R_CRIS_16_PCREL: 1438 1.1 skrll case R_CRIS_32_PCREL: 1439 1.1 skrll /* If the symbol was local, we need no shlib-specific handling. */ 1440 1.1 skrll if (h == NULL || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT 1441 1.1 skrll || h->dynindx == -1) 1442 1.1.1.4 christos break; 1443 1.1.1.6 christos 1444 1.1.1.2 christos /* Fall through. */ 1445 1.1 skrll case R_CRIS_8: 1446 1.1 skrll case R_CRIS_16: 1447 1.1 skrll case R_CRIS_32: 1448 1.1 skrll if (bfd_link_pic (info) 1449 1.1.1.4 christos && !resolved_to_zero 1450 1.1.1.2 christos && r_symndx != STN_UNDEF 1451 1.1 skrll && (input_section->flags & SEC_ALLOC) != 0 1452 1.1 skrll && ((r_type != R_CRIS_8_PCREL 1453 1.1 skrll && r_type != R_CRIS_16_PCREL 1454 1.1.1.9 christos && r_type != R_CRIS_32_PCREL) 1455 1.1 skrll || (!SYMBOLIC_BIND (info, h) 1456 1.1 skrll || (h != NULL && !h->def_regular)))) 1457 1.1 skrll { 1458 1.1 skrll Elf_Internal_Rela outrel; 1459 1.1 skrll bfd_byte *loc; 1460 1.1 skrll bool skip, relocate; 1461 1.1 skrll 1462 1.1.1.2 christos /* When generating a shared object, these relocations 1463 1.1.1.9 christos are copied into the output file to be resolved at run 1464 1.1.1.2 christos time. */ 1465 1.1.1.2 christos 1466 1.1 skrll if (sreloc == NULL) 1467 1.1 skrll { 1468 1.1 skrll sreloc = _bfd_elf_get_dynamic_reloc_section 1469 1.1 skrll (dynobj, input_section, /*rela?*/ true); 1470 1.1.1.9 christos /* The section should have been created in cris_elf_check_relocs, 1471 1.1 skrll but that function will not be called for objects which fail in 1472 1.1 skrll cris_elf_merge_private_bfd_data. */ 1473 1.1 skrll if (sreloc == NULL) 1474 1.1.1.9 christos { 1475 1.1.1.9 christos bfd_set_error (bfd_error_bad_value); 1476 1.1 skrll return false; 1477 1.1 skrll } 1478 1.1 skrll } 1479 1.1 skrll 1480 1.1 skrll skip = false; 1481 1.1.1.9 christos relocate = false; 1482 1.1.1.2 christos 1483 1.1.1.2 christos outrel.r_offset = 1484 1.1.1.2 christos _bfd_elf_section_offset (output_bfd, info, input_section, 1485 1.1.1.2 christos rel->r_offset); 1486 1.1.1.2 christos if (outrel.r_offset == (bfd_vma) -1) 1487 1.1.1.2 christos skip = true; 1488 1.1.1.2 christos else if (outrel.r_offset == (bfd_vma) -2 1489 1.1.1.2 christos /* For now, undefined weak symbols with non-default 1490 1.1.1.2 christos visibility (yielding 0), like exception info for 1491 1.1.1.2 christos discarded sections, will get a R_CRIS_NONE 1492 1.1.1.9 christos relocation rather than no relocation, because we 1493 1.1 skrll notice too late that the symbol doesn't need a 1494 1.1 skrll relocation. */ 1495 1.1 skrll || (h != NULL 1496 1.1 skrll && h->root.type == bfd_link_hash_undefweak 1497 1.1 skrll && ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)) 1498 1.1 skrll skip = true, relocate = true; 1499 1.1 skrll outrel.r_offset += (input_section->output_section->vma 1500 1.1 skrll + input_section->output_offset); 1501 1.1.1.4 christos 1502 1.1 skrll if (skip) 1503 1.1 skrll memset (&outrel, 0, sizeof outrel); 1504 1.1 skrll /* h->dynindx may be -1 if the symbol was marked to 1505 1.1 skrll become local. */ 1506 1.1 skrll else if (h != NULL 1507 1.1 skrll && ((!SYMBOLIC_BIND (info, h) && h->dynindx != -1) 1508 1.1 skrll || !h->def_regular)) 1509 1.1 skrll { 1510 1.1 skrll BFD_ASSERT (h->dynindx != -1); 1511 1.1 skrll outrel.r_info = ELF32_R_INFO (h->dynindx, r_type); 1512 1.1 skrll outrel.r_addend = relocation + rel->r_addend; 1513 1.1 skrll } 1514 1.1.1.9 christos else 1515 1.1 skrll { 1516 1.1 skrll outrel.r_addend = relocation + rel->r_addend; 1517 1.1 skrll 1518 1.1 skrll if (r_type == R_CRIS_32) 1519 1.1 skrll { 1520 1.1 skrll relocate = true; 1521 1.1 skrll outrel.r_info = ELF32_R_INFO (0, R_CRIS_RELATIVE); 1522 1.1 skrll } 1523 1.1 skrll else 1524 1.1 skrll { 1525 1.1 skrll long indx; 1526 1.1.1.9 christos 1527 1.1 skrll if (bfd_is_abs_section (sec)) 1528 1.1 skrll indx = 0; 1529 1.1 skrll else if (sec == NULL || sec->owner == NULL) 1530 1.1 skrll { 1531 1.1 skrll bfd_set_error (bfd_error_bad_value); 1532 1.1 skrll return false; 1533 1.1 skrll } 1534 1.1 skrll else 1535 1.1 skrll { 1536 1.1 skrll asection *osec; 1537 1.1 skrll 1538 1.1 skrll /* We are turning this relocation into one 1539 1.1 skrll against a section symbol. It would be 1540 1.1 skrll proper to subtract the symbol's value, 1541 1.1 skrll osec->vma, from the emitted reloc addend, 1542 1.1 skrll but ld.so expects buggy relocs. */ 1543 1.1 skrll osec = sec->output_section; 1544 1.1 skrll indx = elf_section_data (osec)->dynindx; 1545 1.1 skrll if (indx == 0) 1546 1.1 skrll { 1547 1.1 skrll osec = htab->root.text_index_section; 1548 1.1 skrll indx = elf_section_data (osec)->dynindx; 1549 1.1 skrll } 1550 1.1 skrll BFD_ASSERT (indx != 0); 1551 1.1 skrll } 1552 1.1 skrll 1553 1.1 skrll outrel.r_info = ELF32_R_INFO (indx, r_type); 1554 1.1 skrll } 1555 1.1 skrll } 1556 1.1.1.6 christos 1557 1.1.1.6 christos loc = sreloc->contents; 1558 1.1 skrll loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela); 1559 1.1 skrll bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc); 1560 1.1 skrll 1561 1.1 skrll /* This reloc will be computed at runtime, so there's no 1562 1.1 skrll need to do anything now, except for R_CRIS_32 relocations 1563 1.1.1.2 christos that have been turned into R_CRIS_RELATIVE. */ 1564 1.1.1.2 christos if (!relocate) 1565 1.1.1.2 christos continue; 1566 1.1.1.2 christos } 1567 1.1.1.2 christos 1568 1.1.1.2 christos break; 1569 1.1.1.2 christos 1570 1.1.1.2 christos case R_CRIS_16_DTPREL: 1571 1.1.1.2 christos case R_CRIS_32_DTPREL: 1572 1.1.1.2 christos /* This relocation must only be performed against local 1573 1.1.1.2 christos symbols, or to sections that are not loadable. It's also 1574 1.1.1.4 christos ok when we link a program and the symbol is defined in an 1575 1.1.1.2 christos ordinary (non-DSO) object (if it's undefined there, we've 1576 1.1.1.2 christos already seen an error). */ 1577 1.1.1.2 christos if (h != NULL 1578 1.1.1.6 christos && (input_section->flags & SEC_ALLOC) != 0 1579 1.1.1.2 christos && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT 1580 1.1.1.2 christos && (bfd_link_pic (info) 1581 1.1.1.6 christos || (!h->def_regular 1582 1.1.1.7 christos && h->root.type != bfd_link_hash_undefined))) 1583 1.1.1.2 christos { 1584 1.1.1.6 christos _bfd_error_handler 1585 1.1.1.7 christos ((h->root.type == bfd_link_hash_undefined) 1586 1.1.1.2 christos /* We shouldn't get here for GCC-emitted code. */ 1587 1.1.1.2 christos /* xgettext:c-format */ 1588 1.1.1.2 christos ? _("%pB, section %pA: relocation %s has an undefined" 1589 1.1.1.2 christos " reference to `%s', perhaps a declaration mixup?") 1590 1.1.1.2 christos /* xgettext:c-format */ 1591 1.1.1.2 christos : _("%pB, section %pA: relocation %s is" 1592 1.1.1.2 christos " not allowed for `%s', a global symbol with default" 1593 1.1.1.2 christos " visibility, perhaps a declaration mixup?"), 1594 1.1.1.9 christos input_bfd, 1595 1.1.1.2 christos input_section, 1596 1.1.1.2 christos cris_elf_howto_table[r_type].name, 1597 1.1.1.2 christos symname != NULL && symname[0] != '\0' 1598 1.1.1.2 christos ? symname : _("[whose name is lost]")); 1599 1.1.1.2 christos bfd_set_error (bfd_error_bad_value); 1600 1.1.1.2 christos return false; 1601 1.1.1.2 christos } 1602 1.1.1.2 christos 1603 1.1.1.2 christos BFD_ASSERT ((input_section->flags & SEC_ALLOC) == 0 1604 1.1.1.2 christos || htab->dtpmod_refcount != 0); 1605 1.1.1.2 christos 1606 1.1.1.2 christos /* Fill in a R_CRIS_DTPMOD reloc at offset 3 if we haven't 1607 1.1.1.2 christos already done so. Note that we do this in .got.plt, not 1608 1.1.1.6 christos in .got, as .got.plt contains the first part, still the 1609 1.1.1.2 christos reloc is against .got, because the linker script directs 1610 1.1.1.2 christos (is required to direct) them both into .got. */ 1611 1.1.1.4 christos if (htab->dtpmod_refcount > 0 1612 1.1.1.2 christos && (input_section->flags & SEC_ALLOC) != 0) 1613 1.1.1.2 christos { 1614 1.1.1.2 christos asection *sgotplt = htab->root.sgotplt; 1615 1.1.1.2 christos BFD_ASSERT (sgotplt != NULL); 1616 1.1.1.6 christos 1617 1.1.1.2 christos if (bfd_link_pic (info)) 1618 1.1.1.2 christos { 1619 1.1.1.2 christos Elf_Internal_Rela outrel; 1620 1.1.1.2 christos bfd_byte *loc; 1621 1.1.1.2 christos 1622 1.1.1.2 christos srelgot = htab->root.srelgot; 1623 1.1.1.2 christos BFD_ASSERT (srelgot != NULL); 1624 1.1.1.2 christos loc = srelgot->contents; 1625 1.1.1.2 christos loc += srelgot->reloc_count++ * sizeof (Elf32_External_Rela); 1626 1.1.1.2 christos 1627 1.1.1.2 christos bfd_put_32 (output_bfd, (bfd_vma) 0, sgotplt->contents + 12); 1628 1.1.1.2 christos bfd_put_32 (output_bfd, (bfd_vma) 0, sgotplt->contents + 16); 1629 1.1.1.2 christos outrel.r_offset = (sgotplt->output_section->vma 1630 1.1.1.2 christos + sgotplt->output_offset 1631 1.1.1.2 christos + 12); 1632 1.1.1.2 christos outrel.r_info = ELF32_R_INFO (0, R_CRIS_DTPMOD); 1633 1.1.1.2 christos outrel.r_addend = 0; 1634 1.1.1.2 christos bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc); 1635 1.1.1.2 christos } 1636 1.1.1.2 christos else 1637 1.1.1.2 christos { 1638 1.1.1.2 christos /* For an executable, the GOT entry contents is known. */ 1639 1.1.1.2 christos bfd_put_32 (output_bfd, (bfd_vma) 1, sgotplt->contents + 12); 1640 1.1.1.2 christos bfd_put_32 (output_bfd, (bfd_vma) 0, sgotplt->contents + 16); 1641 1.1.1.2 christos } 1642 1.1.1.2 christos 1643 1.1.1.2 christos /* Reverse the sign to mark that we've emitted the 1644 1.1.1.2 christos required GOT entry. */ 1645 1.1.1.2 christos htab->dtpmod_refcount = - htab->dtpmod_refcount; 1646 1.1.1.2 christos } 1647 1.1.1.2 christos 1648 1.1.1.2 christos /* The relocation is the offset from the start of the module 1649 1.1.1.4 christos TLS block to the (local) symbol. */ 1650 1.1.1.2 christos relocation -= elf_hash_table (info)->tls_sec == NULL 1651 1.1.1.2 christos ? 0 : elf_hash_table (info)->tls_sec->vma; 1652 1.1.1.2 christos break; 1653 1.1.1.2 christos 1654 1.1.1.2 christos case R_CRIS_32_GD: 1655 1.1.1.9 christos if (bfd_link_pic (info)) 1656 1.1.1.2 christos { 1657 1.1.1.2 christos bfd_set_error (bfd_error_invalid_operation); 1658 1.1.1.2 christos 1659 1.1.1.2 christos /* We've already informed in cris_elf_check_relocs that 1660 1.1.1.2 christos this is an error. */ 1661 1.1.1.2 christos return false; 1662 1.1.1.2 christos } 1663 1.1.1.2 christos /* Fall through. */ 1664 1.1.1.2 christos 1665 1.1.1.2 christos case R_CRIS_16_GOT_GD: 1666 1.1.1.2 christos case R_CRIS_32_GOT_GD: 1667 1.1.1.6 christos if (rel->r_addend != 0) 1668 1.1.1.6 christos { 1669 1.1.1.7 christos /* We can't do anything for a relocation which is against a 1670 1.1.1.7 christos symbol *plus offset*. The GOT holds relocations for 1671 1.1.1.2 christos symbols. Make this an error; the compiler isn't allowed 1672 1.1.1.2 christos to pass us these kinds of things. */ 1673 1.1.1.2 christos _bfd_error_handler 1674 1.1.1.7 christos /* xgettext:c-format */ 1675 1.1.1.2 christos (_("%pB, section %pA: relocation %s with non-zero addend" 1676 1.1.1.2 christos " %" PRId64 " against symbol `%s'"), 1677 1.1.1.2 christos input_bfd, 1678 1.1.1.9 christos input_section, 1679 1.1.1.2 christos cris_elf_howto_table[r_type].name, 1680 1.1.1.2 christos (int64_t) rel->r_addend, 1681 1.1.1.4 christos symname[0] != '\0' ? symname : _("[whose name is lost]")); 1682 1.1.1.2 christos 1683 1.1.1.2 christos bfd_set_error (bfd_error_bad_value); 1684 1.1.1.2 christos return false; 1685 1.1.1.2 christos } 1686 1.1.1.2 christos 1687 1.1.1.2 christos if (!bfd_link_pic (info) 1688 1.1.1.2 christos && (h == NULL || h->def_regular || ELF_COMMON_DEF_P (h))) 1689 1.1.1.2 christos { 1690 1.1.1.2 christos /* Known contents of the GOT. */ 1691 1.1.1.2 christos bfd_vma off; 1692 1.1.1.2 christos 1693 1.1.1.2 christos /* The symbol is defined in the program, so just write 1694 1.1.1.2 christos (1, known_tpoffset) into the GOT. */ 1695 1.1.1.2 christos relocation -= elf_hash_table (info)->tls_sec->vma; 1696 1.1.1.2 christos 1697 1.1.1.2 christos if (h != NULL) 1698 1.1.1.2 christos { 1699 1.1.1.2 christos off = elf_cris_hash_entry (h)->tprel_refcount > 0 1700 1.1.1.2 christos ? h->got.offset + 4 : h->got.offset; 1701 1.1.1.2 christos } 1702 1.1.1.2 christos else 1703 1.1.1.2 christos { 1704 1.1.1.2 christos off = local_got_offsets[r_symndx]; 1705 1.1.1.2 christos if (local_got_offsets[LGOT_TPREL_NDX (r_symndx)]) 1706 1.1.1.2 christos off += 4; 1707 1.1.1.2 christos } 1708 1.1.1.2 christos 1709 1.1.1.2 christos /* We use bit 1 of the offset as a flag for GOT entry with 1710 1.1.1.2 christos the R_CRIS_DTP reloc, setting it when we've emitted the 1711 1.1.1.2 christos GOT entry and reloc. Bit 0 is used for R_CRIS_32_TPREL 1712 1.1.1.2 christos relocs. */ 1713 1.1.1.2 christos if ((off & 2) == 0) 1714 1.1.1.2 christos { 1715 1.1.1.2 christos off &= ~3; 1716 1.1.1.2 christos 1717 1.1.1.2 christos if (h != NULL) 1718 1.1.1.2 christos h->got.offset |= 2; 1719 1.1.1.2 christos else 1720 1.1.1.2 christos local_got_offsets[r_symndx] |= 2; 1721 1.1.1.2 christos 1722 1.1.1.2 christos bfd_put_32 (output_bfd, 1, sgot->contents + off); 1723 1.1.1.2 christos bfd_put_32 (output_bfd, relocation, sgot->contents + off + 4); 1724 1.1.1.2 christos } 1725 1.1.1.2 christos else 1726 1.1.1.2 christos off &= ~3; 1727 1.1.1.2 christos 1728 1.1.1.2 christos relocation = sgot->output_offset + off 1729 1.1.1.2 christos + (r_type == R_CRIS_32_GD ? sgot->output_section->vma : 0); 1730 1.1.1.2 christos } 1731 1.1.1.2 christos else 1732 1.1.1.2 christos { 1733 1.1.1.2 christos /* Not all parts of the GOT entry are known; emit a real 1734 1.1.1.2 christos relocation. */ 1735 1.1.1.2 christos bfd_vma off; 1736 1.1.1.2 christos 1737 1.1.1.2 christos if (h != NULL) 1738 1.1.1.2 christos off = elf_cris_hash_entry (h)->tprel_refcount > 0 1739 1.1.1.2 christos ? h->got.offset + 4 : h->got.offset; 1740 1.1.1.2 christos else 1741 1.1.1.2 christos { 1742 1.1.1.2 christos off = local_got_offsets[r_symndx]; 1743 1.1.1.2 christos if (local_got_offsets[LGOT_TPREL_NDX (r_symndx)]) 1744 1.1.1.2 christos off += 4; 1745 1.1.1.2 christos } 1746 1.1.1.2 christos 1747 1.1.1.2 christos /* See above re bit 1 and bit 0 usage. */ 1748 1.1.1.2 christos if ((off & 2) == 0) 1749 1.1.1.2 christos { 1750 1.1.1.2 christos Elf_Internal_Rela outrel; 1751 1.1.1.2 christos bfd_byte *loc; 1752 1.1.1.2 christos 1753 1.1.1.2 christos off &= ~3; 1754 1.1.1.2 christos 1755 1.1.1.2 christos if (h != NULL) 1756 1.1.1.2 christos h->got.offset |= 2; 1757 1.1.1.2 christos else 1758 1.1.1.2 christos local_got_offsets[r_symndx] |= 2; 1759 1.1.1.2 christos 1760 1.1.1.6 christos /* Clear the target contents of the GOT (just as a 1761 1.1.1.2 christos gesture; it's already cleared on allocation): this 1762 1.1.1.2 christos relocation is not like the other dynrelocs. */ 1763 1.1.1.2 christos bfd_put_32 (output_bfd, 0, sgot->contents + off); 1764 1.1.1.2 christos bfd_put_32 (output_bfd, 0, sgot->contents + off + 4); 1765 1.1.1.2 christos 1766 1.1.1.2 christos srelgot = htab->root.srelgot; 1767 1.1.1.2 christos BFD_ASSERT (srelgot != NULL); 1768 1.1.1.2 christos 1769 1.1.1.2 christos if (h != NULL && h->dynindx != -1) 1770 1.1.1.2 christos { 1771 1.1.1.2 christos outrel.r_info = ELF32_R_INFO (h->dynindx, R_CRIS_DTP); 1772 1.1.1.2 christos relocation = 0; 1773 1.1.1.2 christos } 1774 1.1.1.2 christos else 1775 1.1.1.2 christos { 1776 1.1.1.2 christos outrel.r_info = ELF32_R_INFO (0, R_CRIS_DTP); 1777 1.1.1.2 christos 1778 1.1.1.2 christos /* NULL if we had an error. */ 1779 1.1.1.2 christos relocation -= elf_hash_table (info)->tls_sec == NULL 1780 1.1.1.2 christos ? 0 : elf_hash_table (info)->tls_sec->vma; 1781 1.1.1.2 christos } 1782 1.1.1.2 christos 1783 1.1.1.2 christos outrel.r_offset = (sgot->output_section->vma 1784 1.1.1.2 christos + sgot->output_offset 1785 1.1.1.2 christos + off); 1786 1.1.1.2 christos outrel.r_addend = relocation; 1787 1.1.1.2 christos loc = srelgot->contents; 1788 1.1.1.2 christos loc += srelgot->reloc_count++ * sizeof (Elf32_External_Rela); 1789 1.1.1.2 christos 1790 1.1.1.2 christos /* NULL if we had an error. */ 1791 1.1.1.2 christos if (srelgot->contents != NULL) 1792 1.1.1.2 christos bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc); 1793 1.1.1.2 christos } 1794 1.1.1.2 christos else 1795 1.1.1.2 christos off &= ~3; 1796 1.1.1.2 christos 1797 1.1.1.2 christos relocation = sgot->output_offset + off 1798 1.1.1.2 christos + (r_type == R_CRIS_32_GD ? sgot->output_section->vma : 0); 1799 1.1.1.2 christos } 1800 1.1.1.2 christos 1801 1.1.1.4 christos /* The GOT-relative offset to the GOT entry is the 1802 1.1.1.2 christos relocation, or for R_CRIS_32_GD, the actual address of 1803 1.1.1.2 christos the GOT entry. */ 1804 1.1.1.2 christos break; 1805 1.1.1.2 christos 1806 1.1.1.2 christos case R_CRIS_32_IE: 1807 1.1.1.9 christos if (bfd_link_pic (info)) 1808 1.1.1.2 christos { 1809 1.1.1.2 christos bfd_set_error (bfd_error_invalid_operation); 1810 1.1.1.2 christos 1811 1.1.1.2 christos /* We've already informed in cris_elf_check_relocs that 1812 1.1.1.2 christos this is an error. */ 1813 1.1.1.2 christos return false; 1814 1.1.1.2 christos } 1815 1.1.1.2 christos /* Fall through. */ 1816 1.1.1.2 christos 1817 1.1.1.2 christos case R_CRIS_32_GOT_TPREL: 1818 1.1.1.2 christos case R_CRIS_16_GOT_TPREL: 1819 1.1.1.2 christos if (rel->r_addend != 0) 1820 1.1.1.6 christos { 1821 1.1.1.6 christos /* We can't do anything for a relocation which is 1822 1.1.1.7 christos against a symbol *plus offset*. GOT holds 1823 1.1.1.7 christos relocations for symbols. Make this an error; the 1824 1.1.1.2 christos compiler isn't allowed to pass us these kinds of 1825 1.1.1.2 christos things. */ 1826 1.1.1.2 christos _bfd_error_handler 1827 1.1.1.7 christos /* xgettext:c-format */ 1828 1.1.1.2 christos (_("%pB, section %pA: relocation %s with non-zero addend" 1829 1.1.1.2 christos " %" PRId64 " against symbol `%s'"), 1830 1.1.1.9 christos input_bfd, 1831 1.1.1.2 christos input_section, 1832 1.1.1.2 christos cris_elf_howto_table[r_type].name, 1833 1.1.1.4 christos (int64_t) rel->r_addend, 1834 1.1.1.3 christos symname[0] != '\0' ? symname : _("[whose name is lost]")); 1835 1.1.1.2 christos bfd_set_error (bfd_error_bad_value); 1836 1.1.1.2 christos return false; 1837 1.1.1.2 christos } 1838 1.1.1.2 christos 1839 1.1.1.2 christos if (!bfd_link_pic (info) 1840 1.1.1.2 christos && (h == NULL || h->def_regular || ELF_COMMON_DEF_P (h))) 1841 1.1.1.2 christos { 1842 1.1.1.2 christos /* Known contents of the GOT. */ 1843 1.1.1.2 christos bfd_vma off; 1844 1.1.1.2 christos 1845 1.1.1.2 christos /* The symbol is defined in the program, so just write 1846 1.1.1.2 christos the -prog_tls_size+known_tpoffset into the GOT. */ 1847 1.1.1.2 christos relocation -= elf_hash_table (info)->tls_sec->vma; 1848 1.1.1.2 christos relocation -= elf_hash_table (info)->tls_size; 1849 1.1.1.2 christos 1850 1.1.1.2 christos if (h != NULL) 1851 1.1.1.2 christos off = h->got.offset; 1852 1.1.1.2 christos else 1853 1.1.1.2 christos off = local_got_offsets[r_symndx]; 1854 1.1.1.2 christos 1855 1.1.1.2 christos /* Bit 0 is used to mark whether we've emitted the required 1856 1.1.1.2 christos entry (and if needed R_CRIS_32_TPREL reloc). Bit 1 1857 1.1.1.2 christos is used similarly for R_CRIS_DTP, see above. */ 1858 1.1.1.2 christos if ((off & 1) == 0) 1859 1.1.1.2 christos { 1860 1.1.1.2 christos off &= ~3; 1861 1.1.1.2 christos 1862 1.1.1.2 christos if (h != NULL) 1863 1.1.1.2 christos h->got.offset |= 1; 1864 1.1.1.2 christos else 1865 1.1.1.2 christos local_got_offsets[r_symndx] |= 1; 1866 1.1.1.2 christos 1867 1.1.1.2 christos bfd_put_32 (output_bfd, relocation, sgot->contents + off); 1868 1.1.1.2 christos } 1869 1.1.1.2 christos else 1870 1.1.1.2 christos off &= ~3; 1871 1.1.1.2 christos 1872 1.1.1.2 christos relocation = sgot->output_offset + off 1873 1.1.1.2 christos + (r_type == R_CRIS_32_IE ? sgot->output_section->vma : 0); 1874 1.1.1.2 christos } 1875 1.1.1.2 christos else 1876 1.1.1.2 christos { 1877 1.1.1.2 christos /* Emit a real relocation. */ 1878 1.1.1.2 christos bfd_vma off; 1879 1.1.1.2 christos 1880 1.1.1.2 christos if (h != NULL) 1881 1.1.1.2 christos off = h->got.offset; 1882 1.1.1.2 christos else 1883 1.1.1.2 christos off = local_got_offsets[r_symndx]; 1884 1.1.1.2 christos 1885 1.1.1.2 christos /* See above re usage of bit 0 and 1. */ 1886 1.1.1.2 christos if ((off & 1) == 0) 1887 1.1.1.2 christos { 1888 1.1.1.2 christos Elf_Internal_Rela outrel; 1889 1.1.1.2 christos bfd_byte *loc; 1890 1.1.1.2 christos 1891 1.1.1.2 christos off &= ~3; 1892 1.1.1.6 christos 1893 1.1.1.2 christos if (h != NULL) 1894 1.1.1.2 christos h->got.offset |= 1; 1895 1.1.1.2 christos else 1896 1.1.1.2 christos local_got_offsets[r_symndx] |= 1; 1897 1.1.1.2 christos 1898 1.1.1.2 christos srelgot = htab->root.srelgot; 1899 1.1.1.2 christos BFD_ASSERT (srelgot != NULL); 1900 1.1.1.2 christos 1901 1.1.1.2 christos if (h != NULL && h->dynindx != -1) 1902 1.1.1.2 christos { 1903 1.1.1.2 christos outrel.r_info = ELF32_R_INFO (h->dynindx, R_CRIS_32_TPREL); 1904 1.1.1.2 christos relocation = 0; 1905 1.1.1.2 christos } 1906 1.1.1.2 christos else 1907 1.1.1.2 christos { 1908 1.1.1.2 christos outrel.r_info = ELF32_R_INFO (0, R_CRIS_32_TPREL); 1909 1.1.1.2 christos 1910 1.1.1.2 christos /* NULL if we had an error. */ 1911 1.1.1.2 christos relocation -= elf_hash_table (info)->tls_sec == NULL 1912 1.1.1.2 christos ? 0 : elf_hash_table (info)->tls_sec->vma; 1913 1.1.1.2 christos } 1914 1.1.1.2 christos 1915 1.1.1.2 christos /* Just "define" the initial contents in some 1916 1.1.1.2 christos semi-logical way. */ 1917 1.1.1.2 christos bfd_put_32 (output_bfd, relocation, sgot->contents + off); 1918 1.1.1.2 christos 1919 1.1.1.2 christos outrel.r_offset = (sgot->output_section->vma 1920 1.1.1.2 christos + sgot->output_offset 1921 1.1.1.2 christos + off); 1922 1.1.1.2 christos outrel.r_addend = relocation; 1923 1.1.1.2 christos loc = srelgot->contents; 1924 1.1.1.2 christos loc += srelgot->reloc_count++ * sizeof (Elf32_External_Rela); 1925 1.1.1.2 christos /* NULL if we had an error. */ 1926 1.1.1.2 christos if (srelgot->contents != NULL) 1927 1.1.1.2 christos bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc); 1928 1.1.1.2 christos } 1929 1.1.1.2 christos else 1930 1.1.1.2 christos off &= ~3; 1931 1.1.1.2 christos 1932 1.1.1.2 christos relocation = sgot->output_offset + off 1933 1.1.1.2 christos + (r_type == R_CRIS_32_IE ? sgot->output_section->vma : 0); 1934 1.1.1.2 christos } 1935 1.1.1.2 christos 1936 1.1.1.2 christos /* The GOT-relative offset to the GOT entry is the relocation, 1937 1.1.1.2 christos or for R_CRIS_32_GD, the actual address of the GOT entry. */ 1938 1.1.1.4 christos break; 1939 1.1.1.2 christos 1940 1.1.1.2 christos case R_CRIS_16_TPREL: 1941 1.1.1.2 christos case R_CRIS_32_TPREL: 1942 1.1.1.2 christos /* This relocation must only be performed against symbols 1943 1.1.1.2 christos defined in an ordinary (non-DSO) object. */ 1944 1.1.1.9 christos if (bfd_link_pic (info)) 1945 1.1.1.2 christos { 1946 1.1.1.2 christos bfd_set_error (bfd_error_invalid_operation); 1947 1.1.1.2 christos 1948 1.1.1.2 christos /* We've already informed in cris_elf_check_relocs that 1949 1.1.1.2 christos this is an error. */ 1950 1.1.1.2 christos return false; 1951 1.1.1.2 christos } 1952 1.1.1.2 christos 1953 1.1.1.2 christos if (h != NULL 1954 1.1.1.6 christos && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT 1955 1.1.1.6 christos && !(h->def_regular || ELF_COMMON_DEF_P (h)) 1956 1.1.1.7 christos /* If it's undefined, then an error message has already 1957 1.1.1.2 christos been emitted. */ 1958 1.1.1.2 christos && h->root.type != bfd_link_hash_undefined) 1959 1.1.1.2 christos { 1960 1.1.1.2 christos _bfd_error_handler 1961 1.1.1.2 christos /* xgettext:c-format */ 1962 1.1.1.2 christos (_("%pB, section %pA: relocation %s is" 1963 1.1.1.2 christos " not allowed for symbol: `%s'" 1964 1.1.1.2 christos " which is defined outside the program," 1965 1.1.1.9 christos " perhaps a declaration mixup?"), 1966 1.1.1.2 christos input_bfd, 1967 1.1.1.2 christos input_section, 1968 1.1.1.2 christos cris_elf_howto_table[r_type].name, 1969 1.1.1.2 christos symname); 1970 1.1.1.2 christos bfd_set_error (bfd_error_bad_value); 1971 1.1.1.2 christos return false; 1972 1.1.1.2 christos } 1973 1.1.1.2 christos 1974 1.1.1.2 christos /* NULL if we had an error. */ 1975 1.1.1.2 christos relocation -= elf_hash_table (info)->tls_sec == NULL 1976 1.1.1.2 christos ? 0 1977 1.1.1.2 christos : (elf_hash_table (info)->tls_sec->vma 1978 1.1.1.2 christos + elf_hash_table (info)->tls_size); 1979 1.1.1.9 christos 1980 1.1 skrll /* The TLS-relative offset is the relocation. */ 1981 1.1 skrll break; 1982 1.1 skrll 1983 1.1 skrll default: 1984 1.1 skrll BFD_FAIL (); 1985 1.1 skrll return false; 1986 1.1 skrll } 1987 1.1 skrll 1988 1.1 skrll r = cris_final_link_relocate (howto, input_bfd, input_section, 1989 1.1 skrll contents, rel, relocation); 1990 1.1 skrll 1991 1.1 skrll if (r != bfd_reloc_ok) 1992 1.1.1.5 christos { 1993 1.1 skrll const char * msg = (const char *) NULL; 1994 1.1 skrll 1995 1.1.1.2 christos switch (r) 1996 1.1.1.2 christos { 1997 1.1.1.2 christos case bfd_reloc_overflow: 1998 1.1.1.2 christos (*info->callbacks->reloc_overflow) 1999 1.1.1.2 christos (info, (h ? &h->root : NULL), symname, howto->name, 2000 1.1.1.2 christos (bfd_vma) 0, input_bfd, input_section, rel->r_offset); 2001 1.1.1.2 christos if (additional_relocation_error_msg_count > 0) 2002 1.1.1.2 christos { 2003 1.1.1.2 christos additional_relocation_error_msg_count--; 2004 1.1.1.2 christos switch (r_type) 2005 1.1.1.2 christos { 2006 1.1.1.2 christos case R_CRIS_16_GOTPLT: 2007 1.1.1.2 christos case R_CRIS_16_GOT: 2008 1.1.1.6 christos 2009 1.1.1.2 christos /* Not just TLS is involved here, so we make 2010 1.1.1.2 christos generation and message depend on -fPIC/-fpic 2011 1.1.1.2 christos only. */ 2012 1.1.1.2 christos case R_CRIS_16_GOT_TPREL: 2013 1.1.1.2 christos case R_CRIS_16_GOT_GD: 2014 1.1.1.2 christos _bfd_error_handler 2015 1.1.1.6 christos (_("(too many global variables for -fpic:" 2016 1.1.1.2 christos " recompile with -fPIC)")); 2017 1.1.1.2 christos break; 2018 1.1.1.2 christos 2019 1.1.1.2 christos case R_CRIS_16_TPREL: 2020 1.1.1.2 christos case R_CRIS_16_DTPREL: 2021 1.1.1.2 christos _bfd_error_handler 2022 1.1.1.2 christos (_("(thread-local data too big for -fpic or" 2023 1.1.1.2 christos " -msmall-tls: recompile with -fPIC or" 2024 1.1.1.2 christos " -mno-small-tls)")); 2025 1.1.1.2 christos break; 2026 1.1 skrll 2027 1.1 skrll /* No known cause for overflow for other relocs. */ 2028 1.1 skrll default: 2029 1.1.1.5 christos break; 2030 1.1.1.9 christos } 2031 1.1 skrll } 2032 1.1 skrll break; 2033 1.1 skrll 2034 1.1 skrll case bfd_reloc_undefined: 2035 1.1 skrll (*info->callbacks->undefined_symbol) 2036 1.1 skrll (info, symname, input_bfd, input_section, rel->r_offset, true); 2037 1.1 skrll break; 2038 1.1 skrll 2039 1.1 skrll case bfd_reloc_outofrange: 2040 1.1 skrll msg = _("internal error: out of range error"); 2041 1.1 skrll break; 2042 1.1 skrll 2043 1.1 skrll case bfd_reloc_notsupported: 2044 1.1 skrll msg = _("internal error: unsupported relocation error"); 2045 1.1 skrll break; 2046 1.1 skrll 2047 1.1 skrll case bfd_reloc_dangerous: 2048 1.1 skrll msg = _("internal error: dangerous relocation"); 2049 1.1 skrll break; 2050 1.1 skrll 2051 1.1.1.5 christos default: 2052 1.1.1.5 christos msg = _("internal error: unknown error"); 2053 1.1 skrll break; 2054 1.1 skrll } 2055 1.1 skrll 2056 1.1.1.9 christos if (msg) 2057 1.1 skrll (*info->callbacks->warning) (info, msg, symname, input_bfd, 2058 1.1 skrll input_section, rel->r_offset); 2059 1.1 skrll } 2060 1.1 skrll } 2061 1.1 skrll 2062 1.1.1.9 christos return true; 2063 1.1.1.2 christos } 2064 1.1.1.2 christos 2065 1.1.1.2 christos /* Finish up dynamic symbol handling. We set the contents of various 2067 1.1 skrll dynamic sections here. */ 2068 1.1.1.2 christos 2069 1.1 skrll static bool 2070 1.1 skrll elf_cris_finish_dynamic_symbol (bfd *output_bfd, 2071 1.1 skrll struct bfd_link_info *info, 2072 1.1 skrll struct elf_link_hash_entry *h, 2073 1.1 skrll Elf_Internal_Sym *sym) 2074 1.1 skrll { 2075 1.1 skrll struct elf_cris_link_hash_table * htab; 2076 1.1 skrll 2077 1.1 skrll /* Where in the plt entry to put values. */ 2078 1.1 skrll int plt_off1 = 2, plt_off2 = 10, plt_off3 = 16; 2079 1.1 skrll 2080 1.1 skrll /* What offset to add to the distance to the first PLT entry for the 2081 1.1 skrll value at plt_off3. */ 2082 1.1 skrll int plt_off3_value_bias = 4; 2083 1.1 skrll 2084 1.1.1.2 christos /* Where in the PLT entry the call-dynlink-stub is (happens to be same 2085 1.1.1.2 christos for PIC and non-PIC for v32 and pre-v32). */ 2086 1.1 skrll int plt_stub_offset = 8; 2087 1.1 skrll int plt_entry_size = PLT_ENTRY_SIZE; 2088 1.1 skrll const bfd_byte *plt_entry = elf_cris_plt_entry; 2089 1.1 skrll const bfd_byte *plt_pic_entry = elf_cris_pic_plt_entry; 2090 1.1 skrll 2091 1.1 skrll htab = elf_cris_hash_table (info); 2092 1.1 skrll 2093 1.1 skrll /* Adjust the various PLT entry offsets. */ 2094 1.1 skrll if (bfd_get_mach (output_bfd) == bfd_mach_cris_v32) 2095 1.1 skrll { 2096 1.1 skrll plt_off2 = 14; 2097 1.1 skrll plt_off3 = 20; 2098 1.1 skrll plt_off3_value_bias = -2; 2099 1.1 skrll plt_stub_offset = 12; 2100 1.1 skrll plt_entry_size = PLT_ENTRY_SIZE_V32; 2101 1.1 skrll plt_entry = elf_cris_plt_entry_v32; 2102 1.1 skrll plt_pic_entry = elf_cris_pic_plt_entry_v32; 2103 1.1 skrll } 2104 1.1 skrll 2105 1.1 skrll if (h->plt.offset != (bfd_vma) -1) 2106 1.1.1.2 christos { 2107 1.1 skrll asection *splt; 2108 1.1 skrll asection *sgotplt; 2109 1.1.1.9 christos asection *srela; 2110 1.1 skrll bfd_vma got_base; 2111 1.1.1.2 christos 2112 1.1.1.2 christos bfd_vma gotplt_offset 2113 1.1.1.2 christos = elf_cris_hash_entry (h)->gotplt_offset; 2114 1.1.1.2 christos Elf_Internal_Rela rela; 2115 1.1.1.2 christos bfd_byte *loc; 2116 1.1.1.2 christos bool has_gotplt = gotplt_offset != 0; 2117 1.1.1.2 christos 2118 1.1.1.2 christos /* Get the index in the .rela.plt relocations for the .got.plt 2119 1.1.1.2 christos entry that corresponds to this symbol. 2120 1.1.1.2 christos We have to count backwards here, and the result is only valid 2121 1.1.1.2 christos as an index into .rela.plt. We also have to undo the effect 2122 1.1.1.2 christos of the R_CRIS_DTPMOD entry at .got index 3 (offset 12 into 2123 1.1.1.2 christos .got.plt) for which gotplt_offset is adjusted, because while 2124 1.1 skrll that entry goes into .got.plt, its relocation goes into 2125 1.1 skrll .rela.got, not .rela.plt. (It's not PLT-specific; not to be 2126 1.1 skrll processed as part of the runtime lazy .rela.plt relocation). 2127 1.1 skrll FIXME: There be literal constants here... */ 2128 1.1 skrll bfd_vma rela_plt_index 2129 1.1 skrll = (htab->dtpmod_refcount != 0 2130 1.1 skrll ? gotplt_offset/4 - 2 - 3 : gotplt_offset/4 - 3); 2131 1.1 skrll 2132 1.1 skrll /* Get the offset into the .got table of the entry that corresponds 2133 1.1.1.2 christos to this function. Note that we embed knowledge that "incoming" 2134 1.1 skrll .got goes after .got.plt in the output without padding (pointer 2135 1.1 skrll aligned). However, that knowledge is present in several other 2136 1.1 skrll places too. */ 2137 1.1 skrll bfd_vma got_offset 2138 1.1 skrll = (has_gotplt 2139 1.1 skrll ? gotplt_offset 2140 1.1.1.6 christos : h->got.offset + htab->next_gotplt_entry); 2141 1.1.1.6 christos 2142 1.1.1.6 christos /* This symbol has an entry in the procedure linkage table. Set it 2143 1.1 skrll up. */ 2144 1.1 skrll 2145 1.1 skrll BFD_ASSERT (h->dynindx != -1); 2146 1.1 skrll 2147 1.1 skrll splt = htab->root.splt; 2148 1.1 skrll sgotplt = htab->root.sgotplt; 2149 1.1.1.4 christos srela = htab->root.srelplt; 2150 1.1 skrll BFD_ASSERT (splt != NULL && sgotplt != NULL 2151 1.1 skrll && (! has_gotplt || srela != NULL)); 2152 1.1 skrll 2153 1.1 skrll got_base = sgotplt->output_section->vma + sgotplt->output_offset; 2154 1.1 skrll 2155 1.1 skrll /* Fill in the entry in the procedure linkage table. */ 2156 1.1 skrll if (! bfd_link_pic (info)) 2157 1.1 skrll { 2158 1.1 skrll memcpy (splt->contents + h->plt.offset, plt_entry, 2159 1.1 skrll plt_entry_size); 2160 1.1 skrll 2161 1.1 skrll /* We need to enter the absolute address of the GOT entry here. */ 2162 1.1 skrll bfd_put_32 (output_bfd, got_base + got_offset, 2163 1.1 skrll splt->contents + h->plt.offset + plt_off1); 2164 1.1 skrll } 2165 1.1 skrll else 2166 1.1 skrll { 2167 1.1 skrll memcpy (splt->contents + h->plt.offset, plt_pic_entry, 2168 1.1 skrll plt_entry_size); 2169 1.1 skrll bfd_put_32 (output_bfd, got_offset, 2170 1.1 skrll splt->contents + h->plt.offset + plt_off1); 2171 1.1 skrll } 2172 1.1.1.2 christos 2173 1.1 skrll /* Fill in the plt entry and make a relocation, if this is a "real" 2174 1.1 skrll PLT entry. */ 2175 1.1 skrll if (has_gotplt) 2176 1.1 skrll { 2177 1.1 skrll /* Fill in the offset to the reloc table. */ 2178 1.1 skrll bfd_put_32 (output_bfd, 2179 1.1 skrll rela_plt_index * sizeof (Elf32_External_Rela), 2180 1.1 skrll splt->contents + h->plt.offset + plt_off2); 2181 1.1 skrll 2182 1.1 skrll /* Fill in the offset to the first PLT entry, where to "jump". */ 2183 1.1 skrll bfd_put_32 (output_bfd, 2184 1.1 skrll - (h->plt.offset + plt_off3 + plt_off3_value_bias), 2185 1.1 skrll splt->contents + h->plt.offset + plt_off3); 2186 1.1 skrll 2187 1.1 skrll /* Fill in the entry in the global offset table with the address of 2188 1.1 skrll the relocating stub. */ 2189 1.1 skrll bfd_put_32 (output_bfd, 2190 1.1 skrll (splt->output_section->vma 2191 1.1 skrll + splt->output_offset 2192 1.1 skrll + h->plt.offset 2193 1.1 skrll + plt_stub_offset), 2194 1.1 skrll sgotplt->contents + got_offset); 2195 1.1.1.2 christos 2196 1.1 skrll /* Fill in the entry in the .rela.plt section. */ 2197 1.1 skrll rela.r_offset = (sgotplt->output_section->vma 2198 1.1 skrll + sgotplt->output_offset 2199 1.1 skrll + got_offset); 2200 1.1 skrll rela.r_info = ELF32_R_INFO (h->dynindx, R_CRIS_JUMP_SLOT); 2201 1.1 skrll rela.r_addend = 0; 2202 1.1 skrll loc = srela->contents + rela_plt_index * sizeof (Elf32_External_Rela); 2203 1.1 skrll bfd_elf32_swap_reloca_out (output_bfd, &rela, loc); 2204 1.1 skrll } 2205 1.1 skrll 2206 1.1 skrll if (!h->def_regular) 2207 1.1 skrll { 2208 1.1 skrll /* Mark the symbol as undefined, rather than as defined in 2209 1.1 skrll the .plt section. Leave the value alone. */ 2210 1.1 skrll sym->st_shndx = SHN_UNDEF; 2211 1.1 skrll 2212 1.1 skrll /* FIXME: From elf32-sparc.c 2001-02-19 (1.18). I still don't 2213 1.1 skrll know whether resetting the value is significant; if it really 2214 1.1 skrll is, rather than a quirk or bug in the sparc port, then I 2215 1.1 skrll believe we'd see this elsewhere. */ 2216 1.1 skrll /* If the symbol is weak, we do need to clear the value. 2217 1.1 skrll Otherwise, the PLT entry would provide a definition for 2218 1.1 skrll the symbol even if the symbol wasn't defined anywhere, 2219 1.1 skrll and so the symbol would never be NULL. */ 2220 1.1 skrll if (!h->ref_regular_nonweak) 2221 1.1 skrll sym->st_value = 0; 2222 1.1 skrll } 2223 1.1 skrll } 2224 1.1.1.2 christos 2225 1.1.1.4 christos /* For an ordinary program, we emit .got relocs only for symbols that 2226 1.1 skrll are in the dynamic-symbols table and are either defined by the 2227 1.1 skrll program or are undefined weak symbols, or are function symbols 2228 1.1 skrll where we do not output a PLT: the PLT reloc was output above and all 2229 1.1 skrll references to the function symbol are redirected to the PLT. */ 2230 1.1 skrll if (h->got.offset != (bfd_vma) -1 2231 1.1 skrll && (elf_cris_hash_entry (h)->reg_got_refcount > 0) 2232 1.1 skrll && (bfd_link_pic (info) 2233 1.1 skrll || (h->dynindx != -1 2234 1.1 skrll && h->plt.offset == (bfd_vma) -1 2235 1.1 skrll && !h->def_regular 2236 1.1 skrll && h->root.type != bfd_link_hash_undefweak))) 2237 1.1 skrll { 2238 1.1 skrll asection *sgot; 2239 1.1.1.6 christos asection *srela; 2240 1.1.1.6 christos Elf_Internal_Rela rela; 2241 1.1 skrll bfd_byte *loc; 2242 1.1 skrll bfd_byte *where; 2243 1.1 skrll 2244 1.1 skrll /* This symbol has an entry in the global offset table. Set it up. */ 2245 1.1 skrll 2246 1.1 skrll sgot = htab->root.sgot; 2247 1.1 skrll srela = htab->root.srelgot; 2248 1.1 skrll BFD_ASSERT (sgot != NULL && srela != NULL); 2249 1.1 skrll 2250 1.1 skrll rela.r_offset = (sgot->output_section->vma 2251 1.1 skrll + sgot->output_offset 2252 1.1 skrll + (h->got.offset &~ (bfd_vma) 1)); 2253 1.1 skrll 2254 1.1.1.4 christos /* If this is a static link, or it is a -Bsymbolic link and the 2255 1.1.1.4 christos symbol is defined locally or was forced to be local because 2256 1.1 skrll of a version file, we just want to emit a RELATIVE reloc. 2257 1.1 skrll The entry in the global offset table will already have been 2258 1.1 skrll initialized in the relocate_section function. */ 2259 1.1 skrll where = sgot->contents + (h->got.offset &~ (bfd_vma) 1); 2260 1.1 skrll if (! elf_hash_table (info)->dynamic_sections_created 2261 1.1 skrll || (bfd_link_pic (info) 2262 1.1 skrll && (SYMBOLIC_BIND (info, h) || h->dynindx == -1) 2263 1.1 skrll && h->def_regular)) 2264 1.1 skrll { 2265 1.1 skrll rela.r_info = ELF32_R_INFO (0, R_CRIS_RELATIVE); 2266 1.1 skrll rela.r_addend = bfd_get_signed_32 (output_bfd, where); 2267 1.1 skrll } 2268 1.1 skrll else 2269 1.1 skrll { 2270 1.1 skrll bfd_put_32 (output_bfd, (bfd_vma) 0, where); 2271 1.1 skrll rela.r_info = ELF32_R_INFO (h->dynindx, R_CRIS_GLOB_DAT); 2272 1.1 skrll rela.r_addend = 0; 2273 1.1 skrll } 2274 1.1 skrll 2275 1.1 skrll loc = srela->contents; 2276 1.1 skrll loc += srela->reloc_count++ * sizeof (Elf32_External_Rela); 2277 1.1 skrll bfd_elf32_swap_reloca_out (output_bfd, &rela, loc); 2278 1.1 skrll } 2279 1.1 skrll 2280 1.1 skrll if (h->needs_copy) 2281 1.1 skrll { 2282 1.1 skrll asection *s; 2283 1.1 skrll Elf_Internal_Rela rela; 2284 1.1 skrll bfd_byte *loc; 2285 1.1.1.6 christos 2286 1.1.1.6 christos /* This symbol needs a copy reloc. Set it up. */ 2287 1.1.1.6 christos 2288 1.1.1.6 christos BFD_ASSERT (h->dynindx != -1 2289 1.1 skrll && (h->root.type == bfd_link_hash_defined 2290 1.1 skrll || h->root.type == bfd_link_hash_defweak)); 2291 1.1 skrll 2292 1.1 skrll if (h->root.u.def.section == htab->root.sdynrelro) 2293 1.1 skrll s = htab->root.sreldynrelro; 2294 1.1 skrll else 2295 1.1 skrll s = htab->root.srelbss; 2296 1.1 skrll 2297 1.1 skrll rela.r_offset = (h->root.u.def.value 2298 1.1 skrll + h->root.u.def.section->output_section->vma 2299 1.1 skrll + h->root.u.def.section->output_offset); 2300 1.1.1.4 christos rela.r_info = ELF32_R_INFO (h->dynindx, R_CRIS_COPY); 2301 1.1 skrll rela.r_addend = 0; 2302 1.1 skrll loc = s->contents + s->reloc_count++ * sizeof (Elf32_External_Rela); 2303 1.1 skrll bfd_elf32_swap_reloca_out (output_bfd, &rela, loc); 2304 1.1.1.9 christos } 2305 1.1 skrll 2306 1.1 skrll /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute. */ 2307 1.1.1.2 christos if (h == elf_hash_table (info)->hdynamic 2308 1.1.1.2 christos || h == elf_hash_table (info)->hgot) 2309 1.1.1.2 christos sym->st_shndx = SHN_ABS; 2310 1.1 skrll 2311 1.1.1.9 christos return true; 2312 1.1.1.3 christos } 2313 1.1.1.12 christos 2314 1.1.1.12 christos /* Finish up the dynamic sections. Do *not* emit relocs here, as their 2316 1.1 skrll offsets were changed, as part of -z combreloc handling, from those we 2317 1.1 skrll computed. */ 2318 1.1 skrll 2319 1.1 skrll static bool 2320 1.1 skrll elf_cris_finish_dynamic_sections (bfd *output_bfd, 2321 1.1 skrll struct bfd_link_info *info, 2322 1.1.1.6 christos bfd_byte *buf ATTRIBUTE_UNUSED) 2323 1.1 skrll { 2324 1.1.1.3 christos bfd *dynobj; 2325 1.1 skrll asection *sgot; 2326 1.1 skrll asection *sdyn; 2327 1.1 skrll 2328 1.1 skrll dynobj = elf_hash_table (info)->dynobj; 2329 1.1 skrll 2330 1.1 skrll sgot = elf_hash_table (info)->sgotplt; 2331 1.1.1.6 christos BFD_ASSERT (sgot != NULL); 2332 1.1 skrll sdyn = bfd_get_linker_section (dynobj, ".dynamic"); 2333 1.1 skrll 2334 1.1 skrll if (elf_hash_table (info)->dynamic_sections_created) 2335 1.1 skrll { 2336 1.1 skrll asection *splt; 2337 1.1 skrll Elf32_External_Dyn *dyncon, *dynconend; 2338 1.1 skrll 2339 1.1 skrll splt = elf_hash_table (info)->splt; 2340 1.1 skrll BFD_ASSERT (splt != NULL && sdyn != NULL); 2341 1.1 skrll 2342 1.1 skrll dyncon = (Elf32_External_Dyn *) sdyn->contents; 2343 1.1 skrll dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size); 2344 1.1 skrll for (; dyncon < dynconend; dyncon++) 2345 1.1 skrll { 2346 1.1 skrll Elf_Internal_Dyn dyn; 2347 1.1 skrll asection *s; 2348 1.1 skrll 2349 1.1.1.5 christos bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn); 2350 1.1 skrll 2351 1.1 skrll switch (dyn.d_tag) 2352 1.1 skrll { 2353 1.1 skrll default: 2354 1.1 skrll break; 2355 1.1 skrll 2356 1.1.1.6 christos case DT_PLTGOT: 2357 1.1.1.5 christos dyn.d_un.d_ptr = sgot->output_section->vma + sgot->output_offset; 2358 1.1.1.5 christos bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); 2359 1.1 skrll break; 2360 1.1 skrll 2361 1.1 skrll case DT_JMPREL: 2362 1.1 skrll /* Yes, we *can* have a .plt and no .plt.rela, for instance 2363 1.1.1.6 christos if all symbols are found in the .got (not .got.plt). */ 2364 1.1 skrll s = elf_hash_table (info)->srelplt; 2365 1.1 skrll dyn.d_un.d_ptr = s != NULL ? (s->output_section->vma 2366 1.1 skrll + s->output_offset) : 0; 2367 1.1 skrll bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); 2368 1.1 skrll break; 2369 1.1 skrll 2370 1.1 skrll case DT_PLTRELSZ: 2371 1.1 skrll s = elf_hash_table (info)->srelplt; 2372 1.1 skrll if (s == NULL) 2373 1.1 skrll dyn.d_un.d_val = 0; 2374 1.1 skrll else 2375 1.1 skrll dyn.d_un.d_val = s->size; 2376 1.1 skrll bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); 2377 1.1 skrll break; 2378 1.1.1.4 christos } 2379 1.1 skrll } 2380 1.1 skrll 2381 1.1 skrll /* Fill in the first entry in the procedure linkage table. */ 2382 1.1 skrll if (splt->size > 0) 2383 1.1 skrll { 2384 1.1 skrll if (bfd_get_mach (output_bfd) == bfd_mach_cris_v32) 2385 1.1 skrll { 2386 1.1 skrll if (bfd_link_pic (info)) 2387 1.1 skrll memcpy (splt->contents, elf_cris_pic_plt0_entry_v32, 2388 1.1 skrll PLT_ENTRY_SIZE_V32); 2389 1.1 skrll else 2390 1.1 skrll { 2391 1.1 skrll memcpy (splt->contents, elf_cris_plt0_entry_v32, 2392 1.1 skrll PLT_ENTRY_SIZE_V32); 2393 1.1 skrll bfd_put_32 (output_bfd, 2394 1.1 skrll sgot->output_section->vma 2395 1.1 skrll + sgot->output_offset + 4, 2396 1.1.1.4 christos splt->contents + 4); 2397 1.1 skrll 2398 1.1 skrll elf_section_data (splt->output_section)->this_hdr.sh_entsize 2399 1.1 skrll = PLT_ENTRY_SIZE_V32; 2400 1.1 skrll } 2401 1.1 skrll } 2402 1.1 skrll else 2403 1.1 skrll { 2404 1.1 skrll if (bfd_link_pic (info)) 2405 1.1 skrll memcpy (splt->contents, elf_cris_pic_plt0_entry, 2406 1.1 skrll PLT_ENTRY_SIZE); 2407 1.1 skrll else 2408 1.1 skrll { 2409 1.1 skrll memcpy (splt->contents, elf_cris_plt0_entry, 2410 1.1 skrll PLT_ENTRY_SIZE); 2411 1.1 skrll bfd_put_32 (output_bfd, 2412 1.1 skrll sgot->output_section->vma 2413 1.1 skrll + sgot->output_offset + 4, 2414 1.1 skrll splt->contents + 6); 2415 1.1.1.6 christos bfd_put_32 (output_bfd, 2416 1.1 skrll sgot->output_section->vma 2417 1.1 skrll + sgot->output_offset + 8, 2418 1.1 skrll splt->contents + 14); 2419 1.1 skrll 2420 1.1 skrll elf_section_data (splt->output_section)->this_hdr.sh_entsize 2421 1.1 skrll = PLT_ENTRY_SIZE; 2422 1.1 skrll } 2423 1.1 skrll } 2424 1.1 skrll } 2425 1.1 skrll } 2426 1.1 skrll 2427 1.1 skrll /* Fill in the first three entries in the global offset table. */ 2428 1.1 skrll if (sgot->size > 0) 2429 1.1 skrll { 2430 1.1 skrll if (sdyn == NULL) 2431 1.1 skrll bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents); 2432 1.1 skrll else 2433 1.1 skrll bfd_put_32 (output_bfd, 2434 1.1.1.9 christos sdyn->output_section->vma + sdyn->output_offset, 2435 1.1 skrll sgot->contents); 2436 1.1 skrll bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 4); 2437 1.1 skrll bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 8); 2438 1.1 skrll } 2439 1.1 skrll 2440 1.1 skrll elf_section_data (sgot->output_section)->this_hdr.sh_entsize = 4; 2441 1.1 skrll 2442 1.1 skrll return true; 2443 1.1.1.12 christos } 2444 1.1 skrll 2445 1.1.1.12 christos /* Return the section that should be marked against GC for a given 2447 1.1.1.12 christos relocation. */ 2448 1.1 skrll 2449 1.1.1.2 christos static asection * 2450 1.1 skrll cris_elf_gc_mark_hook (asection *sec, 2451 1.1 skrll struct bfd_link_info *info, 2452 1.1 skrll struct elf_reloc_cookie *cookie, 2453 1.1 skrll struct elf_link_hash_entry *h, 2454 1.1.1.2 christos unsigned int symndx) 2455 1.1.1.2 christos { 2456 1.1.1.2 christos enum elf_cris_reloc_type r_type = ELF32_R_TYPE (cookie->rel->r_info); 2457 1.1 skrll if (h != NULL) 2458 1.1 skrll switch (r_type) 2459 1.1.1.12 christos { 2460 1.1 skrll case R_CRIS_GNU_VTINHERIT: 2461 1.1 skrll case R_CRIS_GNU_VTENTRY: 2462 1.1.1.2 christos return NULL; 2463 1.1.1.2 christos 2464 1.1.1.2 christos default: 2465 1.1.1.3 christos break; 2466 1.1.1.3 christos } 2467 1.1.1.2 christos 2468 1.1.1.2 christos return _bfd_elf_gc_mark_hook (sec, info, cookie, h, symndx); 2469 1.1.1.3 christos } 2470 1.1.1.3 christos 2471 1.1.1.3 christos /* The elf_backend_plt_sym_val hook function. */ 2472 1.1.1.3 christos 2473 1.1.1.3 christos static bfd_vma 2474 1.1.1.3 christos cris_elf_plt_sym_val (bfd_vma i ATTRIBUTE_UNUSED, const asection *plt, 2475 1.1.1.3 christos const arelent *rel) 2476 1.1.1.3 christos { 2477 1.1.1.3 christos bfd_size_type plt_entry_size; 2478 1.1.1.3 christos bfd_size_type pltoffs; 2479 1.1.1.3 christos bfd *abfd = plt->owner; 2480 1.1.1.3 christos 2481 1.1.1.3 christos /* Same for CRIS and CRIS v32; see elf_cris_(|pic_)plt_entry(|_v32)[]. */ 2482 1.1.1.2 christos bfd_size_type plt_entry_got_offset = 2; 2483 1.1.1.8 christos bfd_size_type plt_sec_size; 2484 1.1.1.2 christos bfd_size_type got_vma_for_dyn; 2485 1.1.1.3 christos asection *got; 2486 1.1.1.2 christos 2487 1.1.1.2 christos /* FIXME: the .got section should be readily available also when 2488 1.1.1.3 christos we're not linking. */ 2489 1.1.1.3 christos if ((got = bfd_get_section_by_name (abfd, ".got")) == NULL) 2490 1.1.1.3 christos return (bfd_vma) -1; 2491 1.1.1.3 christos 2492 1.1.1.3 christos plt_sec_size = bfd_section_size (plt); 2493 1.1.1.3 christos plt_entry_size 2494 1.1.1.3 christos = (bfd_get_mach (abfd) == bfd_mach_cris_v32 2495 1.1.1.3 christos ? PLT_ENTRY_SIZE_V32 : PLT_ENTRY_SIZE); 2496 1.1.1.3 christos 2497 1.1.1.3 christos /* Data in PLT is GOT-relative for DYN, but absolute for EXE. */ 2498 1.1.1.3 christos got_vma_for_dyn = (abfd->flags & EXEC_P) ? 0 : got->vma; 2499 1.1.1.3 christos 2500 1.1.1.3 christos /* Because we can have merged GOT entries; a single .got entry for 2501 1.1.1.3 christos both GOT and the PLT part of the GOT (.got.plt), the index of the 2502 1.1.1.3 christos reloc in .rela.plt is not the same as the index in the PLT. 2503 1.1.1.3 christos Instead, we have to hunt down the GOT offset in the PLT that 2504 1.1.1.3 christos corresponds to that of this reloc. Unfortunately, we will only 2505 1.1.1.3 christos be called for the .rela.plt relocs, so we'll miss synthetic 2506 1.1.1.3 christos symbols for .plt entries with merged GOT entries. (FIXME: 2507 1.1.1.3 christos fixable by providing our own bfd_elf32_get_synthetic_symtab. 2508 1.1.1.3 christos Doesn't seem worthwile at time of this writing.) FIXME: we've 2509 1.1.1.4 christos gone from O(1) to O(N) (N number of PLT entries) for finding each 2510 1.1.1.3 christos PLT address. Shouldn't matter in practice though. */ 2511 1.1.1.3 christos 2512 1.1.1.3 christos for (pltoffs = plt_entry_size; 2513 1.1.1.3 christos pltoffs < plt_sec_size; 2514 1.1.1.3 christos pltoffs += plt_entry_size) 2515 1.1.1.3 christos { 2516 1.1.1.3 christos bfd_size_type got_offset; 2517 1.1.1.3 christos bfd_byte gotoffs_raw[4]; 2518 1.1.1.3 christos 2519 1.1.1.3 christos if (!bfd_get_section_contents (abfd, (asection *) plt, gotoffs_raw, 2520 1.1.1.3 christos pltoffs + plt_entry_got_offset, 2521 1.1.1.3 christos sizeof (gotoffs_raw))) 2522 1.1.1.3 christos return (bfd_vma) -1; 2523 1.1.1.2 christos 2524 1.1.1.2 christos got_offset = bfd_get_32 (abfd, gotoffs_raw); 2525 1.1 skrll if (got_offset + got_vma_for_dyn == rel->address) 2526 1.1 skrll return plt->vma + pltoffs; 2527 1.1 skrll } 2528 1.1 skrll 2529 1.1.1.11 christos /* While it's tempting to BFD_ASSERT that we shouldn't get here, 2530 1.1 skrll that'd not be graceful behavior for invalid input. */ 2531 1.1 skrll return (bfd_vma) -1; 2532 1.1.1.9 christos } 2533 1.1.1.3 christos 2534 1.1 skrll /* Make sure we emit a GOT entry if the symbol was supposed to have a PLT 2535 1.1 skrll entry but we found we will not create any. Called when we find we will 2536 1.1 skrll not have any PLT for this symbol, by for example 2537 1.1.1.3 christos elf_cris_adjust_dynamic_symbol when we're doing a proper dynamic link, 2538 1.1.1.6 christos or elf_cris_late_size_sections if no dynamic sections will be 2539 1.1.1.3 christos created (we're only linking static objects). */ 2540 1.1.1.6 christos 2541 1.1.1.3 christos static bool 2542 1.1 skrll elf_cris_adjust_gotplt_to_got (struct elf_cris_link_hash_entry *h, void * p) 2543 1.1 skrll { 2544 1.1 skrll struct bfd_link_info *info = (struct bfd_link_info *) p; 2545 1.1.1.9 christos 2546 1.1 skrll /* A GOTPLT reloc, when activated, is supposed to be included into 2547 1.1.1.2 christos the PLT refcount, when the symbol isn't set-or-forced local. */ 2548 1.1 skrll BFD_ASSERT (h->gotplt_refcount == 0 2549 1.1.1.2 christos || h->root.plt.refcount == -1 2550 1.1.1.2 christos || h->gotplt_refcount <= h->root.plt.refcount); 2551 1.1 skrll 2552 1.1 skrll /* If nobody wanted a GOTPLT with this symbol, we're done. */ 2553 1.1.1.2 christos if (h->gotplt_refcount <= 0) 2554 1.1 skrll return true; 2555 1.1 skrll 2556 1.1 skrll if (h->reg_got_refcount > 0) 2557 1.1 skrll { 2558 1.1 skrll /* There's a GOT entry for this symbol. Just adjust the refcounts. 2559 1.1 skrll Probably not necessary at this stage, but keeping them accurate 2560 1.1 skrll helps avoiding surprises later. */ 2561 1.1 skrll h->root.got.refcount += h->gotplt_refcount; 2562 1.1.1.6 christos h->reg_got_refcount += h->gotplt_refcount; 2563 1.1.1.6 christos h->gotplt_refcount = 0; 2564 1.1 skrll } 2565 1.1.1.2 christos else 2566 1.1.1.6 christos { 2567 1.1.1.2 christos /* No GOT entry for this symbol. We need to create one. */ 2568 1.1.1.2 christos asection *sgot; 2569 1.1 skrll asection *srelgot; 2570 1.1 skrll 2571 1.1 skrll sgot = elf_hash_table (info)->sgot; 2572 1.1 skrll srelgot = elf_hash_table (info)->srelgot; 2573 1.1 skrll 2574 1.1 skrll /* Put accurate refcounts there. */ 2575 1.1 skrll BFD_ASSERT (h->root.got.refcount >= 0); 2576 1.1 skrll h->root.got.refcount += h->gotplt_refcount; 2577 1.1 skrll h->reg_got_refcount = h->gotplt_refcount; 2578 1.1 skrll 2579 1.1 skrll h->gotplt_refcount = 0; 2580 1.1 skrll 2581 1.1 skrll /* We always have a .got and a .rela.got section if there were 2582 1.1 skrll GOTPLT relocs in input. */ 2583 1.1.1.9 christos BFD_ASSERT (sgot != NULL && srelgot != NULL); 2584 1.1 skrll 2585 1.1 skrll /* Allocate space in the .got section. */ 2586 1.1 skrll sgot->size += 4; 2587 1.1 skrll 2588 1.1 skrll /* Allocate relocation space. */ 2589 1.1 skrll srelgot->size += sizeof (Elf32_External_Rela); 2590 1.1 skrll } 2591 1.1 skrll 2592 1.1 skrll return true; 2593 1.1 skrll } 2594 1.1 skrll 2595 1.1 skrll /* Try to fold PLT entries with GOT entries. There are two cases when we 2596 1.1 skrll want to do this: 2597 1.1 skrll 2598 1.1 skrll - When all PLT references are GOTPLT references, and there are GOT 2599 1.1 skrll references, and this is not the executable. We don't have to 2600 1.1 skrll generate a PLT at all. 2601 1.1 skrll 2602 1.1 skrll - When there are both (ordinary) PLT references and GOT references, 2603 1.1 skrll and this isn't the executable. 2604 1.1 skrll We want to make the PLT reference use the ordinary GOT entry rather 2605 1.1 skrll than R_CRIS_JUMP_SLOT, a run-time dynamically resolved GOTPLT entry, 2606 1.1 skrll since the GOT entry will have to be resolved at startup anyway. 2607 1.1 skrll 2608 1.1 skrll Though the latter case is handled when room for the PLT is allocated, 2609 1.1 skrll not here. 2610 1.1.1.9 christos 2611 1.1.1.3 christos By folding into the GOT, we may need a round-trip to a PLT in the 2612 1.1 skrll executable for calls, a loss in performance. Still, losing a 2613 1.1 skrll reloc is a win in size and at least in start-up time. 2614 1.1 skrll 2615 1.1 skrll Note that this function is called before symbols are forced local by 2616 1.1 skrll version scripts. The differing cases are handled by 2617 1.1 skrll elf_cris_hide_symbol. */ 2618 1.1 skrll 2619 1.1.1.9 christos static bool 2620 1.1 skrll elf_cris_try_fold_plt_to_got (struct elf_cris_link_hash_entry *h, void * p) 2621 1.1 skrll { 2622 1.1 skrll struct bfd_link_info *info = (struct bfd_link_info *) p; 2623 1.1 skrll 2624 1.1 skrll /* If there are no GOT references for this symbol, we can't fold any 2625 1.1 skrll other reference so there's nothing to do. Likewise if there are no 2626 1.1 skrll PLT references; GOTPLT references included. */ 2627 1.1 skrll if (h->root.got.refcount <= 0 || h->root.plt.refcount <= 0) 2628 1.1 skrll return true; 2629 1.1.1.9 christos 2630 1.1 skrll /* GOTPLT relocs are supposed to be included into the PLT refcount. */ 2631 1.1 skrll BFD_ASSERT (h->gotplt_refcount <= h->root.plt.refcount); 2632 1.1 skrll 2633 1.1 skrll if (h->gotplt_refcount == h->root.plt.refcount) 2634 1.1 skrll { 2635 1.1.1.9 christos /* The only PLT references are GOTPLT references, and there are GOT 2636 1.1 skrll references. Convert PLT to GOT references. */ 2637 1.1 skrll if (! elf_cris_adjust_gotplt_to_got (h, info)) 2638 1.1 skrll return false; 2639 1.1 skrll 2640 1.1 skrll /* Clear the PLT references, so no PLT will be created. */ 2641 1.1 skrll h->root.plt.offset = (bfd_vma) -1; 2642 1.1 skrll } 2643 1.1.1.3 christos 2644 1.1.1.3 christos return true; 2645 1.1.1.9 christos } 2646 1.1 skrll 2647 1.1 skrll /* Our own version of hide_symbol, so that we can adjust a GOTPLT reloc 2648 1.1 skrll to use a GOT entry (and create one) rather than requiring a GOTPLT 2649 1.1 skrll entry. */ 2650 1.1 skrll 2651 1.1 skrll static void 2652 1.1 skrll elf_cris_hide_symbol (struct bfd_link_info *info, 2653 1.1 skrll struct elf_link_hash_entry *h, 2654 1.1 skrll bool force_local) 2655 1.1 skrll { 2656 1.1 skrll elf_cris_adjust_gotplt_to_got ((struct elf_cris_link_hash_entry *) h, info); 2657 1.1 skrll 2658 1.1.1.9 christos _bfd_elf_link_hash_hide_symbol (info, h, force_local); 2659 1.1.1.2 christos } 2660 1.1.1.2 christos 2661 1.1 skrll /* Adjust a symbol defined by a dynamic object and referenced by a 2662 1.1.1.2 christos regular object. The current definition is in some section of the 2663 1.1 skrll dynamic object, but we're not including those sections. We have to 2664 1.1 skrll change the definition to something the rest of the link can 2665 1.1.1.6 christos understand. */ 2666 1.1 skrll 2667 1.1 skrll static bool 2668 1.1.1.2 christos elf_cris_adjust_dynamic_symbol (struct bfd_link_info *info, 2669 1.1.1.2 christos struct elf_link_hash_entry *h) 2670 1.1.1.9 christos { 2671 1.1.1.2 christos struct elf_cris_link_hash_table * htab; 2672 1.1.1.6 christos bfd *dynobj; 2673 1.1 skrll asection *s; 2674 1.1 skrll asection *srel; 2675 1.1 skrll bfd_size_type plt_entry_size; 2676 1.1 skrll 2677 1.1.1.6 christos htab = elf_cris_hash_table (info); 2678 1.1 skrll if (htab == NULL) 2679 1.1 skrll return false; 2680 1.1 skrll 2681 1.1 skrll dynobj = htab->root.dynobj; 2682 1.1 skrll 2683 1.1 skrll /* Make sure we know what is going on here. */ 2684 1.1 skrll BFD_ASSERT (dynobj != NULL 2685 1.1 skrll && (h->needs_plt 2686 1.1 skrll || h->is_weakalias 2687 1.1 skrll || (h->def_dynamic 2688 1.1 skrll && h->ref_regular 2689 1.1 skrll && !h->def_regular))); 2690 1.1 skrll 2691 1.1 skrll plt_entry_size 2692 1.1 skrll = (bfd_get_mach (dynobj) == bfd_mach_cris_v32 2693 1.1 skrll ? PLT_ENTRY_SIZE_V32 : PLT_ENTRY_SIZE); 2694 1.1 skrll 2695 1.1 skrll /* If this is a function, put it in the procedure linkage table. We 2696 1.1 skrll will fill in the contents of the procedure linkage table later, 2697 1.1 skrll when we know the address of the .got section. */ 2698 1.1.1.4 christos if (h->type == STT_FUNC 2699 1.1 skrll || h->needs_plt) 2700 1.1 skrll { 2701 1.1 skrll /* If we link a program (not a DSO), we'll get rid of unnecessary 2702 1.1 skrll PLT entries; we point to the actual symbols -- even for pic 2703 1.1 skrll relocs, because a program built with -fpic should have the same 2704 1.1 skrll result as one built without -fpic, specifically considering weak 2705 1.1 skrll symbols. 2706 1.1 skrll FIXME: m68k and i386 differ here, for unclear reasons. */ 2707 1.1 skrll if (! bfd_link_pic (info) 2708 1.1 skrll && !h->def_dynamic) 2709 1.1 skrll { 2710 1.1 skrll /* This case can occur if we saw a PLT reloc in an input file, 2711 1.1 skrll but the symbol was not defined by a dynamic object. In such 2712 1.1 skrll a case, we don't actually need to build a procedure linkage 2713 1.1 skrll table, and we can just do an absolute or PC reloc instead, or 2714 1.1 skrll change a .got.plt index to a .got index for GOTPLT relocs. */ 2715 1.1 skrll BFD_ASSERT (h->needs_plt); 2716 1.1 skrll h->needs_plt = 0; 2717 1.1 skrll h->plt.offset = (bfd_vma) -1; 2718 1.1 skrll return 2719 1.1 skrll elf_cris_adjust_gotplt_to_got ((struct 2720 1.1.1.4 christos elf_cris_link_hash_entry *) h, 2721 1.1 skrll info); 2722 1.1 skrll } 2723 1.1.1.9 christos 2724 1.1 skrll /* If we had a R_CRIS_GLOB_DAT that didn't have to point to a PLT; 2725 1.1 skrll where a pointer-equivalent symbol was unimportant (i.e. more 2726 1.1 skrll like R_CRIS_JUMP_SLOT after symbol evaluation) we could get rid 2727 1.1 skrll of the PLT. We can't for the executable, because the GOT 2728 1.1 skrll entries will point to the PLT there (and be constant). */ 2729 1.1 skrll if (bfd_link_pic (info) 2730 1.1.1.9 christos && !elf_cris_try_fold_plt_to_got ((struct elf_cris_link_hash_entry*) 2731 1.1 skrll h, info)) 2732 1.1 skrll return false; 2733 1.1 skrll 2734 1.1 skrll /* GC or folding may have rendered this entry unused. */ 2735 1.1 skrll if (h->plt.refcount <= 0) 2736 1.1 skrll { 2737 1.1.1.9 christos h->needs_plt = 0; 2738 1.1 skrll h->plt.offset = (bfd_vma) -1; 2739 1.1 skrll return true; 2740 1.1.1.6 christos } 2741 1.1 skrll 2742 1.1 skrll /* Make sure this symbol is output as a dynamic symbol. */ 2743 1.1 skrll if (h->dynindx == -1) 2744 1.1 skrll { 2745 1.1 skrll if (! bfd_elf_link_record_dynamic_symbol (info, h)) 2746 1.1 skrll return false; 2747 1.1 skrll } 2748 1.1 skrll 2749 1.1 skrll s = htab->root.splt; 2750 1.1 skrll BFD_ASSERT (s != NULL); 2751 1.1.1.4 christos 2752 1.1 skrll /* If this is the first .plt entry, make room for the special 2753 1.1 skrll first entry. */ 2754 1.1 skrll if (s->size == 0) 2755 1.1 skrll s->size += plt_entry_size; 2756 1.1 skrll 2757 1.1 skrll /* If this symbol is not defined in a regular file, and we are 2758 1.1 skrll not generating a shared library, then set the symbol to this 2759 1.1 skrll location in the .plt. */ 2760 1.1 skrll if (!bfd_link_pic (info) 2761 1.1 skrll && !h->def_regular) 2762 1.1 skrll { 2763 1.1 skrll h->root.u.def.section = s; 2764 1.1.1.4 christos h->root.u.def.value = s->size; 2765 1.1 skrll } 2766 1.1 skrll 2767 1.1 skrll /* If there's already a GOT entry, use that, not a .got.plt. A 2768 1.1 skrll GOT field still has a reference count when we get here; it's 2769 1.1 skrll not yet changed to an offset. We can't do this for an 2770 1.1 skrll executable, because then the reloc associated with the PLT 2771 1.1 skrll would get a non-PLT reloc pointing to the PLT. FIXME: Move 2772 1.1 skrll this to elf_cris_try_fold_plt_to_got. */ 2773 1.1 skrll if (bfd_link_pic (info) && h->got.refcount > 0) 2774 1.1 skrll { 2775 1.1 skrll h->got.refcount += h->plt.refcount; 2776 1.1 skrll 2777 1.1 skrll /* Mark the PLT offset to use the GOT entry by setting the low 2778 1.1 skrll bit in the plt offset; it is always a multiple of 2779 1.1 skrll plt_entry_size (which is at least a multiple of 2). */ 2780 1.1 skrll BFD_ASSERT ((s->size % plt_entry_size) == 0); 2781 1.1 skrll 2782 1.1 skrll /* Change the PLT refcount to an offset. */ 2783 1.1 skrll h->plt.offset = s->size; 2784 1.1.1.9 christos 2785 1.1 skrll /* By not setting gotplt_offset (i.e. it remains at 0), we signal 2786 1.1 skrll that the got entry should be used instead. */ 2787 1.1 skrll BFD_ASSERT (((struct elf_cris_link_hash_entry *) 2788 1.1 skrll h)->gotplt_offset == 0); 2789 1.1 skrll 2790 1.1 skrll /* Make room for this entry. */ 2791 1.1 skrll s->size += plt_entry_size; 2792 1.1 skrll 2793 1.1 skrll return true; 2794 1.1 skrll } 2795 1.1 skrll 2796 1.1.1.2 christos /* No GOT reference for this symbol; prepare for an ordinary PLT. */ 2797 1.1.1.2 christos h->plt.offset = s->size; 2798 1.1 skrll 2799 1.1.1.6 christos /* Make room for this entry. */ 2800 1.1 skrll s->size += plt_entry_size; 2801 1.1 skrll 2802 1.1 skrll /* We also need to make an entry in the .got.plt section, which 2803 1.1 skrll will be placed in the .got section by the linker script. */ 2804 1.1 skrll ((struct elf_cris_link_hash_entry *) h)->gotplt_offset 2805 1.1.1.6 christos = htab->next_gotplt_entry; 2806 1.1 skrll htab->next_gotplt_entry += 4; 2807 1.1 skrll 2808 1.1 skrll s = htab->root.sgotplt; 2809 1.1.1.9 christos BFD_ASSERT (s != NULL); 2810 1.1 skrll s->size += 4; 2811 1.1 skrll 2812 1.1 skrll /* We also need to make an entry in the .rela.plt section. */ 2813 1.1 skrll 2814 1.1 skrll s = htab->root.srelplt; 2815 1.1 skrll BFD_ASSERT (s != NULL); 2816 1.1 skrll s->size += sizeof (Elf32_External_Rela); 2817 1.1 skrll 2818 1.1 skrll return true; 2819 1.1.1.6 christos } 2820 1.1 skrll 2821 1.1.1.6 christos /* Reinitialize the plt offset now that it is not used as a reference 2822 1.1.1.6 christos count any more. */ 2823 1.1.1.6 christos h->plt.offset = (bfd_vma) -1; 2824 1.1.1.6 christos 2825 1.1.1.9 christos /* If this is a weak symbol, and there is a real definition, the 2826 1.1 skrll processor independent code will have arranged for us to see the 2827 1.1 skrll real definition first, and we can just use the same value. */ 2828 1.1 skrll if (h->is_weakalias) 2829 1.1 skrll { 2830 1.1 skrll struct elf_link_hash_entry *def = weakdef (h); 2831 1.1 skrll BFD_ASSERT (def->root.type == bfd_link_hash_defined); 2832 1.1 skrll h->root.u.def.section = def->root.u.def.section; 2833 1.1 skrll h->root.u.def.value = def->root.u.def.value; 2834 1.1 skrll return true; 2835 1.1.1.4 christos } 2836 1.1.1.9 christos 2837 1.1 skrll /* This is a reference to a symbol defined by a dynamic object which 2838 1.1 skrll is not a function. */ 2839 1.1 skrll 2840 1.1 skrll /* If we are creating a shared library, we must presume that the 2841 1.1.1.9 christos only references to the symbol are via the global offset table. 2842 1.1 skrll For such cases we need not do anything here; the relocations will 2843 1.1 skrll be handled correctly by relocate_section. */ 2844 1.1 skrll if (bfd_link_pic (info)) 2845 1.1 skrll return true; 2846 1.1 skrll 2847 1.1 skrll /* If there are no references to this symbol that do not use the 2848 1.1 skrll GOT, we don't need to generate a copy reloc. */ 2849 1.1 skrll if (!h->non_got_ref) 2850 1.1 skrll return true; 2851 1.1 skrll 2852 1.1 skrll /* We must allocate the symbol in our .dynbss section, which will 2853 1.1 skrll become part of the .bss section of the executable. There will be 2854 1.1 skrll an entry for this symbol in the .dynsym section. The dynamic 2855 1.1 skrll object will contain position independent code, so all references 2856 1.1 skrll from the dynamic object to this symbol will go through the global 2857 1.1.1.6 christos offset table. The dynamic linker will use the .dynsym entry to 2858 1.1.1.6 christos determine the address it must put in the global offset table, so 2859 1.1.1.6 christos both the dynamic object and the regular object will refer to the 2860 1.1.1.6 christos same memory location for the variable. */ 2861 1.1.1.6 christos 2862 1.1.1.6 christos /* We must generate a R_CRIS_COPY reloc to tell the dynamic linker to 2863 1.1.1.6 christos copy the initial value out of the dynamic object and into the 2864 1.1.1.6 christos runtime process image. We need to remember the offset into the 2865 1.1.1.6 christos .rela.bss section we are going to use. */ 2866 1.1.1.6 christos 2867 1.1.1.6 christos if ((h->root.u.def.section->flags & SEC_READONLY) != 0) 2868 1.1.1.3 christos { 2869 1.1 skrll s = htab->root.sdynrelro; 2870 1.1 skrll srel = htab->root.sreldynrelro; 2871 1.1 skrll } 2872 1.1 skrll else 2873 1.1 skrll { 2874 1.1 skrll s = htab->root.sdynbss; 2875 1.1.1.6 christos srel = htab->root.srelbss; 2876 1.1.1.6 christos } 2877 1.1.1.4 christos if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0) 2878 1.1 skrll { 2879 1.1 skrll BFD_ASSERT (srel != NULL); 2880 1.1.1.2 christos srel->size += sizeof (Elf32_External_Rela); 2881 1.1.1.2 christos h->needs_copy = 1; 2882 1.1.1.2 christos } 2883 1.1.1.2 christos 2884 1.1.1.2 christos BFD_ASSERT (s != NULL); 2885 1.1.1.2 christos 2886 1.1.1.2 christos return _bfd_elf_adjust_dynamic_copy (info, h, s); 2887 1.1.1.2 christos } 2888 1.1.1.2 christos 2889 1.1.1.2 christos /* Adjust our "subclass" elements for an indirect symbol. */ 2890 1.1.1.2 christos 2891 1.1.1.2 christos static void 2892 1.1.1.2 christos elf_cris_copy_indirect_symbol (struct bfd_link_info *info, 2893 1.1.1.2 christos struct elf_link_hash_entry *dir, 2894 1.1.1.2 christos struct elf_link_hash_entry *ind) 2895 1.1.1.2 christos { 2896 1.1.1.2 christos struct elf_cris_link_hash_entry *edir, *eind; 2897 1.1.1.2 christos 2898 1.1.1.2 christos edir = (struct elf_cris_link_hash_entry *) dir; 2899 1.1.1.2 christos eind = (struct elf_cris_link_hash_entry *) ind; 2900 1.1.1.2 christos 2901 1.1.1.2 christos /* Only indirect symbols are replaced; we're not interested in 2902 1.1.1.2 christos updating any of EIND's fields for other symbols. */ 2903 1.1.1.2 christos if (eind->root.root.type != bfd_link_hash_indirect) 2904 1.1.1.2 christos { 2905 1.1.1.2 christos /* Still, we need to copy flags for e.g. weak definitions. */ 2906 1.1.1.2 christos _bfd_elf_link_hash_copy_indirect (info, dir, ind); 2907 1.1.1.2 christos return; 2908 1.1.1.2 christos } 2909 1.1.1.2 christos 2910 1.1.1.2 christos BFD_ASSERT (edir->gotplt_offset == 0 || eind->gotplt_offset == 0); 2911 1.1.1.2 christos 2912 1.1.1.2 christos #define XMOVOPZ(F, OP, Z) edir->F OP eind->F; eind->F = Z 2913 1.1.1.2 christos #define XMOVE(F) XMOVOPZ (F, +=, 0) 2914 1.1.1.2 christos if (eind->pcrel_relocs_copied != NULL) 2915 1.1.1.2 christos { 2916 1.1.1.2 christos if (edir->pcrel_relocs_copied != NULL) 2917 1.1.1.2 christos { 2918 1.1.1.2 christos struct elf_cris_pcrel_relocs_copied **pp; 2919 1.1.1.2 christos struct elf_cris_pcrel_relocs_copied *p; 2920 1.1.1.2 christos 2921 1.1.1.2 christos /* Add reloc counts against the indirect sym to the direct sym 2922 1.1.1.2 christos list. Merge any entries against the same section. */ 2923 1.1.1.2 christos for (pp = &eind->pcrel_relocs_copied; *pp != NULL;) 2924 1.1.1.2 christos { 2925 1.1.1.2 christos struct elf_cris_pcrel_relocs_copied *q; 2926 1.1.1.2 christos p = *pp; 2927 1.1.1.2 christos for (q = edir->pcrel_relocs_copied; q != NULL; q = q->next) 2928 1.1.1.2 christos if (q->section == p->section) 2929 1.1.1.2 christos { 2930 1.1.1.2 christos q->count += p->count; 2931 1.1.1.2 christos *pp = p->next; 2932 1.1.1.2 christos break; 2933 1.1.1.2 christos } 2934 1.1.1.2 christos if (q == NULL) 2935 1.1.1.2 christos pp = &p->next; 2936 1.1.1.2 christos } 2937 1.1.1.2 christos *pp = edir->pcrel_relocs_copied; 2938 1.1.1.2 christos } 2939 1.1.1.2 christos XMOVOPZ (pcrel_relocs_copied, =, NULL); 2940 1.1.1.2 christos } 2941 1.1.1.2 christos XMOVE (gotplt_refcount); 2942 1.1.1.2 christos XMOVE (gotplt_offset); 2943 1.1 skrll XMOVE (reg_got_refcount); 2944 1.1 skrll XMOVE (tprel_refcount); 2945 1.1.1.9 christos XMOVE (dtp_refcount); 2946 1.1.1.2 christos #undef XMOVE 2947 1.1.1.2 christos #undef XMOVOPZ 2948 1.1.1.2 christos 2949 1.1.1.2 christos _bfd_elf_link_hash_copy_indirect (info, dir, ind); 2950 1.1 skrll } 2951 1.1.1.2 christos 2952 1.1 skrll /* Look through the relocs for a section during the first phase. */ 2953 1.1 skrll 2954 1.1 skrll static bool 2955 1.1 skrll cris_elf_check_relocs (bfd *abfd, 2956 1.1 skrll struct bfd_link_info *info, 2957 1.1 skrll asection *sec, 2958 1.1 skrll const Elf_Internal_Rela *relocs) 2959 1.1 skrll { 2960 1.1 skrll struct elf_cris_link_hash_table * htab; 2961 1.1 skrll bfd *dynobj; 2962 1.1.1.4 christos Elf_Internal_Shdr *symtab_hdr; 2963 1.1.1.9 christos struct elf_link_hash_entry **sym_hashes; 2964 1.1 skrll bfd_signed_vma *local_got_refcounts; 2965 1.1.1.2 christos const Elf_Internal_Rela *rel; 2966 1.1.1.2 christos const Elf_Internal_Rela *rel_end; 2967 1.1.1.9 christos asection *sgot; 2968 1.1.1.2 christos asection *srelgot; 2969 1.1 skrll asection *sreloc; 2970 1.1 skrll 2971 1.1 skrll if (bfd_link_relocatable (info)) 2972 1.1 skrll return true; 2973 1.1 skrll 2974 1.1 skrll htab = elf_cris_hash_table (info); 2975 1.1 skrll if (htab == NULL) 2976 1.1 skrll return false; 2977 1.1 skrll 2978 1.1 skrll dynobj = elf_hash_table (info)->dynobj; 2979 1.1 skrll symtab_hdr = &elf_tdata (abfd)->symtab_hdr; 2980 1.1 skrll sym_hashes = elf_sym_hashes (abfd); 2981 1.1 skrll local_got_refcounts = elf_local_got_refcounts (abfd); 2982 1.1 skrll 2983 1.1 skrll sgot = NULL; 2984 1.1.1.2 christos srelgot = NULL; 2985 1.1.1.2 christos sreloc = NULL; 2986 1.1 skrll 2987 1.1 skrll rel_end = relocs + sec->reloc_count; 2988 1.1 skrll for (rel = relocs; rel < rel_end; rel++) 2989 1.1.1.2 christos { 2990 1.1.1.2 christos struct elf_link_hash_entry *h; 2991 1.1.1.2 christos unsigned long r_symndx; 2992 1.1.1.2 christos enum elf_cris_reloc_type r_type; 2993 1.1 skrll bfd_signed_vma got_element_size = 4; 2994 1.1 skrll unsigned long r_symndx_lgot = INT_MAX; 2995 1.1 skrll 2996 1.1 skrll r_symndx = ELF32_R_SYM (rel->r_info); 2997 1.1 skrll if (r_symndx < symtab_hdr->sh_info) 2998 1.1 skrll { 2999 1.1 skrll h = NULL; 3000 1.1 skrll r_symndx_lgot = LGOT_REG_NDX (r_symndx); 3001 1.1 skrll } 3002 1.1 skrll else 3003 1.1 skrll { 3004 1.1 skrll h = sym_hashes[r_symndx - symtab_hdr->sh_info]; 3005 1.1 skrll while (h->root.type == bfd_link_hash_indirect 3006 1.1 skrll || h->root.type == bfd_link_hash_warning) 3007 1.1.1.2 christos h = (struct elf_link_hash_entry *) h->root.u.i.link; 3008 1.1.1.2 christos } 3009 1.1.1.2 christos 3010 1.1.1.2 christos r_type = ELF32_R_TYPE (rel->r_info); 3011 1.1.1.2 christos 3012 1.1.1.2 christos /* Some relocs require linker-created sections; we need to hang them 3013 1.1.1.2 christos on the first input bfd we found that contained dynamic relocs. */ 3014 1.1.1.2 christos switch (r_type) 3015 1.1.1.2 christos { 3016 1.1.1.2 christos case R_CRIS_32_DTPREL: 3017 1.1.1.2 christos if ((sec->flags & SEC_ALLOC) == 0) 3018 1.1.1.2 christos /* This'd be a .dtpreld entry in e.g. debug info. We have 3019 1.1.1.2 christos several different switch statements below, but none of 3020 1.1.1.2 christos that is needed; we need no preparations for resolving 3021 1.1.1.2 christos R_CRIS_32_DTPREL into a non-allocated section (debug 3022 1.1.1.2 christos info), so let's just move on to the next 3023 1.1.1.2 christos relocation. */ 3024 1.1.1.2 christos continue; 3025 1.1.1.2 christos /* Fall through. */ 3026 1.1.1.2 christos case R_CRIS_16_DTPREL: 3027 1.1.1.2 christos /* The first .got.plt entry is right after the R_CRIS_DTPMOD 3028 1.1.1.2 christos entry at index 3. */ 3029 1.1.1.2 christos if (htab->dtpmod_refcount == 0) 3030 1.1.1.2 christos htab->next_gotplt_entry += 8; 3031 1.1.1.2 christos 3032 1.1 skrll htab->dtpmod_refcount++; 3033 1.1 skrll /* Fall through. */ 3034 1.1 skrll 3035 1.1 skrll case R_CRIS_32_IE: 3036 1.1 skrll case R_CRIS_32_GD: 3037 1.1 skrll case R_CRIS_16_GOT_GD: 3038 1.1 skrll case R_CRIS_32_GOT_GD: 3039 1.1 skrll case R_CRIS_32_GOT_TPREL: 3040 1.1 skrll case R_CRIS_16_GOT_TPREL: 3041 1.1 skrll case R_CRIS_16_GOT: 3042 1.1 skrll case R_CRIS_32_GOT: 3043 1.1 skrll case R_CRIS_32_GOTREL: 3044 1.1 skrll case R_CRIS_32_PLT_GOTREL: 3045 1.1 skrll case R_CRIS_32_PLT_PCREL: 3046 1.1 skrll case R_CRIS_16_GOTPLT: 3047 1.1 skrll case R_CRIS_32_GOTPLT: 3048 1.1.1.6 christos if (dynobj == NULL) 3049 1.1.1.6 christos { 3050 1.1.1.7 christos elf_hash_table (info)->dynobj = dynobj = abfd; 3051 1.1 skrll 3052 1.1 skrll /* We could handle this if we can get a handle on the 3053 1.1.1.9 christos output bfd in elf_cris_adjust_dynamic_symbol. Failing 3054 1.1 skrll that, we must insist on dynobj being a specific mach. */ 3055 1.1.1.4 christos if (bfd_get_mach (dynobj) == bfd_mach_cris_v10_v32) 3056 1.1 skrll { 3057 1.1.1.4 christos _bfd_error_handler 3058 1.1.1.4 christos /* xgettext:c-format */ 3059 1.1.1.4 christos (_("%pB, section %pA: v10/v32 compatible object" 3060 1.1.1.4 christos " must not contain a PIC relocation"), 3061 1.1.1.4 christos abfd, sec); 3062 1.1.1.4 christos return false; 3063 1.1.1.4 christos } 3064 1.1 skrll } 3065 1.1.1.9 christos 3066 1.1.1.2 christos if (sgot == NULL) 3067 1.1.1.6 christos { 3068 1.1.1.6 christos /* We may have a dynobj but no .got section, if machine- 3069 1.1.1.4 christos independent parts of the linker found a reason to create 3070 1.1.1.2 christos a dynobj. We want to create the .got section now, so we 3071 1.1.1.2 christos can assume it's always present whenever there's a dynobj. 3072 1.1.1.2 christos It's ok to call this function more than once. */ 3073 1.1.1.2 christos if (!_bfd_elf_create_got_section (dynobj, info)) 3074 1.1.1.2 christos return false; 3075 1.1.1.2 christos 3076 1.1.1.2 christos sgot = elf_hash_table (info)->sgot; 3077 1.1.1.2 christos srelgot = elf_hash_table (info)->srelgot; 3078 1.1.1.2 christos } 3079 1.1.1.2 christos 3080 1.1.1.2 christos if (local_got_refcounts == NULL) 3081 1.1.1.2 christos { 3082 1.1.1.9 christos bfd_size_type amt; 3083 1.1.1.2 christos 3084 1.1.1.2 christos /* We use index local_got_refcounts[-1] to count all 3085 1.1.1.2 christos GOT-relative relocations that do not have explicit 3086 1.1.1.2 christos GOT entries. */ 3087 1.1 skrll amt = LGOT_ALLOC_NELTS_FOR (symtab_hdr->sh_info) + 1; 3088 1.1 skrll amt *= sizeof (bfd_signed_vma); 3089 1.1 skrll local_got_refcounts = ((bfd_signed_vma *) bfd_zalloc (abfd, amt)); 3090 1.1 skrll if (local_got_refcounts == NULL) 3091 1.1 skrll return false; 3092 1.1 skrll 3093 1.1.1.2 christos local_got_refcounts++; 3094 1.1.1.2 christos elf_local_got_refcounts (abfd) = local_got_refcounts; 3095 1.1.1.2 christos } 3096 1.1.1.2 christos break; 3097 1.1.1.2 christos 3098 1.1.1.2 christos default: 3099 1.1.1.2 christos break; 3100 1.1.1.4 christos } 3101 1.1 skrll 3102 1.1.1.6 christos /* Warn and error for invalid input. */ 3103 1.1.1.6 christos switch (r_type) 3104 1.1.1.7 christos { 3105 1.1.1.2 christos case R_CRIS_32_IE: 3106 1.1.1.2 christos case R_CRIS_32_TPREL: 3107 1.1.1.2 christos case R_CRIS_16_TPREL: 3108 1.1.1.2 christos case R_CRIS_32_GD: 3109 1.1.1.2 christos if (bfd_link_pic (info)) 3110 1.1.1.2 christos { 3111 1.1.1.2 christos _bfd_error_handler 3112 1.1.1.2 christos /* xgettext:c-format */ 3113 1.1.1.2 christos (_("%pB, section %pA:\n relocation %s not valid" 3114 1.1.1.2 christos " in a shared object;" 3115 1.1.1.2 christos " typically an option mixup, recompile with -fPIC"), 3116 1.1.1.2 christos abfd, 3117 1.1 skrll sec, 3118 1.1.1.2 christos cris_elf_howto_table[r_type].name); 3119 1.1.1.2 christos /* Don't return FALSE here; we want messages for all of 3120 1.1.1.2 christos these and the error behavior is ungraceful 3121 1.1.1.2 christos anyway. */ 3122 1.1.1.2 christos } 3123 1.1.1.2 christos default: 3124 1.1.1.2 christos break; 3125 1.1.1.2 christos } 3126 1.1.1.2 christos 3127 1.1 skrll switch (r_type) 3128 1.1.1.2 christos { 3129 1.1.1.2 christos case R_CRIS_32_GD: 3130 1.1.1.2 christos case R_CRIS_16_GOT_GD: 3131 1.1.1.2 christos case R_CRIS_32_GOT_GD: 3132 1.1.1.2 christos /* These are requests for tls_index entries, run-time R_CRIS_DTP. */ 3133 1.1.1.2 christos got_element_size = 8; 3134 1.1.1.2 christos r_symndx_lgot = LGOT_DTP_NDX (r_symndx); 3135 1.1.1.2 christos break; 3136 1.1.1.2 christos 3137 1.1.1.2 christos case R_CRIS_16_DTPREL: 3138 1.1.1.2 christos case R_CRIS_32_DTPREL: 3139 1.1.1.2 christos /* These two just request for the constant-index 3140 1.1.1.2 christos module-local tls_index-sized GOT entry, which we add 3141 1.1.1.2 christos elsewhere. */ 3142 1.1.1.2 christos break; 3143 1.1.1.4 christos 3144 1.1.1.2 christos case R_CRIS_32_IE: 3145 1.1 skrll case R_CRIS_32_GOT_TPREL: 3146 1.1 skrll case R_CRIS_16_GOT_TPREL: 3147 1.1.1.2 christos r_symndx_lgot = LGOT_TPREL_NDX (r_symndx); 3148 1.1.1.2 christos 3149 1.1.1.2 christos /* Those relocs also require that a DSO is of type 3150 1.1.1.2 christos Initial Exec. Like other targets, we don't reset this 3151 1.1 skrll flag even if the relocs are GC:ed away. */ 3152 1.1 skrll if (bfd_link_pic (info)) 3153 1.1 skrll info->flags |= DF_STATIC_TLS; 3154 1.1 skrll break; 3155 1.1 skrll 3156 1.1.1.6 christos /* Let's list the other assembler-generated TLS-relocs too, 3157 1.1 skrll just to show that they're not forgotten. */ 3158 1.1 skrll case R_CRIS_16_TPREL: 3159 1.1 skrll case R_CRIS_32_TPREL: 3160 1.1 skrll default: 3161 1.1 skrll break; 3162 1.1 skrll } 3163 1.1 skrll 3164 1.1.1.2 christos switch (r_type) 3165 1.1 skrll { 3166 1.1 skrll case R_CRIS_16_GOTPLT: 3167 1.1 skrll case R_CRIS_32_GOTPLT: 3168 1.1 skrll /* Mark that we need a GOT entry if the PLT entry (and its GOT 3169 1.1 skrll entry) is eliminated. We can only do this for a non-local 3170 1.1 skrll symbol. */ 3171 1.1.1.2 christos if (h != NULL) 3172 1.1.1.2 christos { 3173 1.1.1.2 christos elf_cris_hash_entry (h)->gotplt_refcount++; 3174 1.1.1.2 christos goto handle_gotplt_reloc; 3175 1.1.1.2 christos } 3176 1.1.1.2 christos /* If h is NULL then this is a local symbol, and we must make a 3177 1.1 skrll GOT entry for it, so handle it like a GOT reloc. */ 3178 1.1 skrll /* Fall through. */ 3179 1.1 skrll 3180 1.1 skrll case R_CRIS_32_IE: 3181 1.1 skrll case R_CRIS_32_GD: 3182 1.1 skrll case R_CRIS_16_GOT_GD: 3183 1.1 skrll case R_CRIS_32_GOT_GD: 3184 1.1 skrll case R_CRIS_32_GOT_TPREL: 3185 1.1 skrll case R_CRIS_16_GOT_TPREL: 3186 1.1 skrll case R_CRIS_16_GOT: 3187 1.1 skrll case R_CRIS_32_GOT: 3188 1.1.1.9 christos /* This symbol requires a global offset table entry. */ 3189 1.1 skrll if (h != NULL) 3190 1.1 skrll { 3191 1.1.1.2 christos if (h->got.refcount == 0) 3192 1.1.1.2 christos { 3193 1.1 skrll /* Make sure this symbol is output as a dynamic symbol. */ 3194 1.1.1.2 christos if (h->dynindx == -1) 3195 1.1.1.2 christos { 3196 1.1.1.2 christos if (!bfd_elf_link_record_dynamic_symbol (info, h)) 3197 1.1.1.2 christos return false; 3198 1.1.1.2 christos } 3199 1.1.1.2 christos } 3200 1.1.1.2 christos 3201 1.1.1.2 christos /* Update the sum of reloc counts for this symbol. */ 3202 1.1.1.2 christos h->got.refcount++; 3203 1.1.1.2 christos 3204 1.1.1.2 christos switch (r_type) 3205 1.1.1.2 christos { 3206 1.1.1.2 christos case R_CRIS_16_GOT: 3207 1.1.1.2 christos case R_CRIS_32_GOT: 3208 1.1.1.2 christos if (elf_cris_hash_entry (h)->reg_got_refcount == 0) 3209 1.1.1.2 christos { 3210 1.1.1.2 christos /* Allocate space in the .got section. */ 3211 1.1.1.2 christos sgot->size += got_element_size; 3212 1.1.1.2 christos /* Allocate relocation space. */ 3213 1.1.1.2 christos srelgot->size += sizeof (Elf32_External_Rela); 3214 1.1.1.2 christos } 3215 1.1.1.2 christos elf_cris_hash_entry (h)->reg_got_refcount++; 3216 1.1.1.2 christos break; 3217 1.1.1.2 christos 3218 1.1.1.2 christos case R_CRIS_32_GD: 3219 1.1.1.2 christos case R_CRIS_16_GOT_GD: 3220 1.1.1.2 christos case R_CRIS_32_GOT_GD: 3221 1.1.1.2 christos if (elf_cris_hash_entry (h)->dtp_refcount == 0) 3222 1.1.1.2 christos { 3223 1.1.1.2 christos /* Allocate space in the .got section. */ 3224 1.1.1.2 christos sgot->size += got_element_size; 3225 1.1.1.2 christos /* Allocate relocation space. */ 3226 1.1.1.2 christos srelgot->size += sizeof (Elf32_External_Rela); 3227 1.1.1.2 christos } 3228 1.1.1.2 christos elf_cris_hash_entry (h)->dtp_refcount++; 3229 1.1.1.2 christos break; 3230 1.1.1.2 christos 3231 1.1.1.2 christos case R_CRIS_32_IE: 3232 1.1.1.2 christos case R_CRIS_32_GOT_TPREL: 3233 1.1.1.2 christos case R_CRIS_16_GOT_TPREL: 3234 1.1.1.2 christos if (elf_cris_hash_entry (h)->tprel_refcount == 0) 3235 1.1.1.2 christos { 3236 1.1.1.2 christos /* Allocate space in the .got section. */ 3237 1.1.1.2 christos sgot->size += got_element_size; 3238 1.1.1.2 christos /* Allocate relocation space. */ 3239 1.1 skrll srelgot->size += sizeof (Elf32_External_Rela); 3240 1.1 skrll } 3241 1.1 skrll elf_cris_hash_entry (h)->tprel_refcount++; 3242 1.1 skrll break; 3243 1.1.1.2 christos 3244 1.1 skrll default: 3245 1.1.1.2 christos BFD_FAIL (); 3246 1.1.1.4 christos break; 3247 1.1 skrll } 3248 1.1.1.2 christos } 3249 1.1.1.2 christos else 3250 1.1.1.2 christos { 3251 1.1.1.2 christos /* This is a global offset table entry for a local symbol. */ 3252 1.1 skrll if (local_got_refcounts[r_symndx_lgot] == 0) 3253 1.1 skrll { 3254 1.1 skrll sgot->size += got_element_size; 3255 1.1.1.2 christos if (bfd_link_pic (info)) 3256 1.1.1.2 christos { 3257 1.1.1.2 christos /* If we are generating a shared object, we need 3258 1.1.1.2 christos to output a R_CRIS_RELATIVE reloc so that the 3259 1.1 skrll dynamic linker can adjust this GOT entry. 3260 1.1 skrll Similarly for non-regular got entries. */ 3261 1.1 skrll srelgot->size += sizeof (Elf32_External_Rela); 3262 1.1 skrll } 3263 1.1.1.2 christos } 3264 1.1.1.2 christos /* Update the reloc-specific count. */ 3265 1.1 skrll local_got_refcounts[r_symndx_lgot]++; 3266 1.1 skrll 3267 1.1 skrll /* This one is the sum of all the others. */ 3268 1.1 skrll local_got_refcounts[r_symndx]++; 3269 1.1 skrll } 3270 1.1 skrll break; 3271 1.1 skrll 3272 1.1 skrll case R_CRIS_16_DTPREL: 3273 1.1 skrll case R_CRIS_32_DTPREL: 3274 1.1 skrll case R_CRIS_32_GOTREL: 3275 1.1 skrll /* This reference requires a global offset table. 3276 1.1 skrll FIXME: The actual refcount isn't used currently; the .got 3277 1.1 skrll section can't be removed if there were any references in the 3278 1.1 skrll input. */ 3279 1.1 skrll local_got_refcounts[-1]++; 3280 1.1 skrll break; 3281 1.1 skrll 3282 1.1 skrll handle_gotplt_reloc: 3283 1.1.1.6 christos 3284 1.1.1.6 christos case R_CRIS_32_PLT_GOTREL: 3285 1.1.1.6 christos /* This reference requires a global offset table. */ 3286 1.1.1.6 christos local_got_refcounts[-1]++; 3287 1.1 skrll /* Fall through. */ 3288 1.1 skrll 3289 1.1 skrll case R_CRIS_32_PLT_PCREL: 3290 1.1 skrll /* This symbol requires a procedure linkage table entry. We 3291 1.1 skrll actually build the entry in adjust_dynamic_symbol, 3292 1.1 skrll because this might be a case of linking PIC code which is 3293 1.1 skrll never referenced by a dynamic object, in which case we 3294 1.1 skrll don't need to generate a procedure linkage table entry 3295 1.1 skrll after all. */ 3296 1.1 skrll 3297 1.1 skrll /* Beware: if we'd check for visibility of the symbol here 3298 1.1.1.6 christos (and not marking the need for a PLT when non-visible), we'd 3299 1.1.1.6 christos get into trouble with keeping handling consistent with 3300 1.1.1.6 christos regards to relocs found before definition and GOTPLT 3301 1.1.1.6 christos handling. Eliminable PLT entries will be dealt with later 3302 1.1 skrll anyway. */ 3303 1.1 skrll if (h == NULL) 3304 1.1 skrll continue; 3305 1.1 skrll 3306 1.1 skrll h->needs_plt = 1; 3307 1.1 skrll 3308 1.1.1.2 christos /* If the symbol is forced local, the refcount is unavailable. */ 3309 1.1.1.2 christos if (h->plt.refcount != -1) 3310 1.1.1.2 christos h->plt.refcount++; 3311 1.1.1.2 christos break; 3312 1.1.1.2 christos 3313 1.1.1.2 christos case R_CRIS_8: 3314 1.1.1.2 christos case R_CRIS_16: 3315 1.1.1.4 christos case R_CRIS_32: 3316 1.1 skrll /* Let's help debug shared library creation. Any of these 3317 1.1 skrll relocs *can* be used in shared libs, but pages containing 3318 1.1 skrll them cannot be shared, so they're not appropriate for 3319 1.1 skrll common use. Don't warn for sections we don't care about, 3320 1.1.1.6 christos such as debug sections or non-constant sections. We 3321 1.1.1.6 christos can't help tables of (global) function pointers, for 3322 1.1.1.7 christos example, though they must be emitted in a (writable) data 3323 1.1 skrll section to avoid having impure text sections. */ 3324 1.1 skrll if (bfd_link_pic (info) 3325 1.1 skrll && (sec->flags & SEC_ALLOC) != 0 3326 1.1 skrll && (sec->flags & SEC_READONLY) != 0) 3327 1.1 skrll { 3328 1.1.1.3 christos /* FIXME: How do we make this optionally a warning only? */ 3329 1.1.1.3 christos _bfd_error_handler 3330 1.1.1.3 christos /* xgettext:c-format */ 3331 1.1.1.3 christos (_("%pB, section %pA: relocation %s should not" 3332 1.1.1.3 christos " be used in a shared object; recompile with -fPIC"), 3333 1.1.1.3 christos abfd, 3334 1.1.1.2 christos sec, 3335 1.1.1.2 christos cris_elf_howto_table[r_type].name); 3336 1.1.1.2 christos } 3337 1.1.1.2 christos 3338 1.1.1.2 christos /* We don't need to handle relocs into sections not going into 3339 1.1.1.2 christos the "real" output. */ 3340 1.1.1.2 christos if ((sec->flags & SEC_ALLOC) == 0) 3341 1.1.1.2 christos break; 3342 1.1.1.2 christos 3343 1.1.1.2 christos if (h != NULL) 3344 1.1.1.2 christos { 3345 1.1.1.2 christos h->non_got_ref = 1; 3346 1.1.1.2 christos 3347 1.1.1.2 christos /* Make sure a plt entry is created for this symbol if it 3348 1.1.1.2 christos turns out to be a function defined by a dynamic object. */ 3349 1.1.1.2 christos if (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT) 3350 1.1.1.2 christos h->plt.refcount++; 3351 1.1.1.2 christos } 3352 1.1.1.2 christos 3353 1.1.1.2 christos /* If we are creating a shared library and this is not a local 3354 1.1.1.2 christos symbol, we need to copy the reloc into the shared library. 3355 1.1.1.2 christos However when linking with -Bsymbolic and this is a global 3356 1.1.1.2 christos symbol which is defined in an object we are including in the 3357 1.1.1.2 christos link (i.e., DEF_REGULAR is set), then we can resolve the 3358 1.1.1.2 christos reloc directly. At this point we have not seen all the input 3359 1.1.1.2 christos files, so it is possible that DEF_REGULAR is not set now but 3360 1.1.1.6 christos will be set later (it is never cleared). In case of a weak 3361 1.1.1.9 christos definition, DEF_REGULAR may be cleared later by a strong 3362 1.1.1.2 christos definition in a shared library. We account for that 3363 1.1.1.2 christos possibility below by storing information in the relocs_copied 3364 1.1.1.2 christos field of the hash table entry. A similar situation occurs 3365 1.1.1.2 christos when creating shared libraries and symbol visibility changes 3366 1.1.1.2 christos render the symbol local. */ 3367 1.1.1.2 christos 3368 1.1.1.2 christos /* No need to do anything if we're not creating a shared object. */ 3369 1.1.1.9 christos if (! bfd_link_pic (info) 3370 1.1.1.2 christos || (h != NULL && UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))) 3371 1.1.1.2 christos break; 3372 1.1.1.9 christos 3373 1.1.1.2 christos /* We may need to create a reloc section in the dynobj and made room 3374 1.1.1.2 christos for this reloc. */ 3375 1.1.1.2 christos if (sreloc == NULL) 3376 1.1.1.2 christos { 3377 1.1.1.2 christos sreloc = _bfd_elf_make_dynamic_reloc_section 3378 1.1.1.2 christos (sec, dynobj, 2, abfd, /*rela?*/ true); 3379 1.1.1.2 christos 3380 1.1 skrll if (sreloc == NULL) 3381 1.1 skrll return false; 3382 1.1 skrll } 3383 1.1 skrll 3384 1.1 skrll if (sec->flags & SEC_READONLY) 3385 1.1 skrll info->flags |= DF_TEXTREL; 3386 1.1 skrll 3387 1.1 skrll sreloc->size += sizeof (Elf32_External_Rela); 3388 1.1 skrll break; 3389 1.1 skrll 3390 1.1 skrll case R_CRIS_8_PCREL: 3391 1.1 skrll case R_CRIS_16_PCREL: 3392 1.1 skrll case R_CRIS_32_PCREL: 3393 1.1 skrll if (h != NULL) 3394 1.1 skrll { 3395 1.1 skrll h->non_got_ref = 1; 3396 1.1 skrll 3397 1.1 skrll /* Make sure a plt entry is created for this symbol if it 3398 1.1 skrll turns out to be a function defined by a dynamic object. */ 3399 1.1 skrll if (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT) 3400 1.1 skrll h->plt.refcount++; 3401 1.1 skrll } 3402 1.1 skrll 3403 1.1 skrll /* If we are creating a shared library and this is not a local 3404 1.1 skrll symbol, we need to copy the reloc into the shared library. 3405 1.1 skrll However when linking with -Bsymbolic and this is a global 3406 1.1 skrll symbol which is defined in an object we are including in the 3407 1.1 skrll link (i.e., DEF_REGULAR is set), then we can resolve the 3408 1.1 skrll reloc directly. At this point we have not seen all the input 3409 1.1 skrll files, so it is possible that DEF_REGULAR is not set now but 3410 1.1.1.4 christos will be set later (it is never cleared). In case of a weak 3411 1.1 skrll definition, DEF_REGULAR may be cleared later by a strong 3412 1.1 skrll definition in a shared library. We account for that 3413 1.1 skrll possibility below by storing information in the relocs_copied 3414 1.1 skrll field of the hash table entry. A similar situation occurs 3415 1.1 skrll when creating shared libraries and symbol visibility changes 3416 1.1 skrll render the symbol local. */ 3417 1.1 skrll 3418 1.1.1.2 christos /* No need to do anything if we're not creating a shared object. */ 3419 1.1.1.2 christos if (! bfd_link_pic (info)) 3420 1.1.1.2 christos break; 3421 1.1.1.2 christos 3422 1.1 skrll /* We don't need to handle relocs into sections not going into 3423 1.1.1.2 christos the "real" output. */ 3424 1.1.1.2 christos if ((sec->flags & SEC_ALLOC) == 0) 3425 1.1.1.2 christos break; 3426 1.1.1.2 christos 3427 1.1.1.2 christos /* If the symbol is local, then we know already we can 3428 1.1.1.4 christos eliminate the reloc. */ 3429 1.1.1.2 christos if (h == NULL || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT) 3430 1.1.1.2 christos break; 3431 1.1.1.2 christos 3432 1.1 skrll /* If this is with -Bsymbolic and the symbol isn't weak, and 3433 1.1.1.2 christos is defined by an ordinary object (the ones we include in 3434 1.1.1.2 christos this shared library) then we can also eliminate the 3435 1.1 skrll reloc. See comment above for more eliminable cases which 3436 1.1 skrll we can't identify at this time. */ 3437 1.1.1.2 christos if (SYMBOLIC_BIND (info, h) 3438 1.1.1.9 christos && h->root.type != bfd_link_hash_defweak 3439 1.1 skrll && h->def_regular) 3440 1.1 skrll break; 3441 1.1.1.9 christos 3442 1.1 skrll /* We may need to create a reloc section in the dynobj and made room 3443 1.1 skrll for this reloc. */ 3444 1.1 skrll if (sreloc == NULL) 3445 1.1 skrll { 3446 1.1.1.2 christos sreloc = _bfd_elf_make_dynamic_reloc_section 3447 1.1.1.2 christos (sec, dynobj, 2, abfd, /*rela?*/ true); 3448 1.1.1.2 christos 3449 1.1.1.2 christos if (sreloc == NULL) 3450 1.1 skrll return false; 3451 1.1.1.2 christos } 3452 1.1.1.2 christos 3453 1.1.1.2 christos sreloc->size += sizeof (Elf32_External_Rela); 3454 1.1 skrll 3455 1.1.1.2 christos /* We count the number of PC relative relocations we have 3456 1.1 skrll entered for this symbol, so that we can discard them 3457 1.1.1.2 christos again if the symbol is later defined by a regular object. 3458 1.1.1.2 christos We know that h is really a pointer to an 3459 1.1.1.2 christos elf_cris_link_hash_entry. */ 3460 1.1 skrll { 3461 1.1.1.2 christos struct elf_cris_link_hash_entry *eh; 3462 1.1.1.2 christos struct elf_cris_pcrel_relocs_copied *p; 3463 1.1.1.2 christos 3464 1.1.1.2 christos eh = elf_cris_hash_entry (h); 3465 1.1.1.2 christos 3466 1.1.1.9 christos for (p = eh->pcrel_relocs_copied; p != NULL; p = p->next) 3467 1.1.1.2 christos if (p->section == sec) 3468 1.1.1.2 christos break; 3469 1.1.1.2 christos 3470 1.1.1.2 christos if (p == NULL) 3471 1.1.1.2 christos { 3472 1.1.1.2 christos p = ((struct elf_cris_pcrel_relocs_copied *) 3473 1.1 skrll bfd_alloc (dynobj, (bfd_size_type) sizeof *p)); 3474 1.1.1.2 christos if (p == NULL) 3475 1.1.1.2 christos return false; 3476 1.1 skrll p->next = eh->pcrel_relocs_copied; 3477 1.1 skrll eh->pcrel_relocs_copied = p; 3478 1.1.1.6 christos p->section = sec; 3479 1.1.1.6 christos p->count = 0; 3480 1.1.1.6 christos p->r_type = r_type; 3481 1.1.1.6 christos } 3482 1.1.1.9 christos 3483 1.1.1.6 christos ++p->count; 3484 1.1.1.6 christos } 3485 1.1.1.6 christos break; 3486 1.1.1.6 christos 3487 1.1.1.6 christos /* This relocation describes the C++ object vtable hierarchy. 3488 1.1.1.8 christos Reconstruct it for later use during GC. */ 3489 1.1.1.9 christos case R_CRIS_GNU_VTINHERIT: 3490 1.1.1.6 christos if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset)) 3491 1.1 skrll return false; 3492 1.1.1.2 christos break; 3493 1.1.1.2 christos 3494 1.1.1.2 christos /* This relocation describes which C++ vtable entries are actually 3495 1.1.1.2 christos used. Record for later use during GC. */ 3496 1.1.1.2 christos case R_CRIS_GNU_VTENTRY: 3497 1.1 skrll if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend)) 3498 1.1 skrll return false; 3499 1.1 skrll break; 3500 1.1.1.9 christos 3501 1.1.1.6 christos case R_CRIS_16_TPREL: 3502 1.1 skrll case R_CRIS_32_TPREL: 3503 1.1 skrll /* Already warned above, when necessary. */ 3504 1.1.1.9 christos break; 3505 1.1 skrll 3506 1.1 skrll default: 3507 1.1 skrll /* Other relocs do not appear here. */ 3508 1.1 skrll bfd_set_error (bfd_error_bad_value); 3509 1.1.1.9 christos return false; 3510 1.1.1.11 christos } 3511 1.1.1.11 christos } 3512 1.1 skrll 3513 1.1.1.2 christos return true; 3514 1.1 skrll } 3515 1.1 skrll 3516 1.1.1.9 christos /* Set the sizes of the dynamic sections. */ 3517 1.1 skrll 3518 1.1.1.2 christos static bool 3519 1.1.1.2 christos elf_cris_late_size_sections (bfd *output_bfd ATTRIBUTE_UNUSED, 3520 1.1.1.9 christos struct bfd_link_info *info) 3521 1.1.1.2 christos { 3522 1.1.1.6 christos struct elf_cris_link_hash_table * htab; 3523 1.1.1.11 christos bfd *dynobj; 3524 1.1.1.11 christos asection *s; 3525 1.1 skrll bool relocs; 3526 1.1.1.6 christos 3527 1.1 skrll htab = elf_cris_hash_table (info); 3528 1.1 skrll if (htab == NULL) 3529 1.1.1.4 christos return false; 3530 1.1 skrll 3531 1.1.1.12 christos dynobj = htab->root.dynobj; 3532 1.1 skrll if (dynobj == NULL) 3533 1.1 skrll return true; 3534 1.1 skrll 3535 1.1.1.11 christos if (htab->root.dynamic_sections_created) 3536 1.1 skrll { 3537 1.1 skrll /* Set the contents of the .interp section to the interpreter. */ 3538 1.1 skrll if (bfd_link_executable (info) && !info->nointerp) 3539 1.1 skrll { 3540 1.1 skrll s = htab->root.interp; 3541 1.1.1.2 christos BFD_ASSERT (s != NULL); 3542 1.1.1.2 christos s->size = sizeof ELF_DYNAMIC_INTERPRETER; 3543 1.1 skrll s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER; 3544 1.1 skrll s->alloced = 1; 3545 1.1 skrll } 3546 1.1 skrll } 3547 1.1 skrll else 3548 1.1 skrll { 3549 1.1.1.6 christos /* Adjust all expected GOTPLT uses to use a GOT entry instead. */ 3550 1.1 skrll elf_cris_link_hash_traverse (htab, elf_cris_adjust_gotplt_to_got, 3551 1.1 skrll info); 3552 1.1 skrll 3553 1.1 skrll /* We may have created entries in the .rela.got section. 3554 1.1 skrll However, if we are not creating the dynamic sections, we will 3555 1.1 skrll not actually use these entries. Reset the size of .rela.got, 3556 1.1 skrll which will cause it to get stripped from the output file 3557 1.1 skrll below. */ 3558 1.1 skrll s = htab->root.srelgot; 3559 1.1 skrll if (s != NULL) 3560 1.1 skrll s->size = 0; 3561 1.1.1.4 christos } 3562 1.1.1.2 christos 3563 1.1 skrll /* If this is a -Bsymbolic shared link, then we need to discard all PC 3564 1.1.1.2 christos relative relocs against symbols defined in a regular object. We 3565 1.1 skrll allocated space for them in the check_relocs routine, but we will not 3566 1.1.1.2 christos fill them in in the relocate_section routine. We also discard space 3567 1.1 skrll for relocs that have become for local symbols due to symbol 3568 1.1.1.2 christos visibility changes. For programs, we discard space for relocs for 3569 1.1 skrll symbols not referenced by any dynamic object. */ 3570 1.1 skrll if (bfd_link_pic (info)) 3571 1.1 skrll elf_cris_link_hash_traverse (htab, 3572 1.1 skrll elf_cris_discard_excess_dso_dynamics, 3573 1.1.1.9 christos info); 3574 1.1 skrll else 3575 1.1 skrll elf_cris_link_hash_traverse (htab, 3576 1.1 skrll elf_cris_discard_excess_program_dynamics, 3577 1.1 skrll info); 3578 1.1 skrll 3579 1.1 skrll /* The check_relocs and adjust_dynamic_symbol entry points have 3580 1.1 skrll determined the sizes of the various dynamic sections. Allocate 3581 1.1 skrll memory for them. */ 3582 1.1 skrll relocs = false; 3583 1.1.1.8 christos for (s = dynobj->sections; s != NULL; s = s->next) 3584 1.1 skrll { 3585 1.1 skrll const char *name; 3586 1.1 skrll 3587 1.1.1.9 christos if ((s->flags & SEC_LINKER_CREATED) == 0) 3588 1.1 skrll continue; 3589 1.1.1.2 christos 3590 1.1.1.2 christos /* It's OK to base decisions on the section name, because none 3591 1.1.1.2 christos of the dynobj section names depend upon the input files. */ 3592 1.1.1.2 christos name = bfd_section_name (s); 3593 1.1.1.2 christos 3594 1.1.1.2 christos if (strcmp (name, ".plt") == 0) 3595 1.1.1.2 christos { 3596 1.1.1.2 christos ; 3597 1.1.1.9 christos } 3598 1.1 skrll else if (strcmp (name, ".got.plt") == 0) 3599 1.1.1.2 christos { 3600 1.1.1.2 christos /* The .got.plt contains the .got header as well as the 3601 1.1.1.4 christos actual .got.plt contents. The .got header may contain a 3602 1.1.1.2 christos R_CRIS_DTPMOD entry at index 3. */ 3603 1.1.1.2 christos s->size += htab->dtpmod_refcount != 0 3604 1.1 skrll ? 8 : 0; 3605 1.1 skrll } 3606 1.1 skrll else if (startswith (name, ".rela")) 3607 1.1.1.6 christos { 3608 1.1 skrll if (strcmp (name, ".rela.got") == 0 3609 1.1.1.9 christos && htab->dtpmod_refcount != 0 3610 1.1 skrll && bfd_link_pic (info)) 3611 1.1 skrll s->size += sizeof (Elf32_External_Rela); 3612 1.1 skrll 3613 1.1 skrll if (s->size != 0) 3614 1.1 skrll { 3615 1.1 skrll /* Remember whether there are any reloc sections other 3616 1.1.1.9 christos than .rela.plt. */ 3617 1.1.1.6 christos if (strcmp (name, ".rela.plt") != 0) 3618 1.1.1.6 christos relocs = true; 3619 1.1 skrll 3620 1.1 skrll /* We use the reloc_count field as a counter if we need 3621 1.1 skrll to copy relocs into the output file. */ 3622 1.1 skrll s->reloc_count = 0; 3623 1.1 skrll } 3624 1.1 skrll } 3625 1.1 skrll else if (! startswith (name, ".got") 3626 1.1 skrll && strcmp (name, ".dynbss") != 0 3627 1.1 skrll && s != htab->root.sdynrelro) 3628 1.1 skrll { 3629 1.1 skrll /* It's not one of our sections, so don't allocate space. */ 3630 1.1 skrll continue; 3631 1.1 skrll } 3632 1.1 skrll 3633 1.1 skrll if (s->size == 0) 3634 1.1 skrll { 3635 1.1 skrll /* If we don't need this section, strip it from the 3636 1.1 skrll output file. This is mostly to handle .rela.bss and 3637 1.1 skrll .rela.plt. We must create both sections in 3638 1.1 skrll create_dynamic_sections, because they must be created 3639 1.1 skrll before the linker maps input sections to output 3640 1.1 skrll sections. The linker does that before 3641 1.1 skrll adjust_dynamic_symbol is called, and it is that 3642 1.1 skrll function which decides whether anything needs to go 3643 1.1 skrll into these sections. */ 3644 1.1 skrll s->flags |= SEC_EXCLUDE; 3645 1.1 skrll continue; 3646 1.1 skrll } 3647 1.1 skrll 3648 1.1 skrll if ((s->flags & SEC_HAS_CONTENTS) == 0) 3649 1.1.1.9 christos continue; 3650 1.1.1.11 christos 3651 1.1 skrll /* Allocate memory for the section contents. We use bfd_zalloc here 3652 1.1 skrll in case unused entries are not reclaimed before the section's 3653 1.1.1.9 christos contents are written out. This should not happen, but this way 3654 1.1 skrll if it does, we will not write out garbage. For reloc sections, 3655 1.1 skrll this will make entries have the type R_CRIS_NONE. */ 3656 1.1 skrll s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size); 3657 1.1 skrll if (s->contents == NULL) 3658 1.1 skrll return false; 3659 1.1 skrll s->alloced = 1; 3660 1.1 skrll } 3661 1.1 skrll 3662 1.1 skrll return _bfd_elf_add_dynamic_tags (output_bfd, info, relocs); 3663 1.1 skrll } 3664 1.1 skrll 3665 1.1.1.9 christos /* This function is called via elf_cris_link_hash_traverse if we are 3666 1.1.1.3 christos creating a shared object. In the -Bsymbolic case, it discards the 3667 1.1.1.3 christos space allocated to copy PC relative relocs against symbols which 3668 1.1 skrll are defined in regular objects. For the normal non-symbolic case, 3669 1.1 skrll we also discard space for relocs that have become local due to 3670 1.1 skrll symbol visibility changes. We allocated space for them in the 3671 1.1 skrll check_relocs routine, but we won't fill them in in the 3672 1.1 skrll relocate_section routine. */ 3673 1.1 skrll 3674 1.1 skrll static bool 3675 1.1 skrll elf_cris_discard_excess_dso_dynamics (struct elf_cris_link_hash_entry *h, 3676 1.1 skrll void * inf) 3677 1.1.1.4 christos { 3678 1.1 skrll struct elf_cris_pcrel_relocs_copied *s; 3679 1.1 skrll struct bfd_link_info *info = (struct bfd_link_info *) inf; 3680 1.1.1.2 christos 3681 1.1.1.2 christos /* If a symbol has been forced local or we have found a regular 3682 1.1.1.2 christos definition for the symbolic link case, then we won't be needing 3683 1.1.1.2 christos any relocs. */ 3684 1.1.1.2 christos if (h->root.def_regular 3685 1.1.1.9 christos && (h->root.forced_local 3686 1.1.1.2 christos || SYMBOLIC_BIND (info, &h->root))) 3687 1.1.1.2 christos { 3688 1.1.1.9 christos for (s = h->pcrel_relocs_copied; s != NULL; s = s->next) 3689 1.1 skrll { 3690 1.1 skrll asection *sreloc 3691 1.1.1.2 christos = _bfd_elf_get_dynamic_reloc_section (elf_hash_table (info) 3692 1.1.1.2 christos ->dynobj, 3693 1.1.1.2 christos s->section, 3694 1.1.1.2 christos /*rela?*/ true); 3695 1.1.1.2 christos sreloc->size -= s->count * sizeof (Elf32_External_Rela); 3696 1.1.1.2 christos } 3697 1.1.1.2 christos return true; 3698 1.1.1.2 christos } 3699 1.1.1.2 christos 3700 1.1.1.2 christos /* If we have accounted for PC-relative relocs for read-only 3701 1.1.1.6 christos sections, now is the time to warn for them. We can't do it in 3702 1.1.1.6 christos cris_elf_check_relocs, because we don't know the status of all 3703 1.1.1.7 christos symbols at that time (and it's common to force symbols local 3704 1.1.1.7 christos late). */ 3705 1.1.1.2 christos 3706 1.1.1.2 christos for (s = h->pcrel_relocs_copied; s != NULL; s = s->next) 3707 1.1.1.2 christos if ((s->section->flags & SEC_READONLY) != 0) 3708 1.1.1.2 christos { 3709 1.1.1.2 christos /* FIXME: How do we make this optionally a warning only? */ 3710 1.1.1.2 christos _bfd_error_handler 3711 1.1.1.2 christos /* xgettext:c-format */ 3712 1.1.1.2 christos (_("%pB, section `%pA', to symbol `%s':" 3713 1.1.1.2 christos " relocation %s should not be used" 3714 1.1.1.9 christos " in a shared object; recompile with -fPIC"), 3715 1.1 skrll s->section->owner, 3716 1.1 skrll s->section, 3717 1.1 skrll h->root.root.root.string, 3718 1.1 skrll cris_elf_howto_table[s->r_type].name); 3719 1.1 skrll 3720 1.1 skrll info->flags |= DF_TEXTREL; 3721 1.1.1.9 christos } 3722 1.1.1.3 christos 3723 1.1.1.3 christos return true; 3724 1.1 skrll } 3725 1.1 skrll 3726 1.1 skrll /* This function is called via elf_cris_link_hash_traverse if we are *not* 3727 1.1 skrll creating a shared object. We discard space for relocs for symbols put 3728 1.1 skrll in the .got, but which we found we do not have to resolve at run-time. */ 3729 1.1 skrll 3730 1.1 skrll static bool 3731 1.1 skrll elf_cris_discard_excess_program_dynamics (struct elf_cris_link_hash_entry *h, 3732 1.1 skrll void * inf) 3733 1.1 skrll { 3734 1.1 skrll struct bfd_link_info *info = (struct bfd_link_info *) inf; 3735 1.1.1.2 christos 3736 1.1 skrll /* If we're not creating a shared library and have a symbol which is 3737 1.1 skrll referred to by .got references, but the symbol is defined locally, 3738 1.1 skrll (or rather, not defined by a DSO) then lose the reloc for the .got 3739 1.1 skrll (don't allocate room for it). Likewise for relocs for something 3740 1.1 skrll for which we create a PLT. */ 3741 1.1 skrll if (!h->root.def_dynamic 3742 1.1.1.6 christos || h->root.plt.refcount > 0) 3743 1.1 skrll { 3744 1.1 skrll if (h->reg_got_refcount > 0 3745 1.1 skrll /* The size of this section is only valid and in sync with the 3746 1.1 skrll various reference counts if we do dynamic; don't decrement it 3747 1.1 skrll otherwise. */ 3748 1.1 skrll && elf_hash_table (info)->dynamic_sections_created) 3749 1.1 skrll { 3750 1.1 skrll bfd *dynobj = elf_hash_table (info)->dynobj; 3751 1.1 skrll asection *srelgot = elf_hash_table (info)->srelgot; 3752 1.1 skrll 3753 1.1 skrll BFD_ASSERT (dynobj != NULL); 3754 1.1.1.5 christos BFD_ASSERT (srelgot != NULL); 3755 1.1.1.5 christos 3756 1.1.1.5 christos srelgot->size -= sizeof (Elf32_External_Rela); 3757 1.1.1.5 christos } 3758 1.1 skrll 3759 1.1.1.6 christos /* If the locally-defined symbol isn't used by a DSO, then we don't 3760 1.1 skrll have to export it as a dynamic symbol. This was already done for 3761 1.1 skrll functions; doing this for all symbols would presumably not 3762 1.1 skrll introduce new problems. Of course we don't do this if we're 3763 1.1 skrll exporting all dynamic symbols, or all data symbols, regardless of 3764 1.1 skrll them being referenced or not. */ 3765 1.1 skrll if (! (info->export_dynamic 3766 1.1 skrll || (h->root.type != STT_FUNC && info->dynamic_data)) 3767 1.1 skrll && h->root.dynindx != -1 3768 1.1 skrll && !h->root.dynamic 3769 1.1.1.9 christos && !h->root.def_dynamic 3770 1.1 skrll && !h->root.ref_dynamic) 3771 1.1 skrll { 3772 1.1 skrll h->root.dynindx = -1; 3773 1.1 skrll _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr, 3774 1.1 skrll h->root.dynstr_index); 3775 1.1.1.9 christos } 3776 1.1.1.3 christos } 3777 1.1 skrll 3778 1.1 skrll return true; 3779 1.1.1.9 christos } 3780 1.1 skrll 3781 1.1 skrll /* Reject a file depending on presence and expectation of prefixed 3782 1.1 skrll underscores on symbols. */ 3783 1.1 skrll 3784 1.1 skrll static bool 3785 1.1 skrll cris_elf_object_p (bfd *abfd) 3786 1.1 skrll { 3787 1.1 skrll if (! cris_elf_set_mach_from_flags (abfd, elf_elfheader (abfd)->e_flags)) 3788 1.1 skrll return false; 3789 1.1 skrll 3790 1.1.1.9 christos if ((elf_elfheader (abfd)->e_flags & EF_CRIS_UNDERSCORE)) 3791 1.1.1.8 christos return (bfd_get_symbol_leading_char (abfd) == '_'); 3792 1.1 skrll else 3793 1.1 skrll return (bfd_get_symbol_leading_char (abfd) == 0); 3794 1.1 skrll } 3795 1.1 skrll 3796 1.1 skrll /* Mark presence or absence of leading underscore. Set machine type 3797 1.1 skrll flags from mach type. */ 3798 1.1 skrll 3799 1.1 skrll static bool 3800 1.1 skrll cris_elf_final_write_processing (bfd *abfd) 3801 1.1 skrll { 3802 1.1 skrll unsigned long e_flags = elf_elfheader (abfd)->e_flags; 3803 1.1 skrll 3804 1.1 skrll e_flags &= ~EF_CRIS_UNDERSCORE; 3805 1.1 skrll if (bfd_get_symbol_leading_char (abfd) == '_') 3806 1.1 skrll e_flags |= EF_CRIS_UNDERSCORE; 3807 1.1 skrll 3808 1.1 skrll switch (bfd_get_mach (abfd)) 3809 1.1 skrll { 3810 1.1 skrll case bfd_mach_cris_v0_v10: 3811 1.1 skrll e_flags |= EF_CRIS_VARIANT_ANY_V0_V10; 3812 1.1 skrll break; 3813 1.1 skrll 3814 1.1 skrll case bfd_mach_cris_v10_v32: 3815 1.1.1.7 christos e_flags |= EF_CRIS_VARIANT_COMMON_V10_V32; 3816 1.1 skrll break; 3817 1.1 skrll 3818 1.1 skrll case bfd_mach_cris_v32: 3819 1.1.1.8 christos e_flags |= EF_CRIS_VARIANT_V32; 3820 1.1 skrll break; 3821 1.1 skrll 3822 1.1 skrll default: 3823 1.1 skrll _bfd_abort (__FILE__, __LINE__, 3824 1.1.1.9 christos _("unexpected machine number")); 3825 1.1.1.3 christos } 3826 1.1.1.3 christos 3827 1.1 skrll elf_elfheader (abfd)->e_flags = e_flags; 3828 1.1 skrll return _bfd_elf_final_write_processing (abfd); 3829 1.1 skrll } 3830 1.1 skrll 3831 1.1 skrll /* Set the mach type from e_flags value. */ 3832 1.1 skrll 3833 1.1 skrll static bool 3834 1.1 skrll cris_elf_set_mach_from_flags (bfd *abfd, 3835 1.1 skrll unsigned long flags) 3836 1.1 skrll { 3837 1.1 skrll switch (flags & EF_CRIS_VARIANT_MASK) 3838 1.1 skrll { 3839 1.1 skrll case EF_CRIS_VARIANT_ANY_V0_V10: 3840 1.1 skrll bfd_default_set_arch_mach (abfd, bfd_arch_cris, bfd_mach_cris_v0_v10); 3841 1.1 skrll break; 3842 1.1 skrll 3843 1.1 skrll case EF_CRIS_VARIANT_V32: 3844 1.1 skrll bfd_default_set_arch_mach (abfd, bfd_arch_cris, bfd_mach_cris_v32); 3845 1.1 skrll break; 3846 1.1 skrll 3847 1.1.1.9 christos case EF_CRIS_VARIANT_COMMON_V10_V32: 3848 1.1 skrll bfd_default_set_arch_mach (abfd, bfd_arch_cris, bfd_mach_cris_v10_v32); 3849 1.1 skrll break; 3850 1.1.1.9 christos 3851 1.1 skrll default: 3852 1.1 skrll /* Since we don't recognize them, we obviously can't support them 3853 1.1 skrll with this code; we'd have to require that all future handling 3854 1.1 skrll would be optional. */ 3855 1.1.1.9 christos bfd_set_error (bfd_error_wrong_format); 3856 1.1.1.3 christos return false; 3857 1.1 skrll } 3858 1.1 skrll 3859 1.1 skrll return true; 3860 1.1 skrll } 3861 1.1 skrll 3862 1.1 skrll /* Display the flags field. */ 3863 1.1 skrll 3864 1.1 skrll static bool 3865 1.1 skrll cris_elf_print_private_bfd_data (bfd *abfd, void * ptr) 3866 1.1 skrll { 3867 1.1 skrll FILE *file = (FILE *) ptr; 3868 1.1 skrll 3869 1.1 skrll BFD_ASSERT (abfd != NULL && ptr != NULL); 3870 1.1 skrll 3871 1.1 skrll _bfd_elf_print_private_bfd_data (abfd, ptr); 3872 1.1 skrll 3873 1.1 skrll fprintf (file, _("private flags = %lx:"), elf_elfheader (abfd)->e_flags); 3874 1.1 skrll 3875 1.1 skrll if (elf_elfheader (abfd)->e_flags & EF_CRIS_UNDERSCORE) 3876 1.1.1.9 christos fprintf (file, _(" [symbols have a _ prefix]")); 3877 1.1 skrll if ((elf_elfheader (abfd)->e_flags & EF_CRIS_VARIANT_MASK) 3878 1.1 skrll == EF_CRIS_VARIANT_COMMON_V10_V32) 3879 1.1 skrll fprintf (file, _(" [v10 and v32]")); 3880 1.1 skrll if ((elf_elfheader (abfd)->e_flags & EF_CRIS_VARIANT_MASK) 3881 1.1.1.9 christos == EF_CRIS_VARIANT_V32) 3882 1.1.1.6 christos fprintf (file, _(" [v32]")); 3883 1.1 skrll 3884 1.1.1.6 christos fputc ('\n', file); 3885 1.1 skrll return true; 3886 1.1 skrll } 3887 1.1.1.6 christos 3888 1.1.1.9 christos /* Don't mix files with and without a leading underscore. */ 3889 1.1 skrll 3890 1.1.1.12 christos static bool 3891 1.1.1.9 christos cris_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info) 3892 1.1 skrll { 3893 1.1 skrll bfd *obfd = info->output_bfd; 3894 1.1 skrll int imach, omach; 3895 1.1 skrll 3896 1.1 skrll if (! _bfd_generic_verify_endian_match (ibfd, info)) 3897 1.1 skrll return false; 3898 1.1.1.9 christos 3899 1.1 skrll if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour) 3900 1.1 skrll return true; 3901 1.1 skrll 3902 1.1 skrll imach = bfd_get_mach (ibfd); 3903 1.1 skrll 3904 1.1 skrll if (! elf_flags_init (obfd)) 3905 1.1 skrll { 3906 1.1 skrll /* This happens when ld starts out with a 'blank' output file. */ 3907 1.1 skrll elf_flags_init (obfd) = true; 3908 1.1.1.9 christos 3909 1.1 skrll /* We ignore the linker-set mach, and instead set it according to 3910 1.1 skrll the first input file. This would also happen if we could 3911 1.1 skrll somehow filter out the OUTPUT_ARCH () setting from elf.sc. 3912 1.1 skrll This allows us to keep the same linker config across 3913 1.1 skrll cris(v0..v10) and crisv32. The drawback is that we can't force 3914 1.1.1.6 christos the output type, which might be a sane thing to do for a 3915 1.1 skrll v10+v32 compatibility object. */ 3916 1.1.1.7 christos if (! bfd_set_arch_mach (obfd, bfd_arch_cris, imach)) 3917 1.1.1.7 christos return false; 3918 1.1 skrll } 3919 1.1 skrll 3920 1.1.1.9 christos if (bfd_get_symbol_leading_char (ibfd) 3921 1.1 skrll != bfd_get_symbol_leading_char (obfd)) 3922 1.1 skrll { 3923 1.1 skrll _bfd_error_handler 3924 1.1 skrll (bfd_get_symbol_leading_char (ibfd) == '_' 3925 1.1 skrll ? _("%pB: uses _-prefixed symbols, but writing file with non-prefixed symbols") 3926 1.1 skrll : _("%pB: uses non-prefixed symbols, but writing file with _-prefixed symbols"), 3927 1.1 skrll ibfd); 3928 1.1 skrll bfd_set_error (bfd_error_bad_value); 3929 1.1 skrll return false; 3930 1.1 skrll } 3931 1.1 skrll 3932 1.1 skrll omach = bfd_get_mach (obfd); 3933 1.1 skrll 3934 1.1.1.6 christos if (imach != omach) 3935 1.1 skrll { 3936 1.1.1.7 christos /* We can get an incompatible combination only if either is 3937 1.1 skrll bfd_mach_cris_v32, and the other one isn't compatible. */ 3938 1.1.1.7 christos if ((imach == bfd_mach_cris_v32 3939 1.1 skrll && omach != bfd_mach_cris_v10_v32) 3940 1.1 skrll || (omach == bfd_mach_cris_v32 3941 1.1 skrll && imach != bfd_mach_cris_v10_v32)) 3942 1.1.1.9 christos { 3943 1.1 skrll _bfd_error_handler 3944 1.1 skrll ((imach == bfd_mach_cris_v32) 3945 1.1 skrll ? _("%pB contains CRIS v32 code, incompatible" 3946 1.1 skrll " with previous objects") 3947 1.1 skrll : _("%pB contains non-CRIS-v32 code, incompatible" 3948 1.1 skrll " with previous objects"), 3949 1.1 skrll ibfd); 3950 1.1.1.9 christos bfd_set_error (bfd_error_bad_value); 3951 1.1 skrll return false; 3952 1.1 skrll } 3953 1.1.1.9 christos 3954 1.1 skrll /* We don't have to check the case where the input is compatible 3955 1.1 skrll with v10 and v32, because the output is already known to be set 3956 1.1 skrll to the other (compatible) mach. */ 3957 1.1 skrll if (omach == bfd_mach_cris_v10_v32 3958 1.1.1.9 christos && ! bfd_set_arch_mach (obfd, bfd_arch_cris, imach)) 3959 1.1.1.3 christos return false; 3960 1.1 skrll } 3961 1.1.1.12 christos 3962 1.1.1.9 christos return true; 3963 1.1 skrll } 3964 1.1.1.6 christos 3965 1.1.1.6 christos /* Do side-effects of e_flags copying to obfd. */ 3966 1.1.1.9 christos 3967 1.1.1.6 christos static bool 3968 1.1 skrll cris_elf_copy_private_bfd_data (bfd *ibfd, bfd *obfd) 3969 1.1 skrll { 3970 1.1 skrll if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour) 3971 1.1 skrll return true; 3972 1.1 skrll 3973 1.1.1.4 christos /* Call the base function. */ 3974 1.1.1.4 christos if (!_bfd_elf_copy_private_bfd_data (ibfd, obfd)) 3975 1.1.1.4 christos return false; 3976 1.1 skrll 3977 1.1.1.2 christos /* Do what we really came here for. */ 3978 1.1.1.2 christos return bfd_set_arch_mach (obfd, bfd_arch_cris, bfd_get_mach (ibfd)); 3979 1.1 skrll } 3980 1.1 skrll 3981 1.1 skrll static enum elf_reloc_type_class 3982 1.1 skrll elf_cris_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED, 3983 1.1 skrll const asection *rel_sec ATTRIBUTE_UNUSED, 3984 1.1 skrll const Elf_Internal_Rela *rela) 3985 1.1 skrll { 3986 1.1 skrll enum elf_cris_reloc_type r_type = ELF32_R_TYPE (rela->r_info); 3987 1.1 skrll switch (r_type) 3988 1.1 skrll { 3989 1.1 skrll case R_CRIS_RELATIVE: 3990 1.1.1.2 christos return reloc_class_relative; 3991 1.1.1.2 christos case R_CRIS_JUMP_SLOT: 3992 1.1.1.2 christos return reloc_class_plt; 3993 1.1.1.2 christos case R_CRIS_COPY: 3994 1.1.1.2 christos return reloc_class_copy; 3995 1.1.1.2 christos default: 3996 1.1.1.2 christos return reloc_class_normal; 3997 1.1.1.2 christos } 3998 1.1.1.2 christos } 3999 1.1.1.2 christos 4000 1.1.1.2 christos /* The elf_backend_got_elt_size worker. For one symbol, we can have up to 4001 1.1.1.2 christos two GOT entries from three types with two different sizes. We handle 4002 1.1.1.2 christos it as a single entry, so we can use the regular offset-calculation 4003 1.1.1.2 christos machinery. */ 4004 1.1.1.2 christos 4005 1.1.1.2 christos static bfd_vma 4006 1.1.1.2 christos elf_cris_got_elt_size (bfd *abfd ATTRIBUTE_UNUSED, 4007 1.1.1.2 christos struct bfd_link_info *info ATTRIBUTE_UNUSED, 4008 1.1.1.2 christos struct elf_link_hash_entry *hr, 4009 1.1.1.2 christos bfd *ibfd, 4010 1.1.1.2 christos unsigned long symndx) 4011 1.1.1.2 christos { 4012 1.1.1.2 christos struct elf_link_hash_entry *h = (struct elf_link_hash_entry *) hr; 4013 1.1.1.2 christos bfd_vma eltsiz = 0; 4014 1.1.1.2 christos 4015 1.1.1.2 christos /* We may have one regular GOT entry or up to two TLS GOT 4016 1.1.1.2 christos entries. */ 4017 1.1.1.2 christos if (h == NULL) 4018 1.1.1.2 christos { 4019 1.1.1.2 christos Elf_Internal_Shdr *symtab_hdr = &elf_tdata (ibfd)->symtab_hdr; 4020 1.1.1.2 christos bfd_signed_vma *local_got_refcounts = elf_local_got_refcounts (ibfd); 4021 1.1.1.2 christos 4022 1.1.1.2 christos BFD_ASSERT (local_got_refcounts != NULL); 4023 1.1.1.2 christos 4024 1.1.1.2 christos if (local_got_refcounts[LGOT_REG_NDX (symndx)] > 0) 4025 1.1.1.2 christos { 4026 1.1.1.2 christos /* We can't have a variable referred to both as a regular 4027 1.1.1.2 christos variable and through TLS relocs. */ 4028 1.1.1.2 christos BFD_ASSERT (local_got_refcounts[LGOT_DTP_NDX (symndx)] == 0 4029 1.1.1.2 christos && local_got_refcounts[LGOT_TPREL_NDX (symndx)] == 0); 4030 1.1.1.2 christos return 4; 4031 1.1.1.2 christos } 4032 1.1.1.2 christos 4033 1.1.1.2 christos if (local_got_refcounts[LGOT_DTP_NDX (symndx)] > 0) 4034 1.1.1.2 christos eltsiz += 8; 4035 1.1.1.2 christos 4036 1.1.1.2 christos if (local_got_refcounts[LGOT_TPREL_NDX (symndx)] > 0) 4037 1.1.1.2 christos eltsiz += 4; 4038 1.1.1.2 christos } 4039 1.1.1.2 christos else 4040 1.1.1.2 christos { 4041 1.1.1.2 christos struct elf_cris_link_hash_entry *hh = elf_cris_hash_entry (h); 4042 1.1.1.2 christos if (hh->reg_got_refcount > 0) 4043 1.1.1.2 christos { 4044 1.1.1.2 christos /* The actual error-on-input is emitted elsewhere. */ 4045 1.1.1.2 christos BFD_ASSERT (hh->dtp_refcount == 0 && hh->tprel_refcount == 0); 4046 1.1.1.2 christos return 4; 4047 1.1.1.2 christos } 4048 1.1.1.2 christos 4049 1.1.1.2 christos if (hh->dtp_refcount > 0) 4050 1.1.1.2 christos eltsiz += 8; 4051 1.1.1.2 christos 4052 1.1 skrll if (hh->tprel_refcount > 0) 4053 1.1 skrll eltsiz += 4; 4054 1.1.1.2 christos } 4055 1.1 skrll 4056 1.1 skrll /* We're only called when h->got.refcount is non-zero, so we must 4057 1.1 skrll have a non-zero size. */ 4058 1.1.1.4 christos BFD_ASSERT (eltsiz != 0); 4059 1.1 skrll return eltsiz; 4060 1.1 skrll } 4061 1.1 skrll 4062 1.1 skrll #define ELF_ARCH bfd_arch_cris 4064 1.1 skrll #define ELF_TARGET_ID CRIS_ELF_DATA 4065 1.1 skrll #define ELF_MACHINE_CODE EM_CRIS 4066 1.1.1.2 christos #define ELF_MAXPAGESIZE 0x2000 4067 1.1.1.6 christos 4068 1.1 skrll #define TARGET_LITTLE_SYM cris_elf32_vec 4069 1.1 skrll #define TARGET_LITTLE_NAME "elf32-cris" 4070 1.1 skrll #define elf_symbol_leading_char 0 4071 1.1 skrll 4072 1.1 skrll #define elf_info_to_howto_rel NULL 4073 1.1 skrll #define elf_info_to_howto cris_info_to_howto_rela 4074 1.1 skrll #define elf_backend_relocate_section cris_elf_relocate_section 4075 1.1 skrll #define elf_backend_gc_mark_hook cris_elf_gc_mark_hook 4076 1.1 skrll #define elf_backend_plt_sym_val cris_elf_plt_sym_val 4077 1.1 skrll #define elf_backend_check_relocs cris_elf_check_relocs 4078 1.1 skrll #define elf_backend_grok_prstatus cris_elf_grok_prstatus 4079 1.1 skrll #define elf_backend_grok_psinfo cris_elf_grok_psinfo 4080 1.1 skrll 4081 1.1 skrll #define elf_backend_can_gc_sections 1 4082 1.1 skrll #define elf_backend_can_refcount 1 4083 1.1 skrll 4084 1.1 skrll #define elf_backend_object_p cris_elf_object_p 4085 1.1 skrll #define elf_backend_final_write_processing \ 4086 1.1 skrll cris_elf_final_write_processing 4087 1.1 skrll #define bfd_elf32_bfd_print_private_bfd_data \ 4088 1.1 skrll cris_elf_print_private_bfd_data 4089 1.1 skrll #define bfd_elf32_bfd_merge_private_bfd_data \ 4090 1.1 skrll cris_elf_merge_private_bfd_data 4091 1.1.1.2 christos #define bfd_elf32_bfd_copy_private_bfd_data \ 4092 1.1.1.2 christos cris_elf_copy_private_bfd_data 4093 1.1.1.11 christos 4094 1.1.1.11 christos #define bfd_elf32_bfd_reloc_type_lookup cris_reloc_type_lookup 4095 1.1 skrll #define bfd_elf32_bfd_reloc_name_lookup cris_reloc_name_lookup 4096 1.1 skrll 4097 1.1 skrll #define bfd_elf32_bfd_link_hash_table_create \ 4098 1.1 skrll elf_cris_link_hash_table_create 4099 1.1 skrll #define elf_backend_adjust_dynamic_symbol \ 4100 1.1 skrll elf_cris_adjust_dynamic_symbol 4101 1.1 skrll #define elf_backend_copy_indirect_symbol \ 4102 1.1.1.12 christos elf_cris_copy_indirect_symbol 4103 1.1 skrll #define elf_backend_late_size_sections \ 4104 1.1 skrll elf_cris_late_size_sections 4105 1.1 skrll #define elf_backend_init_index_section _bfd_elf_init_1_index_section 4106 1.1 skrll #define elf_backend_finish_dynamic_symbol \ 4107 1.1 skrll elf_cris_finish_dynamic_symbol 4108 1.1 skrll #define elf_backend_finish_dynamic_sections \ 4109 1.1 skrll elf_cris_finish_dynamic_sections 4110 1.1.1.2 christos #define elf_backend_create_dynamic_sections \ 4111 1.1.1.6 christos _bfd_elf_create_dynamic_sections 4112 1.1.1.6 christos #define bfd_elf32_bfd_final_link _bfd_elf_gc_common_final_link 4113 1.1 skrll #define elf_backend_hide_symbol elf_cris_hide_symbol 4114 1.1.1.9 christos #define elf_backend_reloc_type_class elf_cris_reloc_type_class 4115 1.1.1.9 christos 4116 1.1 skrll #define elf_backend_want_got_plt 1 4117 1.1 skrll #define elf_backend_plt_readonly 1 4118 1.1 skrll #define elf_backend_want_plt_sym 0 4119 1.1 skrll #define elf_backend_got_header_size 12 4120 1.1 skrll #define elf_backend_got_elt_size elf_cris_got_elt_size 4121 1.1 skrll #define elf_backend_dtrel_excludes_plt 1 4122 1.1 skrll #define elf_backend_want_dynrelro 1 4123 1.1.1.9 christos 4124 1.1.1.6 christos #define elf_backend_default_execstack 0 4125 1.1 skrll 4126 1.1 skrll /* Later, we my want to optimize RELA entries into REL entries for dynamic 4127 1.1 skrll linking and libraries (if it's a win of any significance). Until then, 4128 1.1 skrll take the easy route. */ 4129 1.1 skrll #define elf_backend_may_use_rel_p 0 4130 1.1 skrll #define elf_backend_may_use_rela_p 1 4131 1.1.1.4 christos #define elf_backend_rela_normal 1 4132 1.1 skrll 4133 1.1 skrll #define elf_backend_linux_prpsinfo32_ugid16 true 4134 1.1 skrll 4135 1.1 skrll #include "elf32-target.h" 4136 1.1 skrll 4137 1.1 skrll #undef TARGET_LITTLE_SYM 4138 #undef TARGET_LITTLE_NAME 4139 #undef elf_symbol_leading_char 4140 4141 #define TARGET_LITTLE_SYM cris_elf32_us_vec 4142 #define TARGET_LITTLE_NAME "elf32-us-cris" 4143 #define elf_symbol_leading_char '_' 4144 #undef elf32_bed 4145 #define elf32_bed elf32_us_cris_bed 4146 4147 #include "elf32-target.h" 4148