1 1.1 christos /* Lattice Mico32-specific support for 32-bit ELF 2 1.1.1.11 christos Copyright (C) 2008-2026 Free Software Foundation, Inc. 3 1.1 christos Contributed by Jon Beniston <jon (at) beniston.com> 4 1.1 christos 5 1.1 christos This file is part of BFD, the Binary File Descriptor library. 6 1.1 christos 7 1.1 christos This program is free software; you can redistribute it and/or modify 8 1.1 christos it under the terms of the GNU General Public License as published by 9 1.1 christos the Free Software Foundation; either version 3 of the License, or 10 1.1 christos (at your option) any later version. 11 1.1 christos 12 1.1 christos This program is distributed in the hope that it will be useful, 13 1.1 christos but WITHOUT ANY WARRANTY; without even the implied warranty of 14 1.1 christos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 1.1 christos GNU General Public License for more details. 16 1.1 christos 17 1.1 christos You should have received a copy of the GNU General Public License 18 1.1 christos along with this program; if not, write to the Free Software 19 1.1 christos Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, 20 1.1 christos MA 02110-1301, USA. */ 21 1.1 christos 22 1.1 christos #include "sysdep.h" 23 1.1.1.2 christos #include "bfd.h" 24 1.1 christos #include "libbfd.h" 25 1.1 christos #include "elf-bfd.h" 26 1.1 christos #include "elf/lm32.h" 27 1.1 christos 28 1.1 christos #define DEFAULT_STACK_SIZE 0x20000 29 1.1 christos 30 1.1 christos #define PLT_ENTRY_SIZE 20 31 1.1 christos 32 1.1 christos #define PLT0_ENTRY_WORD0 0 33 1.1 christos #define PLT0_ENTRY_WORD1 0 34 1.1 christos #define PLT0_ENTRY_WORD2 0 35 1.1 christos #define PLT0_ENTRY_WORD3 0 36 1.1 christos #define PLT0_ENTRY_WORD4 0 37 1.1 christos 38 1.1 christos #define PLT0_PIC_ENTRY_WORD0 0 39 1.1 christos #define PLT0_PIC_ENTRY_WORD1 0 40 1.1 christos #define PLT0_PIC_ENTRY_WORD2 0 41 1.1 christos #define PLT0_PIC_ENTRY_WORD3 0 42 1.1 christos #define PLT0_PIC_ENTRY_WORD4 0 43 1.1 christos 44 1.1 christos #define ELF_DYNAMIC_INTERPRETER "/usr/lib/libc.so.1" 45 1.1 christos 46 1.1.1.3 christos extern const bfd_target lm32_elf32_fdpic_vec; 47 1.1 christos 48 1.1.1.3 christos #define IS_FDPIC(bfd) ((bfd)->xvec == &lm32_elf32_fdpic_vec) 49 1.1 christos 50 1.1 christos static bfd_reloc_status_type lm32_elf_gprel_reloc 51 1.1 christos (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); 52 1.1 christos 53 1.1 christos /* lm32 ELF linker hash table. */ 54 1.1 christos 55 1.1 christos struct elf_lm32_link_hash_table 56 1.1 christos { 57 1.1 christos struct elf_link_hash_table root; 58 1.1 christos 59 1.1 christos /* Short-cuts to get to dynamic linker sections. */ 60 1.1 christos asection *sfixup32; 61 1.1 christos asection *sdynbss; 62 1.1 christos asection *srelbss; 63 1.1 christos 64 1.1 christos int relocs32; 65 1.1 christos }; 66 1.1 christos 67 1.1 christos /* Get the lm32 ELF linker hash table from a link_info structure. */ 68 1.1 christos 69 1.1 christos #define lm32_elf_hash_table(p) \ 70 1.1.1.8 christos ((is_elf_hash_table ((p)->hash) \ 71 1.1.1.8 christos && elf_hash_table_id (elf_hash_table (p)) == LM32_ELF_DATA) \ 72 1.1.1.8 christos ? (struct elf_lm32_link_hash_table *) (p)->hash : NULL) 73 1.1 christos 74 1.1 christos #define lm32fdpic_got_section(info) \ 75 1.1.1.5 christos (lm32_elf_hash_table (info)->root.sgot) 76 1.1 christos #define lm32fdpic_gotrel_section(info) \ 77 1.1.1.5 christos (lm32_elf_hash_table (info)->root.srelgot) 78 1.1 christos #define lm32fdpic_fixup32_section(info) \ 79 1.1 christos (lm32_elf_hash_table (info)->sfixup32) 80 1.1 christos 81 1.1 christos struct weak_symbol_list 82 1.1 christos { 83 1.1 christos const char *name; 84 1.1 christos struct weak_symbol_list *next; 85 1.1 christos }; 86 1.1 christos 87 1.1 christos /* Create an lm32 ELF linker hash table. */ 88 1.1 christos 89 1.1 christos static struct bfd_link_hash_table * 90 1.1 christos lm32_elf_link_hash_table_create (bfd *abfd) 91 1.1 christos { 92 1.1 christos struct elf_lm32_link_hash_table *ret; 93 1.1.1.8 christos size_t amt = sizeof (struct elf_lm32_link_hash_table); 94 1.1 christos 95 1.1.1.3 christos ret = bfd_zmalloc (amt); 96 1.1 christos if (ret == NULL) 97 1.1 christos return NULL; 98 1.1 christos 99 1.1 christos if (!_bfd_elf_link_hash_table_init (&ret->root, abfd, 100 1.1.1.8 christos _bfd_elf_link_hash_newfunc, 101 1.1.1.10 christos sizeof (struct elf_link_hash_entry))) 102 1.1 christos { 103 1.1 christos free (ret); 104 1.1 christos return NULL; 105 1.1 christos } 106 1.1 christos 107 1.1 christos return &ret->root.root; 108 1.1 christos } 109 1.1 christos 110 1.1 christos /* Add a fixup to the ROFIXUP section. */ 111 1.1 christos 112 1.1 christos static bfd_vma 113 1.1 christos _lm32fdpic_add_rofixup (bfd *output_bfd, asection *rofixup, bfd_vma relocation) 114 1.1 christos { 115 1.1 christos bfd_vma fixup_offset; 116 1.1 christos 117 1.1 christos if (rofixup->flags & SEC_EXCLUDE) 118 1.1 christos return -1; 119 1.1 christos 120 1.1 christos fixup_offset = rofixup->reloc_count * 4; 121 1.1 christos if (rofixup->contents) 122 1.1 christos { 123 1.1 christos BFD_ASSERT (fixup_offset < rofixup->size); 124 1.1 christos if (fixup_offset < rofixup->size) 125 1.1 christos bfd_put_32 (output_bfd, relocation, rofixup->contents + fixup_offset); 126 1.1 christos } 127 1.1 christos rofixup->reloc_count++; 128 1.1 christos 129 1.1 christos return fixup_offset; 130 1.1 christos } 131 1.1 christos 132 1.1 christos /* Create .rofixup sections in DYNOBJ, and set up 133 1.1 christos shortcuts to them in our hash table. */ 134 1.1 christos 135 1.1.1.8 christos static bool 136 1.1 christos create_rofixup_section (bfd *dynobj, struct bfd_link_info *info) 137 1.1 christos { 138 1.1 christos struct elf_lm32_link_hash_table *htab; 139 1.1 christos htab = lm32_elf_hash_table (info); 140 1.1 christos 141 1.1 christos if (htab == NULL) 142 1.1.1.8 christos return false; 143 1.1 christos 144 1.1 christos /* Fixup section for R_LM32_32 relocs. */ 145 1.1.1.2 christos lm32fdpic_fixup32_section (info) 146 1.1.1.2 christos = bfd_make_section_anyway_with_flags (dynobj, 147 1.1.1.2 christos ".rofixup", 148 1.1.1.2 christos (SEC_ALLOC 149 1.1.1.2 christos | SEC_LOAD 150 1.1.1.2 christos | SEC_HAS_CONTENTS 151 1.1.1.2 christos | SEC_IN_MEMORY 152 1.1.1.2 christos | SEC_LINKER_CREATED 153 1.1.1.2 christos | SEC_READONLY)); 154 1.1 christos if (lm32fdpic_fixup32_section (info) == NULL 155 1.1.1.7 christos || !bfd_set_section_alignment (lm32fdpic_fixup32_section (info), 2)) 156 1.1.1.8 christos return false; 157 1.1 christos 158 1.1.1.8 christos return true; 159 1.1 christos } 160 1.1 christos 161 1.1 christos static reloc_howto_type lm32_elf_howto_table [] = 162 1.1 christos { 163 1.1 christos /* This reloc does nothing. */ 164 1.1.1.5 christos HOWTO (R_LM32_NONE, /* type */ 165 1.1.1.5 christos 0, /* rightshift */ 166 1.1.1.8 christos 0, /* size */ 167 1.1.1.5 christos 0, /* bitsize */ 168 1.1.1.8 christos false, /* pc_relative */ 169 1.1.1.5 christos 0, /* bitpos */ 170 1.1.1.5 christos complain_overflow_dont, /* complain_on_overflow */ 171 1.1.1.5 christos bfd_elf_generic_reloc, /* special_function */ 172 1.1.1.5 christos "R_LM32_NONE", /* name */ 173 1.1.1.8 christos false, /* partial_inplace */ 174 1.1.1.5 christos 0, /* src_mask */ 175 1.1.1.5 christos 0, /* dst_mask */ 176 1.1.1.8 christos false), /* pcrel_offset */ 177 1.1 christos 178 1.1 christos /* An 8 bit absolute relocation. */ 179 1.1.1.5 christos HOWTO (R_LM32_8, /* type */ 180 1.1.1.5 christos 0, /* rightshift */ 181 1.1.1.8 christos 1, /* size */ 182 1.1.1.5 christos 8, /* bitsize */ 183 1.1.1.8 christos false, /* pc_relative */ 184 1.1.1.5 christos 0, /* bitpos */ 185 1.1.1.5 christos complain_overflow_bitfield,/* complain_on_overflow */ 186 1.1.1.5 christos bfd_elf_generic_reloc, /* special_function */ 187 1.1.1.5 christos "R_LM32_8", /* name */ 188 1.1.1.8 christos false, /* partial_inplace */ 189 1.1.1.5 christos 0, /* src_mask */ 190 1.1.1.5 christos 0xff, /* dst_mask */ 191 1.1.1.8 christos false), /* pcrel_offset */ 192 1.1 christos 193 1.1 christos /* A 16 bit absolute relocation. */ 194 1.1.1.5 christos HOWTO (R_LM32_16, /* type */ 195 1.1.1.5 christos 0, /* rightshift */ 196 1.1.1.8 christos 2, /* size */ 197 1.1.1.5 christos 16, /* bitsize */ 198 1.1.1.8 christos false, /* pc_relative */ 199 1.1.1.5 christos 0, /* bitpos */ 200 1.1.1.5 christos complain_overflow_bitfield,/* complain_on_overflow */ 201 1.1.1.5 christos bfd_elf_generic_reloc, /* special_function */ 202 1.1.1.5 christos "R_LM32_16", /* name */ 203 1.1.1.8 christos false, /* partial_inplace */ 204 1.1.1.5 christos 0, /* src_mask */ 205 1.1.1.5 christos 0xffff, /* dst_mask */ 206 1.1.1.8 christos false), /* pcrel_offset */ 207 1.1 christos 208 1.1 christos /* A 32 bit absolute relocation. */ 209 1.1.1.5 christos HOWTO (R_LM32_32, /* type */ 210 1.1.1.5 christos 0, /* rightshift */ 211 1.1.1.8 christos 4, /* size */ 212 1.1.1.5 christos 32, /* bitsize */ 213 1.1.1.8 christos false, /* pc_relative */ 214 1.1.1.5 christos 0, /* bitpos */ 215 1.1.1.5 christos complain_overflow_bitfield,/* complain_on_overflow */ 216 1.1.1.5 christos bfd_elf_generic_reloc, /* special_function */ 217 1.1.1.5 christos "R_LM32_32", /* name */ 218 1.1.1.8 christos false, /* partial_inplace */ 219 1.1.1.5 christos 0, /* src_mask */ 220 1.1.1.5 christos 0xffffffff, /* dst_mask */ 221 1.1.1.8 christos false), /* pcrel_offset */ 222 1.1.1.5 christos 223 1.1.1.5 christos HOWTO (R_LM32_HI16, /* type */ 224 1.1.1.5 christos 16, /* rightshift */ 225 1.1.1.8 christos 4, /* size */ 226 1.1.1.5 christos 16, /* bitsize */ 227 1.1.1.8 christos false, /* pc_relative */ 228 1.1.1.5 christos 0, /* bitpos */ 229 1.1.1.5 christos complain_overflow_bitfield,/* complain_on_overflow */ 230 1.1.1.5 christos bfd_elf_generic_reloc, /* special_function */ 231 1.1.1.5 christos "R_LM32_HI16", /* name */ 232 1.1.1.8 christos false, /* partial_inplace */ 233 1.1.1.5 christos 0, /* src_mask */ 234 1.1.1.5 christos 0xffff, /* dst_mask */ 235 1.1.1.8 christos false), /* pcrel_offset */ 236 1.1.1.5 christos 237 1.1.1.5 christos HOWTO (R_LM32_LO16, /* type */ 238 1.1.1.5 christos 0, /* rightshift */ 239 1.1.1.8 christos 4, /* size */ 240 1.1.1.5 christos 16, /* bitsize */ 241 1.1.1.8 christos false, /* pc_relative */ 242 1.1.1.5 christos 0, /* bitpos */ 243 1.1.1.5 christos complain_overflow_dont, /* complain_on_overflow */ 244 1.1.1.5 christos bfd_elf_generic_reloc, /* special_function */ 245 1.1.1.5 christos "R_LM32_LO16", /* name */ 246 1.1.1.8 christos false, /* partial_inplace */ 247 1.1.1.5 christos 0, /* src_mask */ 248 1.1.1.5 christos 0xffff, /* dst_mask */ 249 1.1.1.8 christos false), /* pcrel_offset */ 250 1.1.1.5 christos 251 1.1.1.5 christos HOWTO (R_LM32_GPREL16, /* type */ 252 1.1.1.5 christos 0, /* rightshift */ 253 1.1.1.8 christos 4, /* size */ 254 1.1.1.5 christos 16, /* bitsize */ 255 1.1.1.8 christos false, /* pc_relative */ 256 1.1.1.5 christos 0, /* bitpos */ 257 1.1.1.5 christos complain_overflow_dont, /* complain_on_overflow */ 258 1.1.1.5 christos lm32_elf_gprel_reloc, /* special_function */ 259 1.1.1.5 christos "R_LM32_GPREL16", /* name */ 260 1.1.1.8 christos false, /* partial_inplace */ 261 1.1.1.5 christos 0, /* src_mask */ 262 1.1.1.5 christos 0xffff, /* dst_mask */ 263 1.1.1.8 christos false), /* pcrel_offset */ 264 1.1.1.5 christos 265 1.1.1.5 christos HOWTO (R_LM32_CALL, /* type */ 266 1.1.1.5 christos 2, /* rightshift */ 267 1.1.1.8 christos 4, /* size */ 268 1.1.1.5 christos 26, /* bitsize */ 269 1.1.1.8 christos true, /* pc_relative */ 270 1.1.1.5 christos 0, /* bitpos */ 271 1.1.1.5 christos complain_overflow_signed, /* complain_on_overflow */ 272 1.1.1.5 christos bfd_elf_generic_reloc, /* special_function */ 273 1.1.1.5 christos "R_LM32_CALL", /* name */ 274 1.1.1.8 christos false, /* partial_inplace */ 275 1.1.1.5 christos 0, /* src_mask */ 276 1.1.1.5 christos 0x3ffffff, /* dst_mask */ 277 1.1.1.8 christos true), /* pcrel_offset */ 278 1.1.1.5 christos 279 1.1.1.5 christos HOWTO (R_LM32_BRANCH, /* type */ 280 1.1.1.5 christos 2, /* rightshift */ 281 1.1.1.8 christos 4, /* size */ 282 1.1.1.5 christos 16, /* bitsize */ 283 1.1.1.8 christos true, /* pc_relative */ 284 1.1.1.5 christos 0, /* bitpos */ 285 1.1.1.5 christos complain_overflow_signed, /* complain_on_overflow */ 286 1.1.1.5 christos bfd_elf_generic_reloc, /* special_function */ 287 1.1.1.5 christos "R_LM32_BRANCH", /* name */ 288 1.1.1.8 christos false, /* partial_inplace */ 289 1.1.1.5 christos 0, /* src_mask */ 290 1.1.1.5 christos 0xffff, /* dst_mask */ 291 1.1.1.8 christos true), /* pcrel_offset */ 292 1.1 christos 293 1.1 christos /* GNU extension to record C++ vtable hierarchy. */ 294 1.1.1.5 christos HOWTO (R_LM32_GNU_VTINHERIT, /* type */ 295 1.1.1.5 christos 0, /* rightshift */ 296 1.1.1.8 christos 4, /* size */ 297 1.1.1.5 christos 0, /* bitsize */ 298 1.1.1.8 christos false, /* pc_relative */ 299 1.1.1.5 christos 0, /* bitpos */ 300 1.1.1.5 christos complain_overflow_dont, /* complain_on_overflow */ 301 1.1.1.5 christos NULL, /* special_function */ 302 1.1.1.5 christos "R_LM32_GNU_VTINHERIT", /* name */ 303 1.1.1.8 christos false, /* partial_inplace */ 304 1.1.1.5 christos 0, /* src_mask */ 305 1.1.1.5 christos 0, /* dst_mask */ 306 1.1.1.8 christos false), /* pcrel_offset */ 307 1.1 christos 308 1.1 christos /* GNU extension to record C++ vtable member usage. */ 309 1.1.1.5 christos HOWTO (R_LM32_GNU_VTENTRY, /* type */ 310 1.1.1.5 christos 0, /* rightshift */ 311 1.1.1.8 christos 4, /* size */ 312 1.1.1.5 christos 0, /* bitsize */ 313 1.1.1.8 christos false, /* pc_relative */ 314 1.1.1.5 christos 0, /* bitpos */ 315 1.1.1.5 christos complain_overflow_dont, /* complain_on_overflow */ 316 1.1.1.5 christos _bfd_elf_rel_vtable_reloc_fn,/* special_function */ 317 1.1.1.5 christos "R_LM32_GNU_VTENTRY", /* name */ 318 1.1.1.8 christos false, /* partial_inplace */ 319 1.1.1.5 christos 0, /* src_mask */ 320 1.1.1.5 christos 0, /* dst_mask */ 321 1.1.1.8 christos false), /* pcrel_offset */ 322 1.1.1.5 christos 323 1.1.1.5 christos HOWTO (R_LM32_16_GOT, /* type */ 324 1.1.1.5 christos 0, /* rightshift */ 325 1.1.1.8 christos 4, /* size */ 326 1.1.1.5 christos 16, /* bitsize */ 327 1.1.1.8 christos false, /* pc_relative */ 328 1.1.1.5 christos 0, /* bitpos */ 329 1.1.1.5 christos complain_overflow_signed, /* complain_on_overflow */ 330 1.1.1.5 christos bfd_elf_generic_reloc, /* special_function */ 331 1.1.1.5 christos "R_LM32_16_GOT", /* name */ 332 1.1.1.8 christos false, /* partial_inplace */ 333 1.1.1.5 christos 0, /* src_mask */ 334 1.1.1.5 christos 0xffff, /* dst_mask */ 335 1.1.1.8 christos false), /* pcrel_offset */ 336 1.1.1.5 christos 337 1.1.1.5 christos HOWTO (R_LM32_GOTOFF_HI16, /* type */ 338 1.1.1.5 christos 16, /* rightshift */ 339 1.1.1.8 christos 4, /* size */ 340 1.1.1.5 christos 16, /* bitsize */ 341 1.1.1.8 christos false, /* pc_relative */ 342 1.1.1.5 christos 0, /* bitpos */ 343 1.1.1.5 christos complain_overflow_dont, /* complain_on_overflow */ 344 1.1.1.5 christos bfd_elf_generic_reloc, /* special_function */ 345 1.1.1.5 christos "R_LM32_GOTOFF_HI16", /* name */ 346 1.1.1.8 christos false, /* partial_inplace */ 347 1.1.1.5 christos 0xffff, /* src_mask */ 348 1.1.1.5 christos 0xffff, /* dst_mask */ 349 1.1.1.8 christos false), /* pcrel_offset */ 350 1.1.1.5 christos 351 1.1.1.5 christos HOWTO (R_LM32_GOTOFF_LO16, /* type */ 352 1.1.1.5 christos 0, /* rightshift */ 353 1.1.1.8 christos 4, /* size */ 354 1.1.1.5 christos 16, /* bitsize */ 355 1.1.1.8 christos false, /* pc_relative */ 356 1.1.1.5 christos 0, /* bitpos */ 357 1.1.1.5 christos complain_overflow_dont, /* complain_on_overflow */ 358 1.1.1.5 christos bfd_elf_generic_reloc, /* special_function */ 359 1.1.1.5 christos "R_LM32_GOTOFF_LO16", /* name */ 360 1.1.1.8 christos false, /* partial_inplace */ 361 1.1.1.5 christos 0xffff, /* src_mask */ 362 1.1.1.5 christos 0xffff, /* dst_mask */ 363 1.1.1.8 christos false), /* pcrel_offset */ 364 1.1 christos 365 1.1 christos HOWTO (R_LM32_COPY, /* type */ 366 1.1 christos 0, /* rightshift */ 367 1.1.1.8 christos 4, /* size */ 368 1.1 christos 32, /* bitsize */ 369 1.1.1.8 christos false, /* pc_relative */ 370 1.1 christos 0, /* bitpos */ 371 1.1 christos complain_overflow_bitfield, /* complain_on_overflow */ 372 1.1 christos bfd_elf_generic_reloc, /* special_function */ 373 1.1 christos "R_LM32_COPY", /* name */ 374 1.1.1.8 christos false, /* partial_inplace */ 375 1.1 christos 0xffffffff, /* src_mask */ 376 1.1 christos 0xffffffff, /* dst_mask */ 377 1.1.1.8 christos false), /* pcrel_offset */ 378 1.1 christos 379 1.1 christos HOWTO (R_LM32_GLOB_DAT, /* type */ 380 1.1 christos 0, /* rightshift */ 381 1.1.1.8 christos 4, /* size */ 382 1.1 christos 32, /* bitsize */ 383 1.1.1.8 christos false, /* pc_relative */ 384 1.1 christos 0, /* bitpos */ 385 1.1 christos complain_overflow_bitfield, /* complain_on_overflow */ 386 1.1 christos bfd_elf_generic_reloc, /* special_function */ 387 1.1 christos "R_LM32_GLOB_DAT", /* name */ 388 1.1.1.8 christos false, /* partial_inplace */ 389 1.1 christos 0xffffffff, /* src_mask */ 390 1.1 christos 0xffffffff, /* dst_mask */ 391 1.1.1.8 christos false), /* pcrel_offset */ 392 1.1 christos 393 1.1 christos HOWTO (R_LM32_JMP_SLOT, /* type */ 394 1.1 christos 0, /* rightshift */ 395 1.1.1.8 christos 4, /* size */ 396 1.1 christos 32, /* bitsize */ 397 1.1.1.8 christos false, /* pc_relative */ 398 1.1 christos 0, /* bitpos */ 399 1.1 christos complain_overflow_bitfield, /* complain_on_overflow */ 400 1.1 christos bfd_elf_generic_reloc, /* special_function */ 401 1.1 christos "R_LM32_JMP_SLOT", /* name */ 402 1.1.1.8 christos false, /* partial_inplace */ 403 1.1 christos 0xffffffff, /* src_mask */ 404 1.1 christos 0xffffffff, /* dst_mask */ 405 1.1.1.8 christos false), /* pcrel_offset */ 406 1.1 christos 407 1.1 christos HOWTO (R_LM32_RELATIVE, /* type */ 408 1.1 christos 0, /* rightshift */ 409 1.1.1.8 christos 4, /* size */ 410 1.1 christos 32, /* bitsize */ 411 1.1.1.8 christos false, /* pc_relative */ 412 1.1 christos 0, /* bitpos */ 413 1.1 christos complain_overflow_bitfield, /* complain_on_overflow */ 414 1.1 christos bfd_elf_generic_reloc, /* special_function */ 415 1.1 christos "R_LM32_RELATIVE", /* name */ 416 1.1.1.8 christos false, /* partial_inplace */ 417 1.1 christos 0xffffffff, /* src_mask */ 418 1.1 christos 0xffffffff, /* dst_mask */ 419 1.1.1.8 christos false), /* pcrel_offset */ 420 1.1 christos 421 1.1 christos }; 422 1.1 christos 423 1.1 christos /* Map BFD reloc types to lm32 ELF reloc types. */ 424 1.1 christos 425 1.1 christos struct lm32_reloc_map 426 1.1 christos { 427 1.1 christos bfd_reloc_code_real_type bfd_reloc_val; 428 1.1 christos unsigned char elf_reloc_val; 429 1.1 christos }; 430 1.1 christos 431 1.1 christos static const struct lm32_reloc_map lm32_reloc_map[] = 432 1.1 christos { 433 1.1.1.5 christos { BFD_RELOC_NONE, R_LM32_NONE }, 434 1.1.1.5 christos { BFD_RELOC_8, R_LM32_8 }, 435 1.1.1.5 christos { BFD_RELOC_16, R_LM32_16 }, 436 1.1.1.5 christos { BFD_RELOC_32, R_LM32_32 }, 437 1.1.1.5 christos { BFD_RELOC_HI16, R_LM32_HI16 }, 438 1.1.1.5 christos { BFD_RELOC_LO16, R_LM32_LO16 }, 439 1.1.1.5 christos { BFD_RELOC_GPREL16, R_LM32_GPREL16 }, 440 1.1.1.5 christos { BFD_RELOC_LM32_CALL, R_LM32_CALL }, 441 1.1.1.5 christos { BFD_RELOC_LM32_BRANCH, R_LM32_BRANCH }, 442 1.1.1.5 christos { BFD_RELOC_VTABLE_INHERIT, R_LM32_GNU_VTINHERIT }, 443 1.1.1.5 christos { BFD_RELOC_VTABLE_ENTRY, R_LM32_GNU_VTENTRY }, 444 1.1.1.5 christos { BFD_RELOC_LM32_16_GOT, R_LM32_16_GOT }, 445 1.1 christos { BFD_RELOC_LM32_GOTOFF_HI16, R_LM32_GOTOFF_HI16 }, 446 1.1 christos { BFD_RELOC_LM32_GOTOFF_LO16, R_LM32_GOTOFF_LO16 }, 447 1.1.1.11 christos { BFD_RELOC_COPY, R_LM32_COPY }, 448 1.1.1.11 christos { BFD_RELOC_GLOB_DAT, R_LM32_GLOB_DAT }, 449 1.1.1.11 christos { BFD_RELOC_JMP_SLOT, R_LM32_JMP_SLOT }, 450 1.1.1.11 christos { BFD_RELOC_RELATIVE, R_LM32_RELATIVE }, 451 1.1 christos }; 452 1.1 christos 453 1.1 christos static reloc_howto_type * 454 1.1 christos lm32_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED, 455 1.1.1.5 christos bfd_reloc_code_real_type code) 456 1.1 christos { 457 1.1 christos unsigned int i; 458 1.1 christos 459 1.1 christos for (i = 0; i < sizeof (lm32_reloc_map) / sizeof (lm32_reloc_map[0]); i++) 460 1.1 christos if (lm32_reloc_map[i].bfd_reloc_val == code) 461 1.1 christos return &lm32_elf_howto_table[lm32_reloc_map[i].elf_reloc_val]; 462 1.1 christos return NULL; 463 1.1 christos } 464 1.1 christos 465 1.1 christos static reloc_howto_type * 466 1.1 christos lm32_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED, 467 1.1 christos const char *r_name) 468 1.1 christos { 469 1.1 christos unsigned int i; 470 1.1 christos 471 1.1 christos for (i = 0; 472 1.1 christos i < sizeof (lm32_elf_howto_table) / sizeof (lm32_elf_howto_table[0]); 473 1.1 christos i++) 474 1.1 christos if (lm32_elf_howto_table[i].name != NULL 475 1.1 christos && strcasecmp (lm32_elf_howto_table[i].name, r_name) == 0) 476 1.1 christos return &lm32_elf_howto_table[i]; 477 1.1 christos 478 1.1 christos return NULL; 479 1.1 christos } 480 1.1 christos 481 1.1 christos 482 1.1 christos /* Set the howto pointer for an Lattice Mico32 ELF reloc. */ 483 1.1 christos 484 1.1.1.8 christos static bool 485 1.1.1.6 christos lm32_info_to_howto_rela (bfd *abfd, 486 1.1.1.5 christos arelent *cache_ptr, 487 1.1.1.5 christos Elf_Internal_Rela *dst) 488 1.1 christos { 489 1.1 christos unsigned int r_type; 490 1.1 christos 491 1.1 christos r_type = ELF32_R_TYPE (dst->r_info); 492 1.1.1.3 christos if (r_type >= (unsigned int) R_LM32_max) 493 1.1.1.3 christos { 494 1.1.1.5 christos /* xgettext:c-format */ 495 1.1.1.6 christos _bfd_error_handler (_("%pB: unsupported relocation type %#x"), 496 1.1.1.6 christos abfd, r_type); 497 1.1.1.6 christos bfd_set_error (bfd_error_bad_value); 498 1.1.1.8 christos return false; 499 1.1.1.3 christos } 500 1.1 christos cache_ptr->howto = &lm32_elf_howto_table[r_type]; 501 1.1.1.8 christos return true; 502 1.1 christos } 503 1.1 christos 504 1.1 christos /* Set the right machine number for an Lattice Mico32 ELF file. */ 505 1.1 christos 506 1.1.1.8 christos static bool 507 1.1 christos lm32_elf_object_p (bfd *abfd) 508 1.1 christos { 509 1.1 christos return bfd_default_set_arch_mach (abfd, bfd_arch_lm32, bfd_mach_lm32); 510 1.1 christos } 511 1.1 christos 512 1.1 christos /* Set machine type flags just before file is written out. */ 513 1.1 christos 514 1.1.1.8 christos static bool 515 1.1.1.7 christos lm32_elf_final_write_processing (bfd *abfd) 516 1.1 christos { 517 1.1 christos elf_elfheader (abfd)->e_machine = EM_LATTICEMICO32; 518 1.1 christos elf_elfheader (abfd)->e_flags &=~ EF_LM32_MACH; 519 1.1 christos switch (bfd_get_mach (abfd)) 520 1.1 christos { 521 1.1 christos case bfd_mach_lm32: 522 1.1.1.5 christos elf_elfheader (abfd)->e_flags |= E_LM32_MACH; 523 1.1.1.5 christos break; 524 1.1 christos default: 525 1.1.1.5 christos abort (); 526 1.1 christos } 527 1.1.1.7 christos return _bfd_elf_final_write_processing (abfd); 528 1.1 christos } 529 1.1 christos 530 1.1 christos /* Set the GP value for OUTPUT_BFD. Returns FALSE if this is a 531 1.1 christos dangerous relocation. */ 532 1.1 christos 533 1.1.1.8 christos static bool 534 1.1 christos lm32_elf_assign_gp (bfd *output_bfd, bfd_vma *pgp) 535 1.1 christos { 536 1.1 christos unsigned int count; 537 1.1 christos asymbol **sym; 538 1.1 christos unsigned int i; 539 1.1 christos 540 1.1 christos /* If we've already figured out what GP will be, just return it. */ 541 1.1 christos *pgp = _bfd_get_gp_value (output_bfd); 542 1.1 christos if (*pgp) 543 1.1.1.8 christos return true; 544 1.1 christos 545 1.1 christos count = bfd_get_symcount (output_bfd); 546 1.1 christos sym = bfd_get_outsymbols (output_bfd); 547 1.1 christos 548 1.1 christos /* The linker script will have created a symbol named `_gp' with the 549 1.1 christos appropriate value. */ 550 1.1 christos if (sym == NULL) 551 1.1 christos i = count; 552 1.1 christos else 553 1.1 christos { 554 1.1 christos for (i = 0; i < count; i++, sym++) 555 1.1 christos { 556 1.1 christos const char *name; 557 1.1 christos 558 1.1 christos name = bfd_asymbol_name (*sym); 559 1.1 christos if (*name == '_' && strcmp (name, "_gp") == 0) 560 1.1 christos { 561 1.1 christos *pgp = bfd_asymbol_value (*sym); 562 1.1 christos _bfd_set_gp_value (output_bfd, *pgp); 563 1.1 christos break; 564 1.1 christos } 565 1.1 christos } 566 1.1 christos } 567 1.1 christos 568 1.1 christos if (i >= count) 569 1.1 christos { 570 1.1 christos /* Only get the error once. */ 571 1.1 christos *pgp = 4; 572 1.1 christos _bfd_set_gp_value (output_bfd, *pgp); 573 1.1.1.8 christos return false; 574 1.1 christos } 575 1.1 christos 576 1.1.1.8 christos return true; 577 1.1 christos } 578 1.1 christos 579 1.1 christos /* We have to figure out the gp value, so that we can adjust the 580 1.1 christos symbol value correctly. We look up the symbol _gp in the output 581 1.1 christos BFD. If we can't find it, we're stuck. We cache it in the ELF 582 1.1 christos target data. We don't need to adjust the symbol value for an 583 1.1 christos external symbol if we are producing relocatable output. */ 584 1.1 christos 585 1.1 christos static bfd_reloc_status_type 586 1.1.1.8 christos lm32_elf_final_gp (bfd *output_bfd, asymbol *symbol, bool relocatable, 587 1.1.1.5 christos char **error_message, bfd_vma *pgp) 588 1.1 christos { 589 1.1 christos if (bfd_is_und_section (symbol->section) && !relocatable) 590 1.1 christos { 591 1.1 christos *pgp = 0; 592 1.1 christos return bfd_reloc_undefined; 593 1.1 christos } 594 1.1 christos 595 1.1 christos *pgp = _bfd_get_gp_value (output_bfd); 596 1.1 christos if (*pgp == 0 && (!relocatable || (symbol->flags & BSF_SECTION_SYM) != 0)) 597 1.1 christos { 598 1.1 christos if (relocatable) 599 1.1 christos { 600 1.1 christos /* Make up a value. */ 601 1.1 christos *pgp = symbol->section->output_section->vma + 0x4000; 602 1.1 christos _bfd_set_gp_value (output_bfd, *pgp); 603 1.1 christos } 604 1.1 christos else if (!lm32_elf_assign_gp (output_bfd, pgp)) 605 1.1 christos { 606 1.1 christos *error_message = 607 1.1 christos (char *) 608 1.1 christos _("global pointer relative relocation when _gp not defined"); 609 1.1 christos return bfd_reloc_dangerous; 610 1.1 christos } 611 1.1 christos } 612 1.1 christos 613 1.1 christos return bfd_reloc_ok; 614 1.1 christos } 615 1.1 christos 616 1.1 christos static bfd_reloc_status_type 617 1.1 christos lm32_elf_do_gprel_relocate (bfd *abfd, 618 1.1 christos reloc_howto_type *howto, 619 1.1 christos asection *input_section ATTRIBUTE_UNUSED, 620 1.1 christos bfd_byte *data, 621 1.1 christos bfd_vma offset, 622 1.1 christos bfd_vma symbol_value, 623 1.1 christos bfd_vma addend) 624 1.1 christos { 625 1.1 christos return _bfd_final_link_relocate (howto, abfd, input_section, 626 1.1 christos data, offset, symbol_value, addend); 627 1.1 christos } 628 1.1 christos 629 1.1 christos static bfd_reloc_status_type 630 1.1 christos lm32_elf_gprel_reloc (bfd *abfd, 631 1.1 christos arelent *reloc_entry, 632 1.1 christos asymbol *symbol, 633 1.1 christos void *data, 634 1.1 christos asection *input_section, 635 1.1 christos bfd *output_bfd, 636 1.1 christos char **msg) 637 1.1 christos { 638 1.1 christos bfd_vma relocation; 639 1.1 christos bfd_vma gp; 640 1.1 christos bfd_reloc_status_type r; 641 1.1 christos 642 1.1 christos if (output_bfd != (bfd *) NULL 643 1.1 christos && (symbol->flags & BSF_SECTION_SYM) == 0 644 1.1 christos && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0)) 645 1.1 christos { 646 1.1 christos reloc_entry->address += input_section->output_offset; 647 1.1 christos return bfd_reloc_ok; 648 1.1 christos } 649 1.1 christos 650 1.1 christos if (output_bfd != NULL) 651 1.1 christos return bfd_reloc_ok; 652 1.1 christos 653 1.1 christos relocation = symbol->value 654 1.1 christos + symbol->section->output_section->vma + symbol->section->output_offset; 655 1.1 christos 656 1.1 christos if ((r = 657 1.1.1.8 christos lm32_elf_final_gp (abfd, symbol, false, msg, &gp)) == bfd_reloc_ok) 658 1.1 christos { 659 1.1 christos relocation = relocation + reloc_entry->addend - gp; 660 1.1 christos reloc_entry->addend = 0; 661 1.1 christos if ((signed) relocation < -32768 || (signed) relocation > 32767) 662 1.1 christos { 663 1.1 christos *msg = _("global pointer relative address out of range"); 664 1.1 christos r = bfd_reloc_outofrange; 665 1.1 christos } 666 1.1 christos else 667 1.1 christos { 668 1.1 christos r = lm32_elf_do_gprel_relocate (abfd, reloc_entry->howto, 669 1.1 christos input_section, 670 1.1 christos data, reloc_entry->address, 671 1.1 christos relocation, reloc_entry->addend); 672 1.1 christos } 673 1.1 christos } 674 1.1 christos 675 1.1 christos return r; 676 1.1 christos } 677 1.1 christos 678 1.1 christos /* Find the segment number in which OSEC, and output section, is 679 1.1 christos located. */ 680 1.1 christos 681 1.1 christos static unsigned 682 1.1 christos _lm32fdpic_osec_to_segment (bfd *output_bfd, asection *osec) 683 1.1 christos { 684 1.1 christos struct elf_segment_map *m; 685 1.1 christos Elf_Internal_Phdr *p; 686 1.1 christos 687 1.1 christos /* Find the segment that contains the output_section. */ 688 1.1.1.3 christos for (m = elf_seg_map (output_bfd), p = elf_tdata (output_bfd)->phdr; 689 1.1 christos m != NULL; 690 1.1 christos m = m->next, p++) 691 1.1 christos { 692 1.1 christos int i; 693 1.1 christos 694 1.1 christos for (i = m->count - 1; i >= 0; i--) 695 1.1 christos if (m->sections[i] == osec) 696 1.1 christos break; 697 1.1 christos 698 1.1 christos if (i >= 0) 699 1.1 christos break; 700 1.1 christos } 701 1.1 christos 702 1.1 christos return p - elf_tdata (output_bfd)->phdr; 703 1.1 christos } 704 1.1 christos 705 1.1 christos /* Determine if an output section is read-only. */ 706 1.1 christos 707 1.1.1.8 christos inline static bool 708 1.1 christos _lm32fdpic_osec_readonly_p (bfd *output_bfd, asection *osec) 709 1.1 christos { 710 1.1 christos unsigned seg = _lm32fdpic_osec_to_segment (output_bfd, osec); 711 1.1 christos 712 1.1 christos return ! (elf_tdata (output_bfd)->phdr[seg].p_flags & PF_W); 713 1.1 christos } 714 1.1 christos 715 1.1 christos /* Relocate a section */ 716 1.1 christos 717 1.1.1.8 christos static int 718 1.1 christos lm32_elf_relocate_section (bfd *output_bfd, 719 1.1.1.5 christos struct bfd_link_info *info, 720 1.1.1.5 christos bfd *input_bfd, 721 1.1.1.5 christos asection *input_section, 722 1.1.1.5 christos bfd_byte *contents, 723 1.1.1.5 christos Elf_Internal_Rela *relocs, 724 1.1.1.5 christos Elf_Internal_Sym *local_syms, 725 1.1.1.5 christos asection **local_sections) 726 1.1 christos { 727 1.1 christos Elf_Internal_Shdr *symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr; 728 1.1 christos struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (input_bfd); 729 1.1 christos Elf_Internal_Rela *rel, *relend; 730 1.1 christos struct elf_lm32_link_hash_table *htab = lm32_elf_hash_table (info); 731 1.1 christos bfd_vma *local_got_offsets; 732 1.1 christos asection *sgot; 733 1.1 christos 734 1.1 christos if (htab == NULL) 735 1.1.1.8 christos return false; 736 1.1 christos 737 1.1 christos local_got_offsets = elf_local_got_offsets (input_bfd); 738 1.1 christos 739 1.1.1.5 christos sgot = htab->root.sgot; 740 1.1 christos 741 1.1 christos symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr; 742 1.1 christos sym_hashes = elf_sym_hashes (input_bfd); 743 1.1 christos 744 1.1 christos rel = relocs; 745 1.1 christos relend = relocs + input_section->reloc_count; 746 1.1 christos for (; rel < relend; rel++) 747 1.1 christos { 748 1.1 christos reloc_howto_type *howto; 749 1.1 christos unsigned int r_type; 750 1.1 christos unsigned long r_symndx; 751 1.1 christos Elf_Internal_Sym *sym; 752 1.1 christos asection *sec; 753 1.1 christos struct elf_link_hash_entry *h; 754 1.1 christos bfd_vma relocation; 755 1.1 christos bfd_vma gp; 756 1.1 christos bfd_reloc_status_type r; 757 1.1 christos const char *name = NULL; 758 1.1 christos 759 1.1 christos r_symndx = ELF32_R_SYM (rel->r_info); 760 1.1 christos r_type = ELF32_R_TYPE (rel->r_info); 761 1.1 christos 762 1.1 christos if (r_type == R_LM32_GNU_VTENTRY 763 1.1.1.5 christos || r_type == R_LM32_GNU_VTINHERIT ) 764 1.1.1.5 christos continue; 765 1.1 christos 766 1.1 christos h = NULL; 767 1.1 christos sym = NULL; 768 1.1 christos sec = NULL; 769 1.1 christos 770 1.1 christos howto = lm32_elf_howto_table + r_type; 771 1.1 christos 772 1.1 christos if (r_symndx < symtab_hdr->sh_info) 773 1.1.1.5 christos { 774 1.1.1.5 christos /* It's a local symbol. */ 775 1.1.1.5 christos sym = local_syms + r_symndx; 776 1.1.1.5 christos sec = local_sections[r_symndx]; 777 1.1.1.5 christos relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); 778 1.1.1.5 christos name = bfd_elf_string_from_elf_section 779 1.1 christos (input_bfd, symtab_hdr->sh_link, sym->st_name); 780 1.1.1.7 christos name = name == NULL ? bfd_section_name (sec) : name; 781 1.1.1.5 christos } 782 1.1 christos else 783 1.1.1.5 christos { 784 1.1.1.5 christos /* It's a global symbol. */ 785 1.1.1.8 christos bool unresolved_reloc; 786 1.1.1.8 christos bool warned, ignored; 787 1.1 christos 788 1.1 christos RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel, 789 1.1 christos r_symndx, symtab_hdr, sym_hashes, 790 1.1 christos h, sec, relocation, 791 1.1.1.3 christos unresolved_reloc, warned, ignored); 792 1.1 christos name = h->root.root.string; 793 1.1.1.5 christos } 794 1.1 christos 795 1.1.1.2 christos if (sec != NULL && discarded_section (sec)) 796 1.1 christos RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section, 797 1.1.1.11 christos rel, 1, relend, R_LM32_NONE, 798 1.1.1.11 christos howto, 0, contents); 799 1.1 christos 800 1.1.1.3 christos if (bfd_link_relocatable (info)) 801 1.1.1.5 christos { 802 1.1 christos /* This is a relocatable link. We don't have to change 803 1.1 christos anything, unless the reloc is against a section symbol, 804 1.1 christos in which case we have to adjust according to where the 805 1.1 christos section symbol winds up in the output section. */ 806 1.1 christos if (sym == NULL || ELF_ST_TYPE (sym->st_info) != STT_SECTION) 807 1.1 christos continue; 808 1.1 christos 809 1.1 christos /* If partial_inplace, we need to store any additional addend 810 1.1 christos back in the section. */ 811 1.1 christos if (! howto->partial_inplace) 812 1.1 christos continue; 813 1.1 christos 814 1.1.1.5 christos /* Shouldn't reach here. */ 815 1.1 christos abort (); 816 1.1 christos r = bfd_reloc_ok; 817 1.1.1.5 christos } 818 1.1 christos else 819 1.1.1.5 christos { 820 1.1.1.5 christos switch (howto->type) 821 1.1.1.5 christos { 822 1.1.1.5 christos case R_LM32_GPREL16: 823 1.1.1.5 christos if (!lm32_elf_assign_gp (output_bfd, &gp)) 824 1.1.1.5 christos r = bfd_reloc_dangerous; 825 1.1.1.5 christos else 826 1.1.1.5 christos { 827 1.1.1.5 christos relocation = relocation + rel->r_addend - gp; 828 1.1.1.5 christos rel->r_addend = 0; 829 1.1.1.5 christos if ((signed)relocation < -32768 || (signed)relocation > 32767) 830 1.1.1.5 christos r = bfd_reloc_outofrange; 831 1.1.1.5 christos else 832 1.1.1.5 christos { 833 1.1.1.5 christos r = _bfd_final_link_relocate (howto, input_bfd, 834 1.1.1.5 christos input_section, contents, 835 1.1.1.5 christos rel->r_offset, relocation, 836 1.1.1.5 christos rel->r_addend); 837 1.1.1.5 christos } 838 1.1.1.5 christos } 839 1.1.1.5 christos break; 840 1.1.1.5 christos case R_LM32_16_GOT: 841 1.1.1.5 christos /* Relocation is to the entry for this symbol in the global 842 1.1.1.5 christos offset table. */ 843 1.1.1.5 christos BFD_ASSERT (sgot != NULL); 844 1.1.1.5 christos if (h != NULL) 845 1.1.1.5 christos { 846 1.1.1.8 christos bool dyn; 847 1.1.1.5 christos bfd_vma off; 848 1.1 christos 849 1.1.1.5 christos off = h->got.offset; 850 1.1.1.5 christos BFD_ASSERT (off != (bfd_vma) -1); 851 1.1 christos 852 1.1.1.5 christos dyn = htab->root.dynamic_sections_created; 853 1.1.1.5 christos if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 854 1.1.1.3 christos bfd_link_pic (info), 855 1.1.1.3 christos h) 856 1.1.1.5 christos || (bfd_link_pic (info) 857 1.1.1.5 christos && (info->symbolic 858 1.1.1.5 christos || h->dynindx == -1 859 1.1.1.5 christos || h->forced_local) 860 1.1.1.5 christos && h->def_regular)) 861 1.1.1.5 christos { 862 1.1.1.5 christos /* This is actually a static link, or it is a 863 1.1.1.5 christos -Bsymbolic link and the symbol is defined 864 1.1.1.5 christos locally, or the symbol was forced to be local 865 1.1.1.5 christos because of a version file. We must initialize 866 1.1.1.5 christos this entry in the global offset table. Since the 867 1.1.1.5 christos offset must always be a multiple of 4, we use the 868 1.1.1.5 christos least significant bit to record whether we have 869 1.1.1.5 christos initialized it already. 870 1.1.1.5 christos 871 1.1.1.5 christos When doing a dynamic link, we create a .rela.got 872 1.1.1.5 christos relocation entry to initialize the value. This 873 1.1.1.5 christos is done in the finish_dynamic_symbol routine. */ 874 1.1.1.5 christos if ((off & 1) != 0) 875 1.1.1.5 christos off &= ~1; 876 1.1.1.5 christos else 877 1.1.1.5 christos { 878 1.1.1.5 christos /* Write entry in GOT */ 879 1.1.1.5 christos bfd_put_32 (output_bfd, relocation, 880 1.1.1.5 christos sgot->contents + off); 881 1.1.1.5 christos /* Create entry in .rofixup pointing to GOT entry. */ 882 1.1.1.5 christos if (IS_FDPIC (output_bfd) && h->root.type != bfd_link_hash_undefweak) 883 1.1.1.5 christos { 884 1.1.1.5 christos _lm32fdpic_add_rofixup (output_bfd, 885 1.1.1.5 christos lm32fdpic_fixup32_section 886 1.1.1.5 christos (info), 887 1.1.1.5 christos sgot->output_section->vma 888 1.1.1.5 christos + sgot->output_offset 889 1.1.1.5 christos + off); 890 1.1.1.5 christos } 891 1.1.1.5 christos /* Mark GOT entry as having been written. */ 892 1.1.1.5 christos h->got.offset |= 1; 893 1.1.1.5 christos } 894 1.1.1.5 christos } 895 1.1.1.5 christos 896 1.1.1.5 christos relocation = sgot->output_offset + off; 897 1.1.1.5 christos } 898 1.1.1.5 christos else 899 1.1.1.5 christos { 900 1.1.1.5 christos bfd_vma off; 901 1.1.1.5 christos bfd_byte *loc; 902 1.1.1.5 christos 903 1.1.1.5 christos BFD_ASSERT (local_got_offsets != NULL 904 1.1.1.5 christos && local_got_offsets[r_symndx] != (bfd_vma) -1); 905 1.1.1.5 christos 906 1.1.1.5 christos /* Get offset into GOT table. */ 907 1.1.1.5 christos off = local_got_offsets[r_symndx]; 908 1.1.1.5 christos 909 1.1.1.5 christos /* The offset must always be a multiple of 4. We use 910 1.1.1.5 christos the least significant bit to record whether we have 911 1.1.1.5 christos already processed this entry. */ 912 1.1.1.5 christos if ((off & 1) != 0) 913 1.1.1.5 christos off &= ~1; 914 1.1.1.5 christos else 915 1.1.1.5 christos { 916 1.1.1.5 christos /* Write entry in GOT. */ 917 1.1.1.5 christos bfd_put_32 (output_bfd, relocation, sgot->contents + off); 918 1.1.1.5 christos /* Create entry in .rofixup pointing to GOT entry. */ 919 1.1.1.5 christos if (IS_FDPIC (output_bfd)) 920 1.1.1.5 christos { 921 1.1.1.5 christos _lm32fdpic_add_rofixup (output_bfd, 922 1.1.1.5 christos lm32fdpic_fixup32_section 923 1.1.1.5 christos (info), 924 1.1.1.5 christos sgot->output_section->vma 925 1.1.1.5 christos + sgot->output_offset 926 1.1.1.5 christos + off); 927 1.1.1.5 christos } 928 1.1.1.5 christos 929 1.1.1.5 christos if (bfd_link_pic (info)) 930 1.1.1.5 christos { 931 1.1.1.5 christos asection *srelgot; 932 1.1.1.5 christos Elf_Internal_Rela outrel; 933 1.1.1.5 christos 934 1.1.1.5 christos /* We need to generate a R_LM32_RELATIVE reloc 935 1.1.1.5 christos for the dynamic linker. */ 936 1.1.1.5 christos srelgot = htab->root.srelgot; 937 1.1.1.5 christos BFD_ASSERT (srelgot != NULL); 938 1.1.1.5 christos 939 1.1.1.5 christos outrel.r_offset = (sgot->output_section->vma 940 1.1.1.5 christos + sgot->output_offset 941 1.1.1.5 christos + off); 942 1.1.1.5 christos outrel.r_info = ELF32_R_INFO (0, R_LM32_RELATIVE); 943 1.1.1.5 christos outrel.r_addend = relocation; 944 1.1.1.5 christos loc = srelgot->contents; 945 1.1.1.5 christos loc += srelgot->reloc_count * sizeof (Elf32_External_Rela); 946 1.1.1.5 christos bfd_elf32_swap_reloca_out (output_bfd, &outrel,loc); 947 1.1.1.5 christos ++srelgot->reloc_count; 948 1.1.1.5 christos } 949 1.1.1.5 christos 950 1.1.1.5 christos local_got_offsets[r_symndx] |= 1; 951 1.1.1.5 christos } 952 1.1.1.5 christos 953 1.1.1.5 christos 954 1.1.1.5 christos relocation = sgot->output_offset + off; 955 1.1.1.5 christos } 956 1.1.1.5 christos 957 1.1.1.5 christos /* Addend should be zero. */ 958 1.1.1.5 christos if (rel->r_addend != 0) 959 1.1.1.6 christos _bfd_error_handler 960 1.1.1.6 christos (_("internal error: addend should be zero for %s"), 961 1.1.1.6 christos "R_LM32_16_GOT"); 962 1.1.1.5 christos 963 1.1.1.5 christos r = _bfd_final_link_relocate (howto, 964 1.1.1.5 christos input_bfd, 965 1.1.1.5 christos input_section, 966 1.1.1.5 christos contents, 967 1.1.1.5 christos rel->r_offset, 968 1.1.1.5 christos relocation, 969 1.1.1.5 christos rel->r_addend); 970 1.1.1.5 christos break; 971 1.1.1.5 christos 972 1.1.1.5 christos case R_LM32_GOTOFF_LO16: 973 1.1.1.5 christos case R_LM32_GOTOFF_HI16: 974 1.1.1.5 christos /* Relocation is offset from GOT. */ 975 1.1 christos BFD_ASSERT (sgot != NULL); 976 1.1 christos relocation -= sgot->output_section->vma; 977 1.1 christos /* Account for sign-extension. */ 978 1.1.1.5 christos if ((r_type == R_LM32_GOTOFF_HI16) 979 1.1.1.5 christos && ((relocation + rel->r_addend) & 0x8000)) 980 1.1.1.5 christos rel->r_addend += 0x10000; 981 1.1.1.5 christos r = _bfd_final_link_relocate (howto, 982 1.1.1.5 christos input_bfd, 983 1.1.1.5 christos input_section, 984 1.1.1.5 christos contents, 985 1.1.1.5 christos rel->r_offset, 986 1.1.1.5 christos relocation, 987 1.1.1.5 christos rel->r_addend); 988 1.1.1.5 christos break; 989 1.1.1.5 christos 990 1.1.1.5 christos case R_LM32_32: 991 1.1.1.5 christos if (IS_FDPIC (output_bfd)) 992 1.1.1.5 christos { 993 1.1.1.5 christos if ((!h) || (h && h->root.type != bfd_link_hash_undefweak)) 994 1.1.1.5 christos { 995 1.1.1.5 christos /* Only create .rofixup entries for relocs in loadable sections. */ 996 1.1.1.7 christos if ((bfd_section_flags (input_section->output_section) 997 1.1.1.5 christos & (SEC_ALLOC | SEC_LOAD)) == (SEC_ALLOC | SEC_LOAD)) 998 1.1.1.5 christos 999 1.1.1.5 christos { 1000 1.1.1.5 christos /* Check address to be modified is writable. */ 1001 1.1.1.5 christos if (_lm32fdpic_osec_readonly_p (output_bfd, 1002 1.1.1.5 christos input_section 1003 1.1.1.5 christos ->output_section)) 1004 1.1.1.5 christos { 1005 1.1.1.5 christos info->callbacks->warning 1006 1.1.1.5 christos (info, 1007 1.1.1.5 christos _("cannot emit dynamic relocations in read-only section"), 1008 1.1.1.5 christos name, input_bfd, input_section, rel->r_offset); 1009 1.1.1.8 christos return false; 1010 1.1.1.5 christos } 1011 1.1.1.5 christos /* Create entry in .rofixup section. */ 1012 1.1.1.5 christos _lm32fdpic_add_rofixup (output_bfd, 1013 1.1.1.5 christos lm32fdpic_fixup32_section (info), 1014 1.1.1.5 christos input_section->output_section->vma 1015 1.1.1.5 christos + input_section->output_offset 1016 1.1.1.5 christos + rel->r_offset); 1017 1.1.1.5 christos } 1018 1.1.1.5 christos } 1019 1.1.1.5 christos } 1020 1.1.1.5 christos /* Fall through. */ 1021 1.1.1.5 christos 1022 1.1.1.5 christos default: 1023 1.1.1.5 christos r = _bfd_final_link_relocate (howto, 1024 1.1.1.5 christos input_bfd, 1025 1.1.1.5 christos input_section, 1026 1.1.1.5 christos contents, 1027 1.1.1.5 christos rel->r_offset, 1028 1.1.1.5 christos relocation, 1029 1.1.1.5 christos rel->r_addend); 1030 1.1.1.5 christos break; 1031 1.1.1.5 christos } 1032 1.1.1.5 christos } 1033 1.1 christos 1034 1.1 christos if (r != bfd_reloc_ok) 1035 1.1.1.5 christos { 1036 1.1.1.5 christos const char *msg = NULL; 1037 1.1.1.5 christos arelent bfd_reloc; 1038 1.1.1.5 christos 1039 1.1.1.6 christos if (! lm32_info_to_howto_rela (input_bfd, &bfd_reloc, rel)) 1040 1.1.1.6 christos continue; 1041 1.1.1.5 christos howto = bfd_reloc.howto; 1042 1.1.1.5 christos 1043 1.1.1.5 christos if (h != NULL) 1044 1.1.1.5 christos name = h->root.root.string; 1045 1.1.1.5 christos else 1046 1.1.1.5 christos { 1047 1.1.1.5 christos name = (bfd_elf_string_from_elf_section 1048 1.1.1.5 christos (input_bfd, symtab_hdr->sh_link, sym->st_name)); 1049 1.1.1.5 christos if (name == NULL || *name == '\0') 1050 1.1.1.7 christos name = bfd_section_name (sec); 1051 1.1.1.5 christos } 1052 1.1 christos 1053 1.1.1.5 christos switch (r) 1054 1.1.1.5 christos { 1055 1.1 christos case bfd_reloc_overflow: 1056 1.1 christos if ((h != NULL) 1057 1.1.1.5 christos && (h->root.type == bfd_link_hash_undefweak)) 1058 1.1.1.5 christos break; 1059 1.1.1.4 christos (*info->callbacks->reloc_overflow) 1060 1.1.1.4 christos (info, (h ? &h->root : NULL), name, howto->name, 1061 1.1.1.4 christos (bfd_vma) 0, input_bfd, input_section, rel->r_offset); 1062 1.1 christos break; 1063 1.1 christos 1064 1.1.1.5 christos case bfd_reloc_undefined: 1065 1.1.1.4 christos (*info->callbacks->undefined_symbol) 1066 1.1.1.8 christos (info, name, input_bfd, input_section, rel->r_offset, true); 1067 1.1.1.5 christos break; 1068 1.1 christos 1069 1.1.1.5 christos case bfd_reloc_outofrange: 1070 1.1.1.5 christos msg = _("internal error: out of range error"); 1071 1.1.1.5 christos goto common_error; 1072 1.1.1.5 christos 1073 1.1.1.5 christos case bfd_reloc_notsupported: 1074 1.1.1.5 christos msg = _("internal error: unsupported relocation error"); 1075 1.1.1.5 christos goto common_error; 1076 1.1.1.5 christos 1077 1.1.1.5 christos case bfd_reloc_dangerous: 1078 1.1.1.5 christos msg = _("internal error: dangerous error"); 1079 1.1.1.5 christos goto common_error; 1080 1.1.1.5 christos 1081 1.1.1.5 christos default: 1082 1.1.1.5 christos msg = _("internal error: unknown error"); 1083 1.1.1.5 christos /* fall through */ 1084 1.1 christos 1085 1.1.1.5 christos common_error: 1086 1.1.1.4 christos (*info->callbacks->warning) (info, msg, name, input_bfd, 1087 1.1.1.4 christos input_section, rel->r_offset); 1088 1.1.1.5 christos break; 1089 1.1.1.5 christos } 1090 1.1.1.5 christos } 1091 1.1 christos } 1092 1.1 christos 1093 1.1.1.8 christos return true; 1094 1.1 christos } 1095 1.1 christos 1096 1.1 christos static asection * 1097 1.1 christos lm32_elf_gc_mark_hook (asection *sec, 1098 1.1.1.5 christos struct bfd_link_info *info, 1099 1.1.1.11 christos struct elf_reloc_cookie *cookie, 1100 1.1.1.5 christos struct elf_link_hash_entry *h, 1101 1.1.1.11 christos unsigned int symndx) 1102 1.1 christos { 1103 1.1 christos if (h != NULL) 1104 1.1.1.11 christos switch (ELF32_R_TYPE (cookie->rel->r_info)) 1105 1.1 christos { 1106 1.1 christos case R_LM32_GNU_VTINHERIT: 1107 1.1 christos case R_LM32_GNU_VTENTRY: 1108 1.1 christos return NULL; 1109 1.1 christos } 1110 1.1 christos 1111 1.1.1.11 christos return _bfd_elf_gc_mark_hook (sec, info, cookie, h, symndx); 1112 1.1 christos } 1113 1.1 christos 1114 1.1 christos /* Look through the relocs for a section during the first phase. */ 1115 1.1 christos 1116 1.1.1.8 christos static bool 1117 1.1 christos lm32_elf_check_relocs (bfd *abfd, 1118 1.1.1.5 christos struct bfd_link_info *info, 1119 1.1.1.5 christos asection *sec, 1120 1.1.1.5 christos const Elf_Internal_Rela *relocs) 1121 1.1 christos { 1122 1.1 christos Elf_Internal_Shdr *symtab_hdr; 1123 1.1.1.8 christos struct elf_link_hash_entry **sym_hashes; 1124 1.1 christos const Elf_Internal_Rela *rel; 1125 1.1 christos const Elf_Internal_Rela *rel_end; 1126 1.1 christos struct elf_lm32_link_hash_table *htab; 1127 1.1 christos bfd *dynobj; 1128 1.1 christos 1129 1.1.1.3 christos if (bfd_link_relocatable (info)) 1130 1.1.1.8 christos return true; 1131 1.1.1.5 christos 1132 1.1 christos symtab_hdr = &elf_tdata (abfd)->symtab_hdr; 1133 1.1 christos sym_hashes = elf_sym_hashes (abfd); 1134 1.1 christos 1135 1.1 christos htab = lm32_elf_hash_table (info); 1136 1.1 christos if (htab == NULL) 1137 1.1.1.8 christos return false; 1138 1.1 christos 1139 1.1 christos dynobj = htab->root.dynobj; 1140 1.1 christos 1141 1.1 christos rel_end = relocs + sec->reloc_count; 1142 1.1 christos for (rel = relocs; rel < rel_end; rel++) 1143 1.1 christos { 1144 1.1 christos int r_type; 1145 1.1 christos struct elf_link_hash_entry *h; 1146 1.1 christos unsigned long r_symndx; 1147 1.1 christos 1148 1.1 christos r_symndx = ELF32_R_SYM (rel->r_info); 1149 1.1 christos r_type = ELF32_R_TYPE (rel->r_info); 1150 1.1 christos if (r_symndx < symtab_hdr->sh_info) 1151 1.1.1.5 christos h = NULL; 1152 1.1 christos else 1153 1.1 christos { 1154 1.1 christos h = sym_hashes[r_symndx - symtab_hdr->sh_info]; 1155 1.1 christos while (h->root.type == bfd_link_hash_indirect 1156 1.1 christos || h->root.type == bfd_link_hash_warning) 1157 1.1 christos h = (struct elf_link_hash_entry *) h->root.u.i.link; 1158 1.1 christos } 1159 1.1 christos 1160 1.1 christos /* Some relocs require a global offset table. */ 1161 1.1.1.5 christos if (htab->root.sgot == NULL) 1162 1.1.1.5 christos { 1163 1.1.1.5 christos switch (r_type) 1164 1.1.1.5 christos { 1165 1.1.1.5 christos case R_LM32_16_GOT: 1166 1.1.1.5 christos case R_LM32_GOTOFF_HI16: 1167 1.1.1.5 christos case R_LM32_GOTOFF_LO16: 1168 1.1.1.5 christos if (dynobj == NULL) 1169 1.1.1.5 christos htab->root.dynobj = dynobj = abfd; 1170 1.1.1.5 christos if (!_bfd_elf_create_got_section (dynobj, info)) 1171 1.1.1.8 christos return false; 1172 1.1.1.5 christos break; 1173 1.1.1.5 christos } 1174 1.1.1.5 christos } 1175 1.1 christos 1176 1.1 christos /* Some relocs require a rofixup table. */ 1177 1.1 christos if (IS_FDPIC (abfd)) 1178 1.1.1.5 christos { 1179 1.1.1.5 christos switch (r_type) 1180 1.1.1.5 christos { 1181 1.1.1.5 christos case R_LM32_32: 1182 1.1.1.5 christos /* FDPIC requires a GOT if there is a .rofixup section 1183 1.1.1.5 christos (Normal ELF doesn't). */ 1184 1.1.1.5 christos if (dynobj == NULL) 1185 1.1.1.5 christos htab->root.dynobj = dynobj = abfd; 1186 1.1.1.5 christos if (!_bfd_elf_create_got_section (dynobj, info)) 1187 1.1.1.8 christos return false; 1188 1.1.1.5 christos /* Create .rofixup section */ 1189 1.1.1.5 christos if (htab->sfixup32 == NULL) 1190 1.1.1.5 christos { 1191 1.1.1.5 christos if (! create_rofixup_section (dynobj, info)) 1192 1.1.1.8 christos return false; 1193 1.1.1.5 christos } 1194 1.1.1.5 christos break; 1195 1.1.1.5 christos case R_LM32_16_GOT: 1196 1.1.1.5 christos case R_LM32_GOTOFF_HI16: 1197 1.1.1.5 christos case R_LM32_GOTOFF_LO16: 1198 1.1.1.5 christos /* Create .rofixup section. */ 1199 1.1.1.5 christos if (htab->sfixup32 == NULL) 1200 1.1.1.5 christos { 1201 1.1.1.2 christos if (dynobj == NULL) 1202 1.1.1.2 christos htab->root.dynobj = dynobj = abfd; 1203 1.1.1.5 christos if (! create_rofixup_section (dynobj, info)) 1204 1.1.1.8 christos return false; 1205 1.1.1.5 christos } 1206 1.1.1.5 christos break; 1207 1.1.1.5 christos } 1208 1.1.1.5 christos } 1209 1.1 christos 1210 1.1 christos switch (r_type) 1211 1.1 christos { 1212 1.1 christos case R_LM32_16_GOT: 1213 1.1.1.5 christos if (h != NULL) 1214 1.1.1.5 christos h->got.refcount += 1; 1215 1.1.1.5 christos else 1216 1.1.1.5 christos { 1217 1.1.1.5 christos bfd_signed_vma *local_got_refcounts; 1218 1.1.1.5 christos 1219 1.1.1.5 christos /* This is a global offset table entry for a local symbol. */ 1220 1.1.1.5 christos local_got_refcounts = elf_local_got_refcounts (abfd); 1221 1.1.1.5 christos if (local_got_refcounts == NULL) 1222 1.1.1.5 christos { 1223 1.1.1.5 christos bfd_size_type size; 1224 1.1.1.5 christos 1225 1.1.1.5 christos size = symtab_hdr->sh_info; 1226 1.1.1.5 christos size *= sizeof (bfd_signed_vma); 1227 1.1.1.5 christos local_got_refcounts = bfd_zalloc (abfd, size); 1228 1.1.1.5 christos if (local_got_refcounts == NULL) 1229 1.1.1.8 christos return false; 1230 1.1.1.5 christos elf_local_got_refcounts (abfd) = local_got_refcounts; 1231 1.1.1.5 christos } 1232 1.1.1.5 christos local_got_refcounts[r_symndx] += 1; 1233 1.1.1.5 christos } 1234 1.1.1.5 christos break; 1235 1.1 christos 1236 1.1.1.5 christos /* This relocation describes the C++ object vtable hierarchy. 1237 1.1.1.5 christos Reconstruct it for later use during GC. */ 1238 1.1.1.5 christos case R_LM32_GNU_VTINHERIT: 1239 1.1.1.5 christos if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset)) 1240 1.1.1.8 christos return false; 1241 1.1.1.5 christos break; 1242 1.1.1.5 christos 1243 1.1.1.5 christos /* This relocation describes which C++ vtable entries are actually 1244 1.1.1.5 christos used. Record for later use during GC. */ 1245 1.1.1.5 christos case R_LM32_GNU_VTENTRY: 1246 1.1.1.5 christos if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend)) 1247 1.1.1.8 christos return false; 1248 1.1.1.5 christos break; 1249 1.1.1.5 christos 1250 1.1.1.5 christos } 1251 1.1 christos } 1252 1.1 christos 1253 1.1.1.8 christos return true; 1254 1.1 christos } 1255 1.1 christos 1256 1.1 christos /* Finish up the dynamic sections. */ 1257 1.1 christos 1258 1.1.1.8 christos static bool 1259 1.1 christos lm32_elf_finish_dynamic_sections (bfd *output_bfd, 1260 1.1.1.11 christos struct bfd_link_info *info, 1261 1.1.1.11 christos bfd_byte *buf ATTRIBUTE_UNUSED) 1262 1.1 christos { 1263 1.1 christos struct elf_lm32_link_hash_table *htab; 1264 1.1 christos bfd *dynobj; 1265 1.1 christos asection *sdyn; 1266 1.1 christos asection *sgot; 1267 1.1 christos 1268 1.1 christos htab = lm32_elf_hash_table (info); 1269 1.1 christos if (htab == NULL) 1270 1.1.1.8 christos return false; 1271 1.1 christos 1272 1.1 christos dynobj = htab->root.dynobj; 1273 1.1 christos 1274 1.1.1.5 christos sgot = htab->root.sgotplt; 1275 1.1.1.2 christos sdyn = bfd_get_linker_section (dynobj, ".dynamic"); 1276 1.1 christos 1277 1.1 christos if (htab->root.dynamic_sections_created) 1278 1.1 christos { 1279 1.1 christos asection *splt; 1280 1.1 christos Elf32_External_Dyn *dyncon, *dynconend; 1281 1.1 christos 1282 1.1 christos BFD_ASSERT (sgot != NULL && sdyn != NULL); 1283 1.1 christos 1284 1.1 christos dyncon = (Elf32_External_Dyn *) sdyn->contents; 1285 1.1 christos dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size); 1286 1.1 christos 1287 1.1 christos for (; dyncon < dynconend; dyncon++) 1288 1.1.1.5 christos { 1289 1.1.1.5 christos Elf_Internal_Dyn dyn; 1290 1.1.1.5 christos asection *s; 1291 1.1 christos 1292 1.1.1.5 christos bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn); 1293 1.1 christos 1294 1.1.1.5 christos switch (dyn.d_tag) 1295 1.1.1.5 christos { 1296 1.1.1.5 christos default: 1297 1.1.1.5 christos break; 1298 1.1.1.5 christos 1299 1.1.1.5 christos case DT_PLTGOT: 1300 1.1.1.5 christos s = htab->root.sgotplt; 1301 1.1.1.5 christos goto get_vma; 1302 1.1.1.5 christos case DT_JMPREL: 1303 1.1.1.5 christos s = htab->root.srelplt; 1304 1.1.1.5 christos get_vma: 1305 1.1.1.5 christos dyn.d_un.d_ptr = s->output_section->vma + s->output_offset; 1306 1.1.1.5 christos bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); 1307 1.1.1.5 christos break; 1308 1.1.1.5 christos 1309 1.1.1.5 christos case DT_PLTRELSZ: 1310 1.1.1.5 christos s = htab->root.srelplt; 1311 1.1.1.5 christos dyn.d_un.d_val = s->size; 1312 1.1.1.5 christos bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); 1313 1.1.1.5 christos break; 1314 1.1.1.5 christos } 1315 1.1.1.5 christos } 1316 1.1 christos 1317 1.1 christos /* Fill in the first entry in the procedure linkage table. */ 1318 1.1.1.5 christos splt = htab->root.splt; 1319 1.1 christos if (splt && splt->size > 0) 1320 1.1.1.5 christos { 1321 1.1.1.5 christos if (bfd_link_pic (info)) 1322 1.1.1.5 christos { 1323 1.1.1.5 christos bfd_put_32 (output_bfd, PLT0_PIC_ENTRY_WORD0, splt->contents); 1324 1.1.1.5 christos bfd_put_32 (output_bfd, PLT0_PIC_ENTRY_WORD1, splt->contents + 4); 1325 1.1.1.5 christos bfd_put_32 (output_bfd, PLT0_PIC_ENTRY_WORD2, splt->contents + 8); 1326 1.1.1.5 christos bfd_put_32 (output_bfd, PLT0_PIC_ENTRY_WORD3, splt->contents + 12); 1327 1.1.1.5 christos bfd_put_32 (output_bfd, PLT0_PIC_ENTRY_WORD4, splt->contents + 16); 1328 1.1.1.5 christos } 1329 1.1.1.5 christos else 1330 1.1.1.5 christos { 1331 1.1.1.5 christos unsigned long addr; 1332 1.1.1.5 christos /* addr = .got + 4 */ 1333 1.1.1.5 christos addr = sgot->output_section->vma + sgot->output_offset + 4; 1334 1.1.1.5 christos bfd_put_32 (output_bfd, 1335 1.1 christos PLT0_ENTRY_WORD0 | ((addr >> 16) & 0xffff), 1336 1.1 christos splt->contents); 1337 1.1.1.5 christos bfd_put_32 (output_bfd, 1338 1.1 christos PLT0_ENTRY_WORD1 | (addr & 0xffff), 1339 1.1 christos splt->contents + 4); 1340 1.1.1.5 christos bfd_put_32 (output_bfd, PLT0_ENTRY_WORD2, splt->contents + 8); 1341 1.1.1.5 christos bfd_put_32 (output_bfd, PLT0_ENTRY_WORD3, splt->contents + 12); 1342 1.1.1.5 christos bfd_put_32 (output_bfd, PLT0_ENTRY_WORD4, splt->contents + 16); 1343 1.1.1.5 christos } 1344 1.1.1.5 christos 1345 1.1.1.5 christos elf_section_data (splt->output_section)->this_hdr.sh_entsize = 1346 1.1.1.5 christos PLT_ENTRY_SIZE; 1347 1.1.1.5 christos } 1348 1.1 christos } 1349 1.1 christos 1350 1.1 christos /* Fill in the first three entries in the global offset table. */ 1351 1.1 christos if (sgot && sgot->size > 0) 1352 1.1 christos { 1353 1.1 christos if (sdyn == NULL) 1354 1.1.1.5 christos bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents); 1355 1.1 christos else 1356 1.1.1.5 christos bfd_put_32 (output_bfd, 1357 1.1.1.5 christos sdyn->output_section->vma + sdyn->output_offset, 1358 1.1.1.5 christos sgot->contents); 1359 1.1 christos bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 4); 1360 1.1 christos bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 8); 1361 1.1 christos 1362 1.1 christos /* FIXME: This can be null if create_dynamic_sections wasn't called. */ 1363 1.1 christos if (elf_section_data (sgot->output_section) != NULL) 1364 1.1.1.5 christos elf_section_data (sgot->output_section)->this_hdr.sh_entsize = 4; 1365 1.1 christos } 1366 1.1 christos 1367 1.1 christos if (lm32fdpic_fixup32_section (info)) 1368 1.1 christos { 1369 1.1 christos struct elf_link_hash_entry *hgot = elf_hash_table (info)->hgot; 1370 1.1 christos bfd_vma got_value = hgot->root.u.def.value 1371 1.1.1.5 christos + hgot->root.u.def.section->output_section->vma 1372 1.1.1.5 christos + hgot->root.u.def.section->output_offset; 1373 1.1 christos struct bfd_link_hash_entry *hend; 1374 1.1 christos 1375 1.1 christos /* Last entry is pointer to GOT. */ 1376 1.1 christos _lm32fdpic_add_rofixup (output_bfd, lm32fdpic_fixup32_section (info), got_value); 1377 1.1 christos 1378 1.1 christos /* Check we wrote enough entries. */ 1379 1.1 christos if (lm32fdpic_fixup32_section (info)->size 1380 1.1.1.5 christos != (lm32fdpic_fixup32_section (info)->reloc_count * 4)) 1381 1.1.1.5 christos { 1382 1.1.1.5 christos _bfd_error_handler 1383 1.1.1.6 christos ("LINKER BUG: .rofixup section size mismatch: size/4 %" PRId64 1384 1.1.1.6 christos " != relocs %d", 1385 1.1.1.6 christos (int64_t) (lm32fdpic_fixup32_section (info)->size / 4), 1386 1.1.1.5 christos lm32fdpic_fixup32_section (info)->reloc_count); 1387 1.1.1.8 christos return false; 1388 1.1.1.5 christos } 1389 1.1 christos 1390 1.1 christos hend = bfd_link_hash_lookup (info->hash, "__ROFIXUP_END__", 1391 1.1.1.8 christos false, false, true); 1392 1.1 christos if (hend 1393 1.1.1.5 christos && (hend->type == bfd_link_hash_defined 1394 1.1.1.7 christos || hend->type == bfd_link_hash_defweak) 1395 1.1.1.7 christos && hend->u.def.section->output_section != NULL) 1396 1.1.1.5 christos { 1397 1.1.1.5 christos bfd_vma value = 1398 1.1.1.5 christos lm32fdpic_fixup32_section (info)->output_section->vma 1399 1.1.1.5 christos + lm32fdpic_fixup32_section (info)->output_offset 1400 1.1.1.5 christos + lm32fdpic_fixup32_section (info)->size 1401 1.1.1.5 christos - hend->u.def.section->output_section->vma 1402 1.1.1.5 christos - hend->u.def.section->output_offset; 1403 1.1.1.5 christos BFD_ASSERT (hend->u.def.value == value); 1404 1.1.1.5 christos if (hend->u.def.value != value) 1405 1.1.1.5 christos { 1406 1.1.1.5 christos _bfd_error_handler 1407 1.1.1.6 christos ("LINKER BUG: .rofixup section hend->u.def.value != value: %" 1408 1.1.1.6 christos PRId64 " != %" PRId64, 1409 1.1.1.6 christos (int64_t) hend->u.def.value, (int64_t) value); 1410 1.1.1.8 christos return false; 1411 1.1.1.5 christos } 1412 1.1.1.5 christos } 1413 1.1 christos } 1414 1.1 christos 1415 1.1.1.8 christos return true; 1416 1.1 christos } 1417 1.1 christos 1418 1.1 christos /* Finish up dynamic symbol handling. We set the contents of various 1419 1.1 christos dynamic sections here. */ 1420 1.1 christos 1421 1.1.1.8 christos static bool 1422 1.1 christos lm32_elf_finish_dynamic_symbol (bfd *output_bfd, 1423 1.1 christos struct bfd_link_info *info, 1424 1.1 christos struct elf_link_hash_entry *h, 1425 1.1 christos Elf_Internal_Sym *sym) 1426 1.1 christos { 1427 1.1 christos struct elf_lm32_link_hash_table *htab; 1428 1.1 christos bfd_byte *loc; 1429 1.1 christos 1430 1.1 christos htab = lm32_elf_hash_table (info); 1431 1.1 christos 1432 1.1 christos if (h->plt.offset != (bfd_vma) -1) 1433 1.1 christos { 1434 1.1 christos asection *splt; 1435 1.1 christos asection *sgot; 1436 1.1 christos asection *srela; 1437 1.1 christos 1438 1.1 christos bfd_vma plt_index; 1439 1.1 christos bfd_vma got_offset; 1440 1.1 christos Elf_Internal_Rela rela; 1441 1.1 christos 1442 1.1 christos /* This symbol has an entry in the procedure linkage table. Set 1443 1.1.1.5 christos it up. */ 1444 1.1 christos BFD_ASSERT (h->dynindx != -1); 1445 1.1 christos 1446 1.1.1.5 christos splt = htab->root.splt; 1447 1.1.1.5 christos sgot = htab->root.sgotplt; 1448 1.1.1.5 christos srela = htab->root.srelplt; 1449 1.1 christos BFD_ASSERT (splt != NULL && sgot != NULL && srela != NULL); 1450 1.1 christos 1451 1.1 christos /* Get the index in the procedure linkage table which 1452 1.1.1.5 christos corresponds to this symbol. This is the index of this symbol 1453 1.1.1.5 christos in all the symbols for which we are making plt entries. The 1454 1.1.1.5 christos first entry in the procedure linkage table is reserved. */ 1455 1.1 christos plt_index = h->plt.offset / PLT_ENTRY_SIZE - 1; 1456 1.1 christos 1457 1.1 christos /* Get the offset into the .got table of the entry that 1458 1.1.1.5 christos corresponds to this function. Each .got entry is 4 bytes. 1459 1.1.1.5 christos The first three are reserved. */ 1460 1.1 christos got_offset = (plt_index + 3) * 4; 1461 1.1 christos 1462 1.1 christos /* Fill in the entry in the procedure linkage table. */ 1463 1.1.1.3 christos if (! bfd_link_pic (info)) 1464 1.1.1.5 christos { 1465 1.1.1.5 christos /* TODO */ 1466 1.1.1.5 christos } 1467 1.1 christos else 1468 1.1.1.5 christos { 1469 1.1.1.5 christos /* TODO */ 1470 1.1.1.5 christos } 1471 1.1 christos 1472 1.1 christos /* Fill in the entry in the global offset table. */ 1473 1.1 christos bfd_put_32 (output_bfd, 1474 1.1.1.5 christos (splt->output_section->vma 1475 1.1.1.5 christos + splt->output_offset 1476 1.1.1.5 christos + h->plt.offset 1477 1.1.1.5 christos + 12), /* same offset */ 1478 1.1.1.5 christos sgot->contents + got_offset); 1479 1.1 christos 1480 1.1 christos /* Fill in the entry in the .rela.plt section. */ 1481 1.1 christos rela.r_offset = (sgot->output_section->vma 1482 1.1.1.5 christos + sgot->output_offset 1483 1.1.1.5 christos + got_offset); 1484 1.1 christos rela.r_info = ELF32_R_INFO (h->dynindx, R_LM32_JMP_SLOT); 1485 1.1 christos rela.r_addend = 0; 1486 1.1 christos loc = srela->contents; 1487 1.1 christos loc += plt_index * sizeof (Elf32_External_Rela); 1488 1.1 christos bfd_elf32_swap_reloca_out (output_bfd, &rela, loc); 1489 1.1 christos 1490 1.1 christos if (!h->def_regular) 1491 1.1.1.5 christos { 1492 1.1.1.5 christos /* Mark the symbol as undefined, rather than as defined in 1493 1.1.1.5 christos the .plt section. Leave the value alone. */ 1494 1.1.1.5 christos sym->st_shndx = SHN_UNDEF; 1495 1.1.1.5 christos } 1496 1.1 christos 1497 1.1 christos } 1498 1.1 christos 1499 1.1 christos if (h->got.offset != (bfd_vma) -1) 1500 1.1 christos { 1501 1.1 christos asection *sgot; 1502 1.1 christos asection *srela; 1503 1.1 christos Elf_Internal_Rela rela; 1504 1.1 christos 1505 1.1 christos /* This symbol has an entry in the global offset table. Set it 1506 1.1.1.5 christos up. */ 1507 1.1.1.5 christos sgot = htab->root.sgot; 1508 1.1.1.5 christos srela = htab->root.srelgot; 1509 1.1 christos BFD_ASSERT (sgot != NULL && srela != NULL); 1510 1.1 christos 1511 1.1 christos rela.r_offset = (sgot->output_section->vma 1512 1.1.1.5 christos + sgot->output_offset 1513 1.1.1.5 christos + (h->got.offset &~ 1)); 1514 1.1 christos 1515 1.1 christos /* If this is a -Bsymbolic link, and the symbol is defined 1516 1.1.1.5 christos locally, we just want to emit a RELATIVE reloc. Likewise if 1517 1.1.1.5 christos the symbol was forced to be local because of a version file. 1518 1.1.1.5 christos The entry in the global offset table will already have been 1519 1.1.1.5 christos initialized in the relocate_section function. */ 1520 1.1.1.3 christos if (bfd_link_pic (info) 1521 1.1.1.5 christos && (info->symbolic 1522 1.1 christos || h->dynindx == -1 1523 1.1 christos || h->forced_local) 1524 1.1.1.5 christos && h->def_regular) 1525 1.1.1.5 christos { 1526 1.1.1.5 christos rela.r_info = ELF32_R_INFO (0, R_LM32_RELATIVE); 1527 1.1.1.5 christos rela.r_addend = (h->root.u.def.value 1528 1.1.1.5 christos + h->root.u.def.section->output_section->vma 1529 1.1.1.5 christos + h->root.u.def.section->output_offset); 1530 1.1.1.5 christos } 1531 1.1 christos else 1532 1.1.1.5 christos { 1533 1.1 christos BFD_ASSERT ((h->got.offset & 1) == 0); 1534 1.1.1.5 christos bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + h->got.offset); 1535 1.1.1.5 christos rela.r_info = ELF32_R_INFO (h->dynindx, R_LM32_GLOB_DAT); 1536 1.1.1.5 christos rela.r_addend = 0; 1537 1.1.1.5 christos } 1538 1.1 christos 1539 1.1 christos loc = srela->contents; 1540 1.1 christos loc += srela->reloc_count * sizeof (Elf32_External_Rela); 1541 1.1 christos bfd_elf32_swap_reloca_out (output_bfd, &rela, loc); 1542 1.1 christos ++srela->reloc_count; 1543 1.1 christos } 1544 1.1 christos 1545 1.1 christos if (h->needs_copy) 1546 1.1 christos { 1547 1.1 christos asection *s; 1548 1.1 christos Elf_Internal_Rela rela; 1549 1.1 christos 1550 1.1 christos /* This symbols needs a copy reloc. Set it up. */ 1551 1.1 christos BFD_ASSERT (h->dynindx != -1 1552 1.1.1.5 christos && (h->root.type == bfd_link_hash_defined 1553 1.1.1.5 christos || h->root.type == bfd_link_hash_defweak)); 1554 1.1 christos 1555 1.1.1.2 christos s = bfd_get_linker_section (htab->root.dynobj, ".rela.bss"); 1556 1.1 christos BFD_ASSERT (s != NULL); 1557 1.1 christos 1558 1.1 christos rela.r_offset = (h->root.u.def.value 1559 1.1.1.5 christos + h->root.u.def.section->output_section->vma 1560 1.1.1.5 christos + h->root.u.def.section->output_offset); 1561 1.1 christos rela.r_info = ELF32_R_INFO (h->dynindx, R_LM32_COPY); 1562 1.1 christos rela.r_addend = 0; 1563 1.1 christos loc = s->contents; 1564 1.1 christos loc += s->reloc_count * sizeof (Elf32_External_Rela); 1565 1.1 christos bfd_elf32_swap_reloca_out (output_bfd, &rela, loc); 1566 1.1 christos ++s->reloc_count; 1567 1.1 christos } 1568 1.1 christos 1569 1.1 christos /* Mark some specially defined symbols as absolute. */ 1570 1.1.1.3 christos if (h == htab->root.hdynamic || h == htab->root.hgot) 1571 1.1 christos sym->st_shndx = SHN_ABS; 1572 1.1 christos 1573 1.1.1.8 christos return true; 1574 1.1 christos } 1575 1.1 christos 1576 1.1 christos static enum elf_reloc_type_class 1577 1.1.1.3 christos lm32_elf_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED, 1578 1.1.1.3 christos const asection *rel_sec ATTRIBUTE_UNUSED, 1579 1.1.1.3 christos const Elf_Internal_Rela *rela) 1580 1.1 christos { 1581 1.1 christos switch ((int) ELF32_R_TYPE (rela->r_info)) 1582 1.1 christos { 1583 1.1 christos case R_LM32_RELATIVE: return reloc_class_relative; 1584 1.1 christos case R_LM32_JMP_SLOT: return reloc_class_plt; 1585 1.1 christos case R_LM32_COPY: return reloc_class_copy; 1586 1.1.1.5 christos default: return reloc_class_normal; 1587 1.1 christos } 1588 1.1 christos } 1589 1.1 christos 1590 1.1 christos /* Adjust a symbol defined by a dynamic object and referenced by a 1591 1.1 christos regular object. The current definition is in some section of the 1592 1.1 christos dynamic object, but we're not including those sections. We have to 1593 1.1 christos change the definition to something the rest of the link can 1594 1.1 christos understand. */ 1595 1.1 christos 1596 1.1.1.8 christos static bool 1597 1.1 christos lm32_elf_adjust_dynamic_symbol (struct bfd_link_info *info, 1598 1.1 christos struct elf_link_hash_entry *h) 1599 1.1 christos { 1600 1.1 christos struct elf_lm32_link_hash_table *htab; 1601 1.1 christos bfd *dynobj; 1602 1.1 christos asection *s; 1603 1.1 christos 1604 1.1 christos dynobj = elf_hash_table (info)->dynobj; 1605 1.1 christos 1606 1.1 christos /* Make sure we know what is going on here. */ 1607 1.1 christos BFD_ASSERT (dynobj != NULL 1608 1.1.1.5 christos && (h->needs_plt 1609 1.1.1.5 christos || h->is_weakalias 1610 1.1.1.5 christos || (h->def_dynamic 1611 1.1.1.5 christos && h->ref_regular 1612 1.1.1.5 christos && !h->def_regular))); 1613 1.1 christos 1614 1.1 christos /* If this is a function, put it in the procedure linkage table. We 1615 1.1 christos will fill in the contents of the procedure linkage table later, 1616 1.1 christos when we know the address of the .got section. */ 1617 1.1 christos if (h->type == STT_FUNC 1618 1.1 christos || h->needs_plt) 1619 1.1 christos { 1620 1.1.1.3 christos if (! bfd_link_pic (info) 1621 1.1.1.5 christos && !h->def_dynamic 1622 1.1.1.5 christos && !h->ref_dynamic 1623 1.1 christos && h->root.type != bfd_link_hash_undefweak 1624 1.1 christos && h->root.type != bfd_link_hash_undefined) 1625 1.1.1.5 christos { 1626 1.1.1.5 christos /* This case can occur if we saw a PLT reloc in an input 1627 1.1.1.5 christos file, but the symbol was never referred to by a dynamic 1628 1.1.1.5 christos object. In such a case, we don't actually need to build 1629 1.1.1.5 christos a procedure linkage table, and we can just do a PCREL 1630 1.1.1.5 christos reloc instead. */ 1631 1.1.1.5 christos h->plt.offset = (bfd_vma) -1; 1632 1.1.1.5 christos h->needs_plt = 0; 1633 1.1.1.5 christos } 1634 1.1 christos 1635 1.1.1.8 christos return true; 1636 1.1 christos } 1637 1.1 christos else 1638 1.1 christos h->plt.offset = (bfd_vma) -1; 1639 1.1 christos 1640 1.1 christos /* If this is a weak symbol, and there is a real definition, the 1641 1.1 christos processor independent code will have arranged for us to see the 1642 1.1 christos real definition first, and we can just use the same value. */ 1643 1.1.1.5 christos if (h->is_weakalias) 1644 1.1 christos { 1645 1.1.1.5 christos struct elf_link_hash_entry *def = weakdef (h); 1646 1.1.1.5 christos BFD_ASSERT (def->root.type == bfd_link_hash_defined); 1647 1.1.1.5 christos h->root.u.def.section = def->root.u.def.section; 1648 1.1.1.5 christos h->root.u.def.value = def->root.u.def.value; 1649 1.1.1.8 christos return true; 1650 1.1 christos } 1651 1.1 christos 1652 1.1 christos /* This is a reference to a symbol defined by a dynamic object which 1653 1.1 christos is not a function. */ 1654 1.1 christos 1655 1.1 christos /* If we are creating a shared library, we must presume that the 1656 1.1 christos only references to the symbol are via the global offset table. 1657 1.1 christos For such cases we need not do anything here; the relocations will 1658 1.1 christos be handled correctly by relocate_section. */ 1659 1.1.1.3 christos if (bfd_link_pic (info)) 1660 1.1.1.8 christos return true; 1661 1.1 christos 1662 1.1 christos /* If there are no references to this symbol that do not use the 1663 1.1 christos GOT, we don't need to generate a copy reloc. */ 1664 1.1 christos if (!h->non_got_ref) 1665 1.1.1.8 christos return true; 1666 1.1 christos 1667 1.1 christos /* If -z nocopyreloc was given, we won't generate them either. */ 1668 1.1.1.5 christos if (0 && info->nocopyreloc) 1669 1.1 christos { 1670 1.1 christos h->non_got_ref = 0; 1671 1.1.1.8 christos return true; 1672 1.1 christos } 1673 1.1 christos 1674 1.1.1.5 christos /* If we don't find any dynamic relocs in read-only sections, then 1675 1.1.1.5 christos we'll be keeping the dynamic relocs and avoiding the copy reloc. */ 1676 1.1.1.8 christos if (0 && !_bfd_elf_readonly_dynrelocs (h)) 1677 1.1 christos { 1678 1.1 christos h->non_got_ref = 0; 1679 1.1.1.8 christos return true; 1680 1.1 christos } 1681 1.1 christos 1682 1.1 christos /* We must allocate the symbol in our .dynbss section, which will 1683 1.1 christos become part of the .bss section of the executable. There will be 1684 1.1 christos an entry for this symbol in the .dynsym section. The dynamic 1685 1.1 christos object will contain position independent code, so all references 1686 1.1 christos from the dynamic object to this symbol will go through the global 1687 1.1 christos offset table. The dynamic linker will use the .dynsym entry to 1688 1.1 christos determine the address it must put in the global offset table, so 1689 1.1 christos both the dynamic object and the regular object will refer to the 1690 1.1 christos same memory location for the variable. */ 1691 1.1 christos 1692 1.1 christos htab = lm32_elf_hash_table (info); 1693 1.1 christos if (htab == NULL) 1694 1.1.1.8 christos return false; 1695 1.1 christos 1696 1.1 christos s = htab->sdynbss; 1697 1.1 christos BFD_ASSERT (s != NULL); 1698 1.1 christos 1699 1.1 christos /* We must generate a R_LM32_COPY reloc to tell the dynamic linker 1700 1.1 christos to copy the initial value out of the dynamic object and into the 1701 1.1 christos runtime process image. We need to remember the offset into the 1702 1.1 christos .rela.bss section we are going to use. */ 1703 1.1.1.2 christos if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0) 1704 1.1 christos { 1705 1.1 christos asection *srel; 1706 1.1 christos 1707 1.1 christos srel = htab->srelbss; 1708 1.1 christos BFD_ASSERT (srel != NULL); 1709 1.1 christos srel->size += sizeof (Elf32_External_Rela); 1710 1.1 christos h->needs_copy = 1; 1711 1.1 christos } 1712 1.1 christos 1713 1.1.1.3 christos return _bfd_elf_adjust_dynamic_copy (info, h, s); 1714 1.1 christos } 1715 1.1 christos 1716 1.1 christos /* Allocate space in .plt, .got and associated reloc sections for 1717 1.1 christos dynamic relocs. */ 1718 1.1 christos 1719 1.1.1.8 christos static bool 1720 1.1 christos allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf) 1721 1.1 christos { 1722 1.1 christos struct bfd_link_info *info; 1723 1.1 christos struct elf_lm32_link_hash_table *htab; 1724 1.1.1.5 christos struct elf_dyn_relocs *p; 1725 1.1 christos 1726 1.1 christos if (h->root.type == bfd_link_hash_indirect) 1727 1.1.1.8 christos return true; 1728 1.1 christos 1729 1.1 christos info = (struct bfd_link_info *) inf; 1730 1.1 christos htab = lm32_elf_hash_table (info); 1731 1.1 christos if (htab == NULL) 1732 1.1.1.8 christos return false; 1733 1.1 christos 1734 1.1 christos if (htab->root.dynamic_sections_created 1735 1.1 christos && h->plt.refcount > 0) 1736 1.1 christos { 1737 1.1 christos /* Make sure this symbol is output as a dynamic symbol. 1738 1.1.1.5 christos Undefined weak syms won't yet be marked as dynamic. */ 1739 1.1 christos if (h->dynindx == -1 1740 1.1.1.5 christos && !h->forced_local) 1741 1.1.1.5 christos { 1742 1.1.1.5 christos if (! bfd_elf_link_record_dynamic_symbol (info, h)) 1743 1.1.1.8 christos return false; 1744 1.1.1.5 christos } 1745 1.1 christos 1746 1.1.1.3 christos if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, bfd_link_pic (info), h)) 1747 1.1.1.5 christos { 1748 1.1.1.5 christos asection *s = htab->root.splt; 1749 1.1.1.5 christos 1750 1.1.1.5 christos /* If this is the first .plt entry, make room for the special 1751 1.1.1.5 christos first entry. */ 1752 1.1.1.5 christos if (s->size == 0) 1753 1.1.1.5 christos s->size += PLT_ENTRY_SIZE; 1754 1.1.1.5 christos 1755 1.1.1.5 christos h->plt.offset = s->size; 1756 1.1.1.5 christos 1757 1.1.1.5 christos /* If this symbol is not defined in a regular file, and we are 1758 1.1.1.5 christos not generating a shared library, then set the symbol to this 1759 1.1.1.5 christos location in the .plt. This is required to make function 1760 1.1.1.5 christos pointers compare as equal between the normal executable and 1761 1.1.1.5 christos the shared library. */ 1762 1.1.1.5 christos if (! bfd_link_pic (info) 1763 1.1.1.5 christos && !h->def_regular) 1764 1.1.1.5 christos { 1765 1.1.1.5 christos h->root.u.def.section = s; 1766 1.1.1.5 christos h->root.u.def.value = h->plt.offset; 1767 1.1.1.5 christos } 1768 1.1.1.5 christos 1769 1.1.1.5 christos /* Make room for this entry. */ 1770 1.1.1.5 christos s->size += PLT_ENTRY_SIZE; 1771 1.1.1.5 christos 1772 1.1.1.5 christos /* We also need to make an entry in the .got.plt section, which 1773 1.1.1.5 christos will be placed in the .got section by the linker script. */ 1774 1.1.1.5 christos htab->root.sgotplt->size += 4; 1775 1.1 christos 1776 1.1.1.5 christos /* We also need to make an entry in the .rel.plt section. */ 1777 1.1.1.5 christos htab->root.srelplt->size += sizeof (Elf32_External_Rela); 1778 1.1.1.5 christos } 1779 1.1 christos else 1780 1.1.1.5 christos { 1781 1.1.1.5 christos h->plt.offset = (bfd_vma) -1; 1782 1.1.1.5 christos h->needs_plt = 0; 1783 1.1.1.5 christos } 1784 1.1 christos } 1785 1.1 christos else 1786 1.1 christos { 1787 1.1 christos h->plt.offset = (bfd_vma) -1; 1788 1.1 christos h->needs_plt = 0; 1789 1.1 christos } 1790 1.1 christos 1791 1.1 christos if (h->got.refcount > 0) 1792 1.1 christos { 1793 1.1 christos asection *s; 1794 1.1.1.8 christos bool dyn; 1795 1.1 christos 1796 1.1 christos /* Make sure this symbol is output as a dynamic symbol. 1797 1.1.1.5 christos Undefined weak syms won't yet be marked as dynamic. */ 1798 1.1 christos if (h->dynindx == -1 1799 1.1.1.5 christos && !h->forced_local) 1800 1.1.1.5 christos { 1801 1.1.1.5 christos if (! bfd_elf_link_record_dynamic_symbol (info, h)) 1802 1.1.1.8 christos return false; 1803 1.1.1.5 christos } 1804 1.1 christos 1805 1.1.1.5 christos s = htab->root.sgot; 1806 1.1 christos 1807 1.1 christos h->got.offset = s->size; 1808 1.1 christos s->size += 4; 1809 1.1 christos dyn = htab->root.dynamic_sections_created; 1810 1.1.1.3 christos if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), h)) 1811 1.1.1.5 christos htab->root.srelgot->size += sizeof (Elf32_External_Rela); 1812 1.1 christos } 1813 1.1 christos else 1814 1.1 christos h->got.offset = (bfd_vma) -1; 1815 1.1 christos 1816 1.1.1.8 christos if (h->dyn_relocs == NULL) 1817 1.1.1.8 christos return true; 1818 1.1 christos 1819 1.1 christos /* In the shared -Bsymbolic case, discard space allocated for 1820 1.1 christos dynamic pc-relative relocs against symbols which turn out to be 1821 1.1 christos defined in regular objects. For the normal shared case, discard 1822 1.1 christos space for pc-relative relocs that have become local due to symbol 1823 1.1 christos visibility changes. */ 1824 1.1 christos 1825 1.1.1.3 christos if (bfd_link_pic (info)) 1826 1.1 christos { 1827 1.1 christos if (h->def_regular 1828 1.1.1.5 christos && (h->forced_local 1829 1.1.1.5 christos || info->symbolic)) 1830 1.1.1.5 christos { 1831 1.1.1.5 christos struct elf_dyn_relocs **pp; 1832 1.1.1.5 christos 1833 1.1.1.8 christos for (pp = &h->dyn_relocs; (p = *pp) != NULL;) 1834 1.1.1.5 christos { 1835 1.1.1.5 christos p->count -= p->pc_count; 1836 1.1.1.5 christos p->pc_count = 0; 1837 1.1.1.5 christos if (p->count == 0) 1838 1.1.1.5 christos *pp = p->next; 1839 1.1.1.5 christos else 1840 1.1.1.5 christos pp = &p->next; 1841 1.1.1.5 christos } 1842 1.1.1.5 christos } 1843 1.1 christos 1844 1.1 christos /* Also discard relocs on undefined weak syms with non-default 1845 1.1 christos visibility. */ 1846 1.1.1.8 christos if (h->dyn_relocs != NULL 1847 1.1 christos && h->root.type == bfd_link_hash_undefweak) 1848 1.1 christos { 1849 1.1 christos if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT) 1850 1.1.1.8 christos h->dyn_relocs = NULL; 1851 1.1 christos 1852 1.1 christos /* Make sure undefined weak symbols are output as a dynamic 1853 1.1 christos symbol in PIEs. */ 1854 1.1 christos else if (h->dynindx == -1 1855 1.1 christos && !h->forced_local) 1856 1.1 christos { 1857 1.1 christos if (! bfd_elf_link_record_dynamic_symbol (info, h)) 1858 1.1.1.8 christos return false; 1859 1.1 christos } 1860 1.1 christos } 1861 1.1 christos } 1862 1.1 christos else 1863 1.1 christos { 1864 1.1 christos /* For the non-shared case, discard space for relocs against 1865 1.1.1.5 christos symbols which turn out to need copy relocs or are not 1866 1.1.1.5 christos dynamic. */ 1867 1.1 christos 1868 1.1 christos if (!h->non_got_ref 1869 1.1.1.5 christos && ((h->def_dynamic 1870 1.1.1.5 christos && !h->def_regular) 1871 1.1.1.5 christos || (htab->root.dynamic_sections_created 1872 1.1.1.5 christos && (h->root.type == bfd_link_hash_undefweak 1873 1.1.1.5 christos || h->root.type == bfd_link_hash_undefined)))) 1874 1.1.1.5 christos { 1875 1.1.1.5 christos /* Make sure this symbol is output as a dynamic symbol. 1876 1.1.1.5 christos Undefined weak syms won't yet be marked as dynamic. */ 1877 1.1.1.5 christos if (h->dynindx == -1 1878 1.1.1.5 christos && !h->forced_local) 1879 1.1.1.5 christos { 1880 1.1.1.5 christos if (! bfd_elf_link_record_dynamic_symbol (info, h)) 1881 1.1.1.8 christos return false; 1882 1.1.1.5 christos } 1883 1.1.1.5 christos 1884 1.1.1.5 christos /* If that succeeded, we know we'll be keeping all the 1885 1.1.1.5 christos relocs. */ 1886 1.1.1.5 christos if (h->dynindx != -1) 1887 1.1.1.5 christos goto keep; 1888 1.1.1.5 christos } 1889 1.1 christos 1890 1.1.1.8 christos h->dyn_relocs = NULL; 1891 1.1 christos 1892 1.1 christos keep: ; 1893 1.1 christos } 1894 1.1 christos 1895 1.1 christos /* Finally, allocate space. */ 1896 1.1.1.8 christos for (p = h->dyn_relocs; p != NULL; p = p->next) 1897 1.1 christos { 1898 1.1 christos asection *sreloc = elf_section_data (p->sec)->sreloc; 1899 1.1 christos sreloc->size += p->count * sizeof (Elf32_External_Rela); 1900 1.1 christos } 1901 1.1 christos 1902 1.1.1.8 christos return true; 1903 1.1 christos } 1904 1.1 christos 1905 1.1 christos /* Set the sizes of the dynamic sections. */ 1906 1.1 christos 1907 1.1.1.8 christos static bool 1908 1.1.1.10 christos lm32_elf_late_size_sections (bfd *output_bfd, 1909 1.1.1.10 christos struct bfd_link_info *info) 1910 1.1 christos { 1911 1.1 christos struct elf_lm32_link_hash_table *htab; 1912 1.1 christos bfd *dynobj; 1913 1.1 christos asection *s; 1914 1.1.1.8 christos bool relocs; 1915 1.1 christos bfd *ibfd; 1916 1.1 christos 1917 1.1 christos htab = lm32_elf_hash_table (info); 1918 1.1 christos if (htab == NULL) 1919 1.1.1.8 christos return false; 1920 1.1 christos 1921 1.1 christos dynobj = htab->root.dynobj; 1922 1.1.1.10 christos if (dynobj == NULL) 1923 1.1.1.10 christos return true; 1924 1.1 christos 1925 1.1 christos if (htab->root.dynamic_sections_created) 1926 1.1 christos { 1927 1.1 christos /* Set the contents of the .interp section to the interpreter. */ 1928 1.1.1.3 christos if (bfd_link_executable (info) && !info->nointerp) 1929 1.1 christos { 1930 1.1.1.11 christos s = htab->root.interp; 1931 1.1 christos BFD_ASSERT (s != NULL); 1932 1.1 christos s->size = sizeof ELF_DYNAMIC_INTERPRETER; 1933 1.1 christos s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER; 1934 1.1.1.10 christos s->alloced = 1; 1935 1.1 christos } 1936 1.1 christos } 1937 1.1 christos 1938 1.1 christos /* Set up .got offsets for local syms, and space for local dynamic 1939 1.1 christos relocs. */ 1940 1.1.1.3 christos for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next) 1941 1.1 christos { 1942 1.1 christos bfd_signed_vma *local_got; 1943 1.1 christos bfd_signed_vma *end_local_got; 1944 1.1 christos bfd_size_type locsymcount; 1945 1.1 christos Elf_Internal_Shdr *symtab_hdr; 1946 1.1 christos asection *srel; 1947 1.1 christos 1948 1.1 christos if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour) 1949 1.1.1.5 christos continue; 1950 1.1 christos 1951 1.1 christos for (s = ibfd->sections; s != NULL; s = s->next) 1952 1.1.1.5 christos { 1953 1.1.1.5 christos struct elf_dyn_relocs *p; 1954 1.1 christos 1955 1.1.1.5 christos for (p = ((struct elf_dyn_relocs *) 1956 1.1.1.5 christos elf_section_data (s)->local_dynrel); 1957 1.1.1.5 christos p != NULL; 1958 1.1.1.5 christos p = p->next) 1959 1.1.1.5 christos { 1960 1.1.1.5 christos if (! bfd_is_abs_section (p->sec) 1961 1.1.1.5 christos && bfd_is_abs_section (p->sec->output_section)) 1962 1.1.1.5 christos { 1963 1.1.1.5 christos /* Input section has been discarded, either because 1964 1.1.1.5 christos it is a copy of a linkonce section or due to 1965 1.1.1.5 christos linker script /DISCARD/, so we'll be discarding 1966 1.1.1.5 christos the relocs too. */ 1967 1.1.1.5 christos } 1968 1.1.1.5 christos else if (p->count != 0) 1969 1.1.1.5 christos { 1970 1.1.1.5 christos srel = elf_section_data (p->sec)->sreloc; 1971 1.1.1.5 christos srel->size += p->count * sizeof (Elf32_External_Rela); 1972 1.1.1.5 christos if ((p->sec->output_section->flags & SEC_READONLY) != 0) 1973 1.1.1.5 christos info->flags |= DF_TEXTREL; 1974 1.1.1.5 christos } 1975 1.1.1.5 christos } 1976 1.1.1.5 christos } 1977 1.1 christos 1978 1.1 christos local_got = elf_local_got_refcounts (ibfd); 1979 1.1 christos if (!local_got) 1980 1.1.1.5 christos continue; 1981 1.1 christos 1982 1.1 christos symtab_hdr = &elf_tdata (ibfd)->symtab_hdr; 1983 1.1 christos locsymcount = symtab_hdr->sh_info; 1984 1.1 christos end_local_got = local_got + locsymcount; 1985 1.1.1.5 christos s = htab->root.sgot; 1986 1.1.1.5 christos srel = htab->root.srelgot; 1987 1.1 christos for (; local_got < end_local_got; ++local_got) 1988 1.1.1.5 christos { 1989 1.1.1.5 christos if (*local_got > 0) 1990 1.1.1.5 christos { 1991 1.1.1.5 christos *local_got = s->size; 1992 1.1.1.5 christos s->size += 4; 1993 1.1.1.5 christos if (bfd_link_pic (info)) 1994 1.1.1.5 christos srel->size += sizeof (Elf32_External_Rela); 1995 1.1.1.5 christos } 1996 1.1.1.5 christos else 1997 1.1.1.5 christos *local_got = (bfd_vma) -1; 1998 1.1.1.5 christos } 1999 1.1 christos } 2000 1.1 christos 2001 1.1 christos /* Allocate global sym .plt and .got entries, and space for global 2002 1.1 christos sym dynamic relocs. */ 2003 1.1 christos elf_link_hash_traverse (&htab->root, allocate_dynrelocs, info); 2004 1.1 christos 2005 1.1 christos /* We now have determined the sizes of the various dynamic sections. 2006 1.1 christos Allocate memory for them. */ 2007 1.1.1.8 christos relocs = false; 2008 1.1 christos for (s = dynobj->sections; s != NULL; s = s->next) 2009 1.1 christos { 2010 1.1 christos if ((s->flags & SEC_LINKER_CREATED) == 0) 2011 1.1.1.5 christos continue; 2012 1.1 christos 2013 1.1.1.5 christos if (s == htab->root.splt 2014 1.1.1.5 christos || s == htab->root.sgot 2015 1.1.1.5 christos || s == htab->root.sgotplt 2016 1.1 christos || s == htab->sdynbss) 2017 1.1.1.5 christos { 2018 1.1.1.5 christos /* Strip this section if we don't need it; see the 2019 1.1.1.5 christos comment below. */ 2020 1.1.1.5 christos } 2021 1.1.1.8 christos else if (startswith (bfd_section_name (s), ".rela")) 2022 1.1.1.5 christos { 2023 1.1.1.5 christos if (s->size != 0 && s != htab->root.srelplt) 2024 1.1.1.8 christos relocs = true; 2025 1.1.1.5 christos 2026 1.1.1.5 christos /* We use the reloc_count field as a counter if we need 2027 1.1.1.5 christos to copy relocs into the output file. */ 2028 1.1.1.5 christos s->reloc_count = 0; 2029 1.1.1.5 christos } 2030 1.1 christos else 2031 1.1 christos /* It's not one of our sections, so don't allocate space. */ 2032 1.1 christos continue; 2033 1.1 christos 2034 1.1 christos if (s->size == 0) 2035 1.1.1.5 christos { 2036 1.1.1.5 christos /* If we don't need this section, strip it from the 2037 1.1.1.5 christos output file. This is mostly to handle .rela.bss and 2038 1.1.1.5 christos .rela.plt. We must create both sections in 2039 1.1.1.5 christos create_dynamic_sections, because they must be created 2040 1.1.1.5 christos before the linker maps input sections to output 2041 1.1.1.5 christos sections. The linker does that before 2042 1.1.1.5 christos adjust_dynamic_symbol is called, and it is that 2043 1.1.1.5 christos function which decides whether anything needs to go 2044 1.1.1.5 christos into these sections. */ 2045 1.1.1.5 christos s->flags |= SEC_EXCLUDE; 2046 1.1.1.5 christos continue; 2047 1.1.1.5 christos } 2048 1.1 christos 2049 1.1 christos if ((s->flags & SEC_HAS_CONTENTS) == 0) 2050 1.1 christos continue; 2051 1.1 christos 2052 1.1 christos /* Allocate memory for the section contents. We use bfd_zalloc 2053 1.1.1.5 christos here in case unused entries are not reclaimed before the 2054 1.1.1.5 christos section's contents are written out. This should not happen, 2055 1.1.1.5 christos but this way if it does, we get a R_LM32_NONE reloc instead 2056 1.1.1.5 christos of garbage. */ 2057 1.1 christos s->contents = bfd_zalloc (dynobj, s->size); 2058 1.1 christos if (s->contents == NULL) 2059 1.1.1.8 christos return false; 2060 1.1.1.10 christos s->alloced = 1; 2061 1.1 christos } 2062 1.1 christos 2063 1.1.1.8 christos if (!_bfd_elf_add_dynamic_tags (output_bfd, info, relocs)) 2064 1.1.1.8 christos return false; 2065 1.1 christos 2066 1.1 christos /* Allocate .rofixup section. */ 2067 1.1 christos if (IS_FDPIC (output_bfd)) 2068 1.1 christos { 2069 1.1 christos struct weak_symbol_list *list_start = NULL, *list_end = NULL; 2070 1.1 christos int rgot_weak_count = 0; 2071 1.1 christos int r32_count = 0; 2072 1.1.1.9 christos int rgot_count ATTRIBUTE_UNUSED = 0; 2073 1.1 christos /* Look for deleted sections. */ 2074 1.1.1.3 christos for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next) 2075 1.1.1.5 christos { 2076 1.1.1.5 christos for (s = ibfd->sections; s != NULL; s = s->next) 2077 1.1.1.5 christos { 2078 1.1.1.5 christos if (s->reloc_count) 2079 1.1.1.5 christos { 2080 1.1.1.5 christos /* Count relocs that need .rofixup entires. */ 2081 1.1.1.5 christos Elf_Internal_Rela *internal_relocs, *end; 2082 1.1.1.5 christos internal_relocs = elf_section_data (s)->relocs; 2083 1.1.1.5 christos if (internal_relocs == NULL) 2084 1.1.1.8 christos internal_relocs = (_bfd_elf_link_read_relocs (ibfd, s, NULL, NULL, false)); 2085 1.1.1.5 christos if (internal_relocs != NULL) 2086 1.1.1.5 christos { 2087 1.1.1.5 christos end = internal_relocs + s->reloc_count; 2088 1.1.1.5 christos while (internal_relocs < end) 2089 1.1.1.5 christos { 2090 1.1.1.5 christos Elf_Internal_Shdr *symtab_hdr = &elf_tdata (ibfd)->symtab_hdr; 2091 1.1.1.5 christos struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (ibfd); 2092 1.1.1.5 christos unsigned long r_symndx; 2093 1.1.1.5 christos struct elf_link_hash_entry *h; 2094 1.1.1.5 christos 2095 1.1.1.5 christos symtab_hdr = &elf_tdata (ibfd)->symtab_hdr; 2096 1.1.1.5 christos sym_hashes = elf_sym_hashes (ibfd); 2097 1.1.1.5 christos r_symndx = ELF32_R_SYM (internal_relocs->r_info); 2098 1.1.1.5 christos h = NULL; 2099 1.1.1.5 christos if (r_symndx < symtab_hdr->sh_info) 2100 1.1.1.5 christos { 2101 1.1.1.5 christos } 2102 1.1.1.5 christos else 2103 1.1.1.5 christos { 2104 1.1.1.5 christos h = sym_hashes[r_symndx - symtab_hdr->sh_info]; 2105 1.1.1.5 christos while (h->root.type == bfd_link_hash_indirect 2106 1.1.1.5 christos || h->root.type == bfd_link_hash_warning) 2107 1.1.1.5 christos h = (struct elf_link_hash_entry *) h->root.u.i.link; 2108 1.1.1.5 christos } 2109 1.1.1.5 christos 2110 1.1.1.5 christos /* Don't generate entries for weak symbols. */ 2111 1.1.1.5 christos if (!h || (h && h->root.type != bfd_link_hash_undefweak)) 2112 1.1.1.5 christos { 2113 1.1.1.7 christos if (!discarded_section (s) && !((bfd_section_flags (s) & SEC_ALLOC) == 0)) 2114 1.1.1.5 christos { 2115 1.1.1.5 christos switch (ELF32_R_TYPE (internal_relocs->r_info)) 2116 1.1.1.5 christos { 2117 1.1.1.5 christos case R_LM32_32: 2118 1.1.1.5 christos r32_count++; 2119 1.1.1.5 christos break; 2120 1.1.1.5 christos case R_LM32_16_GOT: 2121 1.1.1.5 christos rgot_count++; 2122 1.1.1.5 christos break; 2123 1.1.1.5 christos } 2124 1.1.1.5 christos } 2125 1.1.1.5 christos } 2126 1.1.1.5 christos else 2127 1.1.1.5 christos { 2128 1.1.1.5 christos struct weak_symbol_list *current, *new_entry; 2129 1.1.1.5 christos /* Is this symbol already in the list? */ 2130 1.1.1.5 christos for (current = list_start; current; current = current->next) 2131 1.1.1.5 christos { 2132 1.1.1.5 christos if (!strcmp (current->name, h->root.root.string)) 2133 1.1.1.5 christos break; 2134 1.1.1.5 christos } 2135 1.1.1.7 christos if (!current && !discarded_section (s) && (bfd_section_flags (s) & SEC_ALLOC)) 2136 1.1.1.5 christos { 2137 1.1.1.5 christos /* Will this have an entry in the GOT. */ 2138 1.1.1.5 christos if (ELF32_R_TYPE (internal_relocs->r_info) == R_LM32_16_GOT) 2139 1.1.1.5 christos { 2140 1.1.1.5 christos /* Create a new entry. */ 2141 1.1.1.5 christos new_entry = malloc (sizeof (struct weak_symbol_list)); 2142 1.1.1.5 christos if (!new_entry) 2143 1.1.1.8 christos return false; 2144 1.1.1.5 christos new_entry->name = h->root.root.string; 2145 1.1.1.5 christos new_entry->next = NULL; 2146 1.1.1.5 christos /* Add to list */ 2147 1.1.1.5 christos if (list_start == NULL) 2148 1.1.1.5 christos { 2149 1.1.1.5 christos list_start = new_entry; 2150 1.1.1.5 christos list_end = new_entry; 2151 1.1.1.5 christos } 2152 1.1.1.5 christos else 2153 1.1.1.5 christos { 2154 1.1.1.5 christos list_end->next = new_entry; 2155 1.1.1.5 christos list_end = new_entry; 2156 1.1.1.5 christos } 2157 1.1.1.5 christos /* Increase count of undefined weak symbols in the got. */ 2158 1.1.1.5 christos rgot_weak_count++; 2159 1.1.1.5 christos } 2160 1.1.1.5 christos } 2161 1.1.1.5 christos } 2162 1.1.1.5 christos internal_relocs++; 2163 1.1.1.5 christos } 2164 1.1.1.5 christos } 2165 1.1.1.5 christos else 2166 1.1.1.8 christos return false; 2167 1.1.1.5 christos } 2168 1.1.1.5 christos } 2169 1.1.1.5 christos } 2170 1.1 christos /* Free list. */ 2171 1.1 christos while (list_start) 2172 1.1.1.5 christos { 2173 1.1.1.5 christos list_end = list_start->next; 2174 1.1.1.5 christos free (list_start); 2175 1.1.1.5 christos list_start = list_end; 2176 1.1.1.5 christos } 2177 1.1 christos 2178 1.1 christos /* Size sections. */ 2179 1.1.1.5 christos lm32fdpic_fixup32_section (info)->size 2180 1.1.1.5 christos = (r32_count + (htab->root.sgot->size / 4) - rgot_weak_count + 1) * 4; 2181 1.1 christos if (lm32fdpic_fixup32_section (info)->size == 0) 2182 1.1.1.5 christos lm32fdpic_fixup32_section (info)->flags |= SEC_EXCLUDE; 2183 1.1 christos else 2184 1.1.1.5 christos { 2185 1.1.1.5 christos lm32fdpic_fixup32_section (info)->contents = 2186 1.1.1.5 christos bfd_zalloc (dynobj, lm32fdpic_fixup32_section (info)->size); 2187 1.1.1.5 christos if (lm32fdpic_fixup32_section (info)->contents == NULL) 2188 1.1.1.8 christos return false; 2189 1.1.1.10 christos lm32fdpic_fixup32_section (info)->alloced = 1; 2190 1.1.1.5 christos } 2191 1.1 christos } 2192 1.1 christos 2193 1.1.1.8 christos return true; 2194 1.1 christos } 2195 1.1 christos 2196 1.1 christos /* Create dynamic sections when linking against a dynamic object. */ 2197 1.1 christos 2198 1.1.1.8 christos static bool 2199 1.1 christos lm32_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info) 2200 1.1 christos { 2201 1.1 christos struct elf_lm32_link_hash_table *htab; 2202 1.1 christos flagword flags, pltflags; 2203 1.1 christos asection *s; 2204 1.1.1.11 christos elf_backend_data *bed = get_elf_backend_data (abfd); 2205 1.1 christos int ptralign = 2; /* 32bit */ 2206 1.1 christos 2207 1.1 christos htab = lm32_elf_hash_table (info); 2208 1.1 christos if (htab == NULL) 2209 1.1.1.8 christos return false; 2210 1.1 christos 2211 1.1 christos /* Make sure we have a GOT - For the case where we have a dynamic object 2212 1.1 christos but none of the relocs in check_relocs */ 2213 1.1.1.5 christos if (!_bfd_elf_create_got_section (abfd, info)) 2214 1.1.1.8 christos return false; 2215 1.1 christos if (IS_FDPIC (abfd) && (htab->sfixup32 == NULL)) 2216 1.1 christos { 2217 1.1 christos if (! create_rofixup_section (abfd, info)) 2218 1.1.1.8 christos return false; 2219 1.1 christos } 2220 1.1 christos 2221 1.1 christos /* We need to create .plt, .rel[a].plt, .got, .got.plt, .dynbss, and 2222 1.1 christos .rel[a].bss sections. */ 2223 1.1 christos flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY 2224 1.1.1.5 christos | SEC_LINKER_CREATED); 2225 1.1 christos 2226 1.1 christos pltflags = flags; 2227 1.1 christos pltflags |= SEC_CODE; 2228 1.1 christos if (bed->plt_not_loaded) 2229 1.1 christos pltflags &= ~ (SEC_LOAD | SEC_HAS_CONTENTS); 2230 1.1 christos if (bed->plt_readonly) 2231 1.1 christos pltflags |= SEC_READONLY; 2232 1.1 christos 2233 1.1.1.2 christos s = bfd_make_section_anyway_with_flags (abfd, ".plt", pltflags); 2234 1.1.1.5 christos htab->root.splt = s; 2235 1.1 christos if (s == NULL 2236 1.1.1.7 christos || !bfd_set_section_alignment (s, bed->plt_alignment)) 2237 1.1.1.8 christos return false; 2238 1.1 christos 2239 1.1 christos if (bed->want_plt_sym) 2240 1.1 christos { 2241 1.1 christos /* Define the symbol _PROCEDURE_LINKAGE_TABLE_ at the start of the 2242 1.1.1.5 christos .plt section. */ 2243 1.1 christos struct bfd_link_hash_entry *bh = NULL; 2244 1.1 christos struct elf_link_hash_entry *h; 2245 1.1 christos 2246 1.1 christos if (! (_bfd_generic_link_add_one_symbol 2247 1.1.1.5 christos (info, abfd, "_PROCEDURE_LINKAGE_TABLE_", BSF_GLOBAL, s, 2248 1.1.1.8 christos (bfd_vma) 0, NULL, false, 2249 1.1.1.5 christos get_elf_backend_data (abfd)->collect, &bh))) 2250 1.1.1.8 christos return false; 2251 1.1 christos h = (struct elf_link_hash_entry *) bh; 2252 1.1 christos h->def_regular = 1; 2253 1.1 christos h->type = STT_OBJECT; 2254 1.1 christos htab->root.hplt = h; 2255 1.1 christos 2256 1.1.1.3 christos if (bfd_link_pic (info) 2257 1.1.1.5 christos && ! bfd_elf_link_record_dynamic_symbol (info, h)) 2258 1.1.1.8 christos return false; 2259 1.1 christos } 2260 1.1 christos 2261 1.1.1.2 christos s = bfd_make_section_anyway_with_flags (abfd, 2262 1.1.1.2 christos bed->default_use_rela_p 2263 1.1.1.2 christos ? ".rela.plt" : ".rel.plt", 2264 1.1.1.2 christos flags | SEC_READONLY); 2265 1.1.1.5 christos htab->root.srelplt = s; 2266 1.1 christos if (s == NULL 2267 1.1.1.7 christos || !bfd_set_section_alignment (s, ptralign)) 2268 1.1.1.8 christos return false; 2269 1.1 christos 2270 1.1.1.5 christos if (htab->root.sgot == NULL 2271 1.1.1.5 christos && !_bfd_elf_create_got_section (abfd, info)) 2272 1.1.1.8 christos return false; 2273 1.1 christos 2274 1.1 christos if (bed->want_dynbss) 2275 1.1 christos { 2276 1.1 christos /* The .dynbss section is a place to put symbols which are defined 2277 1.1.1.5 christos by dynamic objects, are referenced by regular objects, and are 2278 1.1.1.5 christos not functions. We must allocate space for them in the process 2279 1.1.1.5 christos image and use a R_*_COPY reloc to tell the dynamic linker to 2280 1.1.1.5 christos initialize them at run time. The linker script puts the .dynbss 2281 1.1.1.5 christos section into the .bss section of the final image. */ 2282 1.1.1.2 christos s = bfd_make_section_anyway_with_flags (abfd, ".dynbss", 2283 1.1.1.2 christos SEC_ALLOC | SEC_LINKER_CREATED); 2284 1.1 christos htab->sdynbss = s; 2285 1.1 christos if (s == NULL) 2286 1.1.1.8 christos return false; 2287 1.1 christos /* The .rel[a].bss section holds copy relocs. This section is not 2288 1.1.1.5 christos normally needed. We need to create it here, though, so that the 2289 1.1.1.5 christos linker will map it to an output section. We can't just create it 2290 1.1.1.5 christos only if we need it, because we will not know whether we need it 2291 1.1.1.5 christos until we have seen all the input files, and the first time the 2292 1.1.1.5 christos main linker code calls BFD after examining all the input files 2293 1.1.1.5 christos (size_dynamic_sections) the input sections have already been 2294 1.1.1.5 christos mapped to the output sections. If the section turns out not to 2295 1.1.1.5 christos be needed, we can discard it later. We will never need this 2296 1.1.1.5 christos section when generating a shared object, since they do not use 2297 1.1.1.5 christos copy relocs. */ 2298 1.1.1.3 christos if (! bfd_link_pic (info)) 2299 1.1.1.5 christos { 2300 1.1.1.5 christos s = bfd_make_section_anyway_with_flags (abfd, 2301 1.1.1.2 christos (bed->default_use_rela_p 2302 1.1.1.2 christos ? ".rela.bss" : ".rel.bss"), 2303 1.1.1.2 christos flags | SEC_READONLY); 2304 1.1.1.5 christos htab->srelbss = s; 2305 1.1.1.5 christos if (s == NULL 2306 1.1.1.7 christos || !bfd_set_section_alignment (s, ptralign)) 2307 1.1.1.8 christos return false; 2308 1.1.1.5 christos } 2309 1.1 christos } 2310 1.1 christos 2311 1.1.1.8 christos return true; 2312 1.1 christos } 2313 1.1 christos 2314 1.1.1.8 christos static bool 2315 1.1.1.10 christos lm32_elf_early_size_sections (bfd *output_bfd, struct bfd_link_info *info) 2316 1.1 christos { 2317 1.1.1.3 christos if (!bfd_link_relocatable (info)) 2318 1.1 christos { 2319 1.1.1.3 christos if (!bfd_elf_stack_segment_size (output_bfd, info, 2320 1.1.1.3 christos "__stacksize", DEFAULT_STACK_SIZE)) 2321 1.1.1.8 christos return false; 2322 1.1 christos 2323 1.1 christos asection *sec = bfd_get_section_by_name (output_bfd, ".stack"); 2324 1.1 christos if (sec) 2325 1.1.1.3 christos sec->size = info->stacksize >= 0 ? info->stacksize : 0; 2326 1.1 christos } 2327 1.1 christos 2328 1.1.1.8 christos return true; 2329 1.1 christos } 2330 1.1 christos 2331 1.1.1.8 christos static bool 2332 1.1 christos lm32_elf_fdpic_copy_private_bfd_data (bfd *ibfd, bfd *obfd) 2333 1.1 christos { 2334 1.1 christos unsigned i; 2335 1.1 christos 2336 1.1.1.11 christos if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour) 2337 1.1.1.8 christos return true; 2338 1.1 christos 2339 1.1.1.3 christos if (! _bfd_elf_copy_private_bfd_data (ibfd, obfd)) 2340 1.1.1.8 christos return false; 2341 1.1 christos 2342 1.1.1.11 christos if (! elf_tdata (ibfd)->phdr || ! elf_tdata (obfd)->phdr) 2343 1.1.1.8 christos return true; 2344 1.1 christos 2345 1.1 christos /* Copy the stack size. */ 2346 1.1 christos for (i = 0; i < elf_elfheader (ibfd)->e_phnum; i++) 2347 1.1 christos if (elf_tdata (ibfd)->phdr[i].p_type == PT_GNU_STACK) 2348 1.1 christos { 2349 1.1 christos Elf_Internal_Phdr *iphdr = &elf_tdata (ibfd)->phdr[i]; 2350 1.1 christos 2351 1.1 christos for (i = 0; i < elf_elfheader (obfd)->e_phnum; i++) 2352 1.1 christos if (elf_tdata (obfd)->phdr[i].p_type == PT_GNU_STACK) 2353 1.1 christos { 2354 1.1 christos memcpy (&elf_tdata (obfd)->phdr[i], iphdr, sizeof (*iphdr)); 2355 1.1 christos 2356 1.1 christos /* Rewrite the phdrs, since we're only called after they were first written. */ 2357 1.1 christos if (bfd_seek (obfd, (bfd_signed_vma) get_elf_backend_data (obfd) 2358 1.1 christos ->s->sizeof_ehdr, SEEK_SET) != 0 2359 1.1 christos || get_elf_backend_data (obfd)->s->write_out_phdrs (obfd, elf_tdata (obfd)->phdr, 2360 1.1 christos elf_elfheader (obfd)->e_phnum) != 0) 2361 1.1.1.8 christos return false; 2362 1.1 christos break; 2363 1.1 christos } 2364 1.1 christos 2365 1.1 christos break; 2366 1.1 christos } 2367 1.1 christos 2368 1.1.1.8 christos return true; 2369 1.1 christos } 2370 1.1 christos 2371 1.1 christos 2372 1.1.1.5 christos #define ELF_ARCH bfd_arch_lm32 2373 1.1 christos #define ELF_TARGET_ID LM32_ELF_DATA 2374 1.1.1.5 christos #define ELF_MACHINE_CODE EM_LATTICEMICO32 2375 1.1.1.5 christos #define ELF_MAXPAGESIZE 0x1000 2376 1.1 christos 2377 1.1.1.5 christos #define TARGET_BIG_SYM lm32_elf32_vec 2378 1.1.1.5 christos #define TARGET_BIG_NAME "elf32-lm32" 2379 1.1 christos 2380 1.1.1.5 christos #define bfd_elf32_bfd_reloc_type_lookup lm32_reloc_type_lookup 2381 1.1.1.5 christos #define bfd_elf32_bfd_reloc_name_lookup lm32_reloc_name_lookup 2382 1.1.1.5 christos #define elf_info_to_howto lm32_info_to_howto_rela 2383 1.1.1.6 christos #define elf_info_to_howto_rel NULL 2384 1.1.1.5 christos #define elf_backend_rela_normal 1 2385 1.1.1.5 christos #define elf_backend_object_p lm32_elf_object_p 2386 1.1.1.5 christos #define elf_backend_final_write_processing lm32_elf_final_write_processing 2387 1.1.1.3 christos #define elf_backend_stack_align 8 2388 1.1.1.5 christos #define elf_backend_can_gc_sections 1 2389 1.1.1.5 christos #define elf_backend_can_refcount 1 2390 1.1.1.5 christos #define elf_backend_gc_mark_hook lm32_elf_gc_mark_hook 2391 1.1.1.5 christos #define elf_backend_plt_readonly 1 2392 1.1.1.5 christos #define elf_backend_want_got_plt 1 2393 1.1.1.5 christos #define elf_backend_want_plt_sym 0 2394 1.1.1.5 christos #define elf_backend_got_header_size 12 2395 1.1.1.5 christos #define elf_backend_dtrel_excludes_plt 1 2396 1.1.1.5 christos #define bfd_elf32_bfd_link_hash_table_create lm32_elf_link_hash_table_create 2397 1.1.1.5 christos #define elf_backend_check_relocs lm32_elf_check_relocs 2398 1.1.1.5 christos #define elf_backend_reloc_type_class lm32_elf_reloc_type_class 2399 1.1.1.10 christos #define elf_backend_late_size_sections lm32_elf_late_size_sections 2400 1.1.1.6 christos #define elf_backend_omit_section_dynsym _bfd_elf_omit_section_dynsym_all 2401 1.1.1.5 christos #define elf_backend_create_dynamic_sections lm32_elf_create_dynamic_sections 2402 1.1.1.5 christos #define elf_backend_finish_dynamic_sections lm32_elf_finish_dynamic_sections 2403 1.1.1.5 christos #define elf_backend_adjust_dynamic_symbol lm32_elf_adjust_dynamic_symbol 2404 1.1.1.5 christos #define elf_backend_finish_dynamic_symbol lm32_elf_finish_dynamic_symbol 2405 1.1.1.5 christos #define elf_backend_relocate_section lm32_elf_relocate_section 2406 1.1 christos 2407 1.1 christos #include "elf32-target.h" 2408 1.1 christos 2409 1.1 christos #undef ELF_MAXPAGESIZE 2410 1.1 christos #define ELF_MAXPAGESIZE 0x4000 2411 1.1 christos 2412 1.1 christos 2413 1.1 christos #undef TARGET_BIG_SYM 2414 1.1.1.5 christos #define TARGET_BIG_SYM lm32_elf32_fdpic_vec 2415 1.1.1.5 christos #undef TARGET_BIG_NAME 2416 1.1 christos #define TARGET_BIG_NAME "elf32-lm32fdpic" 2417 1.1 christos #undef elf32_bed 2418 1.1 christos #define elf32_bed elf32_lm32fdpic_bed 2419 1.1 christos 2420 1.1.1.10 christos #undef elf_backend_early_size_sections 2421 1.1.1.10 christos #define elf_backend_early_size_sections lm32_elf_early_size_sections 2422 1.1.1.5 christos #undef bfd_elf32_bfd_copy_private_bfd_data 2423 1.1.1.5 christos #define bfd_elf32_bfd_copy_private_bfd_data lm32_elf_fdpic_copy_private_bfd_data 2424 1.1 christos 2425 1.1 christos #include "elf32-target.h" 2426