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