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