]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - bfd/elf32-arc.c
ld: Add -z separate-code tests to frame.exp
[thirdparty/binutils-gdb.git] / bfd / elf32-arc.c
CommitLineData
252b5132 1/* ARC-specific support for 32-bit ELF
219d1afa 2 Copyright (C) 1994-2018 Free Software Foundation, Inc.
886a2506 3 Contributed by Cupertino Miranda (cmiranda@synopsys.com).
252b5132 4
0d2bcfaf 5 This file is part of BFD, the Binary File Descriptor library.
252b5132 6
0d2bcfaf
NC
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
cd123cb7 9 the Free Software Foundation; either version 3 of the License, or
0d2bcfaf 10 (at your option) any later version.
252b5132 11
0d2bcfaf
NC
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
252b5132 16
0d2bcfaf
NC
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
47b0e7ad
NC
19 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20 MA 02110-1301, USA. */
252b5132 21
252b5132 22#include "sysdep.h"
3db64b00 23#include "bfd.h"
252b5132
RH
24#include "libbfd.h"
25#include "elf-bfd.h"
26#include "elf/arc.h"
ea04a8f6 27#include "libiberty.h"
886a2506 28#include "opcode/arc-func.h"
4b0c052e 29#include "opcode/arc.h"
34e967a5 30#include "arc-plt.h"
886a2506 31
53a346d8
CZ
32#define FEATURE_LIST_NAME bfd_feature_list
33#define CONFLICT_LIST bfd_conflict_list
34#include "opcode/arc-attrs.h"
35
08759e0f 36/* #define ARC_ENABLE_DEBUG 1 */
f7e8b360
NC
37#ifdef ARC_ENABLE_DEBUG
38static const char *
34e967a5
MC
39name_for_global_symbol (struct elf_link_hash_entry *h)
40{
41 static char *local_str = "(local)";
42 if (h == NULL)
43 return local_str;
f7e8b360 44 return h->root.root.string;
34e967a5 45}
f7e8b360
NC
46#define ARC_DEBUG(fmt, args...) fprintf (stderr, fmt, ##args)
47#else
48#define ARC_DEBUG(...)
34e967a5
MC
49#endif
50
51
52#define ADD_RELA(BFD, SECTION, OFFSET, SYM_IDX, TYPE, ADDEND) \
53 { \
54 struct elf_link_hash_table *_htab = elf_hash_table (info); \
55 Elf_Internal_Rela _rel; \
23a42089 56 bfd_byte * _loc; \
34e967a5 57 \
be9e3704
CM
58 if (_htab->dynamic_sections_created == TRUE) \
59 { \
60 BFD_ASSERT (_htab->srel##SECTION &&_htab->srel##SECTION->contents); \
07d6d2b8
AM
61 _loc = _htab->srel##SECTION->contents \
62 + ((_htab->srel##SECTION->reloc_count) \
63 * sizeof (Elf32_External_Rela)); \
64 _htab->srel##SECTION->reloc_count++; \
65 _rel.r_addend = ADDEND; \
66 _rel.r_offset = (_htab->s##SECTION)->output_section->vma \
67 + (_htab->s##SECTION)->output_offset + OFFSET; \
68 BFD_ASSERT ((long) SYM_IDX != -1); \
69 _rel.r_info = ELF32_R_INFO (SYM_IDX, TYPE); \
70 bfd_elf32_swap_reloca_out (BFD, &_rel, _loc); \
be9e3704 71 } \
34e967a5 72 }
886a2506 73
34e967a5 74
886a2506
NC
75/* The default symbols representing the init and fini dyn values.
76 TODO: Check what is the relation of those strings with arclinux.em
77 and DT_INIT. */
78#define INIT_SYM_STRING "_init"
79#define FINI_SYM_STRING "_fini"
80
81char * init_str = INIT_SYM_STRING;
82char * fini_str = FINI_SYM_STRING;
83
886a2506
NC
84#define ARC_RELOC_HOWTO(TYPE, VALUE, SIZE, BITSIZE, RELOC_FUNCTION, OVERFLOW, FORMULA) \
85 case VALUE: \
b05a65d0 86 return "R_" #TYPE; \
886a2506
NC
87 break;
88
89static ATTRIBUTE_UNUSED const char *
90reloc_type_to_name (unsigned int type)
91{
92 switch (type)
93 {
94 #include "elf/arc-reloc.def"
95
96 default:
97 return "UNKNOWN";
98 break;
99 }
100}
68d20676 101
886a2506 102#undef ARC_RELOC_HOWTO
252b5132 103
252b5132
RH
104/* Try to minimize the amount of space occupied by relocation tables
105 on the ROM (not that the ROM won't be swamped by other ELF overhead). */
0d2bcfaf 106
886a2506
NC
107#define USE_REL 1
108
109static ATTRIBUTE_UNUSED bfd_boolean
110is_reloc_PC_relative (reloc_howto_type *howto)
111{
112 return (strstr (howto->name, "PC") != NULL) ? TRUE : FALSE;
113}
114
115static bfd_boolean
116is_reloc_SDA_relative (reloc_howto_type *howto)
117{
118 return (strstr (howto->name, "SDA") != NULL) ? TRUE : FALSE;
119}
120
121static bfd_boolean
122is_reloc_for_GOT (reloc_howto_type * howto)
123{
34e967a5
MC
124 if (strstr (howto->name, "TLS") != NULL)
125 return FALSE;
886a2506
NC
126 return (strstr (howto->name, "GOT") != NULL) ? TRUE : FALSE;
127}
128
129static bfd_boolean
130is_reloc_for_PLT (reloc_howto_type * howto)
131{
132 return (strstr (howto->name, "PLT") != NULL) ? TRUE : FALSE;
133}
134
34e967a5
MC
135static bfd_boolean
136is_reloc_for_TLS (reloc_howto_type *howto)
137{
138 return (strstr (howto->name, "TLS") != NULL) ? TRUE : FALSE;
139}
140
08759e0f
CM
141struct arc_relocation_data
142{
143 bfd_signed_vma reloc_offset;
144 bfd_signed_vma reloc_addend;
145 bfd_signed_vma got_offset_value;
146
147 bfd_signed_vma sym_value;
148 asection * sym_section;
149
150 reloc_howto_type *howto;
151
152 asection * input_section;
153
154 bfd_signed_vma sdata_begin_symbol_vma;
155 bfd_boolean sdata_begin_symbol_vma_set;
156 bfd_signed_vma got_symbol_vma;
157
158 bfd_boolean should_relocate;
159
160 const char * symbol_name;
161};
162
163/* Should be included at this location due to static declarations
68d20676 164 defined before this point. */
08759e0f
CM
165#include "arc-got.h"
166
886a2506
NC
167#define arc_bfd_get_8(A,B,C) bfd_get_8(A,B)
168#define arc_bfd_get_16(A,B,C) bfd_get_16(A,B)
72f3b6aa 169#define arc_bfd_get_32(A,B,C) bfd_get_32(A,B)
886a2506
NC
170#define arc_bfd_put_8(A,B,C,D) bfd_put_8(A,B,C)
171#define arc_bfd_put_16(A,B,C,D) bfd_put_16(A,B,C)
72f3b6aa 172#define arc_bfd_put_32(A,B,C,D) bfd_put_32(A,B,C)
886a2506 173
252b5132 174
47b0e7ad 175static bfd_reloc_status_type
886a2506
NC
176arc_elf_reloc (bfd *abfd ATTRIBUTE_UNUSED,
177 arelent *reloc_entry,
178 asymbol *symbol_in,
179 void *data ATTRIBUTE_UNUSED,
180 asection *input_section,
181 bfd *output_bfd,
182 char ** error_message ATTRIBUTE_UNUSED)
183{
184 if (output_bfd != NULL)
185 {
186 reloc_entry->address += input_section->output_offset;
187
188 /* In case of relocateable link and if the reloc is against a
189 section symbol, the addend needs to be adjusted according to
190 where the section symbol winds up in the output section. */
191 if ((symbol_in->flags & BSF_SECTION_SYM) && symbol_in->section)
192 reloc_entry->addend += symbol_in->section->output_offset;
193
194 return bfd_reloc_ok;
195 }
196
197 return bfd_reloc_continue;
198}
199
200
201#define ARC_RELOC_HOWTO(TYPE, VALUE, SIZE, BITSIZE, RELOC_FUNCTION, OVERFLOW, FORMULA) \
202 TYPE = VALUE,
68d20676 203
886a2506
NC
204enum howto_list
205{
206#include "elf/arc-reloc.def"
207 HOWTO_LIST_LAST
208};
68d20676 209
886a2506
NC
210#undef ARC_RELOC_HOWTO
211
212#define ARC_RELOC_HOWTO(TYPE, VALUE, RSIZE, BITSIZE, RELOC_FUNCTION, OVERFLOW, FORMULA) \
f7e8b360
NC
213 [TYPE] = HOWTO (R_##TYPE, 0, RSIZE, BITSIZE, FALSE, 0, \
214 complain_overflow_##OVERFLOW, arc_elf_reloc, \
215 "R_" #TYPE, FALSE, 0, 0, FALSE),
886a2506
NC
216
217static struct reloc_howto_struct elf_arc_howto_table[] =
218{
219#include "elf/arc-reloc.def"
34e967a5
MC
220/* Example of what is generated by the preprocessor. Currently kept as an
221 example.
886a2506
NC
222 HOWTO (R_ARC_NONE, // Type.
223 0, // Rightshift.
224 2, // Size (0 = byte, 1 = short, 2 = long).
225 32, // Bitsize.
226 FALSE, // PC_relative.
227 0, // Bitpos.
228 complain_overflow_bitfield, // Complain_on_overflow.
229 bfd_elf_generic_reloc, // Special_function.
230 "R_ARC_NONE", // Name.
231 TRUE, // Partial_inplace.
232 0, // Src_mask.
233 0, // Dst_mask.
234 FALSE), // PCrel_offset.
235*/
236};
237#undef ARC_RELOC_HOWTO
238
68d20676
NC
239static void
240arc_elf_howto_init (void)
886a2506
NC
241{
242#define ARC_RELOC_HOWTO(TYPE, VALUE, SIZE, BITSIZE, RELOC_FUNCTION, OVERFLOW, FORMULA) \
68d20676 243 elf_arc_howto_table[TYPE].pc_relative = \
0a5ff21b 244 (strstr (#FORMULA, " P ") != NULL || strstr (#FORMULA, " PDATA ") != NULL); \
68d20676
NC
245 elf_arc_howto_table[TYPE].dst_mask = RELOC_FUNCTION(0, ~0); \
246 /* Only 32 bit data relocations should be marked as ME. */ \
247 if (strstr (#FORMULA, " ME ") != NULL) \
248 { \
249 BFD_ASSERT (SIZE == 2); \
72f3b6aa 250 }
886a2506 251
34e967a5 252#include "elf/arc-reloc.def"
72f3b6aa 253
47b0e7ad 254}
886a2506 255#undef ARC_RELOC_HOWTO
47b0e7ad 256
886a2506
NC
257
258#define ARC_RELOC_HOWTO(TYPE, VALUE, SIZE, BITSIZE, RELOC_FUNCTION, OVERFLOW, FORMULA) \
259 [TYPE] = VALUE,
68d20676 260
886a2506
NC
261const int howto_table_lookup[] =
262{
34e967a5 263#include "elf/arc-reloc.def"
252b5132 264};
68d20676 265
886a2506
NC
266#undef ARC_RELOC_HOWTO
267
f26dd308
AM
268static reloc_howto_type *
269arc_elf_howto (unsigned int r_type)
270{
271 if (elf_arc_howto_table[R_ARC_32].dst_mask == 0)
272 arc_elf_howto_init ();
273 return &elf_arc_howto_table[r_type];
274}
252b5132
RH
275
276/* Map BFD reloc types to ARC ELF reloc types. */
277
278struct arc_reloc_map
279{
34e967a5 280 bfd_reloc_code_real_type bfd_reloc_val;
08759e0f 281 unsigned char elf_reloc_val;
252b5132
RH
282};
283
8a36df4d
CM
284/* ARC ELF linker hash entry. */
285struct elf_arc_link_hash_entry
286{
287 struct elf_link_hash_entry root;
288
289 /* Track dynamic relocs copied for this symbol. */
290 struct elf_dyn_relocs *dyn_relocs;
291};
292
293/* ARC ELF linker hash table. */
294struct elf_arc_link_hash_table
295{
296 struct elf_link_hash_table elf;
8a36df4d
CM
297};
298
299static struct bfd_hash_entry *
300elf_arc_link_hash_newfunc (struct bfd_hash_entry *entry,
301 struct bfd_hash_table *table,
302 const char *string)
303{
304 /* Allocate the structure if it has not already been allocated by a
305 subclass. */
306 if (entry == NULL)
307 {
308 entry = (struct bfd_hash_entry *)
309 bfd_hash_allocate (table,
310 sizeof (struct elf_arc_link_hash_entry));
311 if (entry == NULL)
312 return entry;
313 }
314
315 /* Call the allocation method of the superclass. */
316 entry = _bfd_elf_link_hash_newfunc (entry, table, string);
317 if (entry != NULL)
318 {
319 struct elf_arc_link_hash_entry *eh;
320
321 eh = (struct elf_arc_link_hash_entry *) entry;
322 eh->dyn_relocs = NULL;
323 }
324
325 return entry;
326}
327
328/* Destroy an ARC ELF linker hash table. */
329static void
330elf_arc_link_hash_table_free (bfd *obfd)
331{
332 _bfd_elf_link_hash_table_free (obfd);
333}
334
335/* Create an ARC ELF linker hash table. */
336
337static struct bfd_link_hash_table *
338arc_elf_link_hash_table_create (bfd *abfd)
339{
340 struct elf_arc_link_hash_table *ret;
341
342 ret = (struct elf_arc_link_hash_table *) bfd_zmalloc (sizeof (*ret));
343 if (ret == NULL)
344 return NULL;
345
346 if (!_bfd_elf_link_hash_table_init (&ret->elf, abfd,
347 elf_arc_link_hash_newfunc,
348 sizeof (struct elf_arc_link_hash_entry),
349 ARC_ELF_DATA))
350 {
351 free (ret);
352 return NULL;
353 }
354
8a36df4d
CM
355 ret->elf.init_got_refcount.refcount = 0;
356 ret->elf.init_got_refcount.glist = NULL;
357 ret->elf.init_got_offset.offset = 0;
358 ret->elf.init_got_offset.glist = NULL;
359
360 ret->elf.root.hash_table_free = elf_arc_link_hash_table_free;
361
362 return &ret->elf.root;
363}
364
886a2506
NC
365#define ARC_RELOC_HOWTO(TYPE, VALUE, SIZE, BITSIZE, RELOC_FUNCTION, OVERFLOW, FORMULA) \
366 { BFD_RELOC_##TYPE, R_##TYPE },
68d20676 367
252b5132
RH
368static const struct arc_reloc_map arc_reloc_map[] =
369{
34e967a5
MC
370#include "elf/arc-reloc.def"
371
886a2506
NC
372 {BFD_RELOC_NONE, R_ARC_NONE},
373 {BFD_RELOC_8, R_ARC_8},
374 {BFD_RELOC_16, R_ARC_16},
375 {BFD_RELOC_24, R_ARC_24},
376 {BFD_RELOC_32, R_ARC_32},
252b5132 377};
68d20676 378
886a2506 379#undef ARC_RELOC_HOWTO
252b5132 380
094fb063
CZ
381typedef ATTRIBUTE_UNUSED bfd_vma (*replace_func) (unsigned, int ATTRIBUTE_UNUSED);
382
383#define ARC_RELOC_HOWTO(TYPE, VALUE, SIZE, BITSIZE, RELOC_FUNCTION, OVERFLOW, FORMULA) \
384 case TYPE: \
385 func = (void *) RELOC_FUNCTION; \
386 break;
68d20676 387
094fb063
CZ
388static replace_func
389get_replace_function (bfd *abfd, unsigned int r_type)
390{
391 void *func = NULL;
392
393 switch (r_type)
394 {
395 #include "elf/arc-reloc.def"
396 }
397
398 if (func == replace_bits24 && bfd_big_endian (abfd))
68d20676 399 func = replace_bits24_be;
094fb063
CZ
400
401 return (replace_func) func;
402}
403#undef ARC_RELOC_HOWTO
404
252b5132 405static reloc_howto_type *
34e967a5 406arc_elf32_bfd_reloc_type_lookup (bfd * abfd ATTRIBUTE_UNUSED,
47b0e7ad 407 bfd_reloc_code_real_type code)
252b5132
RH
408{
409 unsigned int i;
410
ea04a8f6 411 for (i = ARRAY_SIZE (arc_reloc_map); i--;)
886a2506
NC
412 {
413 if (arc_reloc_map[i].bfd_reloc_val == code)
f26dd308 414 return arc_elf_howto (arc_reloc_map[i].elf_reloc_val);
886a2506 415 }
ea04a8f6 416
252b5132
RH
417 return NULL;
418}
419
34e967a5
MC
420/* Function to set the ELF flag bits. */
421static bfd_boolean
422arc_elf_set_private_flags (bfd *abfd, flagword flags)
423{
424 elf_elfheader (abfd)->e_flags = flags;
425 elf_flags_init (abfd) = TRUE;
426 return TRUE;
427}
428
429/* Print private flags. */
430static bfd_boolean
431arc_elf_print_private_bfd_data (bfd *abfd, void * ptr)
432{
433 FILE *file = (FILE *) ptr;
434 flagword flags;
435
436 BFD_ASSERT (abfd != NULL && ptr != NULL);
437
438 /* Print normal ELF private data. */
439 _bfd_elf_print_private_bfd_data (abfd, ptr);
440
441 flags = elf_elfheader (abfd)->e_flags;
442 fprintf (file, _("private flags = 0x%lx:"), (unsigned long) flags);
443
444 switch (flags & EF_ARC_MACH_MSK)
445 {
34e967a5
MC
446 case EF_ARC_CPU_ARCV2HS : fprintf (file, " -mcpu=ARCv2HS"); break;
447 case EF_ARC_CPU_ARCV2EM : fprintf (file, " -mcpu=ARCv2EM"); break;
448 case E_ARC_MACH_ARC600 : fprintf (file, " -mcpu=ARC600"); break;
449 case E_ARC_MACH_ARC601 : fprintf (file, " -mcpu=ARC601"); break;
450 case E_ARC_MACH_ARC700 : fprintf (file, " -mcpu=ARC700"); break;
451 default:
452 fprintf (file, "-mcpu=unknown");
453 break;
454 }
455
456 switch (flags & EF_ARC_OSABI_MSK)
457 {
458 case E_ARC_OSABI_ORIG : fprintf (file, " (ABI:legacy)"); break;
459 case E_ARC_OSABI_V2 : fprintf (file, " (ABI:v2)"); break;
460 case E_ARC_OSABI_V3 : fprintf (file, " (ABI:v3)"); break;
53a346d8 461 case E_ARC_OSABI_V4 : fprintf (file, " (ABI:v4)"); break;
34e967a5 462 default:
53a346d8 463 fprintf (file, " (ABI:unknown)");
34e967a5
MC
464 break;
465 }
466
467 fputc ('\n', file);
468 return TRUE;
469}
470
471/* Copy backend specific data from one object module to another. */
472
473static bfd_boolean
474arc_elf_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
475{
476 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
477 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
478 return TRUE;
479
480 BFD_ASSERT (!elf_flags_init (obfd)
481 || elf_elfheader (obfd)->e_flags == elf_elfheader (ibfd)->e_flags);
482
483 elf_elfheader (obfd)->e_flags = elf_elfheader (ibfd)->e_flags;
484 elf_flags_init (obfd) = TRUE;
485
486 /* Copy object attributes. */
487 _bfd_elf_copy_obj_attributes (ibfd, obfd);
488
489 return _bfd_elf_copy_private_bfd_data (ibfd, obfd);
490}
491
157090f7 492static reloc_howto_type *
34e967a5
MC
493bfd_elf32_bfd_reloc_name_lookup (bfd * abfd ATTRIBUTE_UNUSED,
494 const char *r_name)
157090f7
AM
495{
496 unsigned int i;
497
886a2506 498 for (i = 0; i < ARRAY_SIZE (elf_arc_howto_table); i++)
157090f7
AM
499 if (elf_arc_howto_table[i].name != NULL
500 && strcasecmp (elf_arc_howto_table[i].name, r_name) == 0)
f26dd308 501 return arc_elf_howto (i);
157090f7
AM
502
503 return NULL;
504}
505
886a2506 506/* Set the howto pointer for an ARC ELF reloc. */
34e967a5 507
252b5132 508static void
886a2506
NC
509arc_info_to_howto_rel (bfd * abfd ATTRIBUTE_UNUSED,
510 arelent * cache_ptr,
511 Elf_Internal_Rela * dst)
252b5132
RH
512{
513 unsigned int r_type;
514
515 r_type = ELF32_R_TYPE (dst->r_info);
886a2506 516 BFD_ASSERT (r_type < (unsigned int) R_ARC_max);
f26dd308 517 cache_ptr->howto = arc_elf_howto (r_type);
252b5132
RH
518}
519
53a346d8
CZ
520/* Extract CPU features from an NTBS. */
521
522static unsigned
523arc_extract_features (const char *p)
524{
525 unsigned i, r = 0;
526
527 if (!p)
528 return 0;
529
530 for (i = 0; i < ARRAY_SIZE (bfd_feature_list); i++)
531 {
532 char *t = strstr (p, bfd_feature_list[i].attr);
533 unsigned l = strlen (bfd_feature_list[i].attr);
534 if ((t != NULL)
535 && (t[l] == ','
536 || t[l] == '\0'))
537 r |= bfd_feature_list[i].feature;
538 }
539
540 return r;
541}
542
543/* Concatenate two strings. s1 can be NULL but not
544 s2. */
545
546static char *
547arc_stralloc (char * s1, const char * s2)
548{
549 char *p;
550
551 /* Only s1 can be null. */
552 BFD_ASSERT (s2);
553
554 p = s1 ? concat (s1, ",", s2, NULL) : (char *)s2;
555
556 return p;
557}
558
559/* Merge ARC object attributes from IBFD into OBFD. Raise an error if
560 there are conflicting attributes. */
561
562static bfd_boolean
563arc_elf_merge_attributes (bfd *ibfd, struct bfd_link_info *info)
564{
565 bfd *obfd = info->output_bfd;
566 obj_attribute *in_attr;
567 obj_attribute *out_attr;
568 int i;
569 bfd_boolean result = TRUE;
570 const char *sec_name = get_elf_backend_data (ibfd)->obj_attrs_section;
571 char *tagname = NULL;
572
573 /* Skip the linker stubs file. This preserves previous behavior
574 of accepting unknown attributes in the first input file - but
575 is that a bug? */
576 if (ibfd->flags & BFD_LINKER_CREATED)
577 return TRUE;
578
579 /* Skip any input that hasn't attribute section.
580 This enables to link object files without attribute section with
581 any others. */
582 if (bfd_get_section_by_name (ibfd, sec_name) == NULL)
583 return TRUE;
584
585 if (!elf_known_obj_attributes_proc (obfd)[0].i)
586 {
587 /* This is the first object. Copy the attributes. */
588 _bfd_elf_copy_obj_attributes (ibfd, obfd);
589
590 out_attr = elf_known_obj_attributes_proc (obfd);
591
592 /* Use the Tag_null value to indicate the attributes have been
593 initialized. */
594 out_attr[0].i = 1;
595
596 return TRUE;
597 }
598
599 in_attr = elf_known_obj_attributes_proc (ibfd);
600 out_attr = elf_known_obj_attributes_proc (obfd);
601
602 for (i = LEAST_KNOWN_OBJ_ATTRIBUTE; i < NUM_KNOWN_OBJ_ATTRIBUTES; i++)
603 {
604 /* Merge this attribute with existing attributes. */
605 switch (i)
606 {
607 case Tag_ARC_PCS_config:
608 if (out_attr[i].i == 0)
609 out_attr[i].i = in_attr[i].i;
610 else if (in_attr[i].i != 0 && out_attr[i].i != in_attr[i].i)
611 {
612 const char *tagval[] = { "Absent", "Bare-metal/mwdt",
613 "Bare-metal/newlib", "Linux/uclibc",
614 "Linux/glibc" };
615 BFD_ASSERT (in_attr[i].i < 5);
616 BFD_ASSERT (out_attr[i].i < 5);
617 /* It's sometimes ok to mix different configs, so this is only
618 a warning. */
619 _bfd_error_handler
620 (_("Warning: %B: Conflicting platform configuration "
621 "%s with %s.\n"), ibfd,
622 tagval[in_attr[i].i],
623 tagval[out_attr[i].i]);
624 }
625 break;
626
627 case Tag_ARC_CPU_base:
628 if (out_attr[i].i == 0)
629 out_attr[i].i = in_attr[i].i;
630 else if (in_attr[i].i != 0 && out_attr[i].i != in_attr[i].i
631 && ((out_attr[i].i + in_attr[i].i) < 6))
632 {
633 const char *tagval[] = { "Absent", "ARC6xx", "ARC7xx",
634 "ARCEM", "ARCHS" };
635 BFD_ASSERT (in_attr[i].i < 5);
636 BFD_ASSERT (out_attr[i].i < 5);
637 /* We cannot mix code for different CPUs. */
638 _bfd_error_handler
639 (_("error: %B: unable to merge CPU base attributes "
640 "%s with %s.\n"),
641 obfd,
642 tagval[in_attr[i].i],
643 tagval[out_attr[i].i]);
644 result = FALSE;
645 break;
646 }
647 else
648 {
649 /* The CPUs may be different, check if we can still mix
650 the objects against the output choosen CPU. */
651 unsigned in_feature = 0;
652 unsigned out_feature = 0;
653 char *p1 = in_attr[Tag_ARC_ISA_config].s;
654 char *p2 = out_attr[Tag_ARC_ISA_config].s;
655 unsigned j;
656 unsigned cpu_out;
657 unsigned opcode_map[] = {0, ARC_OPCODE_ARC600, ARC_OPCODE_ARC700,
658 ARC_OPCODE_ARCv2EM, ARC_OPCODE_ARCv2HS};
659
660 BFD_ASSERT (in_attr[i].i < (sizeof (opcode_map)
661 / sizeof (unsigned)));
662 BFD_ASSERT (out_attr[i].i < (sizeof (opcode_map)
663 / sizeof (unsigned)));
664 cpu_out = opcode_map[out_attr[i].i];
665
666 in_feature = arc_extract_features (p1);
667 out_feature = arc_extract_features (p2);
668
669 /* First, check if a feature is compatible with the
670 output object chosen CPU. */
671 for (j = 0; j < ARRAY_SIZE (bfd_feature_list); j++)
672 if (((in_feature | out_feature) & bfd_feature_list[j].feature)
673 && (!(cpu_out & bfd_feature_list[j].cpus)))
674 {
675 _bfd_error_handler
676 (_("error: %B: unable to merge ISA extension attributes "
677 "%s.\n"),
678 obfd, bfd_feature_list[j].name);
679 result = FALSE;
680 break;
681 }
682 /* Second, if we have compatible features with the
683 chosen CPU, check if they are compatible among
684 them. */
685 for (j = 0; j < ARRAY_SIZE (bfd_conflict_list); j++)
686 if (((in_feature | out_feature) & bfd_conflict_list[j])
687 == bfd_conflict_list[j])
688 {
689 unsigned k;
690 for (k = 0; k < ARRAY_SIZE (bfd_feature_list); k++)
691 {
692 if (in_feature & bfd_feature_list[k].feature
693 & bfd_conflict_list[j])
694 p1 = (char *) bfd_feature_list[k].name;
695 if (out_feature & bfd_feature_list[k].feature
696 & bfd_conflict_list[j])
697 p2 = (char *) bfd_feature_list[k].name;
698 }
699 _bfd_error_handler
700 (_("error: %B: conflicting ISA extension attributes "
701 "%s with %s.\n"),
702 obfd, p1, p2);
703 result = FALSE;
704 break;
705 }
706 /* Everithing is alright. */
707 out_feature |= in_feature;
708 p1 = NULL;
709 for (j = 0; j < ARRAY_SIZE (bfd_feature_list); j++)
710 if (out_feature & bfd_feature_list[j].feature)
711 p1 = arc_stralloc (p1, bfd_feature_list[j].attr);
712 if (p1)
713 out_attr[Tag_ARC_ISA_config].s =
714 _bfd_elf_attr_strdup (obfd, p1);
715 }
716 /* Fall through. */
717 case Tag_ARC_CPU_variation:
718 case Tag_ARC_ISA_mpy_option:
719 case Tag_ARC_ABI_osver:
720 /* Use the largest value specified. */
721 if (in_attr[i].i > out_attr[i].i)
722 out_attr[i].i = in_attr[i].i;
723 break;
724
725 case Tag_ARC_CPU_name:
726 break;
727
728 case Tag_ARC_ABI_rf16:
729 if (out_attr[i].i == 0)
730 out_attr[i].i = in_attr[i].i;
731 else if (out_attr[i].i != in_attr[i].i)
732 {
733 /* We cannot mix code with rf16 and without. */
734 _bfd_error_handler
735 (_("error: %B: cannot mix rf16 with full register set %B.\n"),
736 obfd, ibfd);
737 result = FALSE;
738 }
739 break;
740
741 case Tag_ARC_ABI_pic:
742 tagname = "PIC";
8e7f04f1 743 /* fall through */
53a346d8
CZ
744 case Tag_ARC_ABI_sda:
745 if (!tagname)
746 tagname = "SDA";
8e7f04f1 747 /* fall through */
53a346d8
CZ
748 case Tag_ARC_ABI_tls:
749 {
750 const char *tagval[] = { "Absent", "MWDT", "GNU" };
751
752 if (!tagname)
753 tagname = "TLS";
754
755 BFD_ASSERT (in_attr[i].i < 3);
756 BFD_ASSERT (out_attr[i].i < 3);
757 if (out_attr[i].i != 0 && in_attr[i].i != 0
758 && out_attr[i].i != in_attr[i].i)
759 {
760 _bfd_error_handler
761 (_("error: %B: conflicting attributes %s: %s with %s.\n"),
762 obfd, tagname,
763 tagval[in_attr[i].i],
764 tagval[out_attr[i].i]);
765 result = FALSE;
766 }
767 tagname = NULL;
768 break;
769 }
770
771 case Tag_ARC_ABI_double_size:
772 tagname = "Double size";
8e7f04f1 773 /* fall through */
53a346d8
CZ
774 case Tag_ARC_ABI_enumsize:
775 if (!tagname)
776 tagname = "Enum size";
8e7f04f1 777 /* fall through */
53a346d8
CZ
778 case Tag_ARC_ABI_exceptions:
779 if (!tagname)
780 tagname = "ABI exceptions";
781
782 if (out_attr[i].i != 0 && in_attr[i].i != 0
783 && out_attr[i].i != in_attr[i].i)
784 {
785 _bfd_error_handler
786 (_("error: %B: conflicting attributes %s.\n"),
787 obfd, tagname);
788 result = FALSE;
789 }
790 break;
791
792 case Tag_ARC_ISA_apex:
793 break; /* Do nothing for APEX attributes. */
794
795 case Tag_ARC_ISA_config:
796 /* It is handled in Tag_ARC_CPU_base. */
797 break;
798
799 default:
800 result
801 = result && _bfd_elf_merge_unknown_attribute_low (ibfd, obfd, i);
802 }
803
804 /* If out_attr was copied from in_attr then it won't have a type yet. */
805 if (in_attr[i].type && !out_attr[i].type)
806 out_attr[i].type = in_attr[i].type;
807 }
808
809 /* Merge Tag_compatibility attributes and any common GNU ones. */
810 if (!_bfd_elf_merge_object_attributes (ibfd, info))
811 return FALSE;
812
813 /* Check for any attributes not known on ARC. */
814 result &= _bfd_elf_merge_unknown_attribute_list (ibfd, obfd);
815
816 return result;
817}
818
34e967a5
MC
819/* Merge backend specific data from an object file to the output
820 object file when linking. */
821
822static bfd_boolean
50e03d47 823arc_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
34e967a5 824{
50e03d47 825 bfd *obfd = info->output_bfd;
34e967a5
MC
826 unsigned short mach_ibfd;
827 static unsigned short mach_obfd = EM_NONE;
828 flagword out_flags;
829 flagword in_flags;
830 asection *sec;
831
832 /* Check if we have the same endianess. */
50e03d47 833 if (! _bfd_generic_verify_endian_match (ibfd, info))
1047201f 834 return FALSE;
34e967a5 835
53a346d8
CZ
836 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
837 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
838 return TRUE;
839
34e967a5
MC
840 /* Collect ELF flags. */
841 in_flags = elf_elfheader (ibfd)->e_flags & EF_ARC_MACH_MSK;
842 out_flags = elf_elfheader (obfd)->e_flags & EF_ARC_MACH_MSK;
843
844 if (!elf_flags_init (obfd)) /* First call, no flags set. */
845 {
846 elf_flags_init (obfd) = TRUE;
847 out_flags = in_flags;
848 }
849
53a346d8
CZ
850 if (!arc_elf_merge_attributes (ibfd, info))
851 return FALSE;
34e967a5
MC
852
853 /* Check to see if the input BFD actually contains any sections. Do
854 not short-circuit dynamic objects; their section list may be
855 emptied by elf_link_add_object_symbols. */
856 if (!(ibfd->flags & DYNAMIC))
857 {
858 bfd_boolean null_input_bfd = TRUE;
859 bfd_boolean only_data_sections = TRUE;
860
861 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
862 {
863 if ((bfd_get_section_flags (ibfd, sec)
864 & (SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS))
865 == (SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS))
866 only_data_sections = FALSE;
867
868 null_input_bfd = FALSE;
869 }
870
871 if (null_input_bfd || only_data_sections)
872 return TRUE;
873 }
874
875 /* Complain about various flag/architecture mismatches. */
876 mach_ibfd = elf_elfheader (ibfd)->e_machine;
877 if (mach_obfd == EM_NONE)
878 {
879 mach_obfd = mach_ibfd;
880 }
881 else
882 {
883 if (mach_ibfd != mach_obfd)
884 {
695344c0 885 /* xgettext:c-format */
34e967a5 886 _bfd_error_handler (_("ERROR: Attempting to link %B "
dae82561
AM
887 "with a binary %B of different architecture"),
888 ibfd, obfd);
34e967a5
MC
889 return FALSE;
890 }
53a346d8
CZ
891 else if ((in_flags != out_flags)
892 /* If we have object attributes, then we already
893 checked the objects compatibility, skip it. */
894 && !bfd_elf_get_obj_attr_int (ibfd, OBJ_ATTR_PROC,
895 Tag_ARC_CPU_base))
34e967a5
MC
896 {
897 /* Warn if different flags. */
4eca0228 898 _bfd_error_handler
695344c0 899 /* xgettext:c-format */
d42c267e
AM
900 (_("%B: uses different e_flags (%#x) fields than "
901 "previous modules (%#x)"),
902 ibfd, in_flags, out_flags);
34e967a5
MC
903 if (in_flags && out_flags)
904 return FALSE;
905 /* MWDT doesnt set the eflags hence make sure we choose the
906 eflags set by gcc. */
907 in_flags = in_flags > out_flags ? in_flags : out_flags;
908 }
53a346d8
CZ
909 else
910 {
911 /* Everything is correct; don't change the output flags. */
912 in_flags = out_flags;
913 }
34e967a5
MC
914 }
915
916 /* Update the flags. */
917 elf_elfheader (obfd)->e_flags = in_flags;
918
919 if (bfd_get_mach (obfd) < bfd_get_mach (ibfd))
920 {
921 return bfd_set_arch_mach (obfd, bfd_arch_arc, bfd_get_mach (ibfd));
922 }
923
924 return TRUE;
925}
926
53a346d8
CZ
927/* Return a best guess for the machine number based on the attributes. */
928
929static unsigned int
930bfd_arc_get_mach_from_attributes (bfd * abfd)
931{
932 int arch = bfd_elf_get_obj_attr_int (abfd, OBJ_ATTR_PROC, Tag_ARC_CPU_base);
933 unsigned e_machine = elf_elfheader (abfd)->e_machine;
934
935 switch (arch)
936 {
937 case TAG_CPU_ARC6xx:
938 return bfd_mach_arc_arc600;
939 case TAG_CPU_ARC7xx:
940 return bfd_mach_arc_arc700;
941 case TAG_CPU_ARCEM:
942 case TAG_CPU_ARCHS:
943 return bfd_mach_arc_arcv2;
944 default:
945 break;
946 }
947 return (e_machine == EM_ARC_COMPACT)
948 ? bfd_mach_arc_arc700 : bfd_mach_arc_arcv2;
949}
950
252b5132 951/* Set the right machine number for an ARC ELF file. */
b34976b6 952static bfd_boolean
886a2506 953arc_elf_object_p (bfd * abfd)
252b5132 954{
886a2506
NC
955 /* Make sure this is initialised, or you'll have the potential of passing
956 garbage---or misleading values---into the call to
957 bfd_default_set_arch_mach (). */
53a346d8 958 unsigned int mach = bfd_mach_arc_arc700;
886a2506
NC
959 unsigned long arch = elf_elfheader (abfd)->e_flags & EF_ARC_MACH_MSK;
960 unsigned e_machine = elf_elfheader (abfd)->e_machine;
252b5132 961
886a2506 962 if (e_machine == EM_ARC_COMPACT || e_machine == EM_ARC_COMPACT2)
252b5132 963 {
0d2bcfaf
NC
964 switch (arch)
965 {
886a2506
NC
966 case E_ARC_MACH_ARC600:
967 mach = bfd_mach_arc_arc600;
968 break;
969 case E_ARC_MACH_ARC601:
970 mach = bfd_mach_arc_arc601;
971 break;
972 case E_ARC_MACH_ARC700:
973 mach = bfd_mach_arc_arc700;
974 break;
975 case EF_ARC_CPU_ARCV2HS:
976 case EF_ARC_CPU_ARCV2EM:
977 mach = bfd_mach_arc_arcv2;
978 break;
979 default:
53a346d8 980 mach = bfd_arc_get_mach_from_attributes (abfd);
886a2506
NC
981 break;
982 }
983 }
984 else
985 {
986 if (e_machine == EM_ARC)
987 {
4eca0228 988 _bfd_error_handler
886a2506
NC
989 (_("Error: The ARC4 architecture is no longer supported.\n"));
990 return FALSE;
991 }
992 else
993 {
4eca0228 994 _bfd_error_handler
886a2506
NC
995 (_("Warning: unset or old architecture flags. \n"
996 " Use default machine.\n"));
0d2bcfaf 997 }
252b5132 998 }
886a2506 999
0d2bcfaf 1000 return bfd_default_set_arch_mach (abfd, bfd_arch_arc, mach);
252b5132
RH
1001}
1002
1003/* The final processing done just before writing out an ARC ELF object file.
1004 This gets the ARC architecture right based on the machine number. */
1005
1006static void
34e967a5
MC
1007arc_elf_final_write_processing (bfd * abfd,
1008 bfd_boolean linker ATTRIBUTE_UNUSED)
252b5132 1009{
886a2506 1010 unsigned long emf;
53a346d8
CZ
1011 int osver = bfd_elf_get_obj_attr_int (abfd, OBJ_ATTR_PROC,
1012 Tag_ARC_ABI_osver);
1013 flagword e_flags = elf_elfheader (abfd)->e_flags & ~EF_ARC_OSABI_MSK;
252b5132 1014
0d2bcfaf 1015 switch (bfd_get_mach (abfd))
252b5132 1016 {
886a2506 1017 case bfd_mach_arc_arc600:
886a2506 1018 emf = EM_ARC_COMPACT;
0d2bcfaf 1019 break;
886a2506 1020 case bfd_mach_arc_arc601:
886a2506 1021 emf = EM_ARC_COMPACT;
0d2bcfaf 1022 break;
886a2506 1023 case bfd_mach_arc_arc700:
886a2506 1024 emf = EM_ARC_COMPACT;
0d2bcfaf 1025 break;
886a2506 1026 case bfd_mach_arc_arcv2:
886a2506 1027 emf = EM_ARC_COMPACT2;
0d2bcfaf 1028 break;
886a2506 1029 default:
53a346d8 1030 return;
252b5132 1031 }
34e967a5 1032
886a2506 1033 elf_elfheader (abfd)->e_machine = emf;
7e458899 1034
886a2506 1035 /* Record whatever is the current syscall ABI version. */
53a346d8
CZ
1036 if (osver)
1037 e_flags |= ((osver & 0x0f) << 8);
1038 else
1039 e_flags |= E_ARC_OSABI_V3;
3c8adaca 1040
53a346d8 1041 elf_elfheader (abfd)->e_flags |= e_flags;
252b5132
RH
1042}
1043
f7e8b360
NC
1044#ifdef ARC_ENABLE_DEBUG
1045#define DEBUG_ARC_RELOC(A) debug_arc_reloc (A)
886a2506
NC
1046
1047static void
1048debug_arc_reloc (struct arc_relocation_data reloc_data)
1049{
f7e8b360
NC
1050 ARC_DEBUG ("Reloc type=%s, should_relocate = %s\n",
1051 reloc_data.howto->name,
1052 reloc_data.should_relocate ? "true" : "false");
1053 ARC_DEBUG (" offset = 0x%x, addend = 0x%x\n",
1054 (unsigned int) reloc_data.reloc_offset,
1055 (unsigned int) reloc_data.reloc_addend);
1056 ARC_DEBUG (" Symbol:\n");
1057 ARC_DEBUG (" value = 0x%08x\n",
1058 (unsigned int) reloc_data.sym_value);
886a2506
NC
1059 if (reloc_data.sym_section != NULL)
1060 {
f7e8b360
NC
1061 ARC_DEBUG (" Symbol Section:\n");
1062 ARC_DEBUG (" section name = %s, output_offset 0x%08x",
1063 reloc_data.sym_section->name,
1064 (unsigned int) reloc_data.sym_section->output_offset);
34e967a5 1065 if (reloc_data.sym_section->output_section != NULL)
f7e8b360 1066 ARC_DEBUG (", output_section->vma = 0x%08x",
34e967a5 1067 ((unsigned int) reloc_data.sym_section->output_section->vma));
f7e8b360
NC
1068 ARC_DEBUG ("\n");
1069 if (reloc_data.sym_section->owner && reloc_data.sym_section->owner->filename)
1070 ARC_DEBUG (" file: %s\n", reloc_data.sym_section->owner->filename);
886a2506
NC
1071 }
1072 else
34e967a5 1073 {
f7e8b360 1074 ARC_DEBUG (" symbol section is NULL\n");
34e967a5 1075 }
886a2506 1076
f7e8b360 1077 ARC_DEBUG (" Input_section:\n");
886a2506
NC
1078 if (reloc_data.input_section != NULL)
1079 {
f7e8b360
NC
1080 ARC_DEBUG (" section name = %s, output_offset 0x%08x, output_section->vma = 0x%08x\n",
1081 reloc_data.input_section->name,
1082 (unsigned int) reloc_data.input_section->output_offset,
1083 (unsigned int) reloc_data.input_section->output_section->vma);
1084 ARC_DEBUG (" changed_address = 0x%08x\n",
1085 (unsigned int) (reloc_data.input_section->output_section->vma
1086 + reloc_data.input_section->output_offset
1087 + reloc_data.reloc_offset));
1088 ARC_DEBUG (" file: %s\n", reloc_data.input_section->owner->filename);
886a2506
NC
1089 }
1090 else
34e967a5 1091 {
f7e8b360 1092 ARC_DEBUG (" input section is NULL\n");
34e967a5 1093 }
886a2506 1094}
f7e8b360
NC
1095#else
1096#define DEBUG_ARC_RELOC(A)
1097#endif /* ARC_ENABLE_DEBUG */
886a2506 1098
72f3b6aa
CZ
1099static bfd_vma
1100middle_endian_convert (bfd_vma insn, bfd_boolean do_it)
6f4b1afc 1101{
72f3b6aa
CZ
1102 if (do_it)
1103 {
08759e0f
CM
1104 insn
1105 = ((insn & 0xffff0000) >> 16)
1106 | ((insn & 0xffff) << 16);
72f3b6aa
CZ
1107 }
1108 return insn;
6f4b1afc
CM
1109}
1110
4b0c052e
AB
1111/* This function is called for relocations that are otherwise marked as NOT
1112 requiring overflow checks. In here we perform non-standard checks of
1113 the relocation value. */
1114
1115static inline bfd_reloc_status_type
1116arc_special_overflow_checks (const struct arc_relocation_data reloc_data,
08759e0f 1117 bfd_signed_vma relocation,
4b0c052e
AB
1118 struct bfd_link_info *info ATTRIBUTE_UNUSED)
1119{
1120 switch (reloc_data.howto->type)
1121 {
1122 case R_ARC_NPS_CMEM16:
1123 if (((relocation >> 16) & 0xffff) != NPS_CMEM_HIGH_VALUE)
08759e0f
CM
1124 {
1125 if (reloc_data.reloc_addend == 0)
4eca0228 1126 _bfd_error_handler
695344c0 1127 /* xgettext:c-format */
d42c267e
AM
1128 (_("%B(%A+%#Lx): CMEM relocation to `%s' is invalid, "
1129 "16 MSB should be %#x (value is %#Lx)"),
08759e0f
CM
1130 reloc_data.input_section->owner,
1131 reloc_data.input_section,
1132 reloc_data.reloc_offset,
1133 reloc_data.symbol_name,
1134 NPS_CMEM_HIGH_VALUE,
d42c267e 1135 relocation);
08759e0f 1136 else
4eca0228 1137 _bfd_error_handler
695344c0 1138 /* xgettext:c-format */
d42c267e
AM
1139 (_("%B(%A+%#Lx): CMEM relocation to `%s+%#Lx' is invalid, "
1140 "16 MSB should be %#x (value is %#Lx)"),
08759e0f
CM
1141 reloc_data.input_section->owner,
1142 reloc_data.input_section,
1143 reloc_data.reloc_offset,
1144 reloc_data.symbol_name,
1145 reloc_data.reloc_addend,
1146 NPS_CMEM_HIGH_VALUE,
d42c267e 1147 relocation);
08759e0f
CM
1148 return bfd_reloc_overflow;
1149 }
4b0c052e
AB
1150 break;
1151
1152 default:
1153 break;
1154 }
1155
1156 return bfd_reloc_ok;
1157}
1158
72f3b6aa
CZ
1159#define ME(reloc) (reloc)
1160
1161#define IS_ME(FORMULA,BFD) ((strstr (FORMULA, "ME") != NULL) \
1162 && (!bfd_big_endian (BFD)))
1163
094fb063 1164#define S ((bfd_signed_vma) (reloc_data.sym_value \
34e967a5
MC
1165 + (reloc_data.sym_section->output_section != NULL ? \
1166 (reloc_data.sym_section->output_offset \
094fb063
CZ
1167 + reloc_data.sym_section->output_section->vma) : 0)))
1168#define L ((bfd_signed_vma) (reloc_data.sym_value \
34e967a5
MC
1169 + (reloc_data.sym_section->output_section != NULL ? \
1170 (reloc_data.sym_section->output_offset \
094fb063 1171 + reloc_data.sym_section->output_section->vma) : 0)))
886a2506
NC
1172#define A (reloc_data.reloc_addend)
1173#define B (0)
1174#define G (reloc_data.got_offset_value)
34e967a5
MC
1175#define GOT (reloc_data.got_symbol_vma)
1176#define GOT_BEGIN (htab->sgot->output_section->vma)
1177
886a2506 1178#define MES (0)
34e967a5
MC
1179 /* P: relative offset to PCL The offset should be to the
1180 current location aligned to 32 bits. */
094fb063 1181#define P ((bfd_signed_vma) ( \
34e967a5
MC
1182 ( \
1183 (reloc_data.input_section->output_section != NULL ? \
1184 reloc_data.input_section->output_section->vma : 0) \
1185 + reloc_data.input_section->output_offset \
094fb063
CZ
1186 + (reloc_data.reloc_offset - (bitsize >= 32 ? 4 : 0))) \
1187 & ~0x3))
1188#define PDATA ((bfd_signed_vma) ( \
6f4b1afc
CM
1189 (reloc_data.input_section->output_section->vma \
1190 + reloc_data.input_section->output_offset \
094fb063 1191 + (reloc_data.reloc_offset))))
2ab2f40d
CM
1192#define SECTSTART (bfd_signed_vma) (reloc_data.sym_section->output_section->vma \
1193 + reloc_data.sym_section->output_offset)
684d5a10 1194#define JLI (bfd_signed_vma) (reloc_data.sym_section->output_section->vma)
094fb063
CZ
1195#define _SDA_BASE_ (bfd_signed_vma) (reloc_data.sdata_begin_symbol_vma)
1196#define TLS_REL (bfd_signed_vma) \
1197 ((elf_hash_table (info))->tls_sec->output_section->vma)
34e967a5 1198#define TLS_TBSS (8)
34e967a5 1199
886a2506
NC
1200#define none (0)
1201
f7e8b360
NC
1202#ifdef ARC_ENABLE_DEBUG
1203#define PRINT_DEBUG_RELOC_INFO_BEFORE(FORMULA, TYPE) \
1204 do \
1205 { \
1206 asection *sym_section = reloc_data.sym_section; \
1207 asection *input_section = reloc_data.input_section; \
1208 ARC_DEBUG ("RELOC_TYPE = " TYPE "\n"); \
1209 ARC_DEBUG ("FORMULA = " FORMULA "\n"); \
1210 ARC_DEBUG ("S = %#lx\n", S); \
1211 ARC_DEBUG ("A = %#lx\n", A); \
1212 ARC_DEBUG ("L = %lx\n", L); \
1213 if (sym_section->output_section != NULL) \
1214 ARC_DEBUG ("symbol_section->vma = %#lx\n", \
1215 sym_section->output_section->vma \
1216 + sym_section->output_offset); \
1217 else \
1218 ARC_DEBUG ("symbol_section->vma = NULL\n"); \
1219 if (input_section->output_section != NULL) \
1220 ARC_DEBUG ("symbol_section->vma = %#lx\n", \
1221 input_section->output_section->vma \
1222 + input_section->output_offset); \
1223 else \
1224 ARC_DEBUG ("symbol_section->vma = NULL\n"); \
1225 ARC_DEBUG ("PCL = %#lx\n", P); \
1226 ARC_DEBUG ("P = %#lx\n", P); \
1227 ARC_DEBUG ("G = %#lx\n", G); \
1228 ARC_DEBUG ("SDA_OFFSET = %#lx\n", _SDA_BASE_); \
34e967a5 1229 ARC_DEBUG ("SDA_SET = %d\n", reloc_data.sdata_begin_symbol_vma_set); \
f7e8b360
NC
1230 ARC_DEBUG ("GOT_OFFSET = %#lx\n", GOT); \
1231 ARC_DEBUG ("relocation = %#08lx\n", relocation); \
1232 ARC_DEBUG ("before = %#08x\n", (unsigned) insn); \
1233 ARC_DEBUG ("data = %08x (%u) (%d)\n", (unsigned) relocation, \
1234 (unsigned) relocation, (int) relocation); \
1235 } \
1236 while (0)
1237
1238#define PRINT_DEBUG_RELOC_INFO_AFTER \
1239 do \
1240 { \
1241 ARC_DEBUG ("after = 0x%08x\n", (unsigned int) insn); \
1242 } \
1243 while (0)
34e967a5 1244
f7e8b360
NC
1245#else
1246
1247#define PRINT_DEBUG_RELOC_INFO_BEFORE(...)
07d6d2b8 1248#define PRINT_DEBUG_RELOC_INFO_AFTER
f7e8b360
NC
1249
1250#endif /* ARC_ENABLE_DEBUG */
34e967a5 1251
886a2506 1252#define ARC_RELOC_HOWTO(TYPE, VALUE, SIZE, BITSIZE, RELOC_FUNCTION, OVERFLOW, FORMULA) \
f7e8b360
NC
1253 case R_##TYPE: \
1254 { \
1255 bfd_signed_vma bitsize ATTRIBUTE_UNUSED = BITSIZE; \
1256 relocation = FORMULA ; \
1257 PRINT_DEBUG_RELOC_INFO_BEFORE (#FORMULA, #TYPE); \
1258 insn = middle_endian_convert (insn, IS_ME (#FORMULA, abfd)); \
1259 insn = (* get_replace_function (abfd, TYPE)) (insn, relocation); \
1260 insn = middle_endian_convert (insn, IS_ME (#FORMULA, abfd)); \
1261 PRINT_DEBUG_RELOC_INFO_AFTER; \
1262 } \
886a2506
NC
1263 break;
1264
1265static bfd_reloc_status_type
34e967a5
MC
1266arc_do_relocation (bfd_byte * contents,
1267 struct arc_relocation_data reloc_data,
1268 struct bfd_link_info *info)
886a2506 1269{
094fb063 1270 bfd_signed_vma relocation = 0;
886a2506
NC
1271 bfd_vma insn;
1272 bfd_vma orig_insn ATTRIBUTE_UNUSED;
72f3b6aa 1273 bfd * abfd = reloc_data.input_section->owner;
34e967a5 1274 struct elf_link_hash_table *htab ATTRIBUTE_UNUSED = elf_hash_table (info);
4b0c052e 1275 bfd_reloc_status_type flag;
886a2506 1276
535b785f 1277 if (!reloc_data.should_relocate)
34e967a5 1278 return bfd_reloc_ok;
886a2506
NC
1279
1280 switch (reloc_data.howto->size)
1281 {
1282 case 2:
72f3b6aa 1283 insn = arc_bfd_get_32 (abfd,
886a2506
NC
1284 contents + reloc_data.reloc_offset,
1285 reloc_data.input_section);
1286 break;
1287 case 1:
72f3b6aa
CZ
1288 insn = arc_bfd_get_16 (abfd,
1289 contents + reloc_data.reloc_offset,
1290 reloc_data.input_section);
1291 break;
886a2506 1292 case 0:
72f3b6aa 1293 insn = arc_bfd_get_8 (abfd,
886a2506
NC
1294 contents + reloc_data.reloc_offset,
1295 reloc_data.input_section);
1296 break;
1297 default:
1298 insn = 0;
1299 BFD_ASSERT (0);
1300 break;
1301 }
1302
1303 orig_insn = insn;
1304
1305 switch (reloc_data.howto->type)
1306 {
34e967a5 1307#include "elf/arc-reloc.def"
886a2506
NC
1308
1309 default:
1310 BFD_ASSERT (0);
1311 break;
1312 }
1313
1314 /* Check for relocation overflow. */
1315 if (reloc_data.howto->complain_on_overflow != complain_overflow_dont)
4b0c052e 1316 flag = bfd_check_overflow (reloc_data.howto->complain_on_overflow,
08759e0f
CM
1317 reloc_data.howto->bitsize,
1318 reloc_data.howto->rightshift,
1319 bfd_arch_bits_per_address (abfd),
1320 relocation);
4b0c052e
AB
1321 else
1322 flag = arc_special_overflow_checks (reloc_data, relocation, info);
886a2506 1323
4b0c052e
AB
1324 if (flag != bfd_reloc_ok)
1325 {
f7e8b360 1326 ARC_DEBUG ("Relocation overflows !\n");
4b0c052e 1327 DEBUG_ARC_RELOC (reloc_data);
f7e8b360
NC
1328 ARC_DEBUG ("Relocation value = signed -> %d, unsigned -> %u"
1329 ", hex -> (0x%08x)\n",
1330 (int) relocation, (unsigned) relocation, (int) relocation);
886a2506 1331
4b0c052e 1332 return flag;
886a2506 1333 }
886a2506 1334
4b0c052e 1335 /* Write updated instruction back to memory. */
886a2506
NC
1336 switch (reloc_data.howto->size)
1337 {
1338 case 2:
72f3b6aa 1339 arc_bfd_put_32 (abfd, insn,
886a2506
NC
1340 contents + reloc_data.reloc_offset,
1341 reloc_data.input_section);
1342 break;
1343 case 1:
72f3b6aa
CZ
1344 arc_bfd_put_16 (abfd, insn,
1345 contents + reloc_data.reloc_offset,
1346 reloc_data.input_section);
1347 break;
886a2506 1348 case 0:
72f3b6aa 1349 arc_bfd_put_8 (abfd, insn,
886a2506
NC
1350 contents + reloc_data.reloc_offset,
1351 reloc_data.input_section);
1352 break;
1353 default:
1354 ARC_DEBUG ("size = %d\n", reloc_data.howto->size);
1355 BFD_ASSERT (0);
1356 break;
1357 }
1358
1359 return bfd_reloc_ok;
1360}
1361#undef S
1362#undef A
1363#undef B
1364#undef G
1365#undef GOT
1366#undef L
1367#undef MES
1368#undef P
1369#undef SECTSTAR
1370#undef SECTSTART
684d5a10 1371#undef JLI
886a2506
NC
1372#undef _SDA_BASE_
1373#undef none
1374
1375#undef ARC_RELOC_HOWTO
1376
886a2506 1377
886a2506
NC
1378/* Relocate an arc ELF section.
1379 Function : elf_arc_relocate_section
1380 Brief : Relocate an arc section, by handling all the relocations
34e967a5 1381 appearing in that section.
886a2506 1382 Args : output_bfd : The bfd being written to.
34e967a5
MC
1383 info : Link information.
1384 input_bfd : The input bfd.
1385 input_section : The section being relocated.
1386 contents : contents of the section being relocated.
1387 relocs : List of relocations in the section.
1388 local_syms : is a pointer to the swapped in local symbols.
1389 local_section : is an array giving the section in the input file
1390 corresponding to the st_shndx field of each
1391 local symbol. */
886a2506 1392static bfd_boolean
07d6d2b8 1393elf_arc_relocate_section (bfd * output_bfd,
886a2506 1394 struct bfd_link_info * info,
07d6d2b8
AM
1395 bfd * input_bfd,
1396 asection * input_section,
1397 bfd_byte * contents,
886a2506
NC
1398 Elf_Internal_Rela * relocs,
1399 Elf_Internal_Sym * local_syms,
07d6d2b8 1400 asection ** local_sections)
886a2506 1401{
07d6d2b8 1402 Elf_Internal_Shdr * symtab_hdr;
f7e8b360 1403 struct elf_link_hash_entry ** sym_hashes;
07d6d2b8
AM
1404 Elf_Internal_Rela * rel;
1405 Elf_Internal_Rela * wrel;
1406 Elf_Internal_Rela * relend;
f7e8b360 1407 struct elf_link_hash_table * htab = elf_hash_table (info);
886a2506
NC
1408
1409 symtab_hdr = &((elf_tdata (input_bfd))->symtab_hdr);
1410 sym_hashes = elf_sym_hashes (input_bfd);
1411
3c8adaca 1412 rel = wrel = relocs;
886a2506 1413 relend = relocs + input_section->reloc_count;
3c8adaca 1414 for (; rel < relend; wrel++, rel++)
886a2506 1415 {
07d6d2b8 1416 enum elf_arc_reloc_type r_type;
34e967a5 1417 reloc_howto_type * howto;
f7e8b360 1418 unsigned long r_symndx;
886a2506 1419 struct elf_link_hash_entry * h;
34e967a5
MC
1420 Elf_Internal_Sym * sym;
1421 asection * sec;
f7e8b360 1422 struct elf_link_hash_entry * h2;
07d6d2b8 1423 const char * msg;
f4e6805f 1424 bfd_boolean unresolved_reloc = FALSE;
886a2506
NC
1425
1426 struct arc_relocation_data reloc_data =
1427 {
34e967a5
MC
1428 .reloc_offset = 0,
1429 .reloc_addend = 0,
1430 .got_offset_value = 0,
07d6d2b8 1431 .sym_value = 0,
34e967a5
MC
1432 .sym_section = NULL,
1433 .howto = NULL,
1434 .input_section = NULL,
1435 .sdata_begin_symbol_vma = 0,
1436 .sdata_begin_symbol_vma_set = FALSE,
1437 .got_symbol_vma = 0,
1438 .should_relocate = FALSE
886a2506
NC
1439 };
1440
34e967a5
MC
1441 r_type = ELF32_R_TYPE (rel->r_info);
1442
1443 if (r_type >= (int) R_ARC_max)
1444 {
1445 bfd_set_error (bfd_error_bad_value);
1446 return FALSE;
1447 }
3c8adaca 1448 howto = arc_elf_howto (r_type);
34e967a5
MC
1449
1450 r_symndx = ELF32_R_SYM (rel->r_info);
1451
1452 /* If we are generating another .o file and the symbol in not
1453 local, skip this relocation. */
1454 if (bfd_link_relocatable (info))
1455 {
1456 /* This is a relocateable link. We don't have to change
1457 anything, unless the reloc is against a section symbol,
1458 in which case we have to adjust according to where the
1459 section symbol winds up in the output section. */
1460
1461 /* Checks if this is a local symbol and thus the reloc
1462 might (will??) be against a section symbol. */
1463 if (r_symndx < symtab_hdr->sh_info)
1464 {
1465 sym = local_syms + r_symndx;
1466 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
1467 {
1468 sec = local_sections[r_symndx];
1469
f7e8b360 1470 /* For RELA relocs. Just adjust the addend
34e967a5
MC
1471 value in the relocation entry. */
1472 rel->r_addend += sec->output_offset + sym->st_value;
1473
f7e8b360
NC
1474 ARC_DEBUG ("local symbols reloc (section=%d %s) seen in %s\n",
1475 (int) r_symndx, local_sections[r_symndx]->name,
1476 __PRETTY_FUNCTION__);
34e967a5
MC
1477 }
1478 }
34e967a5 1479 }
886a2506
NC
1480
1481 h2 = elf_link_hash_lookup (elf_hash_table (info), "__SDATA_BEGIN__",
1482 FALSE, FALSE, TRUE);
1483
535b785f
AM
1484 if (!reloc_data.sdata_begin_symbol_vma_set
1485 && h2 != NULL && h2->root.type != bfd_link_hash_undefined
1486 && h2->root.u.def.section->output_section != NULL)
34e967a5 1487 /* TODO: Verify this condition. */
886a2506
NC
1488 {
1489 reloc_data.sdata_begin_symbol_vma =
08759e0f
CM
1490 (h2->root.u.def.value
1491 + h2->root.u.def.section->output_section->vma);
886a2506
NC
1492 reloc_data.sdata_begin_symbol_vma_set = TRUE;
1493 }
1494
886a2506
NC
1495 reloc_data.input_section = input_section;
1496 reloc_data.howto = howto;
1497 reloc_data.reloc_offset = rel->r_offset;
1498 reloc_data.reloc_addend = rel->r_addend;
1499
886a2506
NC
1500 /* This is a final link. */
1501 h = NULL;
1502 sym = NULL;
1503 sec = NULL;
1504
1505 if (r_symndx < symtab_hdr->sh_info) /* A local symbol. */
1506 {
1507 sym = local_syms + r_symndx;
1508 sec = local_sections[r_symndx];
3c8adaca
CZ
1509 }
1510 else
1511 {
f4e6805f
CM
1512 bfd_boolean warned, ignored;
1513 bfd_vma relocation ATTRIBUTE_UNUSED;
1514
1515 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
1516 r_symndx, symtab_hdr, sym_hashes,
1517 h, sec, relocation,
1518 unresolved_reloc, warned, ignored);
1519
3c8adaca
CZ
1520 /* TODO: This code is repeated from below. We should
1521 clean it and remove duplications.
1522 Sec is used check for discarded sections.
1523 Need to redesign code below. */
1524
1525 /* Get the symbol's entry in the symtab. */
1526 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1527
1528 while (h->root.type == bfd_link_hash_indirect
1529 || h->root.type == bfd_link_hash_warning)
1530 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1531
1532 /* If we have encountered a definition for this symbol. */
1533 if (h->root.type == bfd_link_hash_defined
1534 || h->root.type == bfd_link_hash_defweak)
1535 {
1536 reloc_data.sym_value = h->root.u.def.value;
1537 sec = h->root.u.def.section;
1538 }
1539 }
1540
1541 /* Clean relocs for symbols in discarded sections. */
1542 if (sec != NULL && discarded_section (sec))
1543 {
1544 _bfd_clear_contents (howto, input_bfd, input_section,
1545 contents + rel->r_offset);
3c8adaca
CZ
1546 rel->r_info = 0;
1547 rel->r_addend = 0;
1548
1549 /* For ld -r, remove relocations in debug sections against
1550 sections defined in discarded sections. Not done for
1551 eh_frame editing code expects to be present. */
1552 if (bfd_link_relocatable (info)
1553 && (input_section->flags & SEC_DEBUGGING))
1554 wrel--;
1555
1556 continue;
1557 }
1558
1559 if (bfd_link_relocatable (info))
1560 {
1561 if (wrel != rel)
1562 *wrel = *rel;
1563 continue;
1564 }
1565
1566 if (r_symndx < symtab_hdr->sh_info) /* A local symbol. */
1567 {
886a2506
NC
1568 reloc_data.sym_value = sym->st_value;
1569 reloc_data.sym_section = sec;
4b0c052e 1570 reloc_data.symbol_name =
3c8adaca
CZ
1571 bfd_elf_string_from_elf_section (input_bfd,
1572 symtab_hdr->sh_link,
1573 sym->st_name);
886a2506 1574
841fdfcd
CZ
1575 /* Mergeable section handling. */
1576 if ((sec->flags & SEC_MERGE)
1577 && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
1578 {
1579 asection *msec;
1580 msec = sec;
1581 rel->r_addend = _bfd_elf_rel_local_sym (output_bfd, sym,
1582 &msec, rel->r_addend);
1583 rel->r_addend -= (sec->output_section->vma
1584 + sec->output_offset
1585 + sym->st_value);
1586 rel->r_addend += msec->output_section->vma + msec->output_offset;
1587
1588 reloc_data.reloc_addend = rel->r_addend;
1589 }
1590
34e967a5
MC
1591 BFD_ASSERT (htab->sgot != NULL || !is_reloc_for_GOT (howto));
1592 if (htab->sgot != NULL)
1593 reloc_data.got_symbol_vma = htab->sgot->output_section->vma
1594 + htab->sgot->output_offset;
886a2506
NC
1595
1596 reloc_data.should_relocate = TRUE;
1597 }
1598 else /* Global symbol. */
1599 {
f7e8b360
NC
1600 /* FIXME: We should use the RELOC_FOR_GLOBAL_SYMBOL macro
1601 (defined in elf-bfd.h) here. */
1602
886a2506
NC
1603 /* Get the symbol's entry in the symtab. */
1604 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1605
1606 while (h->root.type == bfd_link_hash_indirect
1607 || h->root.type == bfd_link_hash_warning)
cc89d0b3
CM
1608 {
1609 struct elf_link_hash_entry *h_old = h;
886a2506 1610 h = (struct elf_link_hash_entry *) h->root.u.i.link;
cc89d0b3
CM
1611 if (h->got.glist == 0 && h_old->got.glist != h->got.glist)
1612 h->got.glist = h_old->got.glist;
1613 }
886a2506 1614
3c8adaca
CZ
1615 /* TODO: Need to validate what was the intention. */
1616 /* BFD_ASSERT ((h->dynindx == -1) || (h->forced_local != 0)); */
4b0c052e 1617 reloc_data.symbol_name = h->root.root.string;
3c8adaca 1618
886a2506
NC
1619 /* If we have encountered a definition for this symbol. */
1620 if (h->root.type == bfd_link_hash_defined
1621 || h->root.type == bfd_link_hash_defweak)
1622 {
1623 reloc_data.sym_value = h->root.u.def.value;
1624 reloc_data.sym_section = h->root.u.def.section;
1625
1626 reloc_data.should_relocate = TRUE;
1627
34e967a5 1628 if (is_reloc_for_GOT (howto) && !bfd_link_pic (info))
886a2506 1629 {
34e967a5
MC
1630 /* TODO: Change it to use arc_do_relocation with
1631 ARC_32 reloc. Try to use ADD_RELA macro. */
886a2506
NC
1632 bfd_vma relocation =
1633 reloc_data.sym_value + reloc_data.reloc_addend
34e967a5
MC
1634 + (reloc_data.sym_section->output_section != NULL ?
1635 (reloc_data.sym_section->output_offset
1636 + reloc_data.sym_section->output_section->vma)
1637 : 0);
1638
1639 BFD_ASSERT (h->got.glist);
1640 bfd_vma got_offset = h->got.glist->offset;
1641 bfd_put_32 (output_bfd, relocation,
1642 htab->sgot->contents + got_offset);
1643 }
1644 if (is_reloc_for_PLT (howto) && h->plt.offset != (bfd_vma) -1)
1645 {
1646 /* TODO: This is repeated up here. */
1647 reloc_data.sym_value = h->plt.offset;
1648 reloc_data.sym_section = htab->splt;
886a2506
NC
1649 }
1650 }
1651 else if (h->root.type == bfd_link_hash_undefweak)
1652 {
1653 /* Is weak symbol and has no definition. */
34e967a5
MC
1654 if (is_reloc_for_GOT (howto))
1655 {
1656 reloc_data.sym_value = h->root.u.def.value;
1657 reloc_data.sym_section = htab->sgot;
1658 reloc_data.should_relocate = TRUE;
1659 }
1660 else if (is_reloc_for_PLT (howto)
1661 && h->plt.offset != (bfd_vma) -1)
1662 {
1663 /* TODO: This is repeated up here. */
1664 reloc_data.sym_value = h->plt.offset;
1665 reloc_data.sym_section = htab->splt;
1666 reloc_data.should_relocate = TRUE;
1667 }
1668 else
1669 continue;
886a2506
NC
1670 }
1671 else
1672 {
1673 if (is_reloc_for_GOT (howto))
1674 {
886a2506 1675 reloc_data.sym_value = h->root.u.def.value;
34e967a5 1676 reloc_data.sym_section = htab->sgot;
886a2506
NC
1677
1678 reloc_data.should_relocate = TRUE;
1679 }
1680 else if (is_reloc_for_PLT (howto))
1681 {
7e458899
CZ
1682 /* Fail if it is linking for PIE and the symbol is
1683 undefined. */
1a72702b
AM
1684 if (bfd_link_executable (info))
1685 (*info->callbacks->undefined_symbol)
1686 (info, h->root.root.string, input_bfd, input_section,
1687 rel->r_offset, TRUE);
886a2506 1688 reloc_data.sym_value = h->plt.offset;
34e967a5 1689 reloc_data.sym_section = htab->splt;
886a2506
NC
1690
1691 reloc_data.should_relocate = TRUE;
1692 }
8a36df4d 1693 else if (!bfd_link_pic (info) || bfd_link_executable (info))
1a72702b
AM
1694 (*info->callbacks->undefined_symbol)
1695 (info, h->root.root.string, input_bfd, input_section,
1696 rel->r_offset, TRUE);
886a2506
NC
1697 }
1698
34e967a5
MC
1699 BFD_ASSERT (htab->sgot != NULL || !is_reloc_for_GOT (howto));
1700 if (htab->sgot != NULL)
1701 reloc_data.got_symbol_vma = htab->sgot->output_section->vma
1702 + htab->sgot->output_offset;
886a2506
NC
1703 }
1704
08759e0f
CM
1705 if ((is_reloc_for_GOT (howto)
1706 || is_reloc_for_TLS (howto)))
1707 {
980aa3e6
CM
1708 reloc_data.should_relocate = TRUE;
1709
08759e0f
CM
1710 struct got_entry **list
1711 = get_got_entry_list_for_symbol (output_bfd, r_symndx, h);
1712
1713 reloc_data.got_offset_value
1714 = relocate_fix_got_relocs_for_got_info (list,
1715 tls_type_for_reloc (howto),
1716 info,
1717 output_bfd,
1718 r_symndx,
1719 local_syms,
1720 local_sections,
1721 h,
1722 &reloc_data);
1723
1724 if (h == NULL)
1725 {
1726 create_got_dynrelocs_for_single_entry (
1727 got_entry_for_type (list,
07d6d2b8 1728 arc_got_entry_type_for_reloc (howto)),
08759e0f
CM
1729 output_bfd, info, NULL);
1730 }
1731 }
f7e8b360 1732
cd640291
CM
1733
1734#define IS_ARC_PCREL_TYPE(TYPE) \
1735 ( (TYPE == R_ARC_PC32) \
1736 || (TYPE == R_ARC_32_PCREL))
1737
34e967a5
MC
1738 switch (r_type)
1739 {
1740 case R_ARC_32:
1741 case R_ARC_32_ME:
1742 case R_ARC_PC32:
1743 case R_ARC_32_PCREL:
cd640291
CM
1744 if (bfd_link_pic (info)
1745 && (!IS_ARC_PCREL_TYPE (r_type)
34e967a5
MC
1746 || (h != NULL
1747 && h->dynindx != -1
cd640291 1748 && !h->def_regular
34e967a5
MC
1749 && (!info->symbolic || !h->def_regular))))
1750 {
1751 Elf_Internal_Rela outrel;
1752 bfd_byte *loc;
1753 bfd_boolean skip = FALSE;
1754 bfd_boolean relocate = FALSE;
1755 asection *sreloc = _bfd_elf_get_dynamic_reloc_section
1756 (input_bfd, input_section,
1757 /*RELA*/ TRUE);
1758
1759 BFD_ASSERT (sreloc != NULL);
1760
1761 outrel.r_offset = _bfd_elf_section_offset (output_bfd,
1762 info,
1763 input_section,
1764 rel->r_offset);
cd640291 1765
34e967a5
MC
1766 if (outrel.r_offset == (bfd_vma) -1)
1767 skip = TRUE;
1768
1769 outrel.r_addend = rel->r_addend;
1770 outrel.r_offset += (input_section->output_section->vma
1771 + input_section->output_offset);
1772
1773 if (skip)
1774 {
1775 memset (&outrel, 0, sizeof outrel);
1776 relocate = FALSE;
1777 }
3c8adaca
CZ
1778 else if (h != NULL
1779 && h->dynindx != -1
cd640291
CM
1780 && (IS_ARC_PCREL_TYPE (r_type)
1781 || !(bfd_link_executable (info)
1782 || SYMBOLIC_BIND (info, h))
1783 || ! h->def_regular))
34e967a5 1784 {
94e5c971 1785 BFD_ASSERT (h != NULL);
34e967a5
MC
1786 if ((input_section->flags & SEC_ALLOC) != 0)
1787 relocate = FALSE;
1788 else
1789 relocate = TRUE;
94e5c971
CZ
1790
1791 BFD_ASSERT (h->dynindx != -1);
34e967a5
MC
1792 outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
1793 }
1794 else
1795 {
1796 /* Handle local symbols, they either do not have a
1797 global hash table entry (h == NULL), or are
1798 forced local due to a version script
1799 (h->forced_local), or the third condition is
1800 legacy, it appears to say something like, for
1801 links where we are pre-binding the symbols, or
1802 there's not an entry for this symbol in the
1803 dynamic symbol table, and it's a regular symbol
1804 not defined in a shared object, then treat the
1805 symbol as local, resolve it now. */
3c8adaca
CZ
1806 relocate = TRUE;
1807 /* outrel.r_addend = 0; */
1808 outrel.r_info = ELF32_R_INFO (0, R_ARC_RELATIVE);
34e967a5
MC
1809 }
1810
1811 BFD_ASSERT (sreloc->contents != 0);
1812
1813 loc = sreloc->contents;
1814 loc += sreloc->reloc_count * sizeof (Elf32_External_Rela);
1815 sreloc->reloc_count += 1;
1816
1817 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
1818
535b785f 1819 if (!relocate)
34e967a5
MC
1820 continue;
1821 }
1822 break;
1823 default:
1824 break;
1825 }
1826
1827 if (is_reloc_SDA_relative (howto)
535b785f 1828 && !reloc_data.sdata_begin_symbol_vma_set)
886a2506 1829 {
4eca0228
AM
1830 _bfd_error_handler
1831 ("Error: Linker symbol __SDATA_BEGIN__ not found");
886a2506
NC
1832 bfd_set_error (bfd_error_bad_value);
1833 return FALSE;
1834 }
1835
1836 DEBUG_ARC_RELOC (reloc_data);
34e967a5 1837
2ab2f40d 1838 /* Make sure we have with a dynamic linker. In case of GOT and PLT
08759e0f 1839 the sym_section should point to .got or .plt respectively. */
815dc1bc
CZ
1840 if ((is_reloc_for_GOT (howto) || is_reloc_for_PLT (howto))
1841 && reloc_data.sym_section == NULL)
2ab2f40d 1842 {
4eca0228 1843 _bfd_error_handler
2ab2f40d
CM
1844 (_("GOT and PLT relocations cannot be fixed with a non dynamic linker."));
1845 bfd_set_error (bfd_error_bad_value);
1846 return FALSE;
1847 }
1848
f7e8b360
NC
1849 msg = NULL;
1850 switch (arc_do_relocation (contents, reloc_data, info))
1851 {
1852 case bfd_reloc_ok:
1853 continue; /* The reloc processing loop. */
1854
1855 case bfd_reloc_overflow:
1856 (*info->callbacks->reloc_overflow)
1857 (info, (h ? &h->root : NULL), reloc_data.symbol_name, howto->name, (bfd_vma) 0,
1858 input_bfd, input_section, rel->r_offset);
1859 break;
1860
1861 case bfd_reloc_undefined:
1862 (*info->callbacks->undefined_symbol)
1863 (info, reloc_data.symbol_name, input_bfd, input_section, rel->r_offset, TRUE);
1864 break;
1865
1866 case bfd_reloc_other:
695344c0 1867 /* xgettext:c-format */
f7e8b360
NC
1868 msg = _("%B(%A): warning: unaligned access to symbol '%s' in the small data area");
1869 break;
1870
1871 case bfd_reloc_outofrange:
695344c0 1872 /* xgettext:c-format */
f7e8b360
NC
1873 msg = _("%B(%A): internal error: out of range error");
1874 break;
1875
1876 case bfd_reloc_notsupported:
695344c0 1877 /* xgettext:c-format */
f7e8b360
NC
1878 msg = _("%B(%A): internal error: unsupported relocation error");
1879 break;
1880
1881 case bfd_reloc_dangerous:
695344c0 1882 /* xgettext:c-format */
f7e8b360
NC
1883 msg = _("%B(%A): internal error: dangerous relocation");
1884 break;
1885
1886 default:
695344c0 1887 /* xgettext:c-format */
f7e8b360
NC
1888 msg = _("%B(%A): internal error: unknown error");
1889 break;
1890 }
1891
1892 if (msg)
1893 _bfd_error_handler (msg, input_bfd, input_section, reloc_data.symbol_name);
1894 return FALSE;
886a2506
NC
1895 }
1896
1897 return TRUE;
1898}
1899
8a36df4d
CM
1900#define elf_arc_hash_table(p) \
1901 (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
1902 == ARC_ELF_DATA ? ((struct elf_arc_link_hash_table *) ((p)->hash)) : NULL)
1903
886a2506 1904static bfd_boolean
08759e0f 1905elf_arc_check_relocs (bfd * abfd,
886a2506 1906 struct bfd_link_info * info,
34e967a5 1907 asection * sec,
886a2506
NC
1908 const Elf_Internal_Rela * relocs)
1909{
34e967a5
MC
1910 Elf_Internal_Shdr * symtab_hdr;
1911 struct elf_link_hash_entry ** sym_hashes;
34e967a5
MC
1912 const Elf_Internal_Rela * rel;
1913 const Elf_Internal_Rela * rel_end;
1914 bfd * dynobj;
1915 asection * sreloc = NULL;
e3d1d408 1916 struct elf_link_hash_table * htab = elf_hash_table (info);
34e967a5
MC
1917
1918 if (bfd_link_relocatable (info))
1919 return TRUE;
886a2506 1920
e3d1d408
CM
1921 if (htab->dynobj == NULL)
1922 htab->dynobj = abfd;
1923
886a2506
NC
1924 dynobj = (elf_hash_table (info))->dynobj;
1925 symtab_hdr = &((elf_tdata (abfd))->symtab_hdr);
1926 sym_hashes = elf_sym_hashes (abfd);
886a2506
NC
1927
1928 rel_end = relocs + sec->reloc_count;
1929 for (rel = relocs; rel < rel_end; rel++)
1930 {
1931 enum elf_arc_reloc_type r_type;
1932 reloc_howto_type *howto;
1933 unsigned long r_symndx;
1934 struct elf_link_hash_entry *h;
1935
1936 r_type = ELF32_R_TYPE (rel->r_info);
1937
1938 if (r_type >= (int) R_ARC_max)
1939 {
1940 bfd_set_error (bfd_error_bad_value);
1941 return FALSE;
1942 }
3c8adaca 1943 howto = arc_elf_howto (r_type);
34e967a5 1944
886a2506
NC
1945 /* Load symbol information. */
1946 r_symndx = ELF32_R_SYM (rel->r_info);
1947 if (r_symndx < symtab_hdr->sh_info) /* Is a local symbol. */
1948 h = NULL;
1949 else /* Global one. */
1950 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1951
34e967a5
MC
1952 switch (r_type)
1953 {
1954 case R_ARC_32:
1955 case R_ARC_32_ME:
1956 /* During shared library creation, these relocs should not
1957 appear in a shared library (as memory will be read only
1958 and the dynamic linker can not resolve these. However
1959 the error should not occur for e.g. debugging or
1960 non-readonly sections. */
9d5c718b
CM
1961 if (h != NULL
1962 && (bfd_link_dll (info) && !bfd_link_pie (info))
34e967a5 1963 && (sec->flags & SEC_ALLOC) != 0
3c8adaca
CZ
1964 && (sec->flags & SEC_READONLY) != 0
1965 && ((sec->flags & SEC_CODE) != 0
1966 || (sec->flags & SEC_DEBUGGING) != 0))
34e967a5
MC
1967 {
1968 const char *name;
1969 if (h)
1970 name = h->root.root.string;
1971 else
1972 /* bfd_elf_sym_name (abfd, symtab_hdr, isym, NULL); */
1973 name = "UNKNOWN";
4eca0228 1974 _bfd_error_handler
695344c0 1975 /* xgettext:c-format */
34e967a5
MC
1976 (_("\
1977%B: relocation %s against `%s' can not be used when making a shared object; recompile with -fPIC"),
1978 abfd,
1979 arc_elf_howto (r_type)->name,
1980 name);
1981 bfd_set_error (bfd_error_bad_value);
1982 return FALSE;
1983 }
1984
1985 /* In some cases we are not setting the 'non_got_ref'
1986 flag, even though the relocations don't require a GOT
1987 access. We should extend the testing in this area to
1988 ensure that no significant cases are being missed. */
1989 if (h)
1990 h->non_got_ref = 1;
1991 /* FALLTHROUGH */
1992 case R_ARC_PC32:
1993 case R_ARC_32_PCREL:
8a36df4d 1994 if ((bfd_link_pic (info))
34e967a5
MC
1995 && ((r_type != R_ARC_PC32 && r_type != R_ARC_32_PCREL)
1996 || (h != NULL
34e967a5
MC
1997 && (!info->symbolic || !h->def_regular))))
1998 {
1999 if (sreloc == NULL)
2000 {
e3d1d408
CM
2001 if (info->dynamic
2002 && ! htab->dynamic_sections_created
2003 && ! _bfd_elf_link_create_dynamic_sections (abfd, info))
2004 return FALSE;
34e967a5
MC
2005 sreloc = _bfd_elf_make_dynamic_reloc_section (sec, dynobj,
2006 2, abfd,
2007 /*rela*/
2008 TRUE);
2009
2010 if (sreloc == NULL)
2011 return FALSE;
2012 }
2013 sreloc->size += sizeof (Elf32_External_Rela);
2014
2015 }
2016 default:
2017 break;
2018 }
2019
535b785f 2020 if (is_reloc_for_PLT (howto))
886a2506
NC
2021 {
2022 if (h == NULL)
2023 continue;
2024 else
2025 h->needs_plt = 1;
2026 }
2027
08759e0f 2028 /* Add info to the symbol got_entry_list. */
535b785f
AM
2029 if (is_reloc_for_GOT (howto)
2030 || is_reloc_for_TLS (howto))
34e967a5 2031 {
e3d1d408
CM
2032 if (! _bfd_elf_create_got_section (dynobj, info))
2033 return FALSE;
2034
08759e0f
CM
2035 arc_fill_got_info_for_reloc (
2036 arc_got_entry_type_for_reloc (howto),
2037 get_got_entry_list_for_symbol (abfd, r_symndx, h),
2038 info,
2039 h);
34e967a5
MC
2040 }
2041 }
886a2506 2042
34e967a5
MC
2043 return TRUE;
2044}
886a2506 2045
34e967a5 2046#define ELF_DYNAMIC_INTERPRETER "/sbin/ld-uClibc.so"
886a2506 2047
34e967a5
MC
2048static struct plt_version_t *
2049arc_get_plt_version (struct bfd_link_info *info)
886a2506 2050{
34e967a5 2051 int i;
886a2506 2052
34e967a5
MC
2053 for (i = 0; i < 1; i++)
2054 {
2055 ARC_DEBUG ("%d: size1 = %d, size2 = %d\n", i,
f7e8b360
NC
2056 (int) plt_versions[i].entry_size,
2057 (int) plt_versions[i].elem_size);
34e967a5 2058 }
886a2506 2059
34e967a5 2060 if (bfd_get_mach (info->output_bfd) == bfd_mach_arc_arcv2)
886a2506 2061 {
34e967a5
MC
2062 if (bfd_link_pic (info))
2063 return &(plt_versions[ELF_ARCV2_PIC]);
2064 else
2065 return &(plt_versions[ELF_ARCV2_ABS]);
2066 }
2067 else
886a2506 2068 {
34e967a5
MC
2069 if (bfd_link_pic (info))
2070 return &(plt_versions[ELF_ARC_PIC]);
2071 else
2072 return &(plt_versions[ELF_ARC_ABS]);
886a2506 2073 }
886a2506
NC
2074}
2075
2076static bfd_vma
2077add_symbol_to_plt (struct bfd_link_info *info)
2078{
34e967a5 2079 struct elf_link_hash_table *htab = elf_hash_table (info);
886a2506
NC
2080 bfd_vma ret;
2081
34e967a5 2082 struct plt_version_t *plt_data = arc_get_plt_version (info);
886a2506 2083
34e967a5
MC
2084 /* If this is the first .plt entry, make room for the special first
2085 entry. */
2086 if (htab->splt->size == 0)
2087 htab->splt->size += plt_data->entry_size;
886a2506 2088
34e967a5
MC
2089 ret = htab->splt->size;
2090
2091 htab->splt->size += plt_data->elem_size;
f7e8b360 2092 ARC_DEBUG ("PLT_SIZE = %d\n", (int) htab->splt->size);
34e967a5
MC
2093
2094 htab->sgotplt->size += 4;
2095 htab->srelplt->size += sizeof (Elf32_External_Rela);
886a2506
NC
2096
2097 return ret;
2098}
2099
34e967a5
MC
2100#define PLT_DO_RELOCS_FOR_ENTRY(ABFD, DS, RELOCS) \
2101 plt_do_relocs_for_symbol (ABFD, DS, RELOCS, 0, 0)
886a2506
NC
2102
2103static void
34e967a5
MC
2104plt_do_relocs_for_symbol (bfd *abfd,
2105 struct elf_link_hash_table *htab,
2106 const struct plt_reloc *reloc,
886a2506
NC
2107 bfd_vma plt_offset,
2108 bfd_vma symbol_got_offset)
2109{
2110 while (SYM_ONLY (reloc->symbol) != LAST_RELOC)
2111 {
2112 bfd_vma relocation = 0;
2113
2114 switch (SYM_ONLY (reloc->symbol))
2115 {
2116 case SGOT:
08759e0f
CM
2117 relocation
2118 = htab->sgotplt->output_section->vma
2119 + htab->sgotplt->output_offset + symbol_got_offset;
886a2506
NC
2120 break;
2121 }
2122 relocation += reloc->addend;
2123
34e967a5
MC
2124 if (IS_RELATIVE (reloc->symbol))
2125 {
2126 bfd_vma reloc_offset = reloc->offset;
2127 reloc_offset -= (IS_INSN_32 (reloc->symbol)) ? 4 : 0;
2128 reloc_offset -= (IS_INSN_24 (reloc->symbol)) ? 2 : 0;
886a2506 2129
34e967a5
MC
2130 relocation -= htab->splt->output_section->vma
2131 + htab->splt->output_offset
2132 + plt_offset + reloc_offset;
2133 }
2134
2135 /* TODO: being ME is not a property of the relocation but of the
2136 section of which is applying the relocation. */
1e5885b7 2137 if (IS_MIDDLE_ENDIAN (reloc->symbol) && !bfd_big_endian (abfd))
886a2506 2138 {
08759e0f
CM
2139 relocation
2140 = ((relocation & 0xffff0000) >> 16)
2141 | ((relocation & 0xffff) << 16);
886a2506
NC
2142 }
2143
2144 switch (reloc->size)
2145 {
2146 case 32:
34e967a5 2147 bfd_put_32 (htab->splt->output_section->owner,
886a2506 2148 relocation,
34e967a5 2149 htab->splt->contents + plt_offset + reloc->offset);
886a2506
NC
2150 break;
2151 }
2152
34e967a5 2153 reloc = &(reloc[1]); /* Jump to next relocation. */
886a2506
NC
2154 }
2155}
2156
2157static void
34e967a5
MC
2158relocate_plt_for_symbol (bfd *output_bfd,
2159 struct bfd_link_info *info,
886a2506
NC
2160 struct elf_link_hash_entry *h)
2161{
34e967a5
MC
2162 struct plt_version_t *plt_data = arc_get_plt_version (info);
2163 struct elf_link_hash_table *htab = elf_hash_table (info);
886a2506 2164
34e967a5
MC
2165 bfd_vma plt_index = (h->plt.offset - plt_data->entry_size)
2166 / plt_data->elem_size;
886a2506
NC
2167 bfd_vma got_offset = (plt_index + 3) * 4;
2168
f7e8b360
NC
2169 ARC_DEBUG ("arc_info: PLT_OFFSET = %#lx, PLT_ENTRY_VMA = %#lx, \
2170GOT_ENTRY_OFFSET = %#lx, GOT_ENTRY_VMA = %#lx, for symbol %s\n",
2171 (long) h->plt.offset,
2172 (long) (htab->splt->output_section->vma
2173 + htab->splt->output_offset
2174 + h->plt.offset),
2175 (long) got_offset,
2176 (long) (htab->sgotplt->output_section->vma
2177 + htab->sgotplt->output_offset
2178 + got_offset),
34e967a5
MC
2179 h->root.root.string);
2180
1e5885b7
CZ
2181 {
2182 bfd_vma i = 0;
2183 uint16_t *ptr = (uint16_t *) plt_data->elem;
f7e8b360 2184
1e5885b7
CZ
2185 for (i = 0; i < plt_data->elem_size/2; i++)
2186 {
2187 uint16_t data = ptr[i];
2188 bfd_put_16 (output_bfd,
2189 (bfd_vma) data,
2190 htab->splt->contents + h->plt.offset + (i*2));
2191 }
2192 }
2193
34e967a5
MC
2194 plt_do_relocs_for_symbol (output_bfd, htab,
2195 plt_data->elem_relocs,
2196 h->plt.offset,
886a2506 2197 got_offset);
34e967a5
MC
2198
2199 /* Fill in the entry in the global offset table. */
2200 bfd_put_32 (output_bfd,
2201 (bfd_vma) (htab->splt->output_section->vma
2202 + htab->splt->output_offset),
2203 htab->sgotplt->contents + got_offset);
2204
2205 /* TODO: Fill in the entry in the .rela.plt section. */
2206 {
2207 Elf_Internal_Rela rel;
2208 bfd_byte *loc;
2209
2210 rel.r_offset = (htab->sgotplt->output_section->vma
2211 + htab->sgotplt->output_offset
2212 + got_offset);
2213 rel.r_addend = 0;
94e5c971
CZ
2214
2215 BFD_ASSERT (h->dynindx != -1);
34e967a5
MC
2216 rel.r_info = ELF32_R_INFO (h->dynindx, R_ARC_JMP_SLOT);
2217
2218 loc = htab->srelplt->contents;
2219 loc += plt_index * sizeof (Elf32_External_Rela); /* relA */
2220 bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
2221 }
886a2506
NC
2222}
2223
2224static void
34e967a5
MC
2225relocate_plt_for_entry (bfd *abfd,
2226 struct bfd_link_info *info)
886a2506 2227{
34e967a5
MC
2228 struct plt_version_t *plt_data = arc_get_plt_version (info);
2229 struct elf_link_hash_table *htab = elf_hash_table (info);
886a2506 2230
1e5885b7
CZ
2231 {
2232 bfd_vma i = 0;
2233 uint16_t *ptr = (uint16_t *) plt_data->entry;
2234 for (i = 0; i < plt_data->entry_size/2; i++)
2235 {
2236 uint16_t data = ptr[i];
2237 bfd_put_16 (abfd,
2238 (bfd_vma) data,
2239 htab->splt->contents + (i*2));
2240 }
2241 }
34e967a5 2242 PLT_DO_RELOCS_FOR_ENTRY (abfd, htab, plt_data->entry_relocs);
886a2506
NC
2243}
2244
34e967a5
MC
2245/* Desc : Adjust a symbol defined by a dynamic object and referenced
2246 by a regular object. The current definition is in some section of
2247 the dynamic object, but we're not including those sections. We
2248 have to change the definition to something the rest of the link can
886a2506
NC
2249 understand. */
2250
2251static bfd_boolean
2252elf_arc_adjust_dynamic_symbol (struct bfd_link_info *info,
2253 struct elf_link_hash_entry *h)
2254{
34e967a5 2255 asection *s;
886a2506 2256 bfd *dynobj = (elf_hash_table (info))->dynobj;
34e967a5 2257 struct elf_link_hash_table *htab = elf_hash_table (info);
886a2506 2258
34e967a5
MC
2259 if (h->type == STT_FUNC
2260 || h->type == STT_GNU_IFUNC
2261 || h->needs_plt == 1)
886a2506
NC
2262 {
2263 if (!bfd_link_pic (info) && !h->def_dynamic && !h->ref_dynamic)
2264 {
2265 /* This case can occur if we saw a PLT32 reloc in an input
2266 file, but the symbol was never referred to by a dynamic
2267 object. In such a case, we don't actually need to build
2268 a procedure linkage table, and we can just do a PC32
2269 reloc instead. */
2270 BFD_ASSERT (h->needs_plt);
2271 return TRUE;
2272 }
2273
2274 /* Make sure this symbol is output as a dynamic symbol. */
2275 if (h->dynindx == -1 && !h->forced_local
2276 && !bfd_elf_link_record_dynamic_symbol (info, h))
2277 return FALSE;
2278
34e967a5
MC
2279 if (bfd_link_pic (info)
2280 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h))
886a2506
NC
2281 {
2282 bfd_vma loc = add_symbol_to_plt (info);
2283
08759e0f 2284 if (bfd_link_executable (info) && !h->def_regular)
886a2506 2285 {
34e967a5 2286 h->root.u.def.section = htab->splt;
886a2506
NC
2287 h->root.u.def.value = loc;
2288 }
2289 h->plt.offset = loc;
2290 }
34e967a5
MC
2291 else
2292 {
2293 h->plt.offset = (bfd_vma) -1;
2294 h->needs_plt = 0;
2295 }
2296 return TRUE;
886a2506 2297 }
34e967a5
MC
2298
2299 /* If this is a weak symbol, and there is a real definition, the
2300 processor independent code will have arranged for us to see the
2301 real definition first, and we can just use the same value. */
60d67dc8 2302 if (h->is_weakalias)
886a2506 2303 {
60d67dc8
AM
2304 struct elf_link_hash_entry *def = weakdef (h);
2305 BFD_ASSERT (def->root.type == bfd_link_hash_defined);
2306 h->root.u.def.section = def->root.u.def.section;
2307 h->root.u.def.value = def->root.u.def.value;
34e967a5 2308 return TRUE;
886a2506
NC
2309 }
2310
34e967a5
MC
2311 /* This is a reference to a symbol defined by a dynamic object which
2312 is not a function. */
2313
2314 /* If we are creating a shared library, we must presume that the
2315 only references to the symbol are via the global offset table.
2316 For such cases we need not do anything here; the relocations will
2317 be handled correctly by relocate_section. */
3c8adaca
CZ
2318 if (!bfd_link_executable (info))
2319 return TRUE;
2320
2321 /* If there are no non-GOT references, we do not need a copy
2322 relocation. */
2323 if (!h->non_got_ref)
34e967a5
MC
2324 return TRUE;
2325
3c8adaca
CZ
2326 /* If -z nocopyreloc was given, we won't generate them either. */
2327 if (info->nocopyreloc)
2328 {
2329 h->non_got_ref = 0;
2330 return TRUE;
2331 }
2332
34e967a5
MC
2333 /* We must allocate the symbol in our .dynbss section, which will
2334 become part of the .bss section of the executable. There will be
2335 an entry for this symbol in the .dynsym section. The dynamic
2336 object will contain position independent code, so all references
2337 from the dynamic object to this symbol will go through the global
2338 offset table. The dynamic linker will use the .dynsym entry to
2339 determine the address it must put in the global offset table, so
2340 both the dynamic object and the regular object will refer to the
2341 same memory location for the variable. */
2342
3c8adaca
CZ
2343 if (htab == NULL)
2344 return FALSE;
34e967a5
MC
2345
2346 /* We must generate a R_ARC_COPY reloc to tell the dynamic linker to
2347 copy the initial value out of the dynamic object and into the
2348 runtime process image. We need to remember the offset into the
2349 .rela.bss section we are going to use. */
2350 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
2351 {
8a36df4d 2352 struct elf_arc_link_hash_table *arc_htab = elf_arc_hash_table (info);
34e967a5 2353
9d19e4fd
AM
2354 BFD_ASSERT (arc_htab->elf.srelbss != NULL);
2355 arc_htab->elf.srelbss->size += sizeof (Elf32_External_Rela);
34e967a5
MC
2356 h->needs_copy = 1;
2357 }
2358
8a36df4d 2359 /* TODO: Move this also to arc_hash_table. */
3c8adaca
CZ
2360 s = bfd_get_section_by_name (dynobj, ".dynbss");
2361 BFD_ASSERT (s != NULL);
34e967a5 2362
3c8adaca 2363 return _bfd_elf_adjust_dynamic_copy (info, h, s);
886a2506
NC
2364}
2365
2366/* Function : elf_arc_finish_dynamic_symbol
2367 Brief : Finish up dynamic symbol handling. We set the
34e967a5 2368 contents of various dynamic sections here.
886a2506 2369 Args : output_bfd :
34e967a5
MC
2370 info :
2371 h :
2372 sym :
886a2506 2373 Returns : True/False as the return status. */
34e967a5 2374
886a2506
NC
2375static bfd_boolean
2376elf_arc_finish_dynamic_symbol (bfd * output_bfd,
2377 struct bfd_link_info *info,
2378 struct elf_link_hash_entry *h,
2379 Elf_Internal_Sym * sym)
2380{
34e967a5 2381 if (h->plt.offset != (bfd_vma) -1)
886a2506 2382 {
34e967a5
MC
2383 relocate_plt_for_symbol (output_bfd, info, h);
2384
2385 if (!h->def_regular)
886a2506 2386 {
34e967a5
MC
2387 /* Mark the symbol as undefined, rather than as defined in
2388 the .plt section. Leave the value alone. */
2389 sym->st_shndx = SHN_UNDEF;
886a2506 2390 }
34e967a5
MC
2391 }
2392
34e967a5 2393
08759e0f
CM
2394 /* This function traverses list of GOT entries and
2395 create respective dynamic relocs. */
2396 /* TODO: Make function to get list and not access the list directly. */
2397 /* TODO: Move function to relocate_section create this relocs eagerly. */
2398 create_got_dynrelocs_for_got_info (&h->got.glist,
2399 output_bfd,
2400 info,
2401 h);
34e967a5
MC
2402
2403 if (h->needs_copy)
2404 {
8a36df4d
CM
2405 struct elf_arc_link_hash_table *arc_htab = elf_arc_hash_table (info);
2406
2407 if (h->dynindx == -1
2408 || (h->root.type != bfd_link_hash_defined
2409 && h->root.type != bfd_link_hash_defweak)
9d19e4fd 2410 || arc_htab->elf.srelbss == NULL)
8a36df4d
CM
2411 abort ();
2412
34e967a5
MC
2413 bfd_vma rel_offset = (h->root.u.def.value
2414 + h->root.u.def.section->output_section->vma
2415 + h->root.u.def.section->output_offset);
2416
9d19e4fd
AM
2417 bfd_byte * loc = arc_htab->elf.srelbss->contents
2418 + (arc_htab->elf.srelbss->reloc_count * sizeof (Elf32_External_Rela));
2419 arc_htab->elf.srelbss->reloc_count++;
34e967a5
MC
2420
2421 Elf_Internal_Rela rel;
2422 rel.r_addend = 0;
2423 rel.r_offset = rel_offset;
94e5c971
CZ
2424
2425 BFD_ASSERT (h->dynindx != -1);
34e967a5
MC
2426 rel.r_info = ELF32_R_INFO (h->dynindx, R_ARC_COPY);
2427
23a42089 2428 bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
886a2506
NC
2429 }
2430
2431 /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute. */
2432 if (strcmp (h->root.root.string, "_DYNAMIC") == 0
2433 || strcmp (h->root.root.string, "__DYNAMIC") == 0
2434 || strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
2435 sym->st_shndx = SHN_ABS;
2436
2437 return TRUE;
2438}
2439
4ade44b7 2440#define GET_SYMBOL_OR_SECTION(TAG, SYMBOL, SECTION) \
34e967a5
MC
2441 case TAG: \
2442 if (SYMBOL != NULL) \
4ade44b7
AM
2443 h = elf_link_hash_lookup (elf_hash_table (info), \
2444 SYMBOL, FALSE, FALSE, TRUE); \
34e967a5 2445 else if (SECTION != NULL) \
4ade44b7 2446 s = bfd_get_linker_section (dynobj, SECTION); \
34e967a5 2447 break;
886a2506
NC
2448
2449/* Function : elf_arc_finish_dynamic_sections
2450 Brief : Finish up the dynamic sections handling.
2451 Args : output_bfd :
34e967a5
MC
2452 info :
2453 h :
2454 sym :
886a2506 2455 Returns : True/False as the return status. */
34e967a5 2456
886a2506 2457static bfd_boolean
34e967a5
MC
2458elf_arc_finish_dynamic_sections (bfd * output_bfd,
2459 struct bfd_link_info *info)
886a2506 2460{
34e967a5 2461 struct elf_link_hash_table *htab = elf_hash_table (info);
886a2506 2462 bfd *dynobj = (elf_hash_table (info))->dynobj;
034fed0b 2463 asection *sdyn = bfd_get_linker_section (dynobj, ".dynamic");
886a2506 2464
034fed0b 2465 if (sdyn)
886a2506
NC
2466 {
2467 Elf32_External_Dyn *dyncon, *dynconend;
2468
034fed0b 2469 dyncon = (Elf32_External_Dyn *) sdyn->contents;
08759e0f 2470 dynconend
034fed0b 2471 = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
886a2506
NC
2472 for (; dyncon < dynconend; dyncon++)
2473 {
2474 Elf_Internal_Dyn internal_dyn;
2475 bfd_boolean do_it = FALSE;
2476
2477 struct elf_link_hash_entry *h = NULL;
2478 asection *s = NULL;
2479
2480 bfd_elf32_swap_dyn_in (dynobj, dyncon, &internal_dyn);
2481
2482 switch (internal_dyn.d_tag)
2483 {
65b94e90
CM
2484 GET_SYMBOL_OR_SECTION (DT_INIT, info->init_function, NULL)
2485 GET_SYMBOL_OR_SECTION (DT_FINI, info->fini_function, NULL)
4ade44b7
AM
2486 GET_SYMBOL_OR_SECTION (DT_PLTGOT, NULL, ".plt")
2487 GET_SYMBOL_OR_SECTION (DT_JMPREL, NULL, ".rela.plt")
2488 GET_SYMBOL_OR_SECTION (DT_PLTRELSZ, NULL, ".rela.plt")
4ade44b7
AM
2489 GET_SYMBOL_OR_SECTION (DT_VERSYM, NULL, ".gnu.version")
2490 GET_SYMBOL_OR_SECTION (DT_VERDEF, NULL, ".gnu.version_d")
2491 GET_SYMBOL_OR_SECTION (DT_VERNEED, NULL, ".gnu.version_r")
886a2506
NC
2492 default:
2493 break;
2494 }
2495
34e967a5 2496 /* In case the dynamic symbols should be updated with a symbol. */
886a2506
NC
2497 if (h != NULL
2498 && (h->root.type == bfd_link_hash_defined
34e967a5 2499 || h->root.type == bfd_link_hash_defweak))
886a2506
NC
2500 {
2501 asection *asec_ptr;
2502
2503 internal_dyn.d_un.d_val = h->root.u.def.value;
2504 asec_ptr = h->root.u.def.section;
2505 if (asec_ptr->output_section != NULL)
2506 {
2507 internal_dyn.d_un.d_val +=
08759e0f
CM
2508 (asec_ptr->output_section->vma
2509 + asec_ptr->output_offset);
886a2506
NC
2510 }
2511 else
2512 {
34e967a5
MC
2513 /* The symbol is imported from another shared
2514 library and does not apply to this one. */
886a2506
NC
2515 internal_dyn.d_un.d_val = 0;
2516 }
2517 do_it = TRUE;
2518 }
2519 else if (s != NULL) /* With a section information. */
2520 {
2521 switch (internal_dyn.d_tag)
2522 {
2523 case DT_PLTGOT:
2524 case DT_JMPREL:
34e967a5
MC
2525 case DT_VERSYM:
2526 case DT_VERDEF:
2527 case DT_VERNEED:
4ade44b7
AM
2528 internal_dyn.d_un.d_ptr = (s->output_section->vma
2529 + s->output_offset);
886a2506
NC
2530 do_it = TRUE;
2531 break;
2532
2533 case DT_PLTRELSZ:
2534 internal_dyn.d_un.d_val = s->size;
2535 do_it = TRUE;
2536 break;
2537
886a2506
NC
2538 default:
2539 break;
2540 }
2541 }
2542
4ade44b7 2543 if (do_it)
886a2506
NC
2544 bfd_elf32_swap_dyn_out (output_bfd, &internal_dyn, dyncon);
2545 }
2546
34e967a5 2547 if (htab->splt->size > 0)
886a2506 2548 {
34e967a5 2549 relocate_plt_for_entry (output_bfd, info);
886a2506
NC
2550 }
2551
34e967a5 2552 /* TODO: Validate this. */
034fed0b
AM
2553 if (htab->srelplt->output_section != bfd_abs_section_ptr)
2554 elf_section_data (htab->srelplt->output_section)
2555 ->this_hdr.sh_entsize = 12;
886a2506
NC
2556 }
2557
2558 /* Fill in the first three entries in the global offset table. */
34e967a5 2559 if (htab->sgot)
886a2506 2560 {
3b63d2ce
CM
2561 struct elf_link_hash_entry *h;
2562 h = elf_link_hash_lookup (elf_hash_table (info), "_GLOBAL_OFFSET_TABLE_",
2563 FALSE, FALSE, TRUE);
2564
2565 if (h != NULL && h->root.type != bfd_link_hash_undefined
2566 && h->root.u.def.section != NULL)
886a2506 2567 {
3b63d2ce
CM
2568 asection *sec = h->root.u.def.section;
2569
034fed0b 2570 if (sdyn == NULL)
886a2506 2571 bfd_put_32 (output_bfd, (bfd_vma) 0,
3b63d2ce 2572 sec->contents);
886a2506
NC
2573 else
2574 bfd_put_32 (output_bfd,
034fed0b 2575 sdyn->output_section->vma + sdyn->output_offset,
3b63d2ce
CM
2576 sec->contents);
2577 bfd_put_32 (output_bfd, (bfd_vma) 0, sec->contents + 4);
2578 bfd_put_32 (output_bfd, (bfd_vma) 0, sec->contents + 8);
886a2506
NC
2579 }
2580 }
2581
886a2506
NC
2582 return TRUE;
2583}
2584
34e967a5
MC
2585#define ADD_DYNAMIC_SYMBOL(NAME, TAG) \
2586 h = elf_link_hash_lookup (elf_hash_table (info), \
2587 NAME, FALSE, FALSE, FALSE); \
2588 if ((h != NULL && (h->ref_regular || h->def_regular))) \
2589 if (! _bfd_elf_add_dynamic_entry (info, TAG, 0)) \
886a2506
NC
2590 return FALSE;
2591
2592/* Set the sizes of the dynamic sections. */
2593static bfd_boolean
034fed0b 2594elf_arc_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
34e967a5 2595 struct bfd_link_info *info)
886a2506 2596{
034fed0b
AM
2597 bfd *dynobj;
2598 asection *s;
2599 bfd_boolean relocs_exist = FALSE;
2600 bfd_boolean reltext_exist = FALSE;
34e967a5 2601 struct elf_link_hash_table *htab = elf_hash_table (info);
886a2506 2602
034fed0b 2603 dynobj = htab->dynobj;
886a2506
NC
2604 BFD_ASSERT (dynobj != NULL);
2605
034fed0b 2606 if (htab->dynamic_sections_created)
886a2506
NC
2607 {
2608 struct elf_link_hash_entry *h;
2609
34e967a5
MC
2610 /* Set the contents of the .interp section to the
2611 interpreter. */
034fed0b 2612 if (bfd_link_executable (info) && !info->nointerp)
886a2506
NC
2613 {
2614 s = bfd_get_section_by_name (dynobj, ".interp");
2615 BFD_ASSERT (s != NULL);
34e967a5 2616 s->size = sizeof (ELF_DYNAMIC_INTERPRETER);
886a2506
NC
2617 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
2618 }
2619
34e967a5
MC
2620 /* Add some entries to the .dynamic section. We fill in some of
2621 the values later, in elf_bfd_final_link, but we must add the
2622 entries now so that we know the final size of the .dynamic
2623 section. Checking if the .init section is present. We also
2624 create DT_INIT and DT_FINI entries if the init_str has been
2625 changed by the user. */
65b94e90
CM
2626 ADD_DYNAMIC_SYMBOL (info->init_function, DT_INIT);
2627 ADD_DYNAMIC_SYMBOL (info->fini_function, DT_FINI);
886a2506
NC
2628 }
2629 else
2630 {
34e967a5
MC
2631 /* We may have created entries in the .rela.got section.
2632 However, if we are not creating the dynamic sections, we will
2633 not actually use these entries. Reset the size of .rela.got,
2634 which will cause it to get stripped from the output file
2635 below. */
2636 if (htab->srelgot != NULL)
2637 htab->srelgot->size = 0;
886a2506
NC
2638 }
2639
2640 for (s = dynobj->sections; s != NULL; s = s->next)
2641 {
34e967a5 2642 if ((s->flags & SEC_LINKER_CREATED) == 0)
886a2506
NC
2643 continue;
2644
034fed0b
AM
2645 if (s == htab->splt
2646 || s == htab->sgot
2647 || s == htab->sgotplt
2648 || s == htab->sdynbss)
886a2506 2649 {
034fed0b
AM
2650 /* Strip this section if we don't need it. */
2651 }
2652 else if (strncmp (s->name, ".rela", 5) == 0)
2653 {
2654 if (s->size != 0 && s != htab->srelplt)
34e967a5 2655 {
034fed0b 2656 if (!reltext_exist)
34e967a5 2657 {
034fed0b
AM
2658 const char *name = s->name + 5;
2659 bfd *ibfd;
2660 for (ibfd = info->input_bfds; ibfd; ibfd = ibfd->link.next)
64aa8e03
CM
2661 if (bfd_get_flavour (ibfd) == bfd_target_elf_flavour
2662 && ibfd->flags & DYNAMIC)
034fed0b
AM
2663 {
2664 asection *target = bfd_get_section_by_name (ibfd, name);
2665 if (target != NULL
2666 && elf_section_data (target)->sreloc == s
2667 && ((target->output_section->flags
2668 & (SEC_READONLY | SEC_ALLOC))
2669 == (SEC_READONLY | SEC_ALLOC)))
2670 {
2671 reltext_exist = TRUE;
2672 break;
2673 }
2674 }
34e967a5 2675 }
034fed0b 2676 relocs_exist = TRUE;
34e967a5 2677 }
886a2506 2678
34e967a5
MC
2679 /* We use the reloc_count field as a counter if we need to
2680 copy relocs into the output file. */
2681 s->reloc_count = 0;
886a2506 2682 }
034fed0b
AM
2683 else
2684 {
2685 /* It's not one of our sections, so don't allocate space. */
2686 continue;
2687 }
34e967a5 2688
034fed0b
AM
2689 if (s->size == 0)
2690 {
2691 s->flags |= SEC_EXCLUDE;
2692 continue;
2693 }
34e967a5 2694
034fed0b
AM
2695 if ((s->flags & SEC_HAS_CONTENTS) == 0)
2696 continue;
34e967a5 2697
034fed0b
AM
2698 /* Allocate memory for the section contents. */
2699 s->contents = bfd_zalloc (dynobj, s->size);
2700 if (s->contents == NULL)
34e967a5 2701 return FALSE;
886a2506
NC
2702 }
2703
034fed0b 2704 if (htab->dynamic_sections_created)
886a2506 2705 {
34e967a5
MC
2706 /* TODO: Check if this is needed. */
2707 if (!bfd_link_pic (info))
2708 if (!_bfd_elf_add_dynamic_entry (info, DT_DEBUG, 0))
2709 return FALSE;
2710
2711 if (htab->splt && (htab->splt->flags & SEC_EXCLUDE) == 0)
886a2506
NC
2712 if (!_bfd_elf_add_dynamic_entry (info, DT_PLTGOT, 0)
2713 || !_bfd_elf_add_dynamic_entry (info, DT_PLTRELSZ, 0)
2714 || !_bfd_elf_add_dynamic_entry (info, DT_PLTREL, DT_RELA)
034fed0b 2715 || !_bfd_elf_add_dynamic_entry (info, DT_JMPREL, 0))
886a2506
NC
2716 return FALSE;
2717
034fed0b 2718 if (relocs_exist)
886a2506
NC
2719 if (!_bfd_elf_add_dynamic_entry (info, DT_RELA, 0)
2720 || !_bfd_elf_add_dynamic_entry (info, DT_RELASZ, 0)
2ab2f40d 2721 || !_bfd_elf_add_dynamic_entry (info, DT_RELAENT,
034fed0b 2722 sizeof (Elf32_External_Rela)))
886a2506
NC
2723 return FALSE;
2724
034fed0b 2725 if (reltext_exist)
886a2506
NC
2726 if (!_bfd_elf_add_dynamic_entry (info, DT_TEXTREL, 0))
2727 return FALSE;
2728 }
2729
2730 return TRUE;
2731}
2732
0f7f3789
CM
2733
2734/* Classify dynamic relocs such that -z combreloc can reorder and combine
2735 them. */
2736static enum elf_reloc_type_class
2737elf32_arc_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
2738 const asection *rel_sec ATTRIBUTE_UNUSED,
2739 const Elf_Internal_Rela *rela)
2740{
2741 switch ((int) ELF32_R_TYPE (rela->r_info))
2742 {
2743 case R_ARC_RELATIVE:
2744 return reloc_class_relative;
2745 case R_ARC_JMP_SLOT:
2746 return reloc_class_plt;
2747 case R_ARC_COPY:
2748 return reloc_class_copy;
2749 /* TODO: Needed in future to support ifunc. */
2750 /*
2751 case R_ARC_IRELATIVE:
2752 return reloc_class_ifunc;
2753 */
2754 default:
2755 return reloc_class_normal;
2756 }
2757}
2758
34e967a5
MC
2759const struct elf_size_info arc_elf32_size_info =
2760{
2761 sizeof (Elf32_External_Ehdr),
2762 sizeof (Elf32_External_Phdr),
2763 sizeof (Elf32_External_Shdr),
2764 sizeof (Elf32_External_Rel),
2765 sizeof (Elf32_External_Rela),
2766 sizeof (Elf32_External_Sym),
2767 sizeof (Elf32_External_Dyn),
2768 sizeof (Elf_External_Note),
2769 4,
2770 1,
2771 32, 2,
2772 ELFCLASS32, EV_CURRENT,
2773 bfd_elf32_write_out_phdrs,
2774 bfd_elf32_write_shdrs_and_ehdr,
2775 bfd_elf32_checksum_contents,
2776 bfd_elf32_write_relocs,
2777 bfd_elf32_swap_symbol_in,
2778 bfd_elf32_swap_symbol_out,
2779 bfd_elf32_slurp_reloc_table,
2780 bfd_elf32_slurp_symbol_table,
2781 bfd_elf32_swap_dyn_in,
2782 bfd_elf32_swap_dyn_out,
2783 bfd_elf32_swap_reloc_in,
2784 bfd_elf32_swap_reloc_out,
2785 bfd_elf32_swap_reloca_in,
2786 bfd_elf32_swap_reloca_out
2787};
2788
2789#define elf_backend_size_info arc_elf32_size_info
2790
34e967a5
MC
2791/* Hook called by the linker routine which adds symbols from an object
2792 file. */
2793
2794static bfd_boolean
2795elf_arc_add_symbol_hook (bfd * abfd,
2796 struct bfd_link_info * info,
2797 Elf_Internal_Sym * sym,
2798 const char ** namep ATTRIBUTE_UNUSED,
2799 flagword * flagsp ATTRIBUTE_UNUSED,
2800 asection ** secp ATTRIBUTE_UNUSED,
2801 bfd_vma * valp ATTRIBUTE_UNUSED)
2802{
a43942db 2803 if (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC
34e967a5
MC
2804 && (abfd->flags & DYNAMIC) == 0
2805 && bfd_get_flavour (info->output_bfd) == bfd_target_elf_flavour)
a43942db 2806 elf_tdata (info->output_bfd)->has_gnu_symbols |= elf_gnu_symbol_ifunc;
34e967a5
MC
2807
2808 return TRUE;
2809}
886a2506 2810
47f7f636
AK
2811/* GDB expects general purpose registers to be in section .reg. However Linux
2812 kernel doesn't create this section and instead writes registers to NOTE
2813 section. It is up to the binutils to create a pseudo-section .reg from the
2814 contents of NOTE. Also BFD will read pid and signal number from NOTE. This
2815 function relies on offsets inside elf_prstatus structure in Linux to be
2816 stable. */
2817
2818static bfd_boolean
2819elf32_arc_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
2820{
2821 int offset;
2822 size_t size;
2823
2824 switch (note->descsz)
2825 {
2826 default:
2827 return FALSE;
2828
2829 case 236: /* sizeof (struct elf_prstatus) on Linux/arc. */
2830 /* pr_cursig */
2831 elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
2832 /* pr_pid */
2833 elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 24);
2834 /* pr_regs */
2835 offset = 72;
2836 size = (40 * 4); /* There are 40 registers in user_regs_struct. */
2837 break;
2838 }
2839 /* Make a ".reg/999" section. */
2840 return _bfd_elfcore_make_pseudosection (abfd, ".reg", size,
2841 note->descpos + offset);
2842}
2843
53a346d8
CZ
2844/* Determine whether an object attribute tag takes an integer, a
2845 string or both. */
2846
2847static int
2848elf32_arc_obj_attrs_arg_type (int tag)
2849{
2850 if (tag == Tag_ARC_CPU_name
2851 || tag == Tag_ARC_ISA_config
2852 || tag == Tag_ARC_ISA_apex)
2853 return ATTR_TYPE_FLAG_STR_VAL;
2854 else if (tag < (Tag_ARC_ISA_mpy_option + 1))
2855 return ATTR_TYPE_FLAG_INT_VAL;
2856 else
2857 return (tag & 1) != 0 ? ATTR_TYPE_FLAG_STR_VAL : ATTR_TYPE_FLAG_INT_VAL;
2858}
2859
2860/* Attribute numbers >=14 can be safely ignored. */
2861
2862static bfd_boolean
2863elf32_arc_obj_attrs_handle_unknown (bfd *abfd, int tag)
2864{
2865 if ((tag & 127) < (Tag_ARC_ISA_mpy_option + 1))
2866 {
2867 _bfd_error_handler
2868 (_("%B: Unknown mandatory ARC object attribute %d."),
2869 abfd, tag);
2870 bfd_set_error (bfd_error_bad_value);
2871 return FALSE;
2872 }
2873 else
2874 {
2875 _bfd_error_handler
2876 (_("Warning: %B: Unknown ARC object attribute %d."),
2877 abfd, tag);
2878 return TRUE;
2879 }
2880}
2881
2882/* Handle an ARC specific section when reading an object file. This is
2883 called when bfd_section_from_shdr finds a section with an unknown
2884 type. */
2885
2886static bfd_boolean
2887elf32_arc_section_from_shdr (bfd *abfd,
2888 Elf_Internal_Shdr * hdr,
2889 const char *name,
2890 int shindex)
2891{
2892 switch (hdr->sh_type)
2893 {
2894 case SHT_ARC_ATTRIBUTES:
2895 break;
2896
2897 default:
2898 return FALSE;
2899 }
2900
2901 if (!_bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
2902 return FALSE;
2903
2904 return TRUE;
2905}
2906
6d00b590 2907#define TARGET_LITTLE_SYM arc_elf32_le_vec
47b0e7ad 2908#define TARGET_LITTLE_NAME "elf32-littlearc"
886a2506
NC
2909#define TARGET_BIG_SYM arc_elf32_be_vec
2910#define TARGET_BIG_NAME "elf32-bigarc"
2911#define ELF_ARCH bfd_arch_arc
8a36df4d 2912#define ELF_TARGET_ID ARC_ELF_DATA
886a2506
NC
2913#define ELF_MACHINE_CODE EM_ARC_COMPACT
2914#define ELF_MACHINE_ALT1 EM_ARC_COMPACT2
2915#define ELF_MAXPAGESIZE 0x2000
2916
34e967a5
MC
2917#define bfd_elf32_bfd_link_hash_table_create arc_elf_link_hash_table_create
2918
2919#define bfd_elf32_bfd_merge_private_bfd_data arc_elf_merge_private_bfd_data
2920#define bfd_elf32_bfd_reloc_type_lookup arc_elf32_bfd_reloc_type_lookup
2921#define bfd_elf32_bfd_set_private_flags arc_elf_set_private_flags
2922#define bfd_elf32_bfd_print_private_bfd_data arc_elf_print_private_bfd_data
2923#define bfd_elf32_bfd_copy_private_bfd_data arc_elf_copy_private_bfd_data
2924
886a2506
NC
2925#define elf_info_to_howto_rel arc_info_to_howto_rel
2926#define elf_backend_object_p arc_elf_object_p
2927#define elf_backend_final_write_processing arc_elf_final_write_processing
2928
2929#define elf_backend_relocate_section elf_arc_relocate_section
2930#define elf_backend_check_relocs elf_arc_check_relocs
9d19e4fd 2931#define elf_backend_create_dynamic_sections _bfd_elf_create_dynamic_sections
886a2506 2932
0f7f3789
CM
2933#define elf_backend_reloc_type_class elf32_arc_reloc_type_class
2934
886a2506
NC
2935#define elf_backend_adjust_dynamic_symbol elf_arc_adjust_dynamic_symbol
2936#define elf_backend_finish_dynamic_symbol elf_arc_finish_dynamic_symbol
2937
2938#define elf_backend_finish_dynamic_sections elf_arc_finish_dynamic_sections
2939#define elf_backend_size_dynamic_sections elf_arc_size_dynamic_sections
08759e0f 2940#define elf_backend_add_symbol_hook elf_arc_add_symbol_hook
886a2506
NC
2941
2942#define elf_backend_can_gc_sections 1
2943#define elf_backend_want_got_plt 1
2944#define elf_backend_plt_readonly 1
34e967a5 2945#define elf_backend_rela_plts_and_copies_p 1
886a2506
NC
2946#define elf_backend_want_plt_sym 0
2947#define elf_backend_got_header_size 12
64f52338 2948#define elf_backend_dtrel_excludes_plt 1
886a2506
NC
2949
2950#define elf_backend_may_use_rel_p 0
2951#define elf_backend_may_use_rela_p 1
2952#define elf_backend_default_use_rela_p 1
252b5132 2953
47f7f636
AK
2954#define elf_backend_grok_prstatus elf32_arc_grok_prstatus
2955
3c8adaca
CZ
2956#define elf_backend_default_execstack 0
2957
53a346d8
CZ
2958#undef elf_backend_obj_attrs_vendor
2959#define elf_backend_obj_attrs_vendor "ARC"
2960#undef elf_backend_obj_attrs_section
2961#define elf_backend_obj_attrs_section ".ARC.attributes"
2962#undef elf_backend_obj_attrs_arg_type
2963#define elf_backend_obj_attrs_arg_type elf32_arc_obj_attrs_arg_type
2964#undef elf_backend_obj_attrs_section_type
2965#define elf_backend_obj_attrs_section_type SHT_ARC_ATTRIBUTES
07d6d2b8 2966#define elf_backend_obj_attrs_handle_unknown elf32_arc_obj_attrs_handle_unknown
53a346d8 2967
07d6d2b8 2968#define elf_backend_section_from_shdr elf32_arc_section_from_shdr
53a346d8 2969
252b5132 2970#include "elf32-target.h"