]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - bfd/elfnn-kvx.c
New Romanian translation for ld
[thirdparty/binutils-gdb.git] / bfd / elfnn-kvx.c
CommitLineData
6e712424
PI
1/* KVX-specific support for NN-bit ELF.
2 Copyright (C) 2009-2023 Free Software Foundation, Inc.
3 Contributed by Kalray SA.
4
5 This file is part of BFD, the Binary File Descriptor library.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; see the file COPYING3. If not,
19 see <http://www.gnu.org/licenses/>. */
20
21#include "sysdep.h"
22#include "bfd.h"
23#include "libiberty.h"
24#include "libbfd.h"
25#include "elf-bfd.h"
26#include "bfdlink.h"
27#include "objalloc.h"
28#include "elf/kvx.h"
29#include "elfxx-kvx.h"
30
31#define ARCH_SIZE NN
32
33#if ARCH_SIZE == 64
34#define LOG_FILE_ALIGN 3
35#endif
36
37#if ARCH_SIZE == 32
38#define LOG_FILE_ALIGN 2
39#endif
40
41#define IS_KVX_TLS_RELOC(R_TYPE) \
42 ((R_TYPE) == BFD_RELOC_KVX_S37_TLS_LE_LO10 \
43 || (R_TYPE) == BFD_RELOC_KVX_S37_TLS_LE_UP27 \
44 || (R_TYPE) == BFD_RELOC_KVX_S43_TLS_LE_LO10 \
45 || (R_TYPE) == BFD_RELOC_KVX_S43_TLS_LE_UP27 \
46 || (R_TYPE) == BFD_RELOC_KVX_S43_TLS_LE_EX6 \
47 || (R_TYPE) == BFD_RELOC_KVX_S37_TLS_DTPOFF_LO10 \
48 || (R_TYPE) == BFD_RELOC_KVX_S37_TLS_DTPOFF_UP27 \
49 || (R_TYPE) == BFD_RELOC_KVX_S43_TLS_DTPOFF_LO10 \
50 || (R_TYPE) == BFD_RELOC_KVX_S43_TLS_DTPOFF_UP27 \
51 || (R_TYPE) == BFD_RELOC_KVX_S43_TLS_DTPOFF_EX6 \
52 || (R_TYPE) == BFD_RELOC_KVX_S37_TLS_IE_LO10 \
53 || (R_TYPE) == BFD_RELOC_KVX_S37_TLS_IE_UP27 \
54 || (R_TYPE) == BFD_RELOC_KVX_S43_TLS_IE_LO10 \
55 || (R_TYPE) == BFD_RELOC_KVX_S43_TLS_IE_UP27 \
56 || (R_TYPE) == BFD_RELOC_KVX_S43_TLS_IE_EX6 \
57 || (R_TYPE) == BFD_RELOC_KVX_S37_TLS_GD_LO10 \
58 || (R_TYPE) == BFD_RELOC_KVX_S37_TLS_GD_UP27 \
59 || (R_TYPE) == BFD_RELOC_KVX_S43_TLS_GD_LO10 \
60 || (R_TYPE) == BFD_RELOC_KVX_S43_TLS_GD_UP27 \
61 || (R_TYPE) == BFD_RELOC_KVX_S43_TLS_GD_EX6 \
62 || (R_TYPE) == BFD_RELOC_KVX_S37_TLS_LD_LO10 \
63 || (R_TYPE) == BFD_RELOC_KVX_S37_TLS_LD_UP27 \
64 || (R_TYPE) == BFD_RELOC_KVX_S43_TLS_LD_LO10 \
65 || (R_TYPE) == BFD_RELOC_KVX_S43_TLS_LD_UP27 \
66 || (R_TYPE) == BFD_RELOC_KVX_S43_TLS_LD_EX6 \
67 )
68
69#define IS_KVX_TLS_RELAX_RELOC(R_TYPE) 0
70
71#define ELIMINATE_COPY_RELOCS 0
72
73/* Return size of a relocation entry. HTAB is the bfd's
74 elf_kvx_link_hash_entry. */
75#define RELOC_SIZE(HTAB) (sizeof (ElfNN_External_Rela))
76
77/* GOT Entry size - 8 bytes in ELF64 and 4 bytes in ELF32. */
78#define GOT_ENTRY_SIZE (ARCH_SIZE / 8)
79#define PLT_ENTRY_SIZE (32)
80
81#define PLT_SMALL_ENTRY_SIZE (4*4)
82
83/* Encoding of the nop instruction */
84#define INSN_NOP 0x00f0037f
85
86#define kvx_compute_jump_table_size(htab) \
87 (((htab)->root.srelplt == NULL) ? 0 \
88 : (htab)->root.srelplt->reloc_count * GOT_ENTRY_SIZE)
89
90static const bfd_byte elfNN_kvx_small_plt0_entry[PLT_ENTRY_SIZE] =
91{
92 /* FIXME KVX: no first entry, not used yet */
93 0
94};
95
96/* Per function entry in a procedure linkage table looks like this
97 if the distance between the PLTGOT and the PLT is < 4GB use
98 these PLT entries. */
99static const bfd_byte elfNN_kvx_small_plt_entry[PLT_SMALL_ENTRY_SIZE] =
100{
101 0x10, 0x00, 0xc4, 0x0f, /* get $r16 = $pc ;; */
102#if ARCH_SIZE == 32
103 0x10, 0x00, 0x40, 0xb0, /* lwz $r16 = 0[$r16] ;; */
104#else
105 0x10, 0x00, 0x40, 0xb8, /* ld $r16 = 0[$r16] ;; */
106#endif
107 0x00, 0x00, 0x00, 0x18, /* upper 27 bits for LSU */
108 0x10, 0x00, 0xd8, 0x0f, /* igoto $r16 ;; */
109};
110
111/* Long stub use 43bits format of make. */
112static const uint32_t elfNN_kvx_long_branch_stub[] =
113{
114 0xe0400000, /* make $r16 = LO10<emm43> EX6<imm43> */
115 0x00000000, /* UP27<imm43> ;; */
116 0x0fd80010, /* igoto "r16 ;; */
117};
118
119#define elf_info_to_howto elfNN_kvx_info_to_howto
120#define elf_info_to_howto_rel elfNN_kvx_info_to_howto
121
122#define KVX_ELF_ABI_VERSION 0
123
124/* In case we're on a 32-bit machine, construct a 64-bit "-1" value. */
125#define ALL_ONES (~ (bfd_vma) 0)
126
127/* Indexed by the bfd interal reloc enumerators.
128 Therefore, the table needs to be synced with BFD_RELOC_KVX_*
129 in reloc.c. */
130
131#define KVX_KV3_V1_KV3_V2_KV4_V1
132#include "elfxx-kvx-relocs.h"
133#undef KVX_KV3_V1_KV3_V2_KV4_V1
134
135/* Given HOWTO, return the bfd internal relocation enumerator. */
136
137static bfd_reloc_code_real_type
138elfNN_kvx_bfd_reloc_from_howto (reloc_howto_type *howto)
139{
140 const int size = (int) ARRAY_SIZE (elf_kvx_howto_table);
141 const ptrdiff_t offset = howto - elf_kvx_howto_table;
142
143 if (offset >= 0 && offset < size)
144 return BFD_RELOC_KVX_RELOC_START + offset + 1;
145
146 return BFD_RELOC_KVX_RELOC_START + 1;
147}
148
149/* Given R_TYPE, return the bfd internal relocation enumerator. */
150
151static bfd_reloc_code_real_type
152elfNN_kvx_bfd_reloc_from_type (bfd *abfd ATTRIBUTE_UNUSED, unsigned int r_type)
153{
154 static bool initialized_p = false;
155 /* Indexed by R_TYPE, values are offsets in the howto_table. */
156 static unsigned int offsets[R_KVX_end];
157
158 if (!initialized_p)
159 {
160 unsigned int i;
161
162 for (i = 0; i < ARRAY_SIZE (elf_kvx_howto_table); ++i)
d530ba0a 163 offsets[elf_kvx_howto_table[i].type] = i;
6e712424
PI
164
165 initialized_p = true;
166 }
167
168 /* PR 17512: file: b371e70a. */
169 if (r_type >= R_KVX_end)
170 {
171 bfd_set_error (bfd_error_bad_value);
172 return BFD_RELOC_KVX_RELOC_END;
173 }
174
175 return (BFD_RELOC_KVX_RELOC_START + 1) + offsets[r_type];
176}
177
178struct elf_kvx_reloc_map
179{
180 bfd_reloc_code_real_type from;
181 bfd_reloc_code_real_type to;
182};
183
184/* Map bfd generic reloc to KVX-specific reloc. */
185static const struct elf_kvx_reloc_map elf_kvx_reloc_map[] =
186{
187 {BFD_RELOC_NONE, BFD_RELOC_KVX_NONE},
188
189 /* Basic data relocations. */
190 {BFD_RELOC_CTOR, BFD_RELOC_KVX_NN},
191 {BFD_RELOC_64, BFD_RELOC_KVX_64},
192 {BFD_RELOC_32, BFD_RELOC_KVX_32},
193 {BFD_RELOC_16, BFD_RELOC_KVX_16},
194 {BFD_RELOC_8, BFD_RELOC_KVX_8},
195
196 {BFD_RELOC_64_PCREL, BFD_RELOC_KVX_64_PCREL},
197 {BFD_RELOC_32_PCREL, BFD_RELOC_KVX_32_PCREL},
198};
199
200/* Given the bfd internal relocation enumerator in CODE, return the
201 corresponding howto entry. */
202
203static reloc_howto_type *
204elfNN_kvx_howto_from_bfd_reloc (bfd_reloc_code_real_type code)
205{
206 unsigned int i;
207
208 /* Convert bfd generic reloc to KVX-specific reloc. */
209 if (code < BFD_RELOC_KVX_RELOC_START || code > BFD_RELOC_KVX_RELOC_END)
210 for (i = 0; i < ARRAY_SIZE (elf_kvx_reloc_map) ; i++)
211 if (elf_kvx_reloc_map[i].from == code)
212 {
213 code = elf_kvx_reloc_map[i].to;
214 break;
215 }
216
217 if (code > BFD_RELOC_KVX_RELOC_START && code < BFD_RELOC_KVX_RELOC_END)
218 return &elf_kvx_howto_table[code - (BFD_RELOC_KVX_RELOC_START + 1)];
219
220 return NULL;
221}
222
223static reloc_howto_type *
224elfNN_kvx_howto_from_type (bfd *abfd, unsigned int r_type)
225{
226 bfd_reloc_code_real_type val;
227 reloc_howto_type *howto;
228
229#if ARCH_SIZE == 32
230 if (r_type > 256)
231 {
232 bfd_set_error (bfd_error_bad_value);
233 return NULL;
234 }
235#endif
236
237 val = elfNN_kvx_bfd_reloc_from_type (abfd, r_type);
238 howto = elfNN_kvx_howto_from_bfd_reloc (val);
239
240 if (howto != NULL)
241 return howto;
242
243 bfd_set_error (bfd_error_bad_value);
244 return NULL;
245}
246
247static bool
248elfNN_kvx_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, arelent *bfd_reloc,
d530ba0a 249 Elf_Internal_Rela *elf_reloc)
6e712424
PI
250{
251 unsigned int r_type;
252
253 r_type = ELFNN_R_TYPE (elf_reloc->r_info);
254 bfd_reloc->howto = elfNN_kvx_howto_from_type (abfd, r_type);
255
256 if (bfd_reloc->howto == NULL)
257 {
258 /* xgettext:c-format */
d530ba0a
AM
259 _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
260 abfd, r_type);
6e712424
PI
261 return false;
262 }
263 return true;
264}
265
266static reloc_howto_type *
267elfNN_kvx_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
d530ba0a 268 bfd_reloc_code_real_type code)
6e712424
PI
269{
270 reloc_howto_type *howto = elfNN_kvx_howto_from_bfd_reloc (code);
271
272 if (howto != NULL)
273 return howto;
274
275 bfd_set_error (bfd_error_bad_value);
276 return NULL;
277}
278
279static reloc_howto_type *
280elfNN_kvx_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
d530ba0a 281 const char *r_name)
6e712424
PI
282{
283 unsigned int i;
284
285 for (i = 0; i < ARRAY_SIZE (elf_kvx_howto_table); ++i)
286 if (elf_kvx_howto_table[i].name != NULL
287 && strcasecmp (elf_kvx_howto_table[i].name, r_name) == 0)
288 return &elf_kvx_howto_table[i];
289
290 return NULL;
291}
292
293#define TARGET_LITTLE_SYM kvx_elfNN_vec
294#define TARGET_LITTLE_NAME "elfNN-kvx"
295
296/* The linker script knows the section names for placement.
297 The entry_names are used to do simple name mangling on the stubs.
298 Given a function name, and its type, the stub can be found. The
299 name can be changed. The only requirement is the %s be present. */
300#define STUB_ENTRY_NAME "__%s_veneer"
301
302/* The name of the dynamic interpreter. This is put in the .interp
303 section. */
304#define ELF_DYNAMIC_INTERPRETER "/lib/ld.so.1"
305
306
307/* PCREL 27 is signed-extended and scaled by 4 */
308#define KVX_MAX_FWD_CALL_OFFSET \
309 (((1 << 26) - 1) << 2)
310#define KVX_MAX_BWD_CALL_OFFSET \
311 (-((1 << 26) << 2))
312
313/* Check that the destination of the call is within the PCREL27
314 range. */
315static int
316kvx_valid_call_p (bfd_vma value, bfd_vma place)
317{
318 bfd_signed_vma offset = (bfd_signed_vma) (value - place);
319 return (offset <= KVX_MAX_FWD_CALL_OFFSET
320 && offset >= KVX_MAX_BWD_CALL_OFFSET);
321}
322
323/* Section name for stubs is the associated section name plus this
324 string. */
325#define STUB_SUFFIX ".stub"
326
327enum elf_kvx_stub_type
328{
329 kvx_stub_none,
330 kvx_stub_long_branch,
331};
332
333struct elf_kvx_stub_hash_entry
334{
335 /* Base hash table entry structure. */
336 struct bfd_hash_entry root;
337
338 /* The stub section. */
339 asection *stub_sec;
340
341 /* Offset within stub_sec of the beginning of this stub. */
342 bfd_vma stub_offset;
343
344 /* Given the symbol's value and its section we can determine its final
345 value when building the stubs (so the stub knows where to jump). */
346 bfd_vma target_value;
347 asection *target_section;
348
349 enum elf_kvx_stub_type stub_type;
350
351 /* The symbol table entry, if any, that this was derived from. */
352 struct elf_kvx_link_hash_entry *h;
353
354 /* Destination symbol type */
355 unsigned char st_type;
356
357 /* Where this stub is being called from, or, in the case of combined
358 stub sections, the first input section in the group. */
359 asection *id_sec;
360
361 /* The name for the local symbol at the start of this stub. The
362 stub name in the hash table has to be unique; this does not, so
363 it can be friendlier. */
364 char *output_name;
365};
366
367/* Used to build a map of a section. This is required for mixed-endian
368 code/data. */
369
370typedef struct elf_elf_section_map
371{
372 bfd_vma vma;
373 char type;
374}
375elf_kvx_section_map;
376
377
378typedef struct _kvx_elf_section_data
379{
380 struct bfd_elf_section_data elf;
381 unsigned int mapcount;
382 unsigned int mapsize;
383 elf_kvx_section_map *map;
384}
385_kvx_elf_section_data;
386
387#define elf_kvx_section_data(sec) \
388 ((_kvx_elf_section_data *) elf_section_data (sec))
389
390struct elf_kvx_local_symbol
391{
392 unsigned int got_type;
393 bfd_signed_vma got_refcount;
394 bfd_vma got_offset;
395};
396
397struct elf_kvx_obj_tdata
398{
399 struct elf_obj_tdata root;
400
401 /* local symbol descriptors */
402 struct elf_kvx_local_symbol *locals;
403
404 /* Zero to warn when linking objects with incompatible enum sizes. */
405 int no_enum_size_warning;
406
407 /* Zero to warn when linking objects with incompatible wchar_t sizes. */
408 int no_wchar_size_warning;
409};
410
411#define elf_kvx_tdata(bfd) \
412 ((struct elf_kvx_obj_tdata *) (bfd)->tdata.any)
413
414#define elf_kvx_locals(bfd) (elf_kvx_tdata (bfd)->locals)
415
416#define is_kvx_elf(bfd) \
417 (bfd_get_flavour (bfd) == bfd_target_elf_flavour \
418 && elf_tdata (bfd) != NULL \
419 && elf_object_id (bfd) == KVX_ELF_DATA)
420
421static bool
422elfNN_kvx_mkobject (bfd *abfd)
423{
424 return bfd_elf_allocate_object (abfd, sizeof (struct elf_kvx_obj_tdata),
425 KVX_ELF_DATA);
426}
427
428#define elf_kvx_hash_entry(ent) \
429 ((struct elf_kvx_link_hash_entry *)(ent))
430
431#define GOT_UNKNOWN 0
432#define GOT_NORMAL 1
433
434#define GOT_TLS_GD 2
435#define GOT_TLS_IE 4
436#define GOT_TLS_LD 8
437
438/* KVX ELF linker hash entry. */
439struct elf_kvx_link_hash_entry
440{
441 struct elf_link_hash_entry root;
442
443 /* Since PLT entries have variable size, we need to record the
444 index into .got.plt instead of recomputing it from the PLT
445 offset. */
446 bfd_signed_vma plt_got_offset;
447
448 /* Bit mask representing the type of GOT entry(s) if any required by
449 this symbol. */
450 unsigned int got_type;
451
452 /* A pointer to the most recently used stub hash entry against this
453 symbol. */
454 struct elf_kvx_stub_hash_entry *stub_cache;
455};
456
457/* Get the KVX elf linker hash table from a link_info structure. */
458#define elf_kvx_hash_table(info) \
459 ((struct elf_kvx_link_hash_table *) ((info)->hash))
460
461#define kvx_stub_hash_lookup(table, string, create, copy) \
462 ((struct elf_kvx_stub_hash_entry *) \
463 bfd_hash_lookup ((table), (string), (create), (copy)))
464
465/* KVX ELF linker hash table. */
466struct elf_kvx_link_hash_table
467{
468 /* The main hash table. */
469 struct elf_link_hash_table root;
470
471 /* Nonzero to force PIC branch veneers. */
472 int pic_veneer;
473
474 /* The number of bytes in the initial entry in the PLT. */
475 bfd_size_type plt_header_size;
476
477 /* The number of bytes in the subsequent PLT etries. */
478 bfd_size_type plt_entry_size;
479
480 /* The bytes of the subsequent PLT entry. */
481 const bfd_byte *plt_entry;
482
483 /* Short-cuts to get to dynamic linker sections. */
484 asection *sdynbss;
485 asection *srelbss;
486
487 /* Small local sym cache. */
488 struct sym_cache sym_cache;
489
490 /* For convenience in allocate_dynrelocs. */
491 bfd *obfd;
492
493 /* The amount of space used by the reserved portion of the sgotplt
494 section, plus whatever space is used by the jump slots. */
495 bfd_vma sgotplt_jump_table_size;
496
497 /* The stub hash table. */
498 struct bfd_hash_table stub_hash_table;
499
500 /* Linker stub bfd. */
501 bfd *stub_bfd;
502
503 /* Linker call-backs. */
504 asection *(*add_stub_section) (const char *, asection *);
505 void (*layout_sections_again) (void);
506
507 /* Array to keep track of which stub sections have been created, and
508 information on stub grouping. */
509 struct map_stub
510 {
511 /* This is the section to which stubs in the group will be
512 attached. */
513 asection *link_sec;
514 /* The stub section. */
515 asection *stub_sec;
516 } *stub_group;
517
518 /* Assorted information used by elfNN_kvx_size_stubs. */
519 unsigned int bfd_count;
520 unsigned int top_index;
521 asection **input_list;
522};
523
524/* Create an entry in an KVX ELF linker hash table. */
525
526static struct bfd_hash_entry *
527elfNN_kvx_link_hash_newfunc (struct bfd_hash_entry *entry,
d530ba0a
AM
528 struct bfd_hash_table *table,
529 const char *string)
6e712424
PI
530{
531 struct elf_kvx_link_hash_entry *ret =
532 (struct elf_kvx_link_hash_entry *) entry;
533
534 /* Allocate the structure if it has not already been allocated by a
535 subclass. */
536 if (ret == NULL)
537 ret = bfd_hash_allocate (table,
538 sizeof (struct elf_kvx_link_hash_entry));
539 if (ret == NULL)
540 return (struct bfd_hash_entry *) ret;
541
542 /* Call the allocation method of the superclass. */
543 ret = ((struct elf_kvx_link_hash_entry *)
544 _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret,
545 table, string));
546 if (ret != NULL)
547 {
548 ret->got_type = GOT_UNKNOWN;
549 ret->plt_got_offset = (bfd_vma) - 1;
550 ret->stub_cache = NULL;
551 }
552
553 return (struct bfd_hash_entry *) ret;
554}
555
556/* Initialize an entry in the stub hash table. */
557
558static struct bfd_hash_entry *
559stub_hash_newfunc (struct bfd_hash_entry *entry,
560 struct bfd_hash_table *table, const char *string)
561{
562 /* Allocate the structure if it has not already been allocated by a
563 subclass. */
564 if (entry == NULL)
565 {
566 entry = bfd_hash_allocate (table,
567 sizeof (struct
568 elf_kvx_stub_hash_entry));
569 if (entry == NULL)
570 return entry;
571 }
572
573 /* Call the allocation method of the superclass. */
574 entry = bfd_hash_newfunc (entry, table, string);
575 if (entry != NULL)
576 {
577 struct elf_kvx_stub_hash_entry *eh;
578
579 /* Initialize the local fields. */
580 eh = (struct elf_kvx_stub_hash_entry *) entry;
581 eh->stub_sec = NULL;
582 eh->stub_offset = 0;
583 eh->target_value = 0;
584 eh->target_section = NULL;
585 eh->stub_type = kvx_stub_none;
586 eh->h = NULL;
587 eh->id_sec = NULL;
588 }
589
590 return entry;
591}
592
593/* Copy the extra info we tack onto an elf_link_hash_entry. */
594
595static void
596elfNN_kvx_copy_indirect_symbol (struct bfd_link_info *info,
d530ba0a
AM
597 struct elf_link_hash_entry *dir,
598 struct elf_link_hash_entry *ind)
6e712424
PI
599{
600 struct elf_kvx_link_hash_entry *edir, *eind;
601
602 edir = (struct elf_kvx_link_hash_entry *) dir;
603 eind = (struct elf_kvx_link_hash_entry *) ind;
604
605 if (ind->root.type == bfd_link_hash_indirect)
606 {
607 /* Copy over PLT info. */
608 if (dir->got.refcount <= 0)
609 {
610 edir->got_type = eind->got_type;
611 eind->got_type = GOT_UNKNOWN;
612 }
613 }
614
615 _bfd_elf_link_hash_copy_indirect (info, dir, ind);
616}
617
618/* Destroy a KVX elf linker hash table. */
619
620static void
621elfNN_kvx_link_hash_table_free (bfd *obfd)
622{
623 struct elf_kvx_link_hash_table *ret
624 = (struct elf_kvx_link_hash_table *) obfd->link.hash;
625
626 bfd_hash_table_free (&ret->stub_hash_table);
627 _bfd_elf_link_hash_table_free (obfd);
628}
629
630/* Create a KVX elf linker hash table. */
631
632static struct bfd_link_hash_table *
633elfNN_kvx_link_hash_table_create (bfd *abfd)
634{
635 struct elf_kvx_link_hash_table *ret;
636 bfd_size_type amt = sizeof (struct elf_kvx_link_hash_table);
637
638 ret = bfd_zmalloc (amt);
639 if (ret == NULL)
640 return NULL;
641
642 if (!_bfd_elf_link_hash_table_init
643 (&ret->root, abfd, elfNN_kvx_link_hash_newfunc,
644 sizeof (struct elf_kvx_link_hash_entry), KVX_ELF_DATA))
645 {
646 free (ret);
647 return NULL;
648 }
649
650 ret->plt_header_size = PLT_ENTRY_SIZE;
651 ret->plt_entry_size = PLT_SMALL_ENTRY_SIZE;
652 ret->plt_entry = elfNN_kvx_small_plt_entry;
653
654 ret->obfd = abfd;
655
656 if (!bfd_hash_table_init (&ret->stub_hash_table, stub_hash_newfunc,
657 sizeof (struct elf_kvx_stub_hash_entry)))
658 {
659 _bfd_elf_link_hash_table_free (abfd);
660 return NULL;
661 }
662
663 ret->root.root.hash_table_free = elfNN_kvx_link_hash_table_free;
664
665 return &ret->root.root;
666}
667
668static bfd_reloc_status_type
669kvx_relocate (unsigned int r_type, bfd *input_bfd, asection *input_section,
d530ba0a 670 bfd_vma offset, bfd_vma value)
6e712424
PI
671{
672 reloc_howto_type *howto;
6e712424
PI
673
674 howto = elfNN_kvx_howto_from_type (input_bfd, r_type);
6e712424 675 r_type = elfNN_kvx_bfd_reloc_from_type (input_bfd, r_type);
6e712424 676 return _bfd_kvx_elf_put_addend (input_bfd,
d530ba0a
AM
677 input_section->contents + offset, r_type,
678 howto, value);
6e712424
PI
679}
680
681/* Determine the type of stub needed, if any, for a call. */
682
683static enum elf_kvx_stub_type
684kvx_type_of_stub (asection *input_sec,
d530ba0a
AM
685 const Elf_Internal_Rela *rel,
686 asection *sym_sec,
687 unsigned char st_type,
688 bfd_vma destination)
6e712424
PI
689{
690 bfd_vma location;
691 bfd_signed_vma branch_offset;
692 unsigned int r_type;
693 enum elf_kvx_stub_type stub_type = kvx_stub_none;
694
695 if (st_type != STT_FUNC
696 && (sym_sec == input_sec))
697 return stub_type;
698
699 /* Determine where the call point is. */
700 location = (input_sec->output_offset
d530ba0a 701 + input_sec->output_section->vma + rel->r_offset);
6e712424
PI
702
703 branch_offset = (bfd_signed_vma) (destination - location);
704
705 r_type = ELFNN_R_TYPE (rel->r_info);
706
707 /* We don't want to redirect any old unconditional jump in this way,
708 only one which is being used for a sibcall, where it is
709 acceptable for the R16 and R17 registers to be clobbered. */
710 if (r_type == R_KVX_PCREL27
711 && (branch_offset > KVX_MAX_FWD_CALL_OFFSET
712 || branch_offset < KVX_MAX_BWD_CALL_OFFSET))
713 {
714 stub_type = kvx_stub_long_branch;
715 }
716
717 return stub_type;
718}
719
720/* Build a name for an entry in the stub hash table. */
721
722static char *
723elfNN_kvx_stub_name (const asection *input_section,
d530ba0a
AM
724 const asection *sym_sec,
725 const struct elf_kvx_link_hash_entry *hash,
726 const Elf_Internal_Rela *rel)
6e712424
PI
727{
728 char *stub_name;
729 bfd_size_type len;
730
731 if (hash)
732 {
733 len = 8 + 1 + strlen (hash->root.root.root.string) + 1 + 16 + 1;
734 stub_name = bfd_malloc (len);
735 if (stub_name != NULL)
736 snprintf (stub_name, len, "%08x_%s+%" PRIx64 "x",
737 (unsigned int) input_section->id,
738 hash->root.root.root.string,
835f16da 739 (uint64_t) rel->r_addend);
6e712424
PI
740 }
741 else
742 {
743 len = 8 + 1 + 8 + 1 + 8 + 1 + 16 + 1;
744 stub_name = bfd_malloc (len);
745 if (stub_name != NULL)
746 snprintf (stub_name, len, "%08x_%x:%x+%" PRIx64 "x",
747 (unsigned int) input_section->id,
748 (unsigned int) sym_sec->id,
749 (unsigned int) ELFNN_R_SYM (rel->r_info),
835f16da 750 (uint64_t) rel->r_addend);
6e712424
PI
751 }
752
753 return stub_name;
754}
755
756/* Return true if symbol H should be hashed in the `.gnu.hash' section. For
757 executable PLT slots where the executable never takes the address of those
758 functions, the function symbols are not added to the hash table. */
759
760static bool
761elf_kvx_hash_symbol (struct elf_link_hash_entry *h)
762{
763 if (h->plt.offset != (bfd_vma) -1
764 && !h->def_regular
765 && !h->pointer_equality_needed)
766 return false;
767
768 return _bfd_elf_hash_symbol (h);
769}
770
771
772/* Look up an entry in the stub hash. Stub entries are cached because
773 creating the stub name takes a bit of time. */
774
775static struct elf_kvx_stub_hash_entry *
776elfNN_kvx_get_stub_entry (const asection *input_section,
d530ba0a
AM
777 const asection *sym_sec,
778 struct elf_link_hash_entry *hash,
779 const Elf_Internal_Rela *rel,
780 struct elf_kvx_link_hash_table *htab)
6e712424
PI
781{
782 struct elf_kvx_stub_hash_entry *stub_entry;
783 struct elf_kvx_link_hash_entry *h =
784 (struct elf_kvx_link_hash_entry *) hash;
785 const asection *id_sec;
786
787 if ((input_section->flags & SEC_CODE) == 0)
788 return NULL;
789
790 /* If this input section is part of a group of sections sharing one
791 stub section, then use the id of the first section in the group.
792 Stub names need to include a section id, as there may well be
793 more than one stub used to reach say, printf, and we need to
794 distinguish between them. */
795 id_sec = htab->stub_group[input_section->id].link_sec;
796
797 if (h != NULL && h->stub_cache != NULL
798 && h->stub_cache->h == h && h->stub_cache->id_sec == id_sec)
799 {
800 stub_entry = h->stub_cache;
801 }
802 else
803 {
804 char *stub_name;
805
806 stub_name = elfNN_kvx_stub_name (id_sec, sym_sec, h, rel);
807 if (stub_name == NULL)
808 return NULL;
809
810 stub_entry = kvx_stub_hash_lookup (&htab->stub_hash_table,
d530ba0a 811 stub_name, false, false);
6e712424
PI
812 if (h != NULL)
813 h->stub_cache = stub_entry;
814
815 free (stub_name);
816 }
817
818 return stub_entry;
819}
820
821
822/* Create a stub section. */
823
824static asection *
825_bfd_kvx_create_stub_section (asection *section,
d530ba0a 826 struct elf_kvx_link_hash_table *htab)
6e712424
PI
827
828{
829 size_t namelen;
830 bfd_size_type len;
831 char *s_name;
832
833 namelen = strlen (section->name);
834 len = namelen + sizeof (STUB_SUFFIX);
835 s_name = bfd_alloc (htab->stub_bfd, len);
836 if (s_name == NULL)
837 return NULL;
838
839 memcpy (s_name, section->name, namelen);
840 memcpy (s_name + namelen, STUB_SUFFIX, sizeof (STUB_SUFFIX));
841 return (*htab->add_stub_section) (s_name, section);
842}
843
844
845/* Find or create a stub section for a link section.
846
847 Fix or create the stub section used to collect stubs attached to
848 the specified link section. */
849
850static asection *
851_bfd_kvx_get_stub_for_link_section (asection *link_section,
d530ba0a 852 struct elf_kvx_link_hash_table *htab)
6e712424
PI
853{
854 if (htab->stub_group[link_section->id].stub_sec == NULL)
855 htab->stub_group[link_section->id].stub_sec
856 = _bfd_kvx_create_stub_section (link_section, htab);
857 return htab->stub_group[link_section->id].stub_sec;
858}
859
860
861/* Find or create a stub section in the stub group for an input
862 section. */
863
864static asection *
865_bfd_kvx_create_or_find_stub_sec (asection *section,
d530ba0a 866 struct elf_kvx_link_hash_table *htab)
6e712424
PI
867{
868 asection *link_sec = htab->stub_group[section->id].link_sec;
869 return _bfd_kvx_get_stub_for_link_section (link_sec, htab);
870}
871
872
873/* Add a new stub entry in the stub group associated with an input
874 section to the stub hash. Not all fields of the new stub entry are
875 initialised. */
876
877static struct elf_kvx_stub_hash_entry *
878_bfd_kvx_add_stub_entry_in_group (const char *stub_name,
d530ba0a
AM
879 asection *section,
880 struct elf_kvx_link_hash_table *htab)
6e712424
PI
881{
882 asection *link_sec;
883 asection *stub_sec;
884 struct elf_kvx_stub_hash_entry *stub_entry;
885
886 link_sec = htab->stub_group[section->id].link_sec;
887 stub_sec = _bfd_kvx_create_or_find_stub_sec (section, htab);
888
889 /* Enter this entry into the linker stub hash table. */
890 stub_entry = kvx_stub_hash_lookup (&htab->stub_hash_table, stub_name,
d530ba0a 891 true, false);
6e712424
PI
892 if (stub_entry == NULL)
893 {
894 /* xgettext:c-format */
895 _bfd_error_handler (_("%pB: cannot create stub entry %s"),
d530ba0a 896 section->owner, stub_name);
6e712424
PI
897 return NULL;
898 }
899
900 stub_entry->stub_sec = stub_sec;
901 stub_entry->stub_offset = 0;
902 stub_entry->id_sec = link_sec;
903
904 return stub_entry;
905}
906
907static bool
908kvx_build_one_stub (struct bfd_hash_entry *gen_entry,
d530ba0a 909 void *in_arg)
6e712424
PI
910{
911 struct elf_kvx_stub_hash_entry *stub_entry;
912 asection *stub_sec;
913 bfd *stub_bfd;
914 bfd_byte *loc;
915 bfd_vma sym_value;
916 unsigned int template_size;
917 const uint32_t *template;
918 unsigned int i;
919 struct bfd_link_info *info;
920
921 /* Massage our args to the form they really have. */
922 stub_entry = (struct elf_kvx_stub_hash_entry *) gen_entry;
923
924 info = (struct bfd_link_info *) in_arg;
925
926 /* Fail if the target section could not be assigned to an output
927 section. The user should fix his linker script. */
928 if (stub_entry->target_section->output_section == NULL
929 && info->non_contiguous_regions)
930 info->callbacks->einfo (_("%F%P: Could not assign '%pA' to an output section. "
931 "Retry without "
932 "--enable-non-contiguous-regions.\n"),
933 stub_entry->target_section);
934
935 stub_sec = stub_entry->stub_sec;
936
937 /* Make a note of the offset within the stubs for this entry. */
938 stub_entry->stub_offset = stub_sec->size;
939 loc = stub_sec->contents + stub_entry->stub_offset;
940
941 stub_bfd = stub_sec->owner;
942
943 /* This is the address of the stub destination. */
944 sym_value = (stub_entry->target_value
945 + stub_entry->target_section->output_offset
946 + stub_entry->target_section->output_section->vma);
947
948 switch (stub_entry->stub_type)
949 {
950 case kvx_stub_long_branch:
951 template = elfNN_kvx_long_branch_stub;
952 template_size = sizeof (elfNN_kvx_long_branch_stub);
953 break;
954 default:
955 abort ();
956 }
957
958 for (i = 0; i < (template_size / sizeof template[0]); i++)
959 {
960 bfd_putl32 (template[i], loc);
961 loc += 4;
962 }
963
964 stub_sec->size += template_size;
965
966 switch (stub_entry->stub_type)
967 {
968 case kvx_stub_long_branch:
d530ba0a
AM
969 /* The stub uses a make insn with 43bits immediate.
970 We need to apply 3 relocations:
971 BFD_RELOC_KVX_S43_LO10,
972 BFD_RELOC_KVX_S43_UP27,
973 BFD_RELOC_KVX_S43_EX6. */
6e712424 974 if (kvx_relocate (R_KVX_S43_LO10, stub_bfd, stub_sec,
d530ba0a
AM
975 stub_entry->stub_offset, sym_value) != bfd_reloc_ok)
976 BFD_FAIL ();
6e712424 977 if (kvx_relocate (R_KVX_S43_EX6, stub_bfd, stub_sec,
d530ba0a
AM
978 stub_entry->stub_offset, sym_value) != bfd_reloc_ok)
979 BFD_FAIL ();
6e712424 980 if (kvx_relocate (R_KVX_S43_UP27, stub_bfd, stub_sec,
d530ba0a
AM
981 stub_entry->stub_offset + 4, sym_value) != bfd_reloc_ok)
982 BFD_FAIL ();
6e712424
PI
983 break;
984 default:
985 abort ();
986 }
987
988 return true;
989}
990
991/* As above, but don't actually build the stub. Just bump offset so
992 we know stub section sizes. */
993
994static bool
d530ba0a
AM
995kvx_size_one_stub (struct bfd_hash_entry *gen_entry,
996 void *in_arg ATTRIBUTE_UNUSED)
6e712424
PI
997{
998 struct elf_kvx_stub_hash_entry *stub_entry;
999 int size;
1000
1001 /* Massage our args to the form they really have. */
1002 stub_entry = (struct elf_kvx_stub_hash_entry *) gen_entry;
1003
1004 switch (stub_entry->stub_type)
1005 {
1006 case kvx_stub_long_branch:
1007 size = sizeof (elfNN_kvx_long_branch_stub);
1008 break;
1009 default:
1010 abort ();
1011 }
1012
1013 stub_entry->stub_sec->size += size;
1014 return true;
1015}
1016
1017/* External entry points for sizing and building linker stubs. */
1018
1019/* Set up various things so that we can make a list of input sections
1020 for each output section included in the link. Returns -1 on error,
1021 0 when no stubs will be needed, and 1 on success. */
1022
1023int
1024elfNN_kvx_setup_section_lists (bfd *output_bfd,
d530ba0a 1025 struct bfd_link_info *info)
6e712424
PI
1026{
1027 bfd *input_bfd;
1028 unsigned int bfd_count;
1029 unsigned int top_id, top_index;
1030 asection *section;
1031 asection **input_list, **list;
1032 bfd_size_type amt;
1033 struct elf_kvx_link_hash_table *htab =
1034 elf_kvx_hash_table (info);
1035
1036 if (!is_elf_hash_table ((const struct bfd_link_hash_table *)htab))
1037 return 0;
1038
1039 /* Count the number of input BFDs and find the top input section id. */
1040 for (input_bfd = info->input_bfds, bfd_count = 0, top_id = 0;
1041 input_bfd != NULL; input_bfd = input_bfd->link.next)
1042 {
1043 bfd_count += 1;
1044 for (section = input_bfd->sections;
1045 section != NULL; section = section->next)
1046 {
1047 if (top_id < section->id)
1048 top_id = section->id;
1049 }
1050 }
1051 htab->bfd_count = bfd_count;
1052
1053 amt = sizeof (struct map_stub) * (top_id + 1);
1054 htab->stub_group = bfd_zmalloc (amt);
1055 if (htab->stub_group == NULL)
1056 return -1;
1057
1058 /* We can't use output_bfd->section_count here to find the top output
1059 section index as some sections may have been removed, and
1060 _bfd_strip_section_from_output doesn't renumber the indices. */
1061 for (section = output_bfd->sections, top_index = 0;
1062 section != NULL; section = section->next)
1063 {
1064 if (top_index < section->index)
1065 top_index = section->index;
1066 }
1067
1068 htab->top_index = top_index;
1069 amt = sizeof (asection *) * (top_index + 1);
1070 input_list = bfd_malloc (amt);
1071 htab->input_list = input_list;
1072 if (input_list == NULL)
1073 return -1;
1074
1075 /* For sections we aren't interested in, mark their entries with a
1076 value we can check later. */
1077 list = input_list + top_index;
1078 do
1079 *list = bfd_abs_section_ptr;
1080 while (list-- != input_list);
1081
1082 for (section = output_bfd->sections;
1083 section != NULL; section = section->next)
1084 {
1085 if ((section->flags & SEC_CODE) != 0)
1086 input_list[section->index] = NULL;
1087 }
1088
1089 return 1;
1090}
1091
1092/* Used by elfNN_kvx_next_input_section and group_sections. */
1093#define PREV_SEC(sec) (htab->stub_group[(sec)->id].link_sec)
1094
1095/* The linker repeatedly calls this function for each input section,
1096 in the order that input sections are linked into output sections.
1097 Build lists of input sections to determine groupings between which
1098 we may insert linker stubs. */
1099
1100void
1101elfNN_kvx_next_input_section (struct bfd_link_info *info, asection *isec)
1102{
1103 struct elf_kvx_link_hash_table *htab =
1104 elf_kvx_hash_table (info);
1105
1106 if (isec->output_section->index <= htab->top_index)
1107 {
1108 asection **list = htab->input_list + isec->output_section->index;
1109
1110 if (*list != bfd_abs_section_ptr)
1111 {
1112 /* Steal the link_sec pointer for our list. */
1113 /* This happens to make the list in reverse order,
1114 which is what we want. */
1115 PREV_SEC (isec) = *list;
1116 *list = isec;
1117 }
1118 }
1119}
1120
1121/* See whether we can group stub sections together. Grouping stub
1122 sections may result in fewer stubs. More importantly, we need to
1123 put all .init* and .fini* stubs at the beginning of the .init or
1124 .fini output sections respectively, because glibc splits the
1125 _init and _fini functions into multiple parts. Putting a stub in
1126 the middle of a function is not a good idea. */
1127
1128static void
1129group_sections (struct elf_kvx_link_hash_table *htab,
1130 bfd_size_type stub_group_size,
1131 bool stubs_always_after_branch)
1132{
1133 asection **list = htab->input_list;
1134
1135 do
1136 {
1137 asection *tail = *list;
1138 asection *head;
1139
1140 if (tail == bfd_abs_section_ptr)
1141 continue;
1142
1143 /* Reverse the list: we must avoid placing stubs at the
1144 beginning of the section because the beginning of the text
1145 section may be required for an interrupt vector in bare metal
1146 code. */
1147#define NEXT_SEC PREV_SEC
1148 head = NULL;
1149 while (tail != NULL)
1150 {
1151 /* Pop from tail. */
1152 asection *item = tail;
1153 tail = PREV_SEC (item);
1154
1155 /* Push on head. */
1156 NEXT_SEC (item) = head;
1157 head = item;
1158 }
1159
1160 while (head != NULL)
1161 {
1162 asection *curr;
1163 asection *next;
1164 bfd_vma stub_group_start = head->output_offset;
1165 bfd_vma end_of_next;
1166
1167 curr = head;
1168 while (NEXT_SEC (curr) != NULL)
1169 {
1170 next = NEXT_SEC (curr);
1171 end_of_next = next->output_offset + next->size;
1172 if (end_of_next - stub_group_start >= stub_group_size)
1173 /* End of NEXT is too far from start, so stop. */
1174 break;
1175 /* Add NEXT to the group. */
1176 curr = next;
1177 }
1178
1179 /* OK, the size from the start to the start of CURR is less
1180 than stub_group_size and thus can be handled by one stub
1181 section. (Or the head section is itself larger than
1182 stub_group_size, in which case we may be toast.)
1183 We should really be keeping track of the total size of
1184 stubs added here, as stubs contribute to the final output
1185 section size. */
1186 do
1187 {
1188 next = NEXT_SEC (head);
1189 /* Set up this stub group. */
1190 htab->stub_group[head->id].link_sec = curr;
1191 }
1192 while (head != curr && (head = next) != NULL);
1193
1194 /* But wait, there's more! Input sections up to stub_group_size
1195 bytes after the stub section can be handled by it too. */
1196 if (!stubs_always_after_branch)
1197 {
1198 stub_group_start = curr->output_offset + curr->size;
1199
1200 while (next != NULL)
1201 {
1202 end_of_next = next->output_offset + next->size;
1203 if (end_of_next - stub_group_start >= stub_group_size)
1204 /* End of NEXT is too far from stubs, so stop. */
1205 break;
1206 /* Add NEXT to the stub group. */
1207 head = next;
1208 next = NEXT_SEC (head);
1209 htab->stub_group[head->id].link_sec = curr;
1210 }
1211 }
1212 head = next;
1213 }
1214 }
1215 while (list++ != htab->input_list + htab->top_index);
1216
1217 free (htab->input_list);
1218}
1219
1220static void
1221_bfd_kvx_resize_stubs (struct elf_kvx_link_hash_table *htab)
1222{
1223 asection *section;
1224
1225 /* OK, we've added some stubs. Find out the new size of the
1226 stub sections. */
1227 for (section = htab->stub_bfd->sections;
1228 section != NULL; section = section->next)
1229 {
1230 /* Ignore non-stub sections. */
1231 if (!strstr (section->name, STUB_SUFFIX))
1232 continue;
1233 section->size = 0;
1234 }
1235
1236 bfd_hash_traverse (&htab->stub_hash_table, kvx_size_one_stub, htab);
1237}
1238
1239/* Satisfy the ELF linker by filling in some fields in our fake bfd. */
1240
1241bool
1242kvx_elfNN_init_stub_bfd (struct bfd_link_info *info,
1243 bfd *stub_bfd)
1244{
1245 struct elf_kvx_link_hash_table *htab;
1246
1247 elf_elfheader (stub_bfd)->e_ident[EI_CLASS] = ELFCLASSNN;
1248
1249/* Always hook our dynamic sections into the first bfd, which is the
1250 linker created stub bfd. This ensures that the GOT header is at
1251 the start of the output TOC section. */
1252 htab = elf_kvx_hash_table (info);
1253 if (htab == NULL)
1254 return false;
1255
1256 return true;
1257}
1258
1259/* Determine and set the size of the stub section for a final link.
1260
1261 The basic idea here is to examine all the relocations looking for
1262 PC-relative calls to a target that is unreachable with a 27bits
1263 immediate (found in call and goto). */
1264
1265bool
1266elfNN_kvx_size_stubs (bfd *output_bfd,
1267 bfd *stub_bfd,
1268 struct bfd_link_info *info,
1269 bfd_signed_vma group_size,
1270 asection * (*add_stub_section) (const char *,
1271 asection *),
1272 void (*layout_sections_again) (void))
1273{
1274 bfd_size_type stub_group_size;
1275 bool stubs_always_before_branch;
1276 bool stub_changed = false;
1277 struct elf_kvx_link_hash_table *htab = elf_kvx_hash_table (info);
1278
1279 /* Propagate mach to stub bfd, because it may not have been
1280 finalized when we created stub_bfd. */
1281 bfd_set_arch_mach (stub_bfd, bfd_get_arch (output_bfd),
1282 bfd_get_mach (output_bfd));
1283
1284 /* Stash our params away. */
1285 htab->stub_bfd = stub_bfd;
1286 htab->add_stub_section = add_stub_section;
1287 htab->layout_sections_again = layout_sections_again;
1288 stubs_always_before_branch = group_size < 0;
1289 if (group_size < 0)
1290 stub_group_size = -group_size;
1291 else
1292 stub_group_size = group_size;
1293
1294 if (stub_group_size == 1)
1295 {
1296 /* Default values. */
1297 /* KVX branch range is +-256MB. The value used is 1MB less. */
1298 stub_group_size = 255 * 1024 * 1024;
1299 }
1300
1301 group_sections (htab, stub_group_size, stubs_always_before_branch);
1302
1303 (*htab->layout_sections_again) ();
1304
1305 while (1)
1306 {
1307 bfd *input_bfd;
1308
1309 for (input_bfd = info->input_bfds;
1310 input_bfd != NULL; input_bfd = input_bfd->link.next)
1311 {
1312 Elf_Internal_Shdr *symtab_hdr;
1313 asection *section;
1314 Elf_Internal_Sym *local_syms = NULL;
1315
1316 if (!is_kvx_elf (input_bfd)
1317 || (input_bfd->flags & BFD_LINKER_CREATED) != 0)
1318 continue;
1319
1320 /* We'll need the symbol table in a second. */
1321 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
1322 if (symtab_hdr->sh_info == 0)
1323 continue;
1324
1325 /* Walk over each section attached to the input bfd. */
1326 for (section = input_bfd->sections;
1327 section != NULL; section = section->next)
1328 {
1329 Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
1330
1331 /* If there aren't any relocs, then there's nothing more
1332 to do. */
1333 if ((section->flags & SEC_RELOC) == 0
1334 || section->reloc_count == 0
1335 || (section->flags & SEC_CODE) == 0)
1336 continue;
1337
1338 /* If this section is a link-once section that will be
1339 discarded, then don't create any stubs. */
1340 if (section->output_section == NULL
1341 || section->output_section->owner != output_bfd)
1342 continue;
1343
1344 /* Get the relocs. */
1345 internal_relocs
1346 = _bfd_elf_link_read_relocs (input_bfd, section, NULL,
1347 NULL, info->keep_memory);
1348 if (internal_relocs == NULL)
1349 goto error_ret_free_local;
1350
1351 /* Now examine each relocation. */
1352 irela = internal_relocs;
1353 irelaend = irela + section->reloc_count;
1354 for (; irela < irelaend; irela++)
1355 {
1356 unsigned int r_type, r_indx;
1357 enum elf_kvx_stub_type stub_type;
1358 struct elf_kvx_stub_hash_entry *stub_entry;
1359 asection *sym_sec;
1360 bfd_vma sym_value;
1361 bfd_vma destination;
1362 struct elf_kvx_link_hash_entry *hash;
1363 const char *sym_name;
1364 char *stub_name;
1365 const asection *id_sec;
1366 unsigned char st_type;
1367 bfd_size_type len;
1368
1369 r_type = ELFNN_R_TYPE (irela->r_info);
1370 r_indx = ELFNN_R_SYM (irela->r_info);
1371
1372 if (r_type >= (unsigned int) R_KVX_end)
1373 {
1374 bfd_set_error (bfd_error_bad_value);
1375 error_ret_free_internal:
1376 if (elf_section_data (section)->relocs == NULL)
1377 free (internal_relocs);
1378 goto error_ret_free_local;
1379 }
1380
1381 /* Only look for stubs on unconditional branch and
1382 branch and link instructions. */
1383 /* This catches CALL and GOTO insn */
1384 if (r_type != (unsigned int) R_KVX_PCREL27)
1385 continue;
1386
1387 /* Now determine the call target, its name, value,
1388 section. */
1389 sym_sec = NULL;
1390 sym_value = 0;
1391 destination = 0;
1392 hash = NULL;
1393 sym_name = NULL;
1394 if (r_indx < symtab_hdr->sh_info)
1395 {
1396 /* It's a local symbol. */
1397 Elf_Internal_Sym *sym;
1398 Elf_Internal_Shdr *hdr;
1399
1400 if (local_syms == NULL)
1401 {
1402 local_syms
1403 = (Elf_Internal_Sym *) symtab_hdr->contents;
1404 if (local_syms == NULL)
1405 local_syms
1406 = bfd_elf_get_elf_syms (input_bfd, symtab_hdr,
1407 symtab_hdr->sh_info, 0,
1408 NULL, NULL, NULL);
1409 if (local_syms == NULL)
1410 goto error_ret_free_internal;
1411 }
1412
1413 sym = local_syms + r_indx;
1414 hdr = elf_elfsections (input_bfd)[sym->st_shndx];
1415 sym_sec = hdr->bfd_section;
1416 if (!sym_sec)
1417 /* This is an undefined symbol. It can never
1418 be resolved. */
1419 continue;
1420
1421 if (ELF_ST_TYPE (sym->st_info) != STT_SECTION)
1422 sym_value = sym->st_value;
1423 destination = (sym_value + irela->r_addend
1424 + sym_sec->output_offset
1425 + sym_sec->output_section->vma);
1426 st_type = ELF_ST_TYPE (sym->st_info);
1427 sym_name
1428 = bfd_elf_string_from_elf_section (input_bfd,
1429 symtab_hdr->sh_link,
1430 sym->st_name);
1431 }
1432 else
1433 {
1434 int e_indx;
1435
1436 e_indx = r_indx - symtab_hdr->sh_info;
1437 hash = ((struct elf_kvx_link_hash_entry *)
1438 elf_sym_hashes (input_bfd)[e_indx]);
1439
1440 while (hash->root.root.type == bfd_link_hash_indirect
1441 || hash->root.root.type == bfd_link_hash_warning)
1442 hash = ((struct elf_kvx_link_hash_entry *)
1443 hash->root.root.u.i.link);
1444
1445 if (hash->root.root.type == bfd_link_hash_defined
1446 || hash->root.root.type == bfd_link_hash_defweak)
1447 {
1448 struct elf_kvx_link_hash_table *globals =
1449 elf_kvx_hash_table (info);
1450 sym_sec = hash->root.root.u.def.section;
1451 sym_value = hash->root.root.u.def.value;
1452 /* For a destination in a shared library,
1453 use the PLT stub as target address to
1454 decide whether a branch stub is
1455 needed. */
1456 if (globals->root.splt != NULL && hash != NULL
1457 && hash->root.plt.offset != (bfd_vma) - 1)
1458 {
1459 sym_sec = globals->root.splt;
1460 sym_value = hash->root.plt.offset;
1461 if (sym_sec->output_section != NULL)
1462 destination = (sym_value
1463 + sym_sec->output_offset
d530ba0a 1464 + sym_sec->output_section->vma);
6e712424
PI
1465 }
1466 else if (sym_sec->output_section != NULL)
1467 destination = (sym_value + irela->r_addend
1468 + sym_sec->output_offset
1469 + sym_sec->output_section->vma);
1470 }
1471 else if (hash->root.root.type == bfd_link_hash_undefined
1472 || (hash->root.root.type
1473 == bfd_link_hash_undefweak))
1474 {
1475 /* For a shared library, use the PLT stub as
1476 target address to decide whether a long
1477 branch stub is needed.
1478 For absolute code, they cannot be handled. */
1479 struct elf_kvx_link_hash_table *globals =
1480 elf_kvx_hash_table (info);
1481
1482 if (globals->root.splt != NULL && hash != NULL
1483 && hash->root.plt.offset != (bfd_vma) - 1)
1484 {
1485 sym_sec = globals->root.splt;
1486 sym_value = hash->root.plt.offset;
1487 if (sym_sec->output_section != NULL)
1488 destination = (sym_value
1489 + sym_sec->output_offset
d530ba0a 1490 + sym_sec->output_section->vma);
6e712424
PI
1491 }
1492 else
1493 continue;
1494 }
1495 else
1496 {
1497 bfd_set_error (bfd_error_bad_value);
1498 goto error_ret_free_internal;
1499 }
1500 st_type = ELF_ST_TYPE (hash->root.type);
1501 sym_name = hash->root.root.root.string;
1502 }
1503
1504 /* Determine what (if any) linker stub is needed. */
1505 stub_type = kvx_type_of_stub (section, irela, sym_sec,
d530ba0a 1506 st_type, destination);
6e712424
PI
1507 if (stub_type == kvx_stub_none)
1508 continue;
1509
1510 /* Support for grouping stub sections. */
1511 id_sec = htab->stub_group[section->id].link_sec;
1512
1513 /* Get the name of this stub. */
1514 stub_name = elfNN_kvx_stub_name (id_sec, sym_sec, hash,
1515 irela);
1516 if (!stub_name)
1517 goto error_ret_free_internal;
1518
1519 stub_entry =
1520 kvx_stub_hash_lookup (&htab->stub_hash_table,
1521 stub_name, false, false);
1522 if (stub_entry != NULL)
1523 {
1524 /* The proper stub has already been created. */
1525 free (stub_name);
d530ba0a 1526 /* Always update this stub's target since it may have
6e712424
PI
1527 changed after layout. */
1528 stub_entry->target_value = sym_value + irela->r_addend;
1529 continue;
1530 }
1531
1532 stub_entry = _bfd_kvx_add_stub_entry_in_group
1533 (stub_name, section, htab);
1534 if (stub_entry == NULL)
1535 {
1536 free (stub_name);
1537 goto error_ret_free_internal;
1538 }
1539
1540 stub_entry->target_value = sym_value + irela->r_addend;
1541 stub_entry->target_section = sym_sec;
1542 stub_entry->stub_type = stub_type;
1543 stub_entry->h = hash;
1544 stub_entry->st_type = st_type;
1545
1546 if (sym_name == NULL)
1547 sym_name = "unnamed";
1548 len = sizeof (STUB_ENTRY_NAME) + strlen (sym_name);
1549 stub_entry->output_name = bfd_alloc (htab->stub_bfd, len);
1550 if (stub_entry->output_name == NULL)
1551 {
1552 free (stub_name);
1553 goto error_ret_free_internal;
1554 }
1555
1556 snprintf (stub_entry->output_name, len, STUB_ENTRY_NAME,
1557 sym_name);
1558
1559 stub_changed = true;
1560 }
1561
1562 /* We're done with the internal relocs, free them. */
1563 if (elf_section_data (section)->relocs == NULL)
1564 free (internal_relocs);
1565 }
1566 }
1567
1568 if (!stub_changed)
1569 break;
1570
1571 _bfd_kvx_resize_stubs (htab);
1572
1573 /* Ask the linker to do its stuff. */
1574 (*htab->layout_sections_again) ();
1575 stub_changed = false;
1576 }
1577
1578 return true;
1579
1580error_ret_free_local:
1581 return false;
1582
1583}
1584
1585/* Build all the stubs associated with the current output file. The
1586 stubs are kept in a hash table attached to the main linker hash
1587 table. We also set up the .plt entries for statically linked PIC
1588 functions here. This function is called via kvx_elf_finish in the
1589 linker. */
1590
1591bool
1592elfNN_kvx_build_stubs (struct bfd_link_info *info)
1593{
1594 asection *stub_sec;
1595 struct bfd_hash_table *table;
1596 struct elf_kvx_link_hash_table *htab;
1597
1598 htab = elf_kvx_hash_table (info);
1599
1600 for (stub_sec = htab->stub_bfd->sections;
1601 stub_sec != NULL; stub_sec = stub_sec->next)
1602 {
1603 bfd_size_type size;
1604
1605 /* Ignore non-stub sections. */
1606 if (!strstr (stub_sec->name, STUB_SUFFIX))
1607 continue;
1608
1609 /* Allocate memory to hold the linker stubs. */
1610 size = stub_sec->size;
1611 stub_sec->contents = bfd_zalloc (htab->stub_bfd, size);
1612 if (stub_sec->contents == NULL && size != 0)
1613 return false;
1614 stub_sec->size = 0;
1615 }
1616
1617 /* Build the stubs as directed by the stub hash table. */
1618 table = &htab->stub_hash_table;
1619 bfd_hash_traverse (table, kvx_build_one_stub, info);
1620
1621 return true;
1622}
1623
1624static bfd_vma
1625kvx_calculate_got_entry_vma (struct elf_link_hash_entry *h,
1626 struct elf_kvx_link_hash_table
1627 *globals, struct bfd_link_info *info,
1628 bfd_vma value, bfd *output_bfd,
1629 bool *unresolved_reloc_p)
1630{
1631 bfd_vma off = (bfd_vma) - 1;
1632 asection *basegot = globals->root.sgot;
1633 bool dyn = globals->root.dynamic_sections_created;
1634
1635 if (h != NULL)
1636 {
1637 BFD_ASSERT (basegot != NULL);
1638 off = h->got.offset;
1639 BFD_ASSERT (off != (bfd_vma) - 1);
1640 if (!WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), h)
1641 || (bfd_link_pic (info)
1642 && SYMBOL_REFERENCES_LOCAL (info, h))
1643 || (ELF_ST_VISIBILITY (h->other)
1644 && h->root.type == bfd_link_hash_undefweak))
1645 {
1646 /* This is actually a static link, or it is a -Bsymbolic link
1647 and the symbol is defined locally. We must initialize this
1648 entry in the global offset table. Since the offset must
1649 always be a multiple of 8 (4 in the case of ILP32), we use
1650 the least significant bit to record whether we have
1651 initialized it already.
1652 When doing a dynamic link, we create a .rel(a).got relocation
1653 entry to initialize the value. This is done in the
1654 finish_dynamic_symbol routine. */
1655 if ((off & 1) != 0)
1656 off &= ~1;
1657 else
1658 {
1659 bfd_put_NN (output_bfd, value, basegot->contents + off);
1660 h->got.offset |= 1;
1661 }
1662 }
1663 else
1664 *unresolved_reloc_p = false;
1665 }
1666
1667 return off;
1668}
1669
1670static unsigned int
1671kvx_reloc_got_type (bfd_reloc_code_real_type r_type)
1672{
1673 switch (r_type)
1674 {
1675 /* Extracted with:
d530ba0a
AM
1676 awk 'match ($0, /HOWTO.*R_(KVX.*_GOT(OFF)?(64)?_.*),/,ary) \
1677 {print "case BFD_RELOC_" ary[1] ":";}' elfxx-kvxc.def */
6e712424
PI
1678 case BFD_RELOC_KVX_S37_GOTOFF_LO10:
1679 case BFD_RELOC_KVX_S37_GOTOFF_UP27:
1680
1681 case BFD_RELOC_KVX_S37_GOT_LO10:
1682 case BFD_RELOC_KVX_S37_GOT_UP27:
1683
1684 case BFD_RELOC_KVX_S43_GOTOFF_LO10:
1685 case BFD_RELOC_KVX_S43_GOTOFF_UP27:
1686 case BFD_RELOC_KVX_S43_GOTOFF_EX6:
1687
1688 case BFD_RELOC_KVX_S43_GOT_LO10:
1689 case BFD_RELOC_KVX_S43_GOT_UP27:
1690 case BFD_RELOC_KVX_S43_GOT_EX6:
1691 return GOT_NORMAL;
d530ba0a 1692
6e712424
PI
1693 case BFD_RELOC_KVX_S37_TLS_GD_LO10:
1694 case BFD_RELOC_KVX_S37_TLS_GD_UP27:
1695 case BFD_RELOC_KVX_S43_TLS_GD_LO10:
1696 case BFD_RELOC_KVX_S43_TLS_GD_UP27:
1697 case BFD_RELOC_KVX_S43_TLS_GD_EX6:
1698 return GOT_TLS_GD;
1699
1700 case BFD_RELOC_KVX_S37_TLS_LD_LO10:
1701 case BFD_RELOC_KVX_S37_TLS_LD_UP27:
1702 case BFD_RELOC_KVX_S43_TLS_LD_LO10:
1703 case BFD_RELOC_KVX_S43_TLS_LD_UP27:
1704 case BFD_RELOC_KVX_S43_TLS_LD_EX6:
1705 return GOT_TLS_LD;
1706
1707 case BFD_RELOC_KVX_S37_TLS_IE_LO10:
1708 case BFD_RELOC_KVX_S37_TLS_IE_UP27:
1709 case BFD_RELOC_KVX_S43_TLS_IE_LO10:
1710 case BFD_RELOC_KVX_S43_TLS_IE_UP27:
1711 case BFD_RELOC_KVX_S43_TLS_IE_EX6:
1712 return GOT_TLS_IE;
1713
1714 default:
1715 break;
1716 }
1717 return GOT_UNKNOWN;
1718}
1719
1720static bool
1721kvx_can_relax_tls (bfd *input_bfd ATTRIBUTE_UNUSED,
1722 struct bfd_link_info *info ATTRIBUTE_UNUSED,
1723 bfd_reloc_code_real_type r_type ATTRIBUTE_UNUSED,
1724 struct elf_link_hash_entry *h ATTRIBUTE_UNUSED,
1725 unsigned long r_symndx ATTRIBUTE_UNUSED)
1726{
1727 if (! IS_KVX_TLS_RELAX_RELOC (r_type))
1728 return false;
1729
1730 /* Relaxing hook. Disabled on KVX. */
1731 /* See elfnn-aarch64.c */
1732 return true;
1733}
1734
1735/* Given the relocation code R_TYPE, return the relaxed bfd reloc
1736 enumerator. */
1737
1738static bfd_reloc_code_real_type
1739kvx_tls_transition (bfd *input_bfd,
1740 struct bfd_link_info *info,
1741 unsigned int r_type,
1742 struct elf_link_hash_entry *h,
1743 unsigned long r_symndx)
1744{
1745 bfd_reloc_code_real_type bfd_r_type
1746 = elfNN_kvx_bfd_reloc_from_type (input_bfd, r_type);
1747
1748 if (! kvx_can_relax_tls (input_bfd, info, bfd_r_type, h, r_symndx))
1749 return bfd_r_type;
1750
1751 return bfd_r_type;
1752}
1753
1754/* Return the base VMA address which should be subtracted from real addresses
1755 when resolving R_KVX_*_TLS_GD_* and R_KVX_*_TLS_LD_* relocation. */
1756
1757static bfd_vma
1758dtpoff_base (struct bfd_link_info *info)
1759{
1760 /* If tls_sec is NULL, we should have signalled an error already. */
1761 BFD_ASSERT (elf_hash_table (info)->tls_sec != NULL);
1762 return elf_hash_table (info)->tls_sec->vma;
1763}
1764
1765/* Return the base VMA address which should be subtracted from real addresses
1766 when resolving R_KVX_*_TLS_IE_* and R_KVX_*_TLS_LE_* relocations. */
1767
1768static bfd_vma
1769tpoff_base (struct bfd_link_info *info)
1770{
1771 struct elf_link_hash_table *htab = elf_hash_table (info);
1772
1773 /* If tls_sec is NULL, we should have signalled an error already. */
1774 BFD_ASSERT (htab->tls_sec != NULL);
1775
1776 bfd_vma base = align_power ((bfd_vma) 0,
1777 htab->tls_sec->alignment_power);
1778 return htab->tls_sec->vma - base;
1779}
1780
1781static bfd_vma *
1782symbol_got_offset_ref (bfd *input_bfd, struct elf_link_hash_entry *h,
1783 unsigned long r_symndx)
1784{
1785 /* Calculate the address of the GOT entry for symbol
1786 referred to in h. */
1787 if (h != NULL)
1788 return &h->got.offset;
1789 else
1790 {
1791 /* local symbol */
1792 struct elf_kvx_local_symbol *l;
1793
1794 l = elf_kvx_locals (input_bfd);
1795 return &l[r_symndx].got_offset;
1796 }
1797}
1798
1799static void
1800symbol_got_offset_mark (bfd *input_bfd, struct elf_link_hash_entry *h,
1801 unsigned long r_symndx)
1802{
1803 bfd_vma *p;
1804 p = symbol_got_offset_ref (input_bfd, h, r_symndx);
1805 *p |= 1;
1806}
1807
1808static int
1809symbol_got_offset_mark_p (bfd *input_bfd, struct elf_link_hash_entry *h,
1810 unsigned long r_symndx)
1811{
1812 bfd_vma value;
1813 value = * symbol_got_offset_ref (input_bfd, h, r_symndx);
1814 return value & 1;
1815}
1816
1817static bfd_vma
1818symbol_got_offset (bfd *input_bfd, struct elf_link_hash_entry *h,
1819 unsigned long r_symndx)
1820{
1821 bfd_vma value;
1822 value = * symbol_got_offset_ref (input_bfd, h, r_symndx);
1823 value &= ~1;
1824 return value;
1825}
1826
1827/* N_ONES produces N one bits, without overflowing machine arithmetic. */
1828#define N_ONES(n) (((((bfd_vma) 1 << ((n) -1)) - 1) << 1) | 1)
1829
d530ba0a
AM
1830/* This is a copy/paste + modification from
1831 reloc.c:_bfd_relocate_contents. Relocations are applied to 32bits
1832 words, so all overflow checks will overflow for values above
1833 32bits. */
6e712424
PI
1834static bfd_reloc_status_type
1835check_signed_overflow (enum complain_overflow complain_on_overflow,
1836 bfd_reloc_code_real_type bfd_r_type, bfd *input_bfd,
1837 bfd_vma relocation)
1838{
1839 bfd_reloc_status_type flag = bfd_reloc_ok;
1840 bfd_vma addrmask, fieldmask, signmask, ss;
1841 bfd_vma a, b, sum;
1842 bfd_vma x = 0;
1843
1844 /* These usually come from howto struct. As we don't check for
d530ba0a
AM
1845 values fitting in bitfields or in subpart of words, we set all
1846 these to values to check as if the field is starting from first
1847 bit. */
6e712424
PI
1848 unsigned int rightshift = 0;
1849 unsigned int bitpos = 0;
1850 unsigned int bitsize = 0;
1851 bfd_vma src_mask = -1;
1852
1853 /* Only regular symbol relocations are checked here. Others
1854 relocations (GOT, TLS) could be checked if the need is
1855 confirmed. At the moment, we keep previous behavior
1856 (ie. unchecked) for those. */
1857 switch (bfd_r_type)
1858 {
1859 case BFD_RELOC_KVX_S37_LO10:
1860 case BFD_RELOC_KVX_S37_UP27:
1861 bitsize = 37;
1862 break;
1863
1864 case BFD_RELOC_KVX_S32_LO5:
1865 case BFD_RELOC_KVX_S32_UP27:
1866 bitsize = 32;
1867 break;
1868
1869 case BFD_RELOC_KVX_S43_LO10:
1870 case BFD_RELOC_KVX_S43_UP27:
1871 case BFD_RELOC_KVX_S43_EX6:
1872 bitsize = 43;
1873 break;
1874
1875 case BFD_RELOC_KVX_S64_LO10:
1876 case BFD_RELOC_KVX_S64_UP27:
1877 case BFD_RELOC_KVX_S64_EX27:
1878 bitsize = 64;
1879 break;
1880
1881 default:
1882 return bfd_reloc_ok;
1883 }
1884
1885 /* direct copy/paste from reloc.c below */
1886
1887 /* Get the values to be added together. For signed and unsigned
1888 relocations, we assume that all values should be truncated to
1889 the size of an address. For bitfields, all the bits matter.
1890 See also bfd_check_overflow. */
1891 fieldmask = N_ONES (bitsize);
1892 signmask = ~fieldmask;
1893 addrmask = (N_ONES (bfd_arch_bits_per_address (input_bfd))
1894 | (fieldmask << rightshift));
1895 a = (relocation & addrmask) >> rightshift;
1896 b = (x & src_mask & addrmask) >> bitpos;
1897 addrmask >>= rightshift;
1898
1899 switch (complain_on_overflow)
1900 {
1901 case complain_overflow_signed:
1902 /* If any sign bits are set, all sign bits must be set.
1903 That is, A must be a valid negative address after
1904 shifting. */
1905 signmask = ~(fieldmask >> 1);
1906 /* Fall thru */
1907
1908 case complain_overflow_bitfield:
1909 /* Much like the signed check, but for a field one bit
1910 wider. We allow a bitfield to represent numbers in the
1911 range -2**n to 2**n-1, where n is the number of bits in the
1912 field. Note that when bfd_vma is 32 bits, a 32-bit reloc
1913 can't overflow, which is exactly what we want. */
1914 ss = a & signmask;
1915 if (ss != 0 && ss != (addrmask & signmask))
1916 flag = bfd_reloc_overflow;
1917
1918 /* We only need this next bit of code if the sign bit of B
1919 is below the sign bit of A. This would only happen if
1920 SRC_MASK had fewer bits than BITSIZE. Note that if
1921 SRC_MASK has more bits than BITSIZE, we can get into
1922 trouble; we would need to verify that B is in range, as
1923 we do for A above. */
1924 ss = ((~src_mask) >> 1) & src_mask;
1925 ss >>= bitpos;
1926
1927 /* Set all the bits above the sign bit. */
1928 b = (b ^ ss) - ss;
1929
1930 /* Now we can do the addition. */
1931 sum = a + b;
1932
1933 /* See if the result has the correct sign. Bits above the
1934 sign bit are junk now; ignore them. If the sum is
1935 positive, make sure we did not have all negative inputs;
1936 if the sum is negative, make sure we did not have all
1937 positive inputs. The test below looks only at the sign
1938 bits, and it really just
1939 SIGN (A) == SIGN (B) && SIGN (A) != SIGN (SUM)
1940
1941 We mask with addrmask here to explicitly allow an address
1942 wrap-around. The Linux kernel relies on it, and it is
1943 the only way to write assembler code which can run when
1944 loaded at a location 0x80000000 away from the location at
1945 which it is linked. */
1946 if (((~(a ^ b)) & (a ^ sum)) & signmask & addrmask)
1947 flag = bfd_reloc_overflow;
1948 break;
1949
1950 case complain_overflow_unsigned:
1951 /* Checking for an unsigned overflow is relatively easy:
1952 trim the addresses and add, and trim the result as well.
1953 Overflow is normally indicated when the result does not
1954 fit in the field. However, we also need to consider the
1955 case when, e.g., fieldmask is 0x7fffffff or smaller, an
1956 input is 0x80000000, and bfd_vma is only 32 bits; then we
1957 will get sum == 0, but there is an overflow, since the
1958 inputs did not fit in the field. Instead of doing a
1959 separate test, we can check for this by or-ing in the
1960 operands when testing for the sum overflowing its final
1961 field. */
1962 sum = (a + b) & addrmask;
1963 if ((a | b | sum) & signmask)
1964 flag = bfd_reloc_overflow;
1965 break;
1966
1967 default:
1968 abort ();
1969 }
1970 return flag;
1971}
1972
1973/* Perform a relocation as part of a final link. */
1974static bfd_reloc_status_type
1975elfNN_kvx_final_link_relocate (reloc_howto_type *howto,
d530ba0a
AM
1976 bfd *input_bfd,
1977 bfd *output_bfd,
1978 asection *input_section,
1979 bfd_byte *contents,
1980 Elf_Internal_Rela *rel,
1981 bfd_vma value,
1982 struct bfd_link_info *info,
1983 asection *sym_sec,
1984 struct elf_link_hash_entry *h,
1985 bool *unresolved_reloc_p,
1986 bool save_addend,
1987 bfd_vma *saved_addend,
1988 Elf_Internal_Sym *sym)
6e712424
PI
1989{
1990 Elf_Internal_Shdr *symtab_hdr;
1991 unsigned int r_type = howto->type;
1992 bfd_reloc_code_real_type bfd_r_type
1993 = elfNN_kvx_bfd_reloc_from_howto (howto);
1994 bfd_reloc_code_real_type new_bfd_r_type;
1995 unsigned long r_symndx;
1996 bfd_byte *hit_data = contents + rel->r_offset;
1997 bfd_vma place, off;
c5ed8c63 1998 bfd_vma addend;
6e712424
PI
1999 struct elf_kvx_link_hash_table *globals;
2000 bool weak_undef_p;
2001 asection *base_got;
2002 bfd_reloc_status_type rret = bfd_reloc_ok;
2003 bool resolved_to_zero;
2004 globals = elf_kvx_hash_table (info);
2005
2006 symtab_hdr = &elf_symtab_hdr (input_bfd);
2007
2008 BFD_ASSERT (is_kvx_elf (input_bfd));
2009
2010 r_symndx = ELFNN_R_SYM (rel->r_info);
2011
2012 /* It is possible to have linker relaxations on some TLS access
2013 models. Update our information here. */
2014 new_bfd_r_type = kvx_tls_transition (input_bfd, info, r_type, h, r_symndx);
2015 if (new_bfd_r_type != bfd_r_type)
2016 {
2017 bfd_r_type = new_bfd_r_type;
2018 howto = elfNN_kvx_howto_from_bfd_reloc (bfd_r_type);
2019 BFD_ASSERT (howto != NULL);
2020 r_type = howto->type;
2021 }
2022
2023 place = input_section->output_section->vma
2024 + input_section->output_offset + rel->r_offset;
2025
2026 /* Get addend, accumulating the addend for consecutive relocs
2027 which refer to the same offset. */
c5ed8c63
AM
2028 addend = saved_addend ? *saved_addend : 0;
2029 addend += rel->r_addend;
6e712424
PI
2030
2031 weak_undef_p = (h ? h->root.type == bfd_link_hash_undefweak
2032 : bfd_is_und_section (sym_sec));
2033 resolved_to_zero = (h != NULL
2034 && UNDEFWEAK_NO_DYNAMIC_RELOC (info, h));
2035
2036 switch (bfd_r_type)
2037 {
2038 case BFD_RELOC_KVX_NN:
2039#if ARCH_SIZE == 64
2040 case BFD_RELOC_KVX_32:
2041#endif
2042 case BFD_RELOC_KVX_S37_LO10:
2043 case BFD_RELOC_KVX_S37_UP27:
2044
2045 case BFD_RELOC_KVX_S32_LO5:
2046 case BFD_RELOC_KVX_S32_UP27:
2047
2048 case BFD_RELOC_KVX_S43_LO10:
2049 case BFD_RELOC_KVX_S43_UP27:
2050 case BFD_RELOC_KVX_S43_EX6:
2051
2052 case BFD_RELOC_KVX_S64_LO10:
2053 case BFD_RELOC_KVX_S64_UP27:
2054 case BFD_RELOC_KVX_S64_EX27:
2055 /* When generating a shared object or relocatable executable, these
d530ba0a
AM
2056 relocations are copied into the output file to be resolved at
2057 run time. */
6e712424 2058 if (((bfd_link_pic (info) == true)
d530ba0a 2059 || globals->root.is_relocatable_executable)
6e712424
PI
2060 && (input_section->flags & SEC_ALLOC)
2061 && (h == NULL
d530ba0a
AM
2062 || (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
2063 && !resolved_to_zero)
6e712424
PI
2064 || h->root.type != bfd_link_hash_undefweak))
2065 {
2066 Elf_Internal_Rela outrel;
2067 bfd_byte *loc;
2068 bool skip, relocate;
2069 asection *sreloc;
2070
2071 *unresolved_reloc_p = false;
2072
2073 skip = false;
2074 relocate = false;
2075
c5ed8c63 2076 outrel.r_addend = addend;
6e712424
PI
2077 outrel.r_offset =
2078 _bfd_elf_section_offset (output_bfd, info, input_section,
2079 rel->r_offset);
2080 if (outrel.r_offset == (bfd_vma) - 1)
2081 skip = true;
2082 else if (outrel.r_offset == (bfd_vma) - 2)
2083 {
2084 skip = true;
2085 relocate = true;
2086 }
2087
2088 outrel.r_offset += (input_section->output_section->vma
2089 + input_section->output_offset);
2090
2091 if (skip)
2092 memset (&outrel, 0, sizeof outrel);
2093 else if (h != NULL
2094 && h->dynindx != -1
d530ba0a
AM
2095 && (!bfd_link_pic (info) || !info->symbolic
2096 || !h->def_regular))
6e712424
PI
2097 outrel.r_info = ELFNN_R_INFO (h->dynindx, r_type);
2098 else if (bfd_r_type == BFD_RELOC_KVX_32
2099 || bfd_r_type == BFD_RELOC_KVX_64)
2100 {
2101 int symbol;
2102
2103 /* On SVR4-ish systems, the dynamic loader cannot
2104 relocate the text and data segments independently,
2105 so the symbol does not matter. */
2106 symbol = 0;
2107 outrel.r_info = ELFNN_R_INFO (symbol, R_KVX_RELATIVE);
2108 outrel.r_addend += value;
2109 }
2110 else if (bfd_link_pic (info) && info->symbolic)
2111 {
2112 goto skip_because_pic;
2113 }
2114 else
2115 {
2116 /* We may endup here from bad input code trying to
2117 insert relocation on symbols within code. We do not
2118 want that currently, and such code should use GOT +
d530ba0a
AM
2119 KVX_32/64 reloc that translate in KVX_RELATIVE. */
2120 const char *name;
2121 if (h && h->root.root.string)
2122 name = h->root.root.string;
2123 else
2124 name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym,
2125 NULL);
2126
2127 (*_bfd_error_handler)
2128 /* xgettext:c-format */
2129 (_("%pB(%pA+%#" PRIx64 "): "
2130 "unresolvable %s relocation in section `%s'"),
2131 input_bfd, input_section, (uint64_t) rel->r_offset, howto->name,
2132 name);
2133 return bfd_reloc_notsupported;
6e712424
PI
2134 }
2135
2136 sreloc = elf_section_data (input_section)->sreloc;
2137 if (sreloc == NULL || sreloc->contents == NULL)
2138 return bfd_reloc_notsupported;
2139
2140 loc = sreloc->contents + sreloc->reloc_count++ * RELOC_SIZE (globals);
2141 bfd_elfNN_swap_reloca_out (output_bfd, &outrel, loc);
2142
2143 if (sreloc->reloc_count * RELOC_SIZE (globals) > sreloc->size)
2144 {
2145 /* Sanity to check that we have previously allocated
2146 sufficient space in the relocation section for the
2147 number of relocations we actually want to emit. */
2148 abort ();
2149 }
2150
2151 /* If this reloc is against an external symbol, we do not want to
2152 fiddle with the addend. Otherwise, we need to include the symbol
2153 value so that it becomes an addend for the dynamic reloc. */
2154 if (!relocate)
2155 return bfd_reloc_ok;
2156
2157 rret = check_signed_overflow (complain_overflow_signed, bfd_r_type,
c5ed8c63 2158 input_bfd, value + addend);
6e712424
PI
2159 if (rret != bfd_reloc_ok)
2160 return rret;
2161
2162 return _bfd_final_link_relocate (howto, input_bfd, input_section,
2163 contents, rel->r_offset, value,
c5ed8c63 2164 addend);
6e712424
PI
2165 }
2166
2167 skip_because_pic:
2168 rret = check_signed_overflow (complain_overflow_signed, bfd_r_type,
c5ed8c63 2169 input_bfd, value + addend);
6e712424
PI
2170 if (rret != bfd_reloc_ok)
2171 return rret;
2172
2173 return _bfd_final_link_relocate (howto, input_bfd, input_section,
2174 contents, rel->r_offset, value,
c5ed8c63 2175 addend);
6e712424
PI
2176 break;
2177
2178 case BFD_RELOC_KVX_PCREL17:
2179 case BFD_RELOC_KVX_PCREL27:
2180 {
d530ba0a
AM
2181 /* BCU insn are always first in a bundle, so there is no need
2182 to correct the address using offset within bundle. */
6e712424
PI
2183
2184 asection *splt = globals->root.splt;
2185 bool via_plt_p =
2186 splt != NULL && h != NULL && h->plt.offset != (bfd_vma) - 1;
2187
2188 /* A call to an undefined weak symbol is converted to a jump to
2189 the next instruction unless a PLT entry will be created.
2190 The jump to the next instruction is optimized as a NOP.
2191 Do the same for local undefined symbols. */
2192 if (weak_undef_p && ! via_plt_p)
2193 {
2194 bfd_putl32 (INSN_NOP, hit_data);
2195 return bfd_reloc_ok;
2196 }
2197
2198 /* If the call goes through a PLT entry, make sure to
2199 check distance to the right destination address. */
2200 if (via_plt_p)
2201 value = (splt->output_section->vma
2202 + splt->output_offset + h->plt.offset);
2203
2204 /* Check if a stub has to be inserted because the destination
2205 is too far away. */
2206 struct elf_kvx_stub_hash_entry *stub_entry = NULL;
2207
2208 /* If the target symbol is global and marked as a function the
2209 relocation applies a function call or a tail call. In this
2210 situation we can veneer out of range branches. The veneers
2211 use R16 and R17 hence cannot be used arbitrary out of range
2212 branches that occur within the body of a function. */
2213
2214 /* Check if a stub has to be inserted because the destination
2215 is too far away. */
2216 if (! kvx_valid_call_p (value, place))
2217 {
2218 /* The target is out of reach, so redirect the branch to
2219 the local stub for this function. */
2220 stub_entry = elfNN_kvx_get_stub_entry (input_section,
d530ba0a
AM
2221 sym_sec, h,
2222 rel, globals);
6e712424
PI
2223 if (stub_entry != NULL)
2224 value = (stub_entry->stub_offset
2225 + stub_entry->stub_sec->output_offset
2226 + stub_entry->stub_sec->output_section->vma);
2227 /* We have redirected the destination to stub entry address,
2228 so ignore any addend record in the original rela entry. */
c5ed8c63 2229 addend = 0;
6e712424
PI
2230 }
2231 }
2232 *unresolved_reloc_p = false;
2233
2234 /* FALLTHROUGH */
2235
2236 /* PCREL 32 are used in dwarf2 table for exception handling */
2237 case BFD_RELOC_KVX_32_PCREL:
2238 case BFD_RELOC_KVX_S64_PCREL_LO10:
2239 case BFD_RELOC_KVX_S64_PCREL_UP27:
2240 case BFD_RELOC_KVX_S64_PCREL_EX27:
2241 case BFD_RELOC_KVX_S37_PCREL_LO10:
2242 case BFD_RELOC_KVX_S37_PCREL_UP27:
2243 case BFD_RELOC_KVX_S43_PCREL_LO10:
2244 case BFD_RELOC_KVX_S43_PCREL_UP27:
2245 case BFD_RELOC_KVX_S43_PCREL_EX6:
2246 return _bfd_final_link_relocate (howto, input_bfd, input_section,
2247 contents, rel->r_offset, value,
c5ed8c63 2248 addend);
6e712424
PI
2249 break;
2250
2251 case BFD_RELOC_KVX_S37_TLS_LE_LO10:
2252 case BFD_RELOC_KVX_S37_TLS_LE_UP27:
2253
2254 case BFD_RELOC_KVX_S43_TLS_LE_LO10:
2255 case BFD_RELOC_KVX_S43_TLS_LE_UP27:
2256 case BFD_RELOC_KVX_S43_TLS_LE_EX6:
d530ba0a
AM
2257 return _bfd_final_link_relocate (howto, input_bfd, input_section,
2258 contents, rel->r_offset,
c5ed8c63 2259 value - tpoff_base (info), addend);
6e712424
PI
2260 break;
2261
2262 case BFD_RELOC_KVX_S37_TLS_DTPOFF_LO10:
2263 case BFD_RELOC_KVX_S37_TLS_DTPOFF_UP27:
2264
2265 case BFD_RELOC_KVX_S43_TLS_DTPOFF_LO10:
2266 case BFD_RELOC_KVX_S43_TLS_DTPOFF_UP27:
2267 case BFD_RELOC_KVX_S43_TLS_DTPOFF_EX6:
d530ba0a
AM
2268 return _bfd_final_link_relocate (howto, input_bfd, input_section,
2269 contents, rel->r_offset,
c5ed8c63 2270 value - dtpoff_base (info), addend);
6e712424
PI
2271
2272 case BFD_RELOC_KVX_S37_TLS_GD_UP27:
2273 case BFD_RELOC_KVX_S37_TLS_GD_LO10:
2274
2275 case BFD_RELOC_KVX_S43_TLS_GD_UP27:
2276 case BFD_RELOC_KVX_S43_TLS_GD_EX6:
2277 case BFD_RELOC_KVX_S43_TLS_GD_LO10:
2278
2279 case BFD_RELOC_KVX_S37_TLS_IE_UP27:
2280 case BFD_RELOC_KVX_S37_TLS_IE_LO10:
2281
2282 case BFD_RELOC_KVX_S43_TLS_IE_UP27:
2283 case BFD_RELOC_KVX_S43_TLS_IE_EX6:
2284 case BFD_RELOC_KVX_S43_TLS_IE_LO10:
2285
2286 case BFD_RELOC_KVX_S37_TLS_LD_UP27:
2287 case BFD_RELOC_KVX_S37_TLS_LD_LO10:
2288
2289 case BFD_RELOC_KVX_S43_TLS_LD_UP27:
2290 case BFD_RELOC_KVX_S43_TLS_LD_EX6:
2291 case BFD_RELOC_KVX_S43_TLS_LD_LO10:
2292
2293 if (globals->root.sgot == NULL)
d530ba0a 2294 return bfd_reloc_notsupported;
6e712424
PI
2295 value = symbol_got_offset (input_bfd, h, r_symndx);
2296
2297 _bfd_final_link_relocate (howto, input_bfd, input_section,
c5ed8c63 2298 contents, rel->r_offset, value, addend);
6e712424
PI
2299 *unresolved_reloc_p = false;
2300 break;
2301
2302 case BFD_RELOC_KVX_S37_GOTADDR_UP27:
2303 case BFD_RELOC_KVX_S37_GOTADDR_LO10:
2304
2305 case BFD_RELOC_KVX_S43_GOTADDR_UP27:
2306 case BFD_RELOC_KVX_S43_GOTADDR_EX6:
2307 case BFD_RELOC_KVX_S43_GOTADDR_LO10:
2308
2309 case BFD_RELOC_KVX_S64_GOTADDR_UP27:
2310 case BFD_RELOC_KVX_S64_GOTADDR_EX27:
2311 case BFD_RELOC_KVX_S64_GOTADDR_LO10:
2312 {
2313 if (globals->root.sgot == NULL)
2314 BFD_ASSERT (h != NULL);
2315
2316 value = globals->root.sgot->output_section->vma
2317 + globals->root.sgot->output_offset;
2318
2319 return _bfd_final_link_relocate (howto, input_bfd, input_section,
2320 contents, rel->r_offset, value,
c5ed8c63 2321 addend);
6e712424
PI
2322 }
2323 break;
2324
2325 case BFD_RELOC_KVX_S37_GOTOFF_LO10:
2326 case BFD_RELOC_KVX_S37_GOTOFF_UP27:
2327
2328 case BFD_RELOC_KVX_32_GOTOFF:
2329 case BFD_RELOC_KVX_64_GOTOFF:
2330
2331 case BFD_RELOC_KVX_S43_GOTOFF_LO10:
2332 case BFD_RELOC_KVX_S43_GOTOFF_UP27:
2333 case BFD_RELOC_KVX_S43_GOTOFF_EX6:
2334
2335 {
2336 asection *basegot = globals->root.sgot;
2337 /* BFD_ASSERT(h == NULL); */
2338 BFD_ASSERT(globals->root.sgot != NULL);
2339 value -= basegot->output_section->vma + basegot->output_offset;
2340 return _bfd_final_link_relocate (howto, input_bfd, input_section,
2341 contents, rel->r_offset, value,
c5ed8c63 2342 addend);
6e712424
PI
2343 }
2344 break;
2345
2346 case BFD_RELOC_KVX_S37_GOT_LO10:
2347 case BFD_RELOC_KVX_S37_GOT_UP27:
2348
2349 case BFD_RELOC_KVX_32_GOT:
2350 case BFD_RELOC_KVX_64_GOT:
2351
2352 case BFD_RELOC_KVX_S43_GOT_LO10:
2353 case BFD_RELOC_KVX_S43_GOT_UP27:
2354 case BFD_RELOC_KVX_S43_GOT_EX6:
2355
2356 if (globals->root.sgot == NULL)
2357 BFD_ASSERT (h != NULL);
2358
2359 if (h != NULL)
2360 {
2361 value = kvx_calculate_got_entry_vma (h, globals, info, value,
d530ba0a
AM
2362 output_bfd,
2363 unresolved_reloc_p);
6e712424
PI
2364#ifdef UGLY_DEBUG
2365 printf("GOT_LO/HI for %s, value %x\n", h->root.root.string, value);
2366#endif
2367
6e712424
PI
2368 return _bfd_final_link_relocate (howto, input_bfd, input_section,
2369 contents, rel->r_offset, value,
c5ed8c63 2370 addend);
6e712424
PI
2371 }
2372 else
2373 {
2374#ifdef UGLY_DEBUG
2375 printf("GOT_LO/HI with h NULL, initial value %x\n", value);
2376#endif
d530ba0a 2377 struct elf_kvx_local_symbol *locals = elf_kvx_locals (input_bfd);
6e712424 2378
d530ba0a
AM
2379 if (locals == NULL)
2380 {
2381 int howto_index = bfd_r_type - BFD_RELOC_KVX_RELOC_START;
2382 _bfd_error_handler
2383 /* xgettext:c-format */
2384 (_("%pB: local symbol descriptor table be NULL when applying "
2385 "relocation %s against local symbol"),
2386 input_bfd, elf_kvx_howto_table[howto_index].name);
2387 abort ();
2388 }
6e712424 2389
d530ba0a
AM
2390 off = symbol_got_offset (input_bfd, h, r_symndx);
2391 base_got = globals->root.sgot;
2392 bfd_vma got_entry_addr = (base_got->output_section->vma
2393 + base_got->output_offset + off);
6e712424 2394
d530ba0a
AM
2395 if (!symbol_got_offset_mark_p (input_bfd, h, r_symndx))
2396 {
2397 bfd_put_64 (output_bfd, value, base_got->contents + off);
6e712424 2398
d530ba0a
AM
2399 if (bfd_link_pic (info))
2400 {
2401 asection *s;
2402 Elf_Internal_Rela outrel;
2403
2404 /* For PIC executables and shared libraries we need
2405 to relocate the GOT entry at run time. */
2406 s = globals->root.srelgot;
2407 if (s == NULL)
2408 abort ();
2409
2410 outrel.r_offset = got_entry_addr;
2411 outrel.r_info = ELFNN_R_INFO (0, R_KVX_RELATIVE);
2412 outrel.r_addend = value;
2413 elf_append_rela (output_bfd, s, &outrel);
2414 }
6e712424 2415
d530ba0a
AM
2416 symbol_got_offset_mark (input_bfd, h, r_symndx);
2417 }
6e712424 2418
d530ba0a
AM
2419 /* Update the relocation value to GOT entry addr as we have
2420 transformed the direct data access into an indirect data
2421 access through GOT. */
2422 value = got_entry_addr;
6e712424 2423
d530ba0a 2424 return _bfd_final_link_relocate (howto, input_bfd, input_section,
c5ed8c63 2425 contents, rel->r_offset, off, 0);
6e712424
PI
2426 }
2427 break;
2428
2429 default:
2430 return bfd_reloc_notsupported;
2431 }
2432
2433 if (saved_addend)
2434 *saved_addend = value;
2435
2436 /* Only apply the final relocation in a sequence. */
2437 if (save_addend)
2438 return bfd_reloc_continue;
2439
2440 return _bfd_kvx_elf_put_addend (input_bfd, hit_data, bfd_r_type,
d530ba0a 2441 howto, value);
6e712424
PI
2442}
2443
2444
2445
2446/* Relocate a KVX ELF section. */
2447
2448static int
2449elfNN_kvx_relocate_section (bfd *output_bfd,
d530ba0a
AM
2450 struct bfd_link_info *info,
2451 bfd *input_bfd,
2452 asection *input_section,
2453 bfd_byte *contents,
2454 Elf_Internal_Rela *relocs,
2455 Elf_Internal_Sym *local_syms,
2456 asection **local_sections)
6e712424
PI
2457{
2458 Elf_Internal_Shdr *symtab_hdr;
2459 struct elf_link_hash_entry **sym_hashes;
2460 Elf_Internal_Rela *rel;
2461 Elf_Internal_Rela *relend;
2462 const char *name;
2463 struct elf_kvx_link_hash_table *globals;
2464 bool save_addend = false;
2465 bfd_vma addend = 0;
2466
2467 globals = elf_kvx_hash_table (info);
2468
2469 symtab_hdr = &elf_symtab_hdr (input_bfd);
2470 sym_hashes = elf_sym_hashes (input_bfd);
2471
2472 rel = relocs;
2473 relend = relocs + input_section->reloc_count;
2474 for (; rel < relend; rel++)
2475 {
2476 unsigned int r_type;
2477 bfd_reloc_code_real_type bfd_r_type;
2478 reloc_howto_type *howto;
2479 unsigned long r_symndx;
2480 Elf_Internal_Sym *sym;
2481 asection *sec;
2482 struct elf_link_hash_entry *h;
2483 bfd_vma relocation;
2484 bfd_reloc_status_type r;
2485 arelent bfd_reloc;
2486 char sym_type;
2487 bool unresolved_reloc = false;
2488 char *error_message = NULL;
2489
2490 r_symndx = ELFNN_R_SYM (rel->r_info);
2491 r_type = ELFNN_R_TYPE (rel->r_info);
2492
2493 bfd_reloc.howto = elfNN_kvx_howto_from_type (input_bfd, r_type);
2494 howto = bfd_reloc.howto;
2495
2496 if (howto == NULL)
d530ba0a 2497 return _bfd_unrecognized_reloc (input_bfd, input_section, r_type);
6e712424
PI
2498
2499 bfd_r_type = elfNN_kvx_bfd_reloc_from_howto (howto);
2500
2501 h = NULL;
2502 sym = NULL;
2503 sec = NULL;
2504
2505 if (r_symndx < symtab_hdr->sh_info) /* A local symbol. */
2506 {
2507 sym = local_syms + r_symndx;
2508 sym_type = ELFNN_ST_TYPE (sym->st_info);
2509 sec = local_sections[r_symndx];
2510
2511 /* An object file might have a reference to a local
2512 undefined symbol. This is a draft object file, but we
2513 should at least do something about it. */
2514 if (r_type != R_KVX_NONE
2515 && r_type != R_KVX_S37_GOTADDR_LO10
2516 && r_type != R_KVX_S37_GOTADDR_UP27
2517 && r_type != R_KVX_S64_GOTADDR_LO10
2518 && r_type != R_KVX_S64_GOTADDR_UP27
2519 && r_type != R_KVX_S64_GOTADDR_EX27
2520 && r_type != R_KVX_S43_GOTADDR_LO10
2521 && r_type != R_KVX_S43_GOTADDR_UP27
2522 && r_type != R_KVX_S43_GOTADDR_EX6
2523 && bfd_is_und_section (sec)
2524 && ELF_ST_BIND (sym->st_info) != STB_WEAK)
d530ba0a
AM
2525 (*info->callbacks->undefined_symbol)
2526 (info, bfd_elf_string_from_elf_section
2527 (input_bfd, symtab_hdr->sh_link, sym->st_name),
2528 input_bfd, input_section, rel->r_offset, true);
6e712424
PI
2529
2530 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
2531 }
2532 else
2533 {
2534 bool warned, ignored;
2535
2536 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
2537 r_symndx, symtab_hdr, sym_hashes,
2538 h, sec, relocation,
2539 unresolved_reloc, warned, ignored);
2540
2541 sym_type = h->type;
2542 }
2543
2544 if (sec != NULL && discarded_section (sec))
2545 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
2546 rel, 1, relend, howto, 0, contents);
2547
2548 if (bfd_link_relocatable (info))
2549 continue;
2550
2551 if (h != NULL)
2552 name = h->root.root.string;
2553 else
2554 {
2555 name = (bfd_elf_string_from_elf_section
2556 (input_bfd, symtab_hdr->sh_link, sym->st_name));
2557 if (name == NULL || *name == '\0')
2558 name = bfd_section_name (sec);
2559 }
2560
2561 if (r_symndx != 0
2562 && r_type != R_KVX_NONE
2563 && (h == NULL
2564 || h->root.type == bfd_link_hash_defined
2565 || h->root.type == bfd_link_hash_defweak)
2566 && IS_KVX_TLS_RELOC (bfd_r_type) != (sym_type == STT_TLS))
2567 {
2568 (*_bfd_error_handler)
2569 ((sym_type == STT_TLS
d530ba0a 2570 /* xgettext:c-format */
835f16da 2571 ? _("%pB(%pA+%#" PRIx64 "): %s used with TLS symbol %s")
d530ba0a 2572 /* xgettext:c-format */
835f16da 2573 : _("%pB(%pA+%#" PRIx64 "): %s used with non-TLS symbol %s")),
6e712424 2574 input_bfd,
835f16da 2575 input_section, (uint64_t) rel->r_offset, howto->name, name);
6e712424
PI
2576 }
2577
2578 /* Original aarch64 has relaxation handling for TLS here. */
2579 r = bfd_reloc_continue;
2580
2581 /* There may be multiple consecutive relocations for the
d530ba0a
AM
2582 same offset. In that case we are supposed to treat the
2583 output of each relocation as the addend for the next. */
6e712424
PI
2584 if (rel + 1 < relend
2585 && rel->r_offset == rel[1].r_offset
2586 && ELFNN_R_TYPE (rel[1].r_info) != R_KVX_NONE)
2587
2588 save_addend = true;
2589 else
2590 save_addend = false;
2591
2592 if (r == bfd_reloc_continue)
2593 r = elfNN_kvx_final_link_relocate (howto, input_bfd, output_bfd,
d530ba0a
AM
2594 input_section, contents, rel,
2595 relocation, info, sec,
2596 h, &unresolved_reloc,
2597 save_addend, &addend, sym);
6e712424
PI
2598
2599 switch (elfNN_kvx_bfd_reloc_from_type (input_bfd, r_type))
d530ba0a 2600 {
6e712424 2601 case BFD_RELOC_KVX_S37_TLS_GD_LO10:
d530ba0a
AM
2602 case BFD_RELOC_KVX_S37_TLS_GD_UP27:
2603
2604 case BFD_RELOC_KVX_S43_TLS_GD_LO10:
2605 case BFD_RELOC_KVX_S43_TLS_GD_UP27:
2606 case BFD_RELOC_KVX_S43_TLS_GD_EX6:
2607
2608 case BFD_RELOC_KVX_S37_TLS_LD_LO10:
2609 case BFD_RELOC_KVX_S37_TLS_LD_UP27:
2610
2611 case BFD_RELOC_KVX_S43_TLS_LD_LO10:
2612 case BFD_RELOC_KVX_S43_TLS_LD_UP27:
2613 case BFD_RELOC_KVX_S43_TLS_LD_EX6:
2614
2615 if (! symbol_got_offset_mark_p (input_bfd, h, r_symndx))
2616 {
2617 bool need_relocs = false;
2618 bfd_byte *loc;
2619 int indx;
2620 bfd_vma off;
2621
2622 off = symbol_got_offset (input_bfd, h, r_symndx);
2623 indx = h && h->dynindx != -1 ? h->dynindx : 0;
2624
2625 need_relocs =
2626 (bfd_link_pic (info) || indx != 0) &&
2627 (h == NULL
2628 || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
2629 || h->root.type != bfd_link_hash_undefweak);
2630
2631 BFD_ASSERT (globals->root.srelgot != NULL);
2632
2633 if (need_relocs)
2634 {
2635 Elf_Internal_Rela rela;
2636 rela.r_info = ELFNN_R_INFO (indx, R_KVX_64_DTPMOD);
2637 rela.r_addend = 0;
2638 rela.r_offset = globals->root.sgot->output_section->vma +
2639 globals->root.sgot->output_offset + off;
2640
2641 loc = globals->root.srelgot->contents;
2642 loc += globals->root.srelgot->reloc_count++
2643 * RELOC_SIZE (htab);
2644 bfd_elfNN_swap_reloca_out (output_bfd, &rela, loc);
6e712424
PI
2645
2646 bfd_reloc_code_real_type real_type =
2647 elfNN_kvx_bfd_reloc_from_type (input_bfd, r_type);
2648
2649 if (real_type == BFD_RELOC_KVX_S37_TLS_LD_LO10
2650 || real_type == BFD_RELOC_KVX_S37_TLS_LD_UP27
2651 || real_type == BFD_RELOC_KVX_S43_TLS_LD_LO10
2652 || real_type == BFD_RELOC_KVX_S43_TLS_LD_UP27
2653 || real_type == BFD_RELOC_KVX_S43_TLS_LD_EX6)
2654 {
2655 /* For local dynamic, don't generate DTPOFF in any case.
2656 Initialize the DTPOFF slot into zero, so we get module
2657 base address when invoke runtime TLS resolver. */
2658 bfd_put_NN (output_bfd, 0,
2659 globals->root.sgot->contents + off
2660 + GOT_ENTRY_SIZE);
2661 }
d530ba0a
AM
2662 else if (indx == 0)
2663 {
2664 bfd_put_NN (output_bfd,
2665 relocation - dtpoff_base (info),
2666 globals->root.sgot->contents + off
2667 + GOT_ENTRY_SIZE);
2668 }
2669 else
2670 {
2671 /* This TLS symbol is global. We emit a
2672 relocation to fixup the tls offset at load
2673 time. */
2674 rela.r_info =
2675 ELFNN_R_INFO (indx, R_KVX_64_DTPOFF);
2676 rela.r_addend = 0;
2677 rela.r_offset =
2678 (globals->root.sgot->output_section->vma
2679 + globals->root.sgot->output_offset + off
2680 + GOT_ENTRY_SIZE);
2681
2682 loc = globals->root.srelgot->contents;
2683 loc += globals->root.srelgot->reloc_count++
2684 * RELOC_SIZE (globals);
2685 bfd_elfNN_swap_reloca_out (output_bfd, &rela, loc);
2686 bfd_put_NN (output_bfd, (bfd_vma) 0,
2687 globals->root.sgot->contents + off
2688 + GOT_ENTRY_SIZE);
2689 }
2690 }
2691 else
2692 {
2693 bfd_put_NN (output_bfd, (bfd_vma) 1,
2694 globals->root.sgot->contents + off);
2695 bfd_put_NN (output_bfd,
2696 relocation - dtpoff_base (info),
2697 globals->root.sgot->contents + off
2698 + GOT_ENTRY_SIZE);
2699 }
2700
2701 symbol_got_offset_mark (input_bfd, h, r_symndx);
2702 }
2703 break;
2704
2705 case BFD_RELOC_KVX_S37_TLS_IE_LO10:
2706 case BFD_RELOC_KVX_S37_TLS_IE_UP27:
2707
2708 case BFD_RELOC_KVX_S43_TLS_IE_LO10:
2709 case BFD_RELOC_KVX_S43_TLS_IE_UP27:
2710 case BFD_RELOC_KVX_S43_TLS_IE_EX6:
6e712424
PI
2711 if (! symbol_got_offset_mark_p (input_bfd, h, r_symndx))
2712 {
2713 bool need_relocs = false;
2714 bfd_byte *loc;
2715 int indx;
2716 bfd_vma off;
2717
2718 off = symbol_got_offset (input_bfd, h, r_symndx);
2719
2720 indx = h && h->dynindx != -1 ? h->dynindx : 0;
2721
2722 need_relocs =
2723 (bfd_link_pic (info) || indx != 0) &&
2724 (h == NULL
2725 || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
2726 || h->root.type != bfd_link_hash_undefweak);
2727
2728 BFD_ASSERT (globals->root.srelgot != NULL);
2729
2730 if (need_relocs)
2731 {
2732 Elf_Internal_Rela rela;
2733
2734 if (indx == 0)
2735 rela.r_addend = relocation - dtpoff_base (info);
2736 else
2737 rela.r_addend = 0;
2738
2739 rela.r_info = ELFNN_R_INFO (indx, R_KVX_64_TPOFF);
2740 rela.r_offset = globals->root.sgot->output_section->vma +
2741 globals->root.sgot->output_offset + off;
2742
2743 loc = globals->root.srelgot->contents;
2744 loc += globals->root.srelgot->reloc_count++
2745 * RELOC_SIZE (htab);
2746
2747 bfd_elfNN_swap_reloca_out (output_bfd, &rela, loc);
2748
2749 bfd_put_NN (output_bfd, rela.r_addend,
2750 globals->root.sgot->contents + off);
2751 }
2752 else
2753 bfd_put_NN (output_bfd, relocation - tpoff_base (info),
2754 globals->root.sgot->contents + off);
2755
2756 symbol_got_offset_mark (input_bfd, h, r_symndx);
2757 }
2758 break;
2759
d530ba0a
AM
2760 default:
2761 break;
2762 }
6e712424
PI
2763
2764 /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
d530ba0a
AM
2765 because such sections are not SEC_ALLOC and thus ld.so will
2766 not process them. */
6e712424
PI
2767 if (unresolved_reloc
2768 && !((input_section->flags & SEC_DEBUGGING) != 0
2769 && h->def_dynamic)
2770 && _bfd_elf_section_offset (output_bfd, info, input_section,
2771 +rel->r_offset) != (bfd_vma) - 1)
2772 {
2773 (*_bfd_error_handler)
2774 /* xgettext:c-format */
2775 (_("%pB(%pA+%#" PRIx64 "): "
2776 "unresolvable %s relocation against symbol `%s'"),
2777 input_bfd, input_section, (uint64_t) rel->r_offset, howto->name,
2778 h->root.root.string);
2779 return false;
2780 }
2781
2782 if (r != bfd_reloc_ok && r != bfd_reloc_continue)
2783 {
2784 switch (r)
2785 {
2786 case bfd_reloc_overflow:
d530ba0a
AM
2787 (*info->callbacks->reloc_overflow)
2788 (info, (h ? &h->root : NULL), name, howto->name, (bfd_vma) 0,
2789 input_bfd, input_section, rel->r_offset);
6e712424
PI
2790
2791 /* Original aarch64 code had a check for alignement correctness */
2792 break;
2793
2794 case bfd_reloc_undefined:
d530ba0a
AM
2795 (*info->callbacks->undefined_symbol)
2796 (info, name, input_bfd, input_section, rel->r_offset, true);
6e712424
PI
2797 break;
2798
2799 case bfd_reloc_outofrange:
2800 error_message = _("out of range");
2801 goto common_error;
2802
2803 case bfd_reloc_notsupported:
2804 error_message = _("unsupported relocation");
2805 goto common_error;
2806
2807 case bfd_reloc_dangerous:
2808 /* error_message should already be set. */
2809 goto common_error;
2810
2811 default:
2812 error_message = _("unknown error");
2813 /* Fall through. */
2814
2815 common_error:
2816 BFD_ASSERT (error_message != NULL);
2817 (*info->callbacks->reloc_dangerous)
d530ba0a 2818 (info, error_message, input_bfd, input_section, rel->r_offset);
6e712424
PI
2819 break;
2820 }
2821 }
2822
2823 if (!save_addend)
2824 addend = 0;
2825 }
2826
2827 return true;
2828}
2829
2830/* Set the right machine number. */
2831
2832static bool
2833elfNN_kvx_object_p (bfd *abfd)
2834{
2835 /* must be coherent with default arch in cpu-kvx.c */
2836 int e_set = bfd_mach_kv3_1;
2837
2838 if (elf_elfheader (abfd)->e_machine == EM_KVX)
2839 {
2840 int e_core = elf_elfheader (abfd)->e_flags & ELF_KVX_CORE_MASK;
2841 switch(e_core)
2842 {
2843#if ARCH_SIZE == 64
2844 case ELF_KVX_CORE_KV3_1 : e_set = bfd_mach_kv3_1_64; break;
2845 case ELF_KVX_CORE_KV3_2 : e_set = bfd_mach_kv3_2_64; break;
2846 case ELF_KVX_CORE_KV4_1 : e_set = bfd_mach_kv4_1_64; break;
2847#else
2848 case ELF_KVX_CORE_KV3_1 : e_set = bfd_mach_kv3_1; break;
2849 case ELF_KVX_CORE_KV3_2 : e_set = bfd_mach_kv3_2; break;
2850 case ELF_KVX_CORE_KV4_1 : e_set = bfd_mach_kv4_1; break;
2851#endif
2852 default:
2853 (*_bfd_error_handler)(_("%s: Bad ELF id: `%d'"),
2854 abfd->filename, e_core);
2855 }
2856 }
2857 return bfd_default_set_arch_mach (abfd, bfd_arch_kvx, e_set);
6e712424
PI
2858}
2859
2860/* Function to keep KVX specific flags in the ELF header. */
2861
2862static bool
2863elfNN_kvx_set_private_flags (bfd *abfd, flagword flags)
2864{
2865 if (elf_flags_init (abfd) && elf_elfheader (abfd)->e_flags != flags)
2866 {
2867 }
2868 else
2869 {
2870 elf_elfheader (abfd)->e_flags = flags;
2871 elf_flags_init (abfd) = true;
2872 }
2873
2874 return true;
2875}
2876
2877/* Merge backend specific data from an object file to the output
2878 object file when linking. */
2879
2880static bool
2881elfNN_kvx_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
2882{
d530ba0a 2883 bfd *obfd = info->output_bfd;
6e712424
PI
2884 flagword out_flags;
2885 flagword in_flags;
2886 bool flags_compatible = true;
2887 asection *sec;
2888
2889 /* Check if we have the same endianess. */
2890 if (!_bfd_generic_verify_endian_match (ibfd, info))
2891 return false;
2892
2893 if (!is_kvx_elf (ibfd) || !is_kvx_elf (obfd))
2894 return true;
2895
2896 /* The input BFD must have had its flags initialised. */
2897 /* The following seems bogus to me -- The flags are initialized in
2898 the assembler but I don't think an elf_flags_init field is
2899 written into the object. */
2900 /* BFD_ASSERT (elf_flags_init (ibfd)); */
2901
2902 if (bfd_get_arch_size (ibfd) != bfd_get_arch_size (obfd))
2903 {
2904 const char *msg;
2905
2906 if (bfd_get_arch_size (ibfd) == 32
2907 && bfd_get_arch_size (obfd) == 64)
2908 msg = _("%s: compiled as 32-bit object and %s is 64-bit");
2909 else if (bfd_get_arch_size (ibfd) == 64
2910 && bfd_get_arch_size (obfd) == 32)
2911 msg = _("%s: compiled as 64-bit object and %s is 32-bit");
2912 else
2913 msg = _("%s: object size does not match that of target %s");
2914
2915 (*_bfd_error_handler) (msg, bfd_get_filename (ibfd),
2916 bfd_get_filename (obfd));
2917 bfd_set_error (bfd_error_wrong_format);
2918 return false;
2919 }
2920
2921 in_flags = elf_elfheader (ibfd)->e_flags;
2922 out_flags = elf_elfheader (obfd)->e_flags;
2923
2924 if (!elf_flags_init (obfd))
2925 {
2926 /* If the input is the default architecture and had the default
d530ba0a
AM
2927 flags then do not bother setting the flags for the output
2928 architecture, instead allow future merges to do this. If no
2929 future merges ever set these flags then they will retain their
2930 uninitialised values, which surprise surprise, correspond
2931 to the default values. */
6e712424
PI
2932 if (bfd_get_arch_info (ibfd)->the_default
2933 && elf_elfheader (ibfd)->e_flags == 0)
2934 return true;
2935
2936 elf_flags_init (obfd) = true;
2937 elf_elfheader (obfd)->e_flags = in_flags;
2938
2939 if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
2940 && bfd_get_arch_info (obfd)->the_default)
2941 return bfd_set_arch_mach (obfd, bfd_get_arch (ibfd),
2942 bfd_get_mach (ibfd));
2943
2944 return true;
2945 }
2946
2947 /* Identical flags must be compatible. */
2948 if (in_flags == out_flags)
2949 return true;
2950
2951 /* Check to see if the input BFD actually contains any sections. If
2952 not, its flags may not have been initialised either, but it
2953 cannot actually cause any incompatiblity. Do not short-circuit
2954 dynamic objects; their section list may be emptied by
2955 elf_link_add_object_symbols.
2956
2957 Also check to see if there are no code sections in the input.
2958 In this case there is no need to check for code specific flags.
2959 XXX - do we need to worry about floating-point format compatability
2960 in data sections ? */
2961 if (!(ibfd->flags & DYNAMIC))
d530ba0a
AM
2962 {
2963 bool null_input_bfd = true;
2964 bool only_data_sections = true;
2965
2966 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
2967 {
2968 if ((bfd_section_flags (sec)
2969 & (SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS))
2970 == (SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS))
2971 only_data_sections = false;
2972
2973 null_input_bfd = false;
2974 break;
2975 }
2976
2977 if (null_input_bfd || only_data_sections)
2978 return true;
2979 }
6e712424
PI
2980 return flags_compatible;
2981}
2982
2983/* Display the flags field. */
2984
2985static bool
2986elfNN_kvx_print_private_bfd_data (bfd *abfd, void *ptr)
2987{
2988 FILE *file = (FILE *) ptr;
2989 unsigned long flags;
2990
2991 BFD_ASSERT (abfd != NULL && ptr != NULL);
2992
2993 /* Print normal ELF private data. */
2994 _bfd_elf_print_private_bfd_data (abfd, ptr);
2995
2996 flags = elf_elfheader (abfd)->e_flags;
2997 /* Ignore init flag - it may not be set, despite the flags field
2998 containing valid data. */
2999
3000 /* xgettext:c-format */
3001 fprintf (file, _("Private flags = 0x%lx : "), elf_elfheader (abfd)->e_flags);
3002 if((flags & ELF_KVX_ABI_64B_ADDR_BIT) == ELF_KVX_ABI_64B_ADDR_BIT)
3003 {
3004 if (ELF_KVX_CHECK_CORE(flags,ELF_KVX_CORE_KV3_1))
3005 fprintf (file, _("Coolidge (kv3) V1 64 bits"));
3006 else if (ELF_KVX_CHECK_CORE(flags,ELF_KVX_CORE_KV3_2))
3007 fprintf (file, _("Coolidge (kv3) V2 64 bits"));
3008 else if (ELF_KVX_CHECK_CORE(flags,ELF_KVX_CORE_KV4_1))
3009 fprintf (file, _("Coolidge (kv4) V1 64 bits"));
3010 }
3011 else
3012 {
3013 if (ELF_KVX_CHECK_CORE(flags,ELF_KVX_CORE_KV3_1))
3014 fprintf (file, _("Coolidge (kv3) V1 32 bits"));
3015 else if (ELF_KVX_CHECK_CORE(flags,ELF_KVX_CORE_KV3_2))
3016 fprintf (file, _("Coolidge (kv3) V2 32 bits"));
3017 else if (ELF_KVX_CHECK_CORE(flags,ELF_KVX_CORE_KV4_1))
3018 fprintf (file, _("Coolidge (kv4) V1 32 bits"));
3019 }
d530ba0a 3020
6e712424
PI
3021 fputc ('\n', file);
3022
3023 return true;
3024}
3025
3026/* Adjust a symbol defined by a dynamic object and referenced by a
3027 regular object. The current definition is in some section of the
3028 dynamic object, but we're not including those sections. We have to
3029 change the definition to something the rest of the link can
3030 understand. */
3031
3032static bool
3033elfNN_kvx_adjust_dynamic_symbol (struct bfd_link_info *info,
d530ba0a 3034 struct elf_link_hash_entry *h)
6e712424
PI
3035{
3036 struct elf_kvx_link_hash_table *htab;
3037 asection *s;
3038
3039 /* If this is a function, put it in the procedure linkage table. We
3040 will fill in the contents of the procedure linkage table later,
3041 when we know the address of the .got section. */
3042 if (h->type == STT_FUNC || h->needs_plt)
3043 {
3044 if (h->plt.refcount <= 0
3045 || ((SYMBOL_CALLS_LOCAL (info, h)
d530ba0a
AM
3046 || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
3047 && h->root.type == bfd_link_hash_undefweak))))
6e712424
PI
3048 {
3049 /* This case can occur if we saw a CALL26 reloc in
3050 an input file, but the symbol wasn't referred to
3051 by a dynamic object or all references were
3052 garbage collected. In which case we can end up
3053 resolving. */
3054 h->plt.offset = (bfd_vma) - 1;
3055 h->needs_plt = 0;
3056 }
3057
3058 return true;
3059 }
3060 else
3061 /* Otherwise, reset to -1. */
3062 h->plt.offset = (bfd_vma) - 1;
3063
3064
3065 /* If this is a weak symbol, and there is a real definition, the
3066 processor independent code will have arranged for us to see the
3067 real definition first, and we can just use the same value. */
3068 if (h->is_weakalias)
3069 {
d530ba0a
AM
3070 struct elf_link_hash_entry *def = weakdef (h);
3071 BFD_ASSERT (def->root.type == bfd_link_hash_defined);
3072 h->root.u.def.section = def->root.u.def.section;
3073 h->root.u.def.value = def->root.u.def.value;
3074 if (ELIMINATE_COPY_RELOCS || info->nocopyreloc)
3075 h->non_got_ref = def->non_got_ref;
3076 return true;
6e712424
PI
3077 }
3078
3079 /* If we are creating a shared library, we must presume that the
3080 only references to the symbol are via the global offset table.
3081 For such cases we need not do anything here; the relocations will
3082 be handled correctly by relocate_section. */
3083 if (bfd_link_pic (info))
3084 return true;
3085
3086 /* If there are no references to this symbol that do not use the
3087 GOT, we don't need to generate a copy reloc. */
3088 if (!h->non_got_ref)
3089 return true;
3090
3091 /* If -z nocopyreloc was given, we won't generate them either. */
3092 if (info->nocopyreloc)
3093 {
3094 h->non_got_ref = 0;
3095 return true;
3096 }
3097
3098 /* We must allocate the symbol in our .dynbss section, which will
3099 become part of the .bss section of the executable. There will be
3100 an entry for this symbol in the .dynsym section. The dynamic
3101 object will contain position independent code, so all references
3102 from the dynamic object to this symbol will go through the global
3103 offset table. The dynamic linker will use the .dynsym entry to
3104 determine the address it must put in the global offset table, so
3105 both the dynamic object and the regular object will refer to the
3106 same memory location for the variable. */
3107
3108 htab = elf_kvx_hash_table (info);
3109
3110 /* We must generate a R_KVX_COPY reloc to tell the dynamic linker
3111 to copy the initial value out of the dynamic object and into the
3112 runtime process image. */
3113 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
3114 {
3115 htab->srelbss->size += RELOC_SIZE (htab);
3116 h->needs_copy = 1;
3117 }
3118
3119 s = htab->sdynbss;
3120
3121 return _bfd_elf_adjust_dynamic_copy (info, h, s);
6e712424
PI
3122}
3123
3124static bool
3125elfNN_kvx_allocate_local_symbols (bfd *abfd, unsigned number)
3126{
3127 struct elf_kvx_local_symbol *locals;
3128 locals = elf_kvx_locals (abfd);
3129 if (locals == NULL)
3130 {
3131 locals = (struct elf_kvx_local_symbol *)
3132 bfd_zalloc (abfd, number * sizeof (struct elf_kvx_local_symbol));
3133 if (locals == NULL)
3134 return false;
3135 elf_kvx_locals (abfd) = locals;
3136 }
3137 return true;
3138}
3139
3140/* Create the .got section to hold the global offset table. */
3141
3142static bool
3143kvx_elf_create_got_section (bfd *abfd, struct bfd_link_info *info)
3144{
3145 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
3146 flagword flags;
3147 asection *s;
3148 struct elf_link_hash_entry *h;
3149 struct elf_link_hash_table *htab = elf_hash_table (info);
3150
3151 /* This function may be called more than once. */
3152 s = bfd_get_linker_section (abfd, ".got");
3153 if (s != NULL)
3154 return true;
3155
3156 flags = bed->dynamic_sec_flags;
3157
3158 s = bfd_make_section_anyway_with_flags (abfd,
3159 (bed->rela_plts_and_copies_p
3160 ? ".rela.got" : ".rel.got"),
3161 (bed->dynamic_sec_flags
3162 | SEC_READONLY));
3163 if (s == NULL
d530ba0a 3164 || !bfd_set_section_alignment (s, bed->s->log_file_align))
6e712424
PI
3165
3166 return false;
3167 htab->srelgot = s;
3168
3169 s = bfd_make_section_anyway_with_flags (abfd, ".got", flags);
3170 if (s == NULL
3171 || !bfd_set_section_alignment (s, bed->s->log_file_align))
3172 return false;
3173 htab->sgot = s;
3174 htab->sgot->size += GOT_ENTRY_SIZE;
3175
3176 if (bed->want_got_sym)
3177 {
3178 /* Define the symbol _GLOBAL_OFFSET_TABLE_ at the start of the .got
3179 (or .got.plt) section. We don't do this in the linker script
3180 because we don't want to define the symbol if we are not creating
3181 a global offset table. */
3182 h = _bfd_elf_define_linkage_sym (abfd, info, s,
3183 "_GLOBAL_OFFSET_TABLE_");
3184 elf_hash_table (info)->hgot = h;
3185 if (h == NULL)
3186 return false;
3187 }
3188
3189 if (bed->want_got_plt)
3190 {
3191 s = bfd_make_section_anyway_with_flags (abfd, ".got.plt", flags);
3192 if (s == NULL
3193 || !bfd_set_section_alignment (s,
3194 bed->s->log_file_align))
3195 return false;
3196 htab->sgotplt = s;
3197 }
3198
3199 /* The first bit of the global offset table is the header. */
3200 s->size += bed->got_header_size;
3201
3202 /* we still need to handle got content when doing static link with PIC */
3203 if (bfd_link_executable (info) && !bfd_link_pic (info)) {
3204 htab->dynobj = abfd;
3205 }
3206
3207 return true;
3208}
3209
3210/* Look through the relocs for a section during the first phase. */
3211
3212static bool
3213elfNN_kvx_check_relocs (bfd *abfd, struct bfd_link_info *info,
3214 asection *sec, const Elf_Internal_Rela *relocs)
3215{
3216 Elf_Internal_Shdr *symtab_hdr;
3217 struct elf_link_hash_entry **sym_hashes;
3218 const Elf_Internal_Rela *rel;
3219 const Elf_Internal_Rela *rel_end;
3220 asection *sreloc;
3221
3222 struct elf_kvx_link_hash_table *htab;
3223
3224 if (bfd_link_relocatable (info))
3225 return true;
3226
3227 BFD_ASSERT (is_kvx_elf (abfd));
3228
3229 htab = elf_kvx_hash_table (info);
3230 sreloc = NULL;
3231
3232 symtab_hdr = &elf_symtab_hdr (abfd);
3233 sym_hashes = elf_sym_hashes (abfd);
3234
3235 rel_end = relocs + sec->reloc_count;
3236 for (rel = relocs; rel < rel_end; rel++)
3237 {
3238 struct elf_link_hash_entry *h;
3239 unsigned int r_symndx;
3240 unsigned int r_type;
3241 bfd_reloc_code_real_type bfd_r_type;
3242 Elf_Internal_Sym *isym;
3243
3244 r_symndx = ELFNN_R_SYM (rel->r_info);
3245 r_type = ELFNN_R_TYPE (rel->r_info);
3246
3247 if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
3248 {
3249 /* xgettext:c-format */
3250 _bfd_error_handler (_("%pB: bad symbol index: %d"), abfd, r_symndx);
3251 return false;
3252 }
3253
3254 if (r_symndx < symtab_hdr->sh_info)
3255 {
3256 /* A local symbol. */
3257 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
3258 abfd, r_symndx);
3259 if (isym == NULL)
3260 return false;
3261
d530ba0a 3262 h = NULL;
6e712424
PI
3263 }
3264 else
3265 {
3266 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
3267 while (h->root.type == bfd_link_hash_indirect
3268 || h->root.type == bfd_link_hash_warning)
3269 h = (struct elf_link_hash_entry *) h->root.u.i.link;
3270 }
3271
3272 /* Could be done earlier, if h were already available. */
3273 bfd_r_type = kvx_tls_transition (abfd, info, r_type, h, r_symndx);
3274
3275 if (h != NULL)
3276 {
3277 /* Create the ifunc sections for static executables. If we
3278 never see an indirect function symbol nor we are building
3279 a static executable, those sections will be empty and
3280 won't appear in output. */
3281 switch (bfd_r_type)
3282 {
3283 default:
3284 break;
3285 }
3286
3287 /* It is referenced by a non-shared object. */
3288 h->ref_regular = 1;
3289 }
3290
3291 switch (bfd_r_type)
3292 {
3293
3294 case BFD_RELOC_KVX_S43_LO10:
3295 case BFD_RELOC_KVX_S43_UP27:
3296 case BFD_RELOC_KVX_S43_EX6:
3297
3298 case BFD_RELOC_KVX_S37_LO10:
3299 case BFD_RELOC_KVX_S37_UP27:
3300
3301 case BFD_RELOC_KVX_S64_LO10:
3302 case BFD_RELOC_KVX_S64_UP27:
3303 case BFD_RELOC_KVX_S64_EX27:
3304
3305 case BFD_RELOC_KVX_32:
3306 case BFD_RELOC_KVX_64:
3307
3308 /* We don't need to handle relocs into sections not going into
3309 the "real" output. */
3310 if ((sec->flags & SEC_ALLOC) == 0)
3311 break;
3312
3313 if (h != NULL)
3314 {
3315 if (!bfd_link_pic (info))
3316 h->non_got_ref = 1;
3317
3318 h->plt.refcount += 1;
3319 h->pointer_equality_needed = 1;
3320 }
3321
3322 /* No need to do anything if we're not creating a shared
3323 object. */
3324 if (! bfd_link_pic (info))
3325 break;
3326
3327 {
3328 struct elf_dyn_relocs *p;
3329 struct elf_dyn_relocs **head;
3330
3331 /* We must copy these reloc types into the output file.
3332 Create a reloc section in dynobj and make room for
3333 this reloc. */
3334 if (sreloc == NULL)
3335 {
3336 if (htab->root.dynobj == NULL)
3337 htab->root.dynobj = abfd;
3338
3339 sreloc = _bfd_elf_make_dynamic_reloc_section
3340 (sec, htab->root.dynobj, LOG_FILE_ALIGN, abfd, /*rela? */ true);
3341
3342 if (sreloc == NULL)
3343 return false;
3344 }
3345
3346 /* If this is a global symbol, we count the number of
3347 relocations we need for this symbol. */
3348 if (h != NULL)
3349 {
d530ba0a 3350 head = &h->dyn_relocs;
6e712424
PI
3351 }
3352 else
3353 {
3354 /* Track dynamic relocs needed for local syms too.
3355 We really need local syms available to do this
3356 easily. Oh well. */
3357
3358 asection *s;
3359 void **vpp;
3360
3361 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
3362 abfd, r_symndx);
3363 if (isym == NULL)
3364 return false;
3365
3366 s = bfd_section_from_elf_index (abfd, isym->st_shndx);
3367 if (s == NULL)
3368 s = sec;
3369
3370 /* Beware of type punned pointers vs strict aliasing
3371 rules. */
3372 vpp = &(elf_section_data (s)->local_dynrel);
3373 head = (struct elf_dyn_relocs **) vpp;
3374 }
3375
3376 p = *head;
3377 if (p == NULL || p->sec != sec)
3378 {
3379 bfd_size_type amt = sizeof *p;
3380 p = ((struct elf_dyn_relocs *)
3381 bfd_zalloc (htab->root.dynobj, amt));
3382 if (p == NULL)
3383 return false;
3384 p->next = *head;
3385 *head = p;
3386 p->sec = sec;
3387 }
3388
3389 p->count += 1;
3390
3391 }
3392 break;
3393
3394 case BFD_RELOC_KVX_S37_GOT_LO10:
3395 case BFD_RELOC_KVX_S37_GOT_UP27:
3396
3397 case BFD_RELOC_KVX_S37_GOTOFF_LO10:
3398 case BFD_RELOC_KVX_S37_GOTOFF_UP27:
3399
3400 case BFD_RELOC_KVX_S43_GOT_LO10:
3401 case BFD_RELOC_KVX_S43_GOT_UP27:
3402 case BFD_RELOC_KVX_S43_GOT_EX6:
3403
3404 case BFD_RELOC_KVX_S43_GOTOFF_LO10:
3405 case BFD_RELOC_KVX_S43_GOTOFF_UP27:
3406 case BFD_RELOC_KVX_S43_GOTOFF_EX6:
3407
3408 case BFD_RELOC_KVX_S37_TLS_GD_LO10:
3409 case BFD_RELOC_KVX_S37_TLS_GD_UP27:
3410
3411 case BFD_RELOC_KVX_S43_TLS_GD_LO10:
3412 case BFD_RELOC_KVX_S43_TLS_GD_UP27:
3413 case BFD_RELOC_KVX_S43_TLS_GD_EX6:
3414
3415 case BFD_RELOC_KVX_S37_TLS_IE_LO10:
3416 case BFD_RELOC_KVX_S37_TLS_IE_UP27:
3417
3418 case BFD_RELOC_KVX_S43_TLS_IE_LO10:
3419 case BFD_RELOC_KVX_S43_TLS_IE_UP27:
3420 case BFD_RELOC_KVX_S43_TLS_IE_EX6:
3421
3422 case BFD_RELOC_KVX_S37_TLS_LD_LO10:
3423 case BFD_RELOC_KVX_S37_TLS_LD_UP27:
3424
3425 case BFD_RELOC_KVX_S43_TLS_LD_LO10:
3426 case BFD_RELOC_KVX_S43_TLS_LD_UP27:
3427 case BFD_RELOC_KVX_S43_TLS_LD_EX6:
3428 {
3429 unsigned got_type;
3430 unsigned old_got_type;
3431
3432 got_type = kvx_reloc_got_type (bfd_r_type);
3433
3434 if (h)
3435 {
3436 h->got.refcount += 1;
3437 old_got_type = elf_kvx_hash_entry (h)->got_type;
3438 }
3439 else
3440 {
3441 struct elf_kvx_local_symbol *locals;
3442
3443 if (!elfNN_kvx_allocate_local_symbols
3444 (abfd, symtab_hdr->sh_info))
3445 return false;
3446
3447 locals = elf_kvx_locals (abfd);
3448 BFD_ASSERT (r_symndx < symtab_hdr->sh_info);
3449 locals[r_symndx].got_refcount += 1;
3450 old_got_type = locals[r_symndx].got_type;
3451 }
3452
3453 /* We will already have issued an error message if there
3454 is a TLS/non-TLS mismatch, based on the symbol type.
3455 So just combine any TLS types needed. */
3456 if (old_got_type != GOT_UNKNOWN && old_got_type != GOT_NORMAL
3457 && got_type != GOT_NORMAL)
3458 got_type |= old_got_type;
3459
3460 /* If the symbol is accessed by both IE and GD methods, we
3461 are able to relax. Turn off the GD flag, without
3462 messing up with any other kind of TLS types that may be
3463 involved. */
3464 /* Disabled untested and unused TLS */
3465 /* if ((got_type & GOT_TLS_IE) && GOT_TLS_GD_ANY_P (got_type)) */
3466 /* got_type &= ~ (GOT_TLSDESC_GD | GOT_TLS_GD); */
3467
3468 if (old_got_type != got_type)
3469 {
3470 if (h != NULL)
3471 elf_kvx_hash_entry (h)->got_type = got_type;
3472 else
3473 {
3474 struct elf_kvx_local_symbol *locals;
3475 locals = elf_kvx_locals (abfd);
3476 BFD_ASSERT (r_symndx < symtab_hdr->sh_info);
3477 locals[r_symndx].got_type = got_type;
3478 }
3479 }
3480
3481 if (htab->root.dynobj == NULL)
3482 htab->root.dynobj = abfd;
3483 if (! kvx_elf_create_got_section (htab->root.dynobj, info))
3484 return false;
3485 break;
3486 }
3487
3488 case BFD_RELOC_KVX_S64_GOTADDR_LO10:
3489 case BFD_RELOC_KVX_S64_GOTADDR_UP27:
3490 case BFD_RELOC_KVX_S64_GOTADDR_EX27:
3491
3492 case BFD_RELOC_KVX_S43_GOTADDR_LO10:
3493 case BFD_RELOC_KVX_S43_GOTADDR_UP27:
3494 case BFD_RELOC_KVX_S43_GOTADDR_EX6:
3495
3496 case BFD_RELOC_KVX_S37_GOTADDR_LO10:
3497 case BFD_RELOC_KVX_S37_GOTADDR_UP27:
3498
d530ba0a
AM
3499 if (htab->root.dynobj == NULL)
3500 htab->root.dynobj = abfd;
3501 if (! kvx_elf_create_got_section (htab->root.dynobj, info))
3502 return false;
3503 break;
6e712424
PI
3504
3505 case BFD_RELOC_KVX_PCREL27:
3506 case BFD_RELOC_KVX_PCREL17:
3507 /* If this is a local symbol then we resolve it
3508 directly without creating a PLT entry. */
3509 if (h == NULL)
3510 continue;
3511
3512 h->needs_plt = 1;
3513 if (h->plt.refcount <= 0)
3514 h->plt.refcount = 1;
3515 else
3516 h->plt.refcount += 1;
3517 break;
3518
3519 default:
3520 break;
3521 }
3522 }
3523
3524 return true;
3525}
3526
3527static bool
3528elfNN_kvx_init_file_header (bfd *abfd, struct bfd_link_info *link_info)
3529{
3530 Elf_Internal_Ehdr *i_ehdrp; /* ELF file header, internal form. */
3531
3532 if (!_bfd_elf_init_file_header (abfd, link_info))
3533 return false;
3534
3535 i_ehdrp = elf_elfheader (abfd);
3536 i_ehdrp->e_ident[EI_ABIVERSION] = KVX_ELF_ABI_VERSION;
3537 return true;
3538}
3539
3540static enum elf_reloc_type_class
3541elfNN_kvx_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
3542 const asection *rel_sec ATTRIBUTE_UNUSED,
3543 const Elf_Internal_Rela *rela)
3544{
3545 switch ((int) ELFNN_R_TYPE (rela->r_info))
3546 {
3547 case R_KVX_RELATIVE:
3548 return reloc_class_relative;
3549 case R_KVX_JMP_SLOT:
3550 return reloc_class_plt;
3551 case R_KVX_COPY:
3552 return reloc_class_copy;
3553 default:
3554 return reloc_class_normal;
3555 }
3556}
3557
3558/* A structure used to record a list of sections, independently
3559 of the next and prev fields in the asection structure. */
3560typedef struct section_list
3561{
3562 asection *sec;
3563 struct section_list *next;
3564 struct section_list *prev;
3565}
3566section_list;
3567
3568typedef struct
3569{
3570 void *finfo;
3571 struct bfd_link_info *info;
3572 asection *sec;
3573 int sec_shndx;
3574 int (*func) (void *, const char *, Elf_Internal_Sym *,
3575 asection *, struct elf_link_hash_entry *);
3576} output_arch_syminfo;
3577
3578/* Output a single local symbol for a generated stub. */
3579
3580static bool
3581elfNN_kvx_output_stub_sym (output_arch_syminfo *osi, const char *name,
3582 bfd_vma offset, bfd_vma size)
3583{
3584 Elf_Internal_Sym sym;
3585
3586 sym.st_value = (osi->sec->output_section->vma
3587 + osi->sec->output_offset + offset);
3588 sym.st_size = size;
3589 sym.st_other = 0;
3590 sym.st_info = ELF_ST_INFO (STB_LOCAL, STT_FUNC);
3591 sym.st_shndx = osi->sec_shndx;
3592 return osi->func (osi->finfo, name, &sym, osi->sec, NULL) == 1;
3593}
3594
3595static bool
3596kvx_map_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
3597{
3598 struct elf_kvx_stub_hash_entry *stub_entry;
3599 asection *stub_sec;
3600 bfd_vma addr;
3601 char *stub_name;
3602 output_arch_syminfo *osi;
3603
3604 /* Massage our args to the form they really have. */
3605 stub_entry = (struct elf_kvx_stub_hash_entry *) gen_entry;
3606 osi = (output_arch_syminfo *) in_arg;
3607
3608 stub_sec = stub_entry->stub_sec;
3609
3610 /* Ensure this stub is attached to the current section being
3611 processed. */
3612 if (stub_sec != osi->sec)
3613 return true;
3614
3615 addr = (bfd_vma) stub_entry->stub_offset;
3616
3617 stub_name = stub_entry->output_name;
3618
3619 switch (stub_entry->stub_type)
3620 {
3621 case kvx_stub_long_branch:
3622 if (!elfNN_kvx_output_stub_sym
3623 (osi, stub_name, addr, sizeof (elfNN_kvx_long_branch_stub)))
3624 return false;
3625 break;
3626
3627 default:
3628 abort ();
3629 }
3630
3631 return true;
3632}
3633
3634/* Output mapping symbols for linker generated sections. */
3635
3636static bool
3637elfNN_kvx_output_arch_local_syms (bfd *output_bfd,
d530ba0a
AM
3638 struct bfd_link_info *info,
3639 void *finfo,
3640 int (*func) (void *, const char *,
3641 Elf_Internal_Sym *,
3642 asection *,
3643 struct elf_link_hash_entry *))
6e712424
PI
3644{
3645 output_arch_syminfo osi;
3646 struct elf_kvx_link_hash_table *htab;
3647
3648 htab = elf_kvx_hash_table (info);
3649
3650 osi.finfo = finfo;
3651 osi.info = info;
3652 osi.func = func;
3653
3654 /* Long calls stubs. */
3655 if (htab->stub_bfd && htab->stub_bfd->sections)
3656 {
3657 asection *stub_sec;
3658
3659 for (stub_sec = htab->stub_bfd->sections;
3660 stub_sec != NULL; stub_sec = stub_sec->next)
3661 {
3662 /* Ignore non-stub sections. */
3663 if (!strstr (stub_sec->name, STUB_SUFFIX))
3664 continue;
3665
3666 osi.sec = stub_sec;
3667
3668 osi.sec_shndx = _bfd_elf_section_from_bfd_section
3669 (output_bfd, osi.sec->output_section);
3670
3671 bfd_hash_traverse (&htab->stub_hash_table, kvx_map_one_stub,
3672 &osi);
3673 }
3674 }
3675
3676 /* Finally, output mapping symbols for the PLT. */
3677 if (!htab->root.splt || htab->root.splt->size == 0)
3678 return true;
3679
3680 osi.sec_shndx = _bfd_elf_section_from_bfd_section
3681 (output_bfd, htab->root.splt->output_section);
3682 osi.sec = htab->root.splt;
3683
3684 return true;
3685
3686}
3687
3688/* Allocate target specific section data. */
3689
3690static bool
3691elfNN_kvx_new_section_hook (bfd *abfd, asection *sec)
3692{
3693 if (!sec->used_by_bfd)
3694 {
3695 _kvx_elf_section_data *sdata;
3696 bfd_size_type amt = sizeof (*sdata);
3697
3698 sdata = bfd_zalloc (abfd, amt);
3699 if (sdata == NULL)
3700 return false;
3701 sec->used_by_bfd = sdata;
3702 }
3703
3704 return _bfd_elf_new_section_hook (abfd, sec);
3705}
3706
3707/* Create dynamic sections. This is different from the ARM backend in that
3708 the got, plt, gotplt and their relocation sections are all created in the
3709 standard part of the bfd elf backend. */
3710
3711static bool
3712elfNN_kvx_create_dynamic_sections (bfd *dynobj,
d530ba0a 3713 struct bfd_link_info *info)
6e712424
PI
3714{
3715 struct elf_kvx_link_hash_table *htab;
3716
3717 /* We need to create .got section. */
3718 if (!kvx_elf_create_got_section (dynobj, info))
3719 return false;
3720
3721 if (!_bfd_elf_create_dynamic_sections (dynobj, info))
3722 return false;
3723
3724 htab = elf_kvx_hash_table (info);
3725 htab->sdynbss = bfd_get_linker_section (dynobj, ".dynbss");
3726 if (!bfd_link_pic (info))
3727 htab->srelbss = bfd_get_linker_section (dynobj, ".rela.bss");
3728
3729 if (!htab->sdynbss || (!bfd_link_pic (info) && !htab->srelbss))
3730 abort ();
3731
3732 return true;
3733}
3734
3735
3736/* Allocate space in .plt, .got and associated reloc sections for
3737 dynamic relocs. */
3738
3739static bool
3740elfNN_kvx_allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
3741{
3742 struct bfd_link_info *info;
3743 struct elf_kvx_link_hash_table *htab;
3744 struct elf_dyn_relocs *p;
3745
3746 /* An example of a bfd_link_hash_indirect symbol is versioned
3747 symbol. For example: __gxx_personality_v0(bfd_link_hash_indirect)
3748 -> __gxx_personality_v0(bfd_link_hash_defined)
3749
3750 There is no need to process bfd_link_hash_indirect symbols here
3751 because we will also be presented with the concrete instance of
3752 the symbol and elfNN_kvx_copy_indirect_symbol () will have been
3753 called to copy all relevant data from the generic to the concrete
d530ba0a 3754 symbol instance. */
6e712424
PI
3755 if (h->root.type == bfd_link_hash_indirect)
3756 return true;
3757
3758 if (h->root.type == bfd_link_hash_warning)
3759 h = (struct elf_link_hash_entry *) h->root.u.i.link;
3760
3761 info = (struct bfd_link_info *) inf;
3762 htab = elf_kvx_hash_table (info);
3763
3764 if (htab->root.dynamic_sections_created && h->plt.refcount > 0)
3765 {
3766 /* Make sure this symbol is output as a dynamic symbol.
d530ba0a 3767 Undefined weak syms won't yet be marked as dynamic. */
6e712424
PI
3768 if (h->dynindx == -1 && !h->forced_local)
3769 {
3770 if (!bfd_elf_link_record_dynamic_symbol (info, h))
3771 return false;
3772 }
3773
3774 if (bfd_link_pic (info) || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h))
3775 {
3776 asection *s = htab->root.splt;
3777
3778 /* If this is the first .plt entry, make room for the special
3779 first entry. */
3780 if (s->size == 0)
3781 s->size += htab->plt_header_size;
3782
3783 h->plt.offset = s->size;
3784
3785 /* If this symbol is not defined in a regular file, and we are
3786 not generating a shared library, then set the symbol to this
3787 location in the .plt. This is required to make function
3788 pointers compare as equal between the normal executable and
3789 the shared library. */
3790 if (!bfd_link_pic (info) && !h->def_regular)
3791 {
3792 h->root.u.def.section = s;
3793 h->root.u.def.value = h->plt.offset;
3794 }
3795
3796 /* Make room for this entry. For now we only create the
3797 small model PLT entries. We later need to find a way
3798 of relaxing into these from the large model PLT entries. */
3799 s->size += PLT_SMALL_ENTRY_SIZE;
3800
3801 /* We also need to make an entry in the .got.plt section, which
3802 will be placed in the .got section by the linker script. */
3803 htab->root.sgotplt->size += GOT_ENTRY_SIZE;
3804
3805 /* We also need to make an entry in the .rela.plt section. */
3806 htab->root.srelplt->size += RELOC_SIZE (htab);
3807
3808 /* We need to ensure that all GOT entries that serve the PLT
3809 are consecutive with the special GOT slots [0] [1] and
3810 [2]. Any addtional relocations must be placed after the
3811 PLT related entries. We abuse the reloc_count such that
3812 during sizing we adjust reloc_count to indicate the
3813 number of PLT related reserved entries. In subsequent
3814 phases when filling in the contents of the reloc entries,
3815 PLT related entries are placed by computing their PLT
3816 index (0 .. reloc_count). While other none PLT relocs are
3817 placed at the slot indicated by reloc_count and
3818 reloc_count is updated. */
3819
3820 htab->root.srelplt->reloc_count++;
3821 }
3822 else
3823 {
3824 h->plt.offset = (bfd_vma) - 1;
3825 h->needs_plt = 0;
3826 }
3827 }
3828 else
3829 {
3830 h->plt.offset = (bfd_vma) - 1;
3831 h->needs_plt = 0;
3832 }
3833
3834 if (h->got.refcount > 0)
3835 {
3836 bool dyn;
3837 unsigned got_type = elf_kvx_hash_entry (h)->got_type;
3838
3839 h->got.offset = (bfd_vma) - 1;
3840
3841 dyn = htab->root.dynamic_sections_created;
3842
3843 /* Make sure this symbol is output as a dynamic symbol.
d530ba0a 3844 Undefined weak syms won't yet be marked as dynamic. */
6e712424
PI
3845 if (dyn && h->dynindx == -1 && !h->forced_local)
3846 {
3847 if (!bfd_elf_link_record_dynamic_symbol (info, h))
3848 return false;
3849 }
3850
3851 if (got_type == GOT_UNKNOWN)
3852 {
3853 (*_bfd_error_handler)
3854 (_("relocation against `%s' has faulty GOT type "),
3855 (h) ? h->root.root.string : "a local symbol");
3856 bfd_set_error (bfd_error_bad_value);
3857 return false;
3858 }
3859 else if (got_type == GOT_NORMAL)
3860 {
3861 h->got.offset = htab->root.sgot->size;
3862 htab->root.sgot->size += GOT_ENTRY_SIZE;
3863 if ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
3864 || h->root.type != bfd_link_hash_undefweak)
3865 && (bfd_link_pic (info)
3866 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h)))
3867 {
3868 htab->root.srelgot->size += RELOC_SIZE (htab);
3869 }
3870 }
3871 else
3872 {
3873 int indx;
3874
3875 /* Any of these will require 2 GOT slots because
3876 * they use __tls_get_addr() */
3877 if (got_type & (GOT_TLS_GD | GOT_TLS_LD))
3878 {
3879 h->got.offset = htab->root.sgot->size;
3880 htab->root.sgot->size += GOT_ENTRY_SIZE * 2;
3881 }
3882
3883 if (got_type & GOT_TLS_IE)
3884 {
3885 h->got.offset = htab->root.sgot->size;
3886 htab->root.sgot->size += GOT_ENTRY_SIZE;
3887 }
3888
3889 indx = h && h->dynindx != -1 ? h->dynindx : 0;
3890 if ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
3891 || h->root.type != bfd_link_hash_undefweak)
3892 && (bfd_link_pic (info)
3893 || indx != 0
3894 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h)))
3895 {
3896 /* Only the GD case requires 2 relocations. */
3897 if (got_type & GOT_TLS_GD)
d530ba0a 3898 htab->root.srelgot->size += RELOC_SIZE (htab) * 2;
6e712424
PI
3899
3900 /* LD needs a DTPMOD reloc, IE needs a DTPOFF. */
3901 if (got_type & (GOT_TLS_LD | GOT_TLS_IE))
d530ba0a 3902 htab->root.srelgot->size += RELOC_SIZE (htab);
6e712424
PI
3903 }
3904 }
3905 }
3906 else
3907 {
3908 h->got.offset = (bfd_vma) - 1;
3909 }
3910
3911 if (h->dyn_relocs == NULL)
3912 return true;
3913
3914 /* In the shared -Bsymbolic case, discard space allocated for
3915 dynamic pc-relative relocs against symbols which turn out to be
3916 defined in regular objects. For the normal shared case, discard
3917 space for pc-relative relocs that have become local due to symbol
3918 visibility changes. */
3919
3920 if (bfd_link_pic (info))
3921 {
3922 /* Relocs that use pc_count are those that appear on a call
d530ba0a
AM
3923 insn, or certain REL relocs that can generated via assembly.
3924 We want calls to protected symbols to resolve directly to the
3925 function rather than going via the plt. If people want
3926 function pointer comparisons to work as expected then they
3927 should avoid writing weird assembly. */
6e712424
PI
3928 if (SYMBOL_CALLS_LOCAL (info, h))
3929 {
3930 struct elf_dyn_relocs **pp;
3931
d530ba0a 3932 for (pp = &h->dyn_relocs; (p = *pp) != NULL;)
6e712424
PI
3933 {
3934 p->count -= p->pc_count;
3935 p->pc_count = 0;
3936 if (p->count == 0)
3937 *pp = p->next;
3938 else
3939 pp = &p->next;
3940 }
3941 }
3942
3943 /* Also discard relocs on undefined weak syms with non-default
d530ba0a 3944 visibility. */
6e712424
PI
3945 if (h->dyn_relocs != NULL && h->root.type == bfd_link_hash_undefweak)
3946 {
3947 if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
3948 || UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
3949 h->dyn_relocs = NULL;
3950
3951 /* Make sure undefined weak symbols are output as a dynamic
3952 symbol in PIEs. */
3953 else if (h->dynindx == -1
3954 && !h->forced_local
3955 && !bfd_elf_link_record_dynamic_symbol (info, h))
3956 return false;
3957 }
3958
3959 }
3960 else if (ELIMINATE_COPY_RELOCS)
3961 {
3962 /* For the non-shared case, discard space for relocs against
d530ba0a
AM
3963 symbols which turn out to need copy relocs or are not
3964 dynamic. */
6e712424
PI
3965
3966 if (!h->non_got_ref
3967 && ((h->def_dynamic
3968 && !h->def_regular)
3969 || (htab->root.dynamic_sections_created
3970 && (h->root.type == bfd_link_hash_undefweak
3971 || h->root.type == bfd_link_hash_undefined))))
3972 {
3973 /* Make sure this symbol is output as a dynamic symbol.
3974 Undefined weak syms won't yet be marked as dynamic. */
3975 if (h->dynindx == -1
3976 && !h->forced_local
3977 && !bfd_elf_link_record_dynamic_symbol (info, h))
3978 return false;
3979
3980 /* If that succeeded, we know we'll be keeping all the
3981 relocs. */
3982 if (h->dynindx != -1)
3983 goto keep;
3984 }
3985
3986 h->dyn_relocs = NULL;
3987
3988 keep:;
3989 }
3990
3991 /* Finally, allocate space. */
3992 for (p = h->dyn_relocs; p != NULL; p = p->next)
3993 {
3994 asection *sreloc;
3995
3996 sreloc = elf_section_data (p->sec)->sreloc;
3997
3998 BFD_ASSERT (sreloc != NULL);
3999
4000 sreloc->size += p->count * RELOC_SIZE (htab);
4001 }
4002
4003 return true;
4004}
4005
4006/* Find any dynamic relocs that apply to read-only sections. */
4007
4008static bool
4009kvx_readonly_dynrelocs (struct elf_link_hash_entry * h, void * inf)
4010{
4011 struct elf_dyn_relocs * p;
4012
4013 for (p = h->dyn_relocs; p != NULL; p = p->next)
4014 {
4015 asection *s = p->sec;
4016
4017 if (s != NULL && (s->flags & SEC_READONLY) != 0)
4018 {
4019 struct bfd_link_info *info = (struct bfd_link_info *) inf;
4020
4021 info->flags |= DF_TEXTREL;
4022 info->callbacks->minfo (_("%pB: dynamic relocation against `%pT' in "
4023 "read-only section `%pA'\n"),
4024 s->owner, h->root.root.string, s);
4025
4026 /* Not an error, just cut short the traversal. */
4027 return false;
4028 }
4029 }
4030 return true;
4031}
4032
4033/* This is the most important function of all . Innocuosly named
4034 though ! */
4035static bool
4036elfNN_kvx_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
d530ba0a 4037 struct bfd_link_info *info)
6e712424
PI
4038{
4039 struct elf_kvx_link_hash_table *htab;
4040 bfd *dynobj;
4041 asection *s;
4042 bool relocs;
4043 bfd *ibfd;
4044
4045 htab = elf_kvx_hash_table ((info));
4046 dynobj = htab->root.dynobj;
4047
4048 BFD_ASSERT (dynobj != NULL);
4049
4050 if (htab->root.dynamic_sections_created)
4051 {
4052 if (bfd_link_executable (info) && !info->nointerp)
4053 {
4054 s = bfd_get_linker_section (dynobj, ".interp");
4055 if (s == NULL)
4056 abort ();
4057 s->size = sizeof ELF_DYNAMIC_INTERPRETER;
4058 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
4059 }
4060 }
4061
4062 /* Set up .got offsets for local syms, and space for local dynamic
4063 relocs. */
4064 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
4065 {
4066 struct elf_kvx_local_symbol *locals = NULL;
4067 Elf_Internal_Shdr *symtab_hdr;
4068 asection *srel;
4069 unsigned int i;
4070
4071 if (!is_kvx_elf (ibfd))
4072 continue;
4073
4074 for (s = ibfd->sections; s != NULL; s = s->next)
4075 {
4076 struct elf_dyn_relocs *p;
4077
4078 for (p = (struct elf_dyn_relocs *)
d530ba0a 4079 (elf_section_data (s)->local_dynrel); p != NULL; p = p->next)
6e712424
PI
4080 {
4081 if (!bfd_is_abs_section (p->sec)
4082 && bfd_is_abs_section (p->sec->output_section))
4083 {
4084 /* Input section has been discarded, either because
4085 it is a copy of a linkonce section or due to
4086 linker script /DISCARD/, so we'll be discarding
4087 the relocs too. */
4088 }
4089 else if (p->count != 0)
4090 {
4091 srel = elf_section_data (p->sec)->sreloc;
4092 srel->size += p->count * RELOC_SIZE (htab);
4093 if ((p->sec->output_section->flags & SEC_READONLY) != 0)
4094 info->flags |= DF_TEXTREL;
4095 }
4096 }
4097 }
4098
4099 locals = elf_kvx_locals (ibfd);
4100 if (!locals)
4101 continue;
4102
4103 symtab_hdr = &elf_symtab_hdr (ibfd);
4104 srel = htab->root.srelgot;
4105 for (i = 0; i < symtab_hdr->sh_info; i++)
4106 {
4107 locals[i].got_offset = (bfd_vma) - 1;
4108 if (locals[i].got_refcount > 0)
4109 {
4110 unsigned got_type = locals[i].got_type;
4111 if (got_type & (GOT_TLS_GD | GOT_TLS_LD))
d530ba0a
AM
4112 {
4113 locals[i].got_offset = htab->root.sgot->size;
4114 htab->root.sgot->size += GOT_ENTRY_SIZE * 2;
4115 }
6e712424
PI
4116
4117 if (got_type & (GOT_NORMAL | GOT_TLS_IE ))
4118 {
4119 locals[i].got_offset = htab->root.sgot->size;
4120 htab->root.sgot->size += GOT_ENTRY_SIZE;
4121 }
4122
4123 if (got_type == GOT_UNKNOWN)
4124 {
4125 }
4126
4127 if (bfd_link_pic (info))
4128 {
4129 if (got_type & GOT_TLS_GD)
4130 htab->root.srelgot->size += RELOC_SIZE (htab) * 2;
4131
4132 if (got_type & GOT_TLS_IE
4133 || got_type & GOT_TLS_LD
4134 || got_type & GOT_NORMAL)
4135 htab->root.srelgot->size += RELOC_SIZE (htab);
4136 }
4137 }
4138 else
4139 {
4140 locals[i].got_refcount = (bfd_vma) - 1;
4141 }
4142 }
4143 }
4144
4145
4146 /* Allocate global sym .plt and .got entries, and space for global
4147 sym dynamic relocs. */
4148 elf_link_hash_traverse (&htab->root, elfNN_kvx_allocate_dynrelocs,
4149 info);
4150
4151 /* For every jump slot reserved in the sgotplt, reloc_count is
4152 incremented. However, when we reserve space for TLS descriptors,
4153 it's not incremented, so in order to compute the space reserved
4154 for them, it suffices to multiply the reloc count by the jump
4155 slot size. */
4156
4157 if (htab->root.srelplt)
4158 htab->sgotplt_jump_table_size = kvx_compute_jump_table_size (htab);
4159
4160 /* We now have determined the sizes of the various dynamic sections.
4161 Allocate memory for them. */
4162 relocs = false;
4163 for (s = dynobj->sections; s != NULL; s = s->next)
4164 {
4165 if ((s->flags & SEC_LINKER_CREATED) == 0)
4166 continue;
4167
4168 if (s == htab->root.splt
4169 || s == htab->root.sgot
4170 || s == htab->root.sgotplt
4171 || s == htab->root.iplt
4172 || s == htab->root.igotplt || s == htab->sdynbss)
4173 {
4174 /* Strip this section if we don't need it; see the
4175 comment below. */
4176 }
4177 else if (startswith (bfd_section_name (s), ".rela"))
4178 {
4179 if (s->size != 0 && s != htab->root.srelplt)
4180 relocs = true;
4181
4182 /* We use the reloc_count field as a counter if we need
4183 to copy relocs into the output file. */
4184 if (s != htab->root.srelplt)
4185 s->reloc_count = 0;
4186 }
4187 else
4188 {
4189 /* It's not one of our sections, so don't allocate space. */
4190 continue;
4191 }
4192
4193 if (s->size == 0)
4194 {
4195 /* If we don't need this section, strip it from the
4196 output file. This is mostly to handle .rela.bss and
4197 .rela.plt. We must create both sections in
4198 create_dynamic_sections, because they must be created
4199 before the linker maps input sections to output
4200 sections. The linker does that before
4201 adjust_dynamic_symbol is called, and it is that
4202 function which decides whether anything needs to go
4203 into these sections. */
4204
4205 s->flags |= SEC_EXCLUDE;
4206 continue;
4207 }
4208
4209 if ((s->flags & SEC_HAS_CONTENTS) == 0)
4210 continue;
4211
4212 /* Allocate memory for the section contents. We use bfd_zalloc
d530ba0a
AM
4213 here in case unused entries are not reclaimed before the
4214 section's contents are written out. This should not happen,
4215 but this way if it does, we get a R_KVX_NONE reloc instead
4216 of garbage. */
6e712424
PI
4217 s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
4218 if (s->contents == NULL)
4219 return false;
4220 }
4221
4222 if (htab->root.dynamic_sections_created)
4223 {
4224 /* Add some entries to the .dynamic section. We fill in the
d530ba0a
AM
4225 values later, in elfNN_kvx_finish_dynamic_sections, but we
4226 must add the entries now so that we get the correct size for
4227 the .dynamic section. The DT_DEBUG entry is filled in by the
4228 dynamic linker and used by the debugger. */
6e712424
PI
4229#define add_dynamic_entry(TAG, VAL) \
4230 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
4231
4232 if (bfd_link_executable (info))
4233 {
4234 if (!add_dynamic_entry (DT_DEBUG, 0))
4235 return false;
4236 }
4237
4238 if (htab->root.splt->size != 0)
4239 {
4240 if (!add_dynamic_entry (DT_PLTGOT, 0)
4241 || !add_dynamic_entry (DT_PLTRELSZ, 0)
4242 || !add_dynamic_entry (DT_PLTREL, DT_RELA)
4243 || !add_dynamic_entry (DT_JMPREL, 0))
4244 return false;
4245 }
4246
4247 if (relocs)
4248 {
4249 if (!add_dynamic_entry (DT_RELA, 0)
4250 || !add_dynamic_entry (DT_RELASZ, 0)
4251 || !add_dynamic_entry (DT_RELAENT, RELOC_SIZE (htab)))
4252 return false;
4253
4254 /* If any dynamic relocs apply to a read-only section,
4255 then we need a DT_TEXTREL entry. */
4256 if ((info->flags & DF_TEXTREL) == 0)
4257 elf_link_hash_traverse (&htab->root, kvx_readonly_dynrelocs,
4258 info);
4259
4260 if ((info->flags & DF_TEXTREL) != 0)
4261 {
4262 if (!add_dynamic_entry (DT_TEXTREL, 0))
4263 return false;
4264 }
4265 }
4266 }
4267#undef add_dynamic_entry
4268
4269 return true;
4270}
4271
4272static inline void
4273elf_kvx_update_plt_entry (bfd *output_bfd,
d530ba0a
AM
4274 bfd_reloc_code_real_type r_type,
4275 bfd_byte *plt_entry, bfd_vma value)
6e712424
PI
4276{
4277 reloc_howto_type *howto = elfNN_kvx_howto_from_bfd_reloc (r_type);
4278 BFD_ASSERT(howto != NULL);
4279 _bfd_kvx_elf_put_addend (output_bfd, plt_entry, r_type, howto, value);
4280}
4281
4282static void
4283elfNN_kvx_create_small_pltn_entry (struct elf_link_hash_entry *h,
d530ba0a
AM
4284 struct elf_kvx_link_hash_table *htab,
4285 bfd *output_bfd)
6e712424
PI
4286{
4287 bfd_byte *plt_entry;
4288 bfd_vma plt_index;
4289 bfd_vma got_offset;
4290 bfd_vma gotplt_entry_address;
4291 bfd_vma plt_entry_address;
4292 Elf_Internal_Rela rela;
4293 bfd_byte *loc;
4294 asection *plt, *gotplt, *relplt;
4295
4296 plt = htab->root.splt;
4297 gotplt = htab->root.sgotplt;
4298 relplt = htab->root.srelplt;
4299
4300 /* Get the index in the procedure linkage table which
4301 corresponds to this symbol. This is the index of this symbol
4302 in all the symbols for which we are making plt entries. The
4303 first entry in the procedure linkage table is reserved.
4304
4305 Get the offset into the .got table of the entry that
4306 corresponds to this function. Each .got entry is GOT_ENTRY_SIZE
4307 bytes. The first three are reserved for the dynamic linker.
4308
4309 For static executables, we don't reserve anything. */
4310
4311 if (plt == htab->root.splt)
4312 {
4313 plt_index = (h->plt.offset - htab->plt_header_size) / htab->plt_entry_size;
4314 got_offset = (plt_index + 3) * GOT_ENTRY_SIZE;
4315 }
4316 else
4317 {
4318 plt_index = h->plt.offset / htab->plt_entry_size;
4319 got_offset = plt_index * GOT_ENTRY_SIZE;
4320 }
4321
4322 plt_entry = plt->contents + h->plt.offset;
4323 plt_entry_address = plt->output_section->vma
4324 + plt->output_offset + h->plt.offset;
4325 gotplt_entry_address = gotplt->output_section->vma +
4326 gotplt->output_offset + got_offset;
4327
4328 /* Copy in the boiler-plate for the PLTn entry. */
4329 memcpy (plt_entry, elfNN_kvx_small_plt_entry, PLT_SMALL_ENTRY_SIZE);
4330
4331 /* Patch the loading of the GOT entry, relative to the PLT entry
d530ba0a 4332 address. */
6e712424 4333
d530ba0a
AM
4334 /* Use 37bits offset for both 32 and 64bits mode.
4335 Fill the LO10 of of lw $r9 = 0[$r14]. */
6e712424 4336 elf_kvx_update_plt_entry(output_bfd, BFD_RELOC_KVX_S37_LO10,
d530ba0a
AM
4337 plt_entry+4,
4338 gotplt_entry_address - plt_entry_address);
6e712424 4339
d530ba0a 4340 /* Fill the UP27 of of lw $r9 = 0[$r14]. */
6e712424 4341 elf_kvx_update_plt_entry(output_bfd, BFD_RELOC_KVX_S37_UP27,
d530ba0a
AM
4342 plt_entry+8,
4343 gotplt_entry_address - plt_entry_address);
6e712424
PI
4344
4345 rela.r_offset = gotplt_entry_address;
4346
4347 /* Fill in the entry in the .rela.plt section. */
4348 rela.r_info = ELFNN_R_INFO (h->dynindx, R_KVX_JMP_SLOT);
4349 rela.r_addend = 0;
4350
4351 /* Compute the relocation entry to used based on PLT index and do
4352 not adjust reloc_count. The reloc_count has already been adjusted
4353 to account for this entry. */
4354 loc = relplt->contents + plt_index * RELOC_SIZE (htab);
4355 bfd_elfNN_swap_reloca_out (output_bfd, &rela, loc);
4356}
4357
4358/* Size sections even though they're not dynamic. We use it to setup
4359 _TLS_MODULE_BASE_, if needed. */
4360
4361static bool
4362elfNN_kvx_always_size_sections (bfd *output_bfd,
d530ba0a 4363 struct bfd_link_info *info)
6e712424
PI
4364{
4365 asection *tls_sec;
4366
4367 if (bfd_link_relocatable (info))
4368 return true;
4369
4370 tls_sec = elf_hash_table (info)->tls_sec;
4371
4372 if (tls_sec)
4373 {
4374 struct elf_link_hash_entry *tlsbase;
4375
4376 tlsbase = elf_link_hash_lookup (elf_hash_table (info),
4377 "_TLS_MODULE_BASE_", true, true, false);
4378
4379 if (tlsbase)
4380 {
4381 struct bfd_link_hash_entry *h = NULL;
4382 const struct elf_backend_data *bed =
4383 get_elf_backend_data (output_bfd);
4384
4385 if (!(_bfd_generic_link_add_one_symbol
4386 (info, output_bfd, "_TLS_MODULE_BASE_", BSF_LOCAL,
4387 tls_sec, 0, NULL, false, bed->collect, &h)))
4388 return false;
4389
4390 tlsbase->type = STT_TLS;
4391 tlsbase = (struct elf_link_hash_entry *) h;
4392 tlsbase->def_regular = 1;
4393 tlsbase->other = STV_HIDDEN;
4394 (*bed->elf_backend_hide_symbol) (info, tlsbase, true);
4395 }
4396 }
4397
4398 return true;
4399}
4400
4401/* Finish up dynamic symbol handling. We set the contents of various
4402 dynamic sections here. */
4403static bool
4404elfNN_kvx_finish_dynamic_symbol (bfd *output_bfd,
d530ba0a
AM
4405 struct bfd_link_info *info,
4406 struct elf_link_hash_entry *h,
4407 Elf_Internal_Sym *sym)
6e712424
PI
4408{
4409 struct elf_kvx_link_hash_table *htab;
4410 htab = elf_kvx_hash_table (info);
4411
4412 if (h->plt.offset != (bfd_vma) - 1)
4413 {
4414 asection *plt = NULL, *gotplt = NULL, *relplt = NULL;
4415
4416 /* This symbol has an entry in the procedure linkage table. Set
d530ba0a 4417 it up. */
6e712424
PI
4418
4419 if (htab->root.splt != NULL)
4420 {
4421 plt = htab->root.splt;
4422 gotplt = htab->root.sgotplt;
4423 relplt = htab->root.srelplt;
4424 }
4425
4426 /* This symbol has an entry in the procedure linkage table. Set
4427 it up. */
4428 if ((h->dynindx == -1
4429 && !((h->forced_local || bfd_link_executable (info))
4430 && h->def_regular
4431 && h->type == STT_GNU_IFUNC))
4432 || plt == NULL
4433 || gotplt == NULL
4434 || relplt == NULL)
4435 abort ();
4436
4437 elfNN_kvx_create_small_pltn_entry (h, htab, output_bfd);
4438 if (!h->def_regular)
4439 {
4440 /* Mark the symbol as undefined, rather than as defined in
4441 the .plt section. */
4442 sym->st_shndx = SHN_UNDEF;
4443 /* If the symbol is weak we need to clear the value.
4444 Otherwise, the PLT entry would provide a definition for
4445 the symbol even if the symbol wasn't defined anywhere,
4446 and so the symbol would never be NULL. Leave the value if
4447 there were any relocations where pointer equality matters
4448 (this is a clue for the dynamic linker, to make function
4449 pointer comparisons work between an application and shared
4450 library). */
4451 if (!h->ref_regular_nonweak || !h->pointer_equality_needed)
4452 sym->st_value = 0;
4453 }
4454 }
4455
4456 if (h->got.offset != (bfd_vma) - 1
4457 && elf_kvx_hash_entry (h)->got_type == GOT_NORMAL)
4458 {
4459 Elf_Internal_Rela rela;
4460 bfd_byte *loc;
4461
4462 /* This symbol has an entry in the global offset table. Set it
d530ba0a 4463 up. */
6e712424
PI
4464 if (htab->root.sgot == NULL || htab->root.srelgot == NULL)
4465 abort ();
4466
4467 rela.r_offset = (htab->root.sgot->output_section->vma
4468 + htab->root.sgot->output_offset
4469 + (h->got.offset & ~(bfd_vma) 1));
4470
4471#ifdef UGLY_DEBUG
4472 printf("setting rela at offset 0x%x(0x%x + 0x%x + 0x%x) for %s\n",
4473 rela.r_offset,
4474 htab->root.sgot->output_section->vma,
4475 htab->root.sgot->output_offset,
4476 h->got.offset,
4477 h->root.root.string);
4478#endif
4479
d530ba0a 4480 if (bfd_link_pic (info) && SYMBOL_REFERENCES_LOCAL (info, h))
6e712424
PI
4481 {
4482 if (!h->def_regular)
4483 return false;
4484
4485 /* in case of PLT related GOT entry, it is not clear who is
4486 supposed to set the LSB of GOT entry...
4487 kvx_calculate_got_entry_vma() would be a good candidate,
4488 but it is not called currently
d530ba0a 4489 So we are commenting it ATM. */
6e712424
PI
4490 // BFD_ASSERT ((h->got.offset & 1) != 0);
4491 rela.r_info = ELFNN_R_INFO (0, R_KVX_RELATIVE);
4492 rela.r_addend = (h->root.u.def.value
4493 + h->root.u.def.section->output_section->vma
4494 + h->root.u.def.section->output_offset);
4495 }
4496 else
4497 {
4498 BFD_ASSERT ((h->got.offset & 1) == 0);
4499 bfd_put_NN (output_bfd, (bfd_vma) 0,
4500 htab->root.sgot->contents + h->got.offset);
4501 rela.r_info = ELFNN_R_INFO (h->dynindx, R_KVX_GLOB_DAT);
4502 rela.r_addend = 0;
4503 }
4504
4505 loc = htab->root.srelgot->contents;
4506 loc += htab->root.srelgot->reloc_count++ * RELOC_SIZE (htab);
4507 bfd_elfNN_swap_reloca_out (output_bfd, &rela, loc);
4508 }
4509
4510 if (h->needs_copy)
4511 {
4512 Elf_Internal_Rela rela;
4513 bfd_byte *loc;
4514
4515 /* This symbol needs a copy reloc. Set it up. */
4516
4517 if (h->dynindx == -1
4518 || (h->root.type != bfd_link_hash_defined
4519 && h->root.type != bfd_link_hash_defweak)
4520 || htab->srelbss == NULL)
4521 abort ();
4522
4523 rela.r_offset = (h->root.u.def.value
4524 + h->root.u.def.section->output_section->vma
4525 + h->root.u.def.section->output_offset);
4526 rela.r_info = ELFNN_R_INFO (h->dynindx, R_KVX_COPY);
4527 rela.r_addend = 0;
4528 loc = htab->srelbss->contents;
4529 loc += htab->srelbss->reloc_count++ * RELOC_SIZE (htab);
4530 bfd_elfNN_swap_reloca_out (output_bfd, &rela, loc);
4531 }
4532
4533 /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute. SYM may
4534 be NULL for local symbols. */
4535 if (sym != NULL
4536 && (h == elf_hash_table (info)->hdynamic
4537 || h == elf_hash_table (info)->hgot))
4538 sym->st_shndx = SHN_ABS;
4539
4540 return true;
4541}
4542
4543static void
4544elfNN_kvx_init_small_plt0_entry (bfd *output_bfd ATTRIBUTE_UNUSED,
d530ba0a 4545 struct elf_kvx_link_hash_table *htab)
6e712424
PI
4546{
4547 memcpy (htab->root.splt->contents, elfNN_kvx_small_plt0_entry,
4548 PLT_ENTRY_SIZE);
4549 elf_section_data (htab->root.splt->output_section)->this_hdr.sh_entsize =
4550 PLT_ENTRY_SIZE;
4551}
4552
4553static bool
4554elfNN_kvx_finish_dynamic_sections (bfd *output_bfd,
d530ba0a 4555 struct bfd_link_info *info)
6e712424
PI
4556{
4557 struct elf_kvx_link_hash_table *htab;
4558 bfd *dynobj;
4559 asection *sdyn;
4560
4561 htab = elf_kvx_hash_table (info);
4562 dynobj = htab->root.dynobj;
4563 sdyn = bfd_get_linker_section (dynobj, ".dynamic");
4564
4565 if (htab->root.dynamic_sections_created)
4566 {
4567 ElfNN_External_Dyn *dyncon, *dynconend;
4568
4569 if (sdyn == NULL || htab->root.sgot == NULL)
4570 abort ();
4571
4572 dyncon = (ElfNN_External_Dyn *) sdyn->contents;
4573 dynconend = (ElfNN_External_Dyn *) (sdyn->contents + sdyn->size);
4574 for (; dyncon < dynconend; dyncon++)
4575 {
4576 Elf_Internal_Dyn dyn;
4577 asection *s;
4578
4579 bfd_elfNN_swap_dyn_in (dynobj, dyncon, &dyn);
4580
4581 switch (dyn.d_tag)
4582 {
4583 default:
4584 continue;
4585
4586 case DT_PLTGOT:
4587 s = htab->root.sgotplt;
4588 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
4589 break;
4590
4591 case DT_JMPREL:
fb9b7fbf
AM
4592 s = htab->root.srelplt;
4593 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
6e712424
PI
4594 break;
4595
4596 case DT_PLTRELSZ:
4597 s = htab->root.srelplt;
4598 dyn.d_un.d_val = s->size;
4599 break;
4600
4601 case DT_RELASZ:
4602 /* The procedure linkage table relocs (DT_JMPREL) should
4603 not be included in the overall relocs (DT_RELA).
4604 Therefore, we override the DT_RELASZ entry here to
4605 make it not include the JMPREL relocs. Since the
4606 linker script arranges for .rela.plt to follow all
4607 other relocation sections, we don't have to worry
4608 about changing the DT_RELA entry. */
4609 if (htab->root.srelplt != NULL)
4610 {
4611 s = htab->root.srelplt;
4612 dyn.d_un.d_val -= s->size;
4613 }
4614 break;
4615 }
4616
4617 bfd_elfNN_swap_dyn_out (output_bfd, &dyn, dyncon);
4618 }
4619
4620 }
4621
4622 /* Fill in the special first entry in the procedure linkage table. */
4623 if (htab->root.splt && htab->root.splt->size > 0)
4624 {
4625 elfNN_kvx_init_small_plt0_entry (output_bfd, htab);
4626
4627 elf_section_data (htab->root.splt->output_section)->
4628 this_hdr.sh_entsize = htab->plt_entry_size;
4629 }
4630
4631 if (htab->root.sgotplt)
4632 {
4633 if (bfd_is_abs_section (htab->root.sgotplt->output_section))
4634 {
4635 (*_bfd_error_handler)
4636 (_("discarded output section: `%pA'"), htab->root.sgotplt);
4637 return false;
4638 }
4639
4640 /* Fill in the first three entries in the global offset table. */
4641 if (htab->root.sgotplt->size > 0)
4642 {
4643 bfd_put_NN (output_bfd, (bfd_vma) 0, htab->root.sgotplt->contents);
4644
4645 /* Write GOT[1] and GOT[2], needed for the dynamic linker. */
4646 bfd_put_NN (output_bfd,
4647 (bfd_vma) 0,
4648 htab->root.sgotplt->contents + GOT_ENTRY_SIZE);
4649 bfd_put_NN (output_bfd,
4650 (bfd_vma) 0,
4651 htab->root.sgotplt->contents + GOT_ENTRY_SIZE * 2);
4652 }
4653
4654 if (htab->root.sgot)
4655 {
4656 if (htab->root.sgot->size > 0)
4657 {
4658 bfd_vma addr =
4659 sdyn ? sdyn->output_section->vma + sdyn->output_offset : 0;
4660 bfd_put_NN (output_bfd, addr, htab->root.sgot->contents);
4661 }
4662 }
4663
4664 elf_section_data (htab->root.sgotplt->output_section)->
4665 this_hdr.sh_entsize = GOT_ENTRY_SIZE;
4666 }
4667
4668 if (htab->root.sgot && htab->root.sgot->size > 0)
4669 elf_section_data (htab->root.sgot->output_section)->this_hdr.sh_entsize
4670 = GOT_ENTRY_SIZE;
4671
4672 return true;
4673}
4674
4675/* Return address for Ith PLT stub in section PLT, for relocation REL
4676 or (bfd_vma) -1 if it should not be included. */
4677
4678static bfd_vma
4679elfNN_kvx_plt_sym_val (bfd_vma i, const asection *plt,
d530ba0a 4680 const arelent *rel ATTRIBUTE_UNUSED)
6e712424
PI
4681{
4682 return plt->vma + PLT_ENTRY_SIZE + i * PLT_SMALL_ENTRY_SIZE;
4683}
4684
4685#define ELF_ARCH bfd_arch_kvx
4686#define ELF_MACHINE_CODE EM_KVX
4687#define ELF_MAXPAGESIZE 0x10000
4688#define ELF_MINPAGESIZE 0x1000
4689#define ELF_COMMONPAGESIZE 0x1000
4690
4691#define bfd_elfNN_bfd_link_hash_table_create \
4692 elfNN_kvx_link_hash_table_create
4693
4694#define bfd_elfNN_bfd_merge_private_bfd_data \
4695 elfNN_kvx_merge_private_bfd_data
4696
4697#define bfd_elfNN_bfd_print_private_bfd_data \
4698 elfNN_kvx_print_private_bfd_data
4699
4700#define bfd_elfNN_bfd_reloc_type_lookup \
4701 elfNN_kvx_reloc_type_lookup
4702
4703#define bfd_elfNN_bfd_reloc_name_lookup \
4704 elfNN_kvx_reloc_name_lookup
4705
4706#define bfd_elfNN_bfd_set_private_flags \
4707 elfNN_kvx_set_private_flags
4708
4709#define bfd_elfNN_mkobject \
4710 elfNN_kvx_mkobject
4711
4712#define bfd_elfNN_new_section_hook \
4713 elfNN_kvx_new_section_hook
4714
4715#define elf_backend_adjust_dynamic_symbol \
4716 elfNN_kvx_adjust_dynamic_symbol
4717
4718#define elf_backend_always_size_sections \
4719 elfNN_kvx_always_size_sections
4720
4721#define elf_backend_check_relocs \
4722 elfNN_kvx_check_relocs
4723
4724#define elf_backend_copy_indirect_symbol \
4725 elfNN_kvx_copy_indirect_symbol
4726
4727/* Create .dynbss, and .rela.bss sections in DYNOBJ, and set up shortcuts
4728 to them in our hash. */
4729#define elf_backend_create_dynamic_sections \
4730 elfNN_kvx_create_dynamic_sections
4731
4732#define elf_backend_init_index_section \
4733 _bfd_elf_init_2_index_sections
4734
4735#define elf_backend_finish_dynamic_sections \
4736 elfNN_kvx_finish_dynamic_sections
4737
4738#define elf_backend_finish_dynamic_symbol \
4739 elfNN_kvx_finish_dynamic_symbol
4740
4741#define elf_backend_object_p \
4742 elfNN_kvx_object_p
4743
4744#define elf_backend_output_arch_local_syms \
4745 elfNN_kvx_output_arch_local_syms
4746
4747#define elf_backend_plt_sym_val \
4748 elfNN_kvx_plt_sym_val
4749
4750#define elf_backend_init_file_header \
4751 elfNN_kvx_init_file_header
4752
4753#define elf_backend_init_process_headers \
4754 elfNN_kvx_init_process_headers
4755
4756#define elf_backend_relocate_section \
4757 elfNN_kvx_relocate_section
4758
4759#define elf_backend_reloc_type_class \
4760 elfNN_kvx_reloc_type_class
4761
4762#define elf_backend_size_dynamic_sections \
4763 elfNN_kvx_size_dynamic_sections
4764
4765#define elf_backend_can_refcount 1
4766#define elf_backend_can_gc_sections 1
4767#define elf_backend_plt_readonly 1
4768#define elf_backend_want_got_plt 1
4769#define elf_backend_want_plt_sym 0
4770#define elf_backend_may_use_rel_p 0
4771#define elf_backend_may_use_rela_p 1
4772#define elf_backend_default_use_rela_p 1
4773#define elf_backend_rela_normal 1
4774#define elf_backend_got_header_size (GOT_ENTRY_SIZE * 3)
4775#define elf_backend_default_execstack 0
4776#define elf_backend_extern_protected_data 1
4777#define elf_backend_hash_symbol elf_kvx_hash_symbol
4778
4779#include "elfNN-target.h"