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