Add support for Score target.
[external/binutils.git] / bfd / elf32-score.c
1 /* 32-bit ELF support for S+core.
2    Copyright 2006 Free Software Foundation, Inc.
3    Contributed by
4    Mei Ligang (ligang@sunnorth.com.cn)
5    Pei-Lin Tsai (pltsai@sunplus.com)
6
7    This file is part of BFD, the Binary File Descriptor library.
8
9    This program is free software; you can redistribute it and/or modify
10    it under the terms of the GNU General Public License as published by
11    the Free Software Foundation; either version 2 of the License, or
12    (at your option) any later version.
13
14    This program is distributed in the hope that it will be useful,
15    but WITHOUT ANY WARRANTY; without even the implied warranty of
16    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17    GNU General Public License for more details.
18
19    You should have received a copy of the GNU General Public License
20    along with this program; if not, write to the Free Software
21    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
22
23 #include "bfd.h"
24 #include "sysdep.h"
25 #include "libbfd.h"
26 #include "libiberty.h"
27 #include "elf-bfd.h"
28 #include "elf/score.h"
29 #include "elf/common.h"
30 #include "elf/internal.h"
31 #include "hashtab.h"
32
33
34 /* Score ELF linker hash table.  */
35
36 struct score_elf_link_hash_table
37 {
38   /* The main hash table.  */
39   struct elf_link_hash_table root;
40 };
41
42 /* The SCORE ELF linker needs additional information for each symbol in
43    the global hash table.  */
44
45 struct score_elf_link_hash_entry
46 {
47   struct elf_link_hash_entry root;
48
49   /* Number of R_SCORE_ABS32, R_SCORE_REL32 relocs against this symbol.  */
50   unsigned int possibly_dynamic_relocs;
51
52   /* If the R_SCORE_ABS32, R_SCORE_REL32 reloc is against a readonly section.  */
53   bfd_boolean readonly_reloc;
54
55   /* We must not create a stub for a symbol that has relocations related to
56      taking the function's address, i.e. any but R_SCORE_CALL15 ones.  */
57   bfd_boolean no_fn_stub;
58
59   /* Are we forced local?  This will only be set if we have converted
60      the initial global GOT entry to a local GOT entry.  */
61   bfd_boolean forced_local;
62 };
63
64 /* Traverse a score ELF linker hash table.  */
65 #define score_elf_link_hash_traverse(table, func, info) \
66   (elf_link_hash_traverse \
67    (&(table)->root, \
68     (bfd_boolean (*) (struct elf_link_hash_entry *, void *)) (func), \
69     (info)))
70
71 /* Get the SCORE elf linker hash table from a link_info structure.  */
72 #define score_elf_hash_table(info) \
73   ((struct score_elf_link_hash_table *) ((info)->hash))
74
75 /* This structure is used to hold .got entries while estimating got sizes.  */
76 struct score_got_entry
77 {
78   /* The input bfd in which the symbol is defined.  */
79   bfd *abfd;
80   /* The index of the symbol, as stored in the relocation r_info, if
81      we have a local symbol; -1 otherwise.  */
82   long symndx;
83   union
84   {
85     /* If abfd == NULL, an address that must be stored in the got.  */
86     bfd_vma address;
87     /* If abfd != NULL && symndx != -1, the addend of the relocation
88        that should be added to the symbol value.  */
89     bfd_vma addend;
90     /* If abfd != NULL && symndx == -1, the hash table entry
91        corresponding to a global symbol in the got (or, local, if
92        h->forced_local).  */
93     struct score_elf_link_hash_entry *h;
94   } d;
95
96   /* The offset from the beginning of the .got section to the entry
97      corresponding to this symbol+addend.  If it's a global symbol
98      whose offset is yet to be decided, it's going to be -1.  */
99   long gotidx;
100 };
101
102 /* This structure is passed to score_elf_sort_hash_table_f when sorting
103    the dynamic symbols.  */
104
105 struct score_elf_hash_sort_data
106 {
107   /* The symbol in the global GOT with the lowest dynamic symbol table index.  */
108   struct elf_link_hash_entry *low;
109   /* The least dynamic symbol table index corresponding to a symbol with a GOT entry.  */
110   long min_got_dynindx;
111   /* The greatest dynamic symbol table index corresponding to a symbol
112      with a GOT entry that is not referenced (e.g., a dynamic symbol
113      with dynamic relocations pointing to it from non-primary GOTs).  */
114   long max_unref_got_dynindx;
115   /* The greatest dynamic symbol table index not corresponding to a
116      symbol without a GOT entry.  */
117   long max_non_got_dynindx;
118 };
119
120 struct score_got_info
121 {
122   /* The global symbol in the GOT with the lowest index in the dynamic
123      symbol table.  */
124   struct elf_link_hash_entry *global_gotsym;
125   /* The number of global .got entries.  */
126   unsigned int global_gotno;
127   /* The number of local .got entries.  */
128   unsigned int local_gotno;
129   /* The number of local .got entries we have used.  */
130   unsigned int assigned_gotno;
131   /* A hash table holding members of the got.  */
132   struct htab *got_entries;
133   /* In multi-got links, a pointer to the next got (err, rather, most
134      of the time, it points to the previous got).  */
135   struct score_got_info *next;
136 };
137
138 /* A structure used to count GOT entries, for GOT entry or ELF symbol table traversal.  */
139 struct _score_elf_section_data
140 {
141   struct bfd_elf_section_data elf;
142   union
143   {
144     struct score_got_info *got_info;
145     bfd_byte *tdata;
146   }
147   u;
148 };
149
150 #define score_elf_section_data(sec) \
151   ((struct _score_elf_section_data *) elf_section_data (sec))
152
153 /* The size of a symbol-table entry.  */
154 #define SCORE_ELF_SYM_SIZE(abfd)  \
155   (get_elf_backend_data (abfd)->s->sizeof_sym)
156
157 /* In case we're on a 32-bit machine, construct a 64-bit "-1" value
158    from smaller values.  Start with zero, widen, *then* decrement.  */
159 #define MINUS_ONE (((bfd_vma)0) - 1)
160 #define MINUS_TWO (((bfd_vma)0) - 2)
161
162 #define PDR_SIZE 32
163
164
165 /* The number of local .got entries we reserve.  */
166 #define SCORE_RESERVED_GOTNO (2)
167 #define ELF_DYNAMIC_INTERPRETER     "/usr/lib/ld.so.1"
168
169 /* The offset of $gp from the beginning of the .got section.  */
170 #define ELF_SCORE_GP_OFFSET(abfd) (0x3ff0)
171 /* The maximum size of the GOT for it to be addressable using 15-bit offsets from $gp.  */
172 #define SCORE_ELF_GOT_MAX_SIZE(abfd) (ELF_SCORE_GP_OFFSET(abfd) + 0x3fff)
173
174 #define SCORE_ELF_STUB_SECTION_NAME  (".SCORE.stub")
175 #define SCORE_FUNCTION_STUB_SIZE (16)
176
177 #define STUB_LW      0xc3bcc010     /* lw r29, [r28, -0x3ff0]  */
178 #define STUB_MOVE    0x8363bc56     /* mv r27, r3  */
179 #define STUB_LI16    0x87548000     /* ori r26, .dynsym_index  */
180 #define STUB_BRL     0x801dbc09     /* brl r29  */
181
182 #define SCORE_ELF_GOT_SIZE(abfd)   \
183   (get_elf_backend_data (abfd)->s->arch_size / 8)
184
185 #define SCORE_ELF_ADD_DYNAMIC_ENTRY(info, tag, val) \
186         (_bfd_elf_add_dynamic_entry (info, (bfd_vma) tag, (bfd_vma) val))
187
188 /* The size of an external dynamic table entry.  */
189 #define SCORE_ELF_DYN_SIZE(abfd) \
190   (get_elf_backend_data (abfd)->s->sizeof_dyn)
191
192 /* The size of an external REL relocation.  */
193 #define SCORE_ELF_REL_SIZE(abfd) \
194   (get_elf_backend_data (abfd)->s->sizeof_rel)
195
196 /* The default alignment for sections, as a power of two.  */
197 #define SCORE_ELF_LOG_FILE_ALIGN(abfd)\
198   (get_elf_backend_data (abfd)->s->log_file_align)
199
200 #ifndef NUM_ELEM
201 #define NUM_ELEM(a)  (sizeof (a) / (sizeof (a)[0]))
202 #endif
203
204 static bfd_byte *hi16_rel_addr;
205
206 /* This will be used when we sort the dynamic relocation records.  */
207 static bfd *reldyn_sorting_bfd;
208
209 /* SCORE ELF uses two common sections.  One is the usual one, and the
210    other is for small objects.  All the small objects are kept
211    together, and then referenced via the gp pointer, which yields
212    faster assembler code.  This is what we use for the small common
213    section.  This approach is copied from ecoff.c.  */
214 static asection score_elf_scom_section;
215 static asymbol  score_elf_scom_symbol;
216 static asymbol  *score_elf_scom_symbol_ptr;
217
218 static bfd_reloc_status_type
219 score_elf_hi16_reloc (bfd *abfd ATTRIBUTE_UNUSED,
220                       arelent *reloc_entry,
221                       asymbol *symbol ATTRIBUTE_UNUSED,
222                       void * data,
223                       asection *input_section ATTRIBUTE_UNUSED,
224                       bfd *output_bfd ATTRIBUTE_UNUSED,
225                       char **error_message ATTRIBUTE_UNUSED)
226 {
227   hi16_rel_addr = (bfd_byte *) data + reloc_entry->address;
228   return bfd_reloc_ok;
229 }
230
231 static bfd_reloc_status_type
232 score_elf_lo16_reloc (bfd *abfd,
233                       arelent *reloc_entry,
234                       asymbol *symbol ATTRIBUTE_UNUSED,
235                       void * data,
236                       asection *input_section,
237                       bfd *output_bfd ATTRIBUTE_UNUSED,
238                       char **error_message ATTRIBUTE_UNUSED)
239 {
240   bfd_vma addend = 0, offset = 0;
241   unsigned long val;
242   unsigned long hi16_offset, hi16_value, uvalue;
243
244   hi16_value = bfd_get_32 (abfd, hi16_rel_addr);
245   hi16_offset = ((((hi16_value >> 16) & 0x3) << 15) | (hi16_value & 0x7fff)) >> 1;
246   addend = bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address);
247   offset = ((((addend >> 16) & 0x3) << 15) | (addend & 0x7fff)) >> 1;
248   val = reloc_entry->addend;
249   if (reloc_entry->address > input_section->size)
250     return bfd_reloc_outofrange;
251   uvalue = ((hi16_offset << 16) | (offset & 0xffff)) + val;
252   hi16_offset = (uvalue >> 16) << 1;
253   hi16_value = (hi16_value & ~0x37fff) | (hi16_offset & 0x7fff) | ((hi16_offset << 1) & 0x30000);
254   bfd_put_32 (abfd, hi16_value, hi16_rel_addr);
255   offset = (uvalue & 0xffff) << 1;
256   addend = (addend & ~0x37fff) | (offset & 0x7fff) | ((offset << 1) & 0x30000);
257   bfd_put_32 (abfd, addend, (bfd_byte *) data + reloc_entry->address);
258   return bfd_reloc_ok;
259 }
260
261 /* Set the GP value for OUTPUT_BFD.  Returns FALSE if this is a
262    dangerous relocation.  */
263
264 static bfd_boolean
265 score_elf_assign_gp (bfd *output_bfd, bfd_vma *pgp)
266 {
267   unsigned int count;
268   asymbol **sym;
269   unsigned int i;
270
271   /* If we've already figured out what GP will be, just return it.  */
272   *pgp = _bfd_get_gp_value (output_bfd);
273   if (*pgp)
274     return TRUE;
275
276   count = bfd_get_symcount (output_bfd);
277   sym = bfd_get_outsymbols (output_bfd);
278
279   /* The linker script will have created a symbol named `_gp' with the
280      appropriate value.  */
281   if (sym == NULL)
282     i = count;
283   else
284     {
285       for (i = 0; i < count; i++, sym++)
286         {
287           const char *name;
288
289           name = bfd_asymbol_name (*sym);
290           if (*name == '_' && strcmp (name, "_gp") == 0)
291             {
292               *pgp = bfd_asymbol_value (*sym);
293               _bfd_set_gp_value (output_bfd, *pgp);
294               break;
295             }
296         }
297     }
298
299   if (i >= count)
300     {
301       /* Only get the error once.  */
302       *pgp = 4;
303       _bfd_set_gp_value (output_bfd, *pgp);
304       return FALSE;
305     }
306
307   return TRUE;
308 }
309
310 /* We have to figure out the gp value, so that we can adjust the
311    symbol value correctly.  We look up the symbol _gp in the output
312    BFD.  If we can't find it, we're stuck.  We cache it in the ELF
313    target data.  We don't need to adjust the symbol value for an
314    external symbol if we are producing relocatable output.  */
315
316 static bfd_reloc_status_type
317 score_elf_final_gp (bfd *output_bfd,
318                     asymbol *symbol,
319                     bfd_boolean relocatable,
320                     char **error_message,
321                     bfd_vma *pgp)
322 {
323   if (bfd_is_und_section (symbol->section)
324       && ! relocatable)
325     {
326       *pgp = 0;
327       return bfd_reloc_undefined;
328     }
329
330   *pgp = _bfd_get_gp_value (output_bfd);
331   if (*pgp == 0
332       && (! relocatable
333           || (symbol->flags & BSF_SECTION_SYM) != 0))
334     {
335       if (relocatable)
336         {
337           /* Make up a value.  */
338           *pgp = symbol->section->output_section->vma + 0x4000;
339           _bfd_set_gp_value (output_bfd, *pgp);
340         }
341       else if (!score_elf_assign_gp (output_bfd, pgp))
342         {
343             *error_message =
344               (char *) _("GP relative relocation when _gp not defined");
345             return bfd_reloc_dangerous;
346         }
347     }
348
349   return bfd_reloc_ok;
350 }
351
352 static bfd_reloc_status_type
353 score_elf_gprel15_with_gp (bfd *abfd,
354                            asymbol *symbol,
355                            arelent *reloc_entry,
356                            asection *input_section,
357                            bfd_boolean relocateable,
358                            void * data,
359                            bfd_vma gp ATTRIBUTE_UNUSED)
360 {
361   bfd_vma relocation;
362   unsigned long insn;
363
364   if (bfd_is_com_section (symbol->section))
365     relocation = 0;
366   else
367     relocation = symbol->value;
368
369   relocation += symbol->section->output_section->vma;
370   relocation += symbol->section->output_offset;
371   if (reloc_entry->address > input_section->size)
372     return bfd_reloc_outofrange;
373
374   insn = bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address);
375   if (((reloc_entry->addend & 0xffffc000) != 0)
376       && ((reloc_entry->addend & 0xffffc000) != 0xffffc000))
377     return bfd_reloc_overflow;
378
379   insn = (insn & ~0x7fff) | (reloc_entry->addend & 0x7fff);
380   bfd_put_32 (abfd, insn, (bfd_byte *) data + reloc_entry->address);
381   if (relocateable)
382     reloc_entry->address += input_section->output_offset;
383
384   return bfd_reloc_ok;
385 }
386
387 static bfd_reloc_status_type
388 gprel32_with_gp (bfd *abfd, asymbol *symbol, arelent *reloc_entry,
389                  asection *input_section, bfd_boolean relocatable,
390                  void *data, bfd_vma gp)
391 {
392   bfd_vma relocation;
393   bfd_vma val;
394
395   if (bfd_is_com_section (symbol->section))
396     relocation = 0;
397   else
398     relocation = symbol->value;
399
400   relocation += symbol->section->output_section->vma;
401   relocation += symbol->section->output_offset;
402
403   if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
404     return bfd_reloc_outofrange;
405
406   /* Set val to the offset into the section or symbol.  */
407   val = reloc_entry->addend;
408
409   if (reloc_entry->howto->partial_inplace)
410     val += bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address);
411
412   /* Adjust val for the final section location and GP value.  If we
413      are producing relocatable output, we don't want to do this for
414      an external symbol.  */
415   if (! relocatable
416       || (symbol->flags & BSF_SECTION_SYM) != 0)
417     val += relocation - gp;
418
419   if (reloc_entry->howto->partial_inplace)
420     bfd_put_32 (abfd, val, (bfd_byte *) data + reloc_entry->address);
421   else
422     reloc_entry->addend = val;
423
424   if (relocatable)
425     reloc_entry->address += input_section->output_offset;
426
427   return bfd_reloc_ok;
428 }
429
430 static bfd_reloc_status_type
431 score_elf_gprel15_reloc (bfd *abfd,
432                          arelent *reloc_entry,
433                          asymbol *symbol,
434                          void * data,
435                          asection *input_section,
436                          bfd *output_bfd,
437                          char **error_message)
438 {
439   bfd_boolean relocateable;
440   bfd_reloc_status_type ret;
441   bfd_vma gp;
442
443   if (output_bfd != (bfd *) NULL
444       && (symbol->flags & BSF_SECTION_SYM) == 0 && reloc_entry->addend == 0)
445     {
446       reloc_entry->address += input_section->output_offset;
447       return bfd_reloc_ok;
448     }
449   if (output_bfd != (bfd *) NULL)
450     relocateable = TRUE;
451   else
452     {
453       relocateable = FALSE;
454       output_bfd = symbol->section->output_section->owner;
455     }
456
457   ret = score_elf_final_gp (output_bfd, symbol, relocateable, error_message, &gp);
458   if (ret != bfd_reloc_ok)
459     return ret;
460
461   return score_elf_gprel15_with_gp (abfd, symbol, reloc_entry,
462                                          input_section, relocateable, data, gp);
463 }
464
465 /* Do a R_SCORE_GPREL32 relocation.  This is a 32 bit value which must
466    become the offset from the gp register.  */
467
468 static bfd_reloc_status_type
469 score_elf_gprel32_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
470                         void *data, asection *input_section, bfd *output_bfd,
471                         char **error_message)
472 {
473   bfd_boolean relocatable;
474   bfd_reloc_status_type ret;
475   bfd_vma gp;
476
477   /* R_SCORE_GPREL32 relocations are defined for local symbols only.  */
478   if (output_bfd != NULL
479       && (symbol->flags & BSF_SECTION_SYM) == 0
480       && (symbol->flags & BSF_LOCAL) != 0)
481     {
482       *error_message = (char *)
483         _("32bits gp relative relocation occurs for an external symbol");
484       return bfd_reloc_outofrange;
485     }
486
487   if (output_bfd != NULL)
488     relocatable = TRUE;
489   else
490     {
491       relocatable = FALSE;
492       output_bfd = symbol->section->output_section->owner;
493     }
494
495   ret = score_elf_final_gp (output_bfd, symbol, relocatable, error_message, &gp);
496   if (ret != bfd_reloc_ok)
497     return ret;
498
499   gp = 0;   /* FIXME.  */
500   return gprel32_with_gp (abfd, symbol, reloc_entry, input_section,
501                           relocatable, data, gp);
502 }
503
504 /* A howto special_function for R_SCORE_GOT15 relocations.  This is just
505    like any other 16-bit relocation when applied to global symbols, but is
506    treated in the same as R_SCORE_HI16 when applied to local symbols.  */
507
508 static bfd_reloc_status_type
509 score_elf_got15_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
510                        void *data, asection *input_section,
511                        bfd *output_bfd, char **error_message)
512 {
513   if ((symbol->flags & (BSF_GLOBAL | BSF_WEAK)) != 0
514       || bfd_is_und_section (bfd_get_section (symbol))
515       || bfd_is_com_section (bfd_get_section (symbol)))
516     /* The relocation is against a global symbol.  */
517     return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
518                                   input_section, output_bfd,
519                                   error_message);
520
521   return score_elf_hi16_reloc (abfd, reloc_entry, symbol, data,
522                                input_section, output_bfd, error_message);
523 }
524
525 static bfd_reloc_status_type
526 score_elf_got_lo16_reloc (bfd *abfd,
527                           arelent *reloc_entry,
528                           asymbol *symbol ATTRIBUTE_UNUSED,
529                           void * data,
530                           asection *input_section,
531                           bfd *output_bfd ATTRIBUTE_UNUSED,
532                           char **error_message ATTRIBUTE_UNUSED)
533 {
534   bfd_vma addend = 0, offset = 0;
535   unsigned long val;
536   unsigned long hi16_offset, hi16_value, uvalue;
537
538   hi16_value = bfd_get_32 (abfd, hi16_rel_addr);
539   hi16_offset = ((((hi16_value >> 16) & 0x3) << 15) | (hi16_value & 0x7fff)) >> 1;
540   addend = bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address);
541   offset = ((((addend >> 16) & 0x3) << 15) | (addend & 0x7fff)) >> 1;
542   val = reloc_entry->addend;
543   if (reloc_entry->address > input_section->size)
544     return bfd_reloc_outofrange;
545   uvalue = ((hi16_offset << 16) | (offset & 0xffff)) + val;
546   hi16_offset = (uvalue >> 16) & 0x7fff;
547   hi16_value = (hi16_value & ~0x37fff) | (hi16_offset & 0x7fff) | ((hi16_offset << 1) & 0x30000);
548   bfd_put_32 (abfd, hi16_value, hi16_rel_addr);
549   offset = (uvalue & 0xffff) << 1;
550   addend = (addend & ~0x37fff) | (offset & 0x7fff) | ((offset << 1) & 0x30000);
551   bfd_put_32 (abfd, addend, (bfd_byte *) data + reloc_entry->address);
552   return bfd_reloc_ok;
553 }
554
555 static reloc_howto_type elf32_score_howto_table[] =
556 {
557   /* No relocation.  */
558   HOWTO (R_SCORE_NONE,          /* type */
559          0,                     /* rightshift */
560          0,                     /* size (0 = byte, 1 = short, 2 = long) */
561          0,                     /* bitsize */
562          FALSE,                 /* pc_relative */
563          0,                     /* bitpos */
564          complain_overflow_dont,/* complain_on_overflow */
565          bfd_elf_generic_reloc, /* special_function */
566          "R_SCORE_NONE",        /* name */
567          FALSE,                 /* partial_inplace */
568          0,                     /* src_mask */
569          0,                     /* dst_mask */
570          FALSE),                /* pcrel_offset */
571
572   /* R_SCORE_HI16 */
573   HOWTO (R_SCORE_HI16,          /* type */
574          0,                     /* rightshift */
575          2,                     /* size (0 = byte, 1 = short, 2 = long) */
576          16,                    /* bitsize */
577          FALSE,                 /* pc_relative */
578          1,                     /* bitpos */
579          complain_overflow_dont,/* complain_on_overflow */
580          score_elf_hi16_reloc,  /* special_function */
581          "R_SCORE_HI16",        /* name */
582          TRUE,                  /* partial_inplace */
583          0x37fff,               /* src_mask */
584          0x37fff,               /* dst_mask */
585          FALSE),                /* pcrel_offset */
586
587   /* R_SCORE_LO16 */
588   HOWTO (R_SCORE_LO16,          /* type */
589          0,                     /* rightshift */
590          2,                     /* size (0 = byte, 1 = short, 2 = long) */
591          16,                    /* bitsize */
592          FALSE,                 /* pc_relative */
593          1,                     /* bitpos */
594          complain_overflow_dont,/* complain_on_overflow */
595          score_elf_lo16_reloc,  /* special_function */
596          "R_SCORE_LO16",        /* name */
597          TRUE,                  /* partial_inplace */
598          0x37fff,               /* src_mask */
599          0x37fff,               /* dst_mask */
600          FALSE),                /* pcrel_offset */
601
602   /*  R_SCORE_DUMMY1 */
603   HOWTO (R_SCORE_DUMMY1,        /* type */
604          0,                     /* rightshift */
605          2,                     /* size (0 = byte, 1 = short, 2 = long) */
606          16,                    /* bitsize */
607          FALSE,                 /* pc_relative */
608          1,                     /* bitpos */
609          complain_overflow_dont,/* complain_on_overflow */
610          bfd_elf_generic_reloc, /* special_function */
611          "R_SCORE_DUMMY1",      /* name */
612          TRUE,                  /* partial_inplace */
613          0x0000ffff,            /* src_mask */
614          0x0000ffff,            /* dst_mask */
615          FALSE),                /* pcrel_offset */
616
617   /*R_SCORE_24 */
618   HOWTO (R_SCORE_24,            /* type */
619          1,                     /* rightshift */
620          2,                     /* size (0 = byte, 1 = short, 2 = long) */
621          24,                    /* bitsize */
622          FALSE,                 /* pc_relative */
623          1,                     /* bitpos */
624          complain_overflow_dont,/* complain_on_overflow */
625          bfd_elf_generic_reloc, /* special_function */
626          "R_SCORE_24",          /* name */
627          FALSE,                 /* partial_inplace */
628          0x3ff7fff,             /* src_mask */
629          0x3ff7fff,             /* dst_mask */
630          FALSE),                /* pcrel_offset */
631
632   /*R_SCORE_PC19 */
633   HOWTO (R_SCORE_PC19,          /* type */
634          1,                     /* rightshift */
635          2,                     /* size (0 = byte, 1 = short, 2 = long) */
636          19,                    /* bitsize */
637          TRUE,                  /* pc_relative */
638          1,                     /* bitpos */
639          complain_overflow_dont,/* complain_on_overflow */
640          bfd_elf_generic_reloc, /* special_function */
641          "R_SCORE_PC19",        /* name */
642          FALSE,                 /* partial_inplace */
643          0x3ff03fe,             /* src_mask */
644          0x3ff03fe,             /* dst_mask */
645          FALSE),                /* pcrel_offset */
646
647   /*R_SCORE16_11 */
648   HOWTO (R_SCORE16_11,          /* type */
649          1,                     /* rightshift */
650          1,                     /* size (0 = byte, 1 = short, 2 = long) */
651          11,                    /* bitsize */
652          FALSE,                 /* pc_relative */
653          1,                     /* bitpos */
654          complain_overflow_dont,/* complain_on_overflow */
655          bfd_elf_generic_reloc, /* special_function */
656          "R_SCORE16_11",        /* name */
657          FALSE,                 /* partial_inplace */
658          0x000000ffe,           /* src_mask */
659          0x000000ffe,           /* dst_mask */
660          FALSE),                /* pcrel_offset */
661
662   /* R_SCORE16_PC8 */
663   HOWTO (R_SCORE16_PC8,         /* type */
664          1,                     /* rightshift */
665          1,                     /* size (0 = byte, 1 = short, 2 = long) */
666          8,                     /* bitsize */
667          TRUE,                  /* pc_relative */
668          0,                     /* bitpos */
669          complain_overflow_dont,/* complain_on_overflow */
670          bfd_elf_generic_reloc, /* special_function */
671          "R_SCORE16_PC8",       /* name */
672          FALSE,                 /* partial_inplace */
673          0x000000ff,            /* src_mask */
674          0x000000ff,            /* dst_mask */
675          FALSE),                /* pcrel_offset */
676
677   /* 32 bit absolute */
678   HOWTO (R_SCORE_ABS32,         /* type  8 */
679          0,                     /* rightshift */
680          2,                     /* size (0 = byte, 1 = short, 2 = long) */
681          32,                    /* bitsize */
682          FALSE,                 /* pc_relative */
683          0,                     /* bitpos */
684          complain_overflow_bitfield,    /* complain_on_overflow */
685          bfd_elf_generic_reloc, /* special_function */
686          "R_SCORE_ABS32",       /* name */
687          FALSE,                 /* partial_inplace */
688          0xffffffff,            /* src_mask */
689          0xffffffff,            /* dst_mask */
690          FALSE),                /* pcrel_offset */
691
692   /* 16 bit absolute */
693   HOWTO (R_SCORE_ABS16,         /* type 11 */
694          0,                     /* rightshift */
695          1,                     /* size (0 = byte, 1 = short, 2 = long) */
696          16,                    /* bitsize */
697          FALSE,                 /* pc_relative */
698          0,                     /* bitpos */
699          complain_overflow_bitfield,    /* complain_on_overflow */
700          bfd_elf_generic_reloc, /* special_function */
701          "R_SCORE_ABS16",       /* name */
702          FALSE,                 /* partial_inplace */
703          0x0000ffff,            /* src_mask */
704          0x0000ffff,            /* dst_mask */
705          FALSE),                /* pcrel_offset */
706
707   /* R_SCORE_DUMMY2 */
708   HOWTO (R_SCORE_DUMMY2,        /* type */
709          0,                     /* rightshift */
710          2,                     /* size (0 = byte, 1 = short, 2 = long) */
711          16,                    /* bitsize */
712          FALSE,                 /* pc_relative */
713          0,                     /* bitpos */
714          complain_overflow_dont,/* complain_on_overflow */
715          bfd_elf_generic_reloc, /* special_function */
716          "R_SCORE_DUMMY2",      /* name */
717          TRUE,                  /* partial_inplace */
718          0x00007fff,            /* src_mask */
719          0x00007fff,            /* dst_mask */
720          FALSE),                /* pcrel_offset */
721
722   /* R_SCORE_GP15 */
723   HOWTO (R_SCORE_GP15,          /* type */
724          0,                     /* rightshift */
725          2,                     /* size (0 = byte, 1 = short, 2 = long) */
726          16,                    /* bitsize */
727          FALSE,                 /* pc_relative */
728          0,                     /* bitpos */
729          complain_overflow_dont,/* complain_on_overflow */
730          score_elf_gprel15_reloc,/* special_function */
731          "R_SCORE_GP15",        /* name */
732          TRUE,                  /* partial_inplace */
733          0x00007fff,            /* src_mask */
734          0x00007fff,            /* dst_mask */
735          FALSE),                /* pcrel_offset */
736
737   /* GNU extension to record C++ vtable hierarchy.  */
738   HOWTO (R_SCORE_GNU_VTINHERIT, /* type */
739          0,                     /* rightshift */
740          2,                     /* size (0 = byte, 1 = short, 2 = long) */
741          0,                     /* bitsize */
742          FALSE,                 /* pc_relative */
743          0,                     /* bitpos */
744          complain_overflow_dont,/* complain_on_overflow */
745          NULL,                  /* special_function */
746          "R_SCORE_GNU_VTINHERIT",       /* name */
747          FALSE,                 /* partial_inplace */
748          0,                     /* src_mask */
749          0,                     /* dst_mask */
750          FALSE),                /* pcrel_offset */
751
752   /* GNU extension to record C++ vtable member usage */
753   HOWTO (R_SCORE_GNU_VTENTRY,   /* type */
754          0,                     /* rightshift */
755          2,                     /* size (0 = byte, 1 = short, 2 = long) */
756          0,                     /* bitsize */
757          FALSE,                 /* pc_relative */
758          0,                     /* bitpos */
759          complain_overflow_dont,/* complain_on_overflow */
760          _bfd_elf_rel_vtable_reloc_fn,  /* special_function */
761          "R_SCORE_GNU_VTENTRY", /* name */
762          FALSE,                 /* partial_inplace */
763          0,                     /* src_mask */
764          0,                     /* dst_mask */
765          FALSE),                /* pcrel_offset */
766
767   /* Reference to global offset table.  */
768   HOWTO (R_SCORE_GOT15,         /* type */
769          0,                     /* rightshift */
770          2,                     /* size (0 = byte, 1 = short, 2 = long) */
771          16,                    /* bitsize */
772          FALSE,                 /* pc_relative */
773          0,                     /* bitpos */
774          complain_overflow_signed,      /* complain_on_overflow */
775          score_elf_got15_reloc, /* special_function */
776          "R_SCORE_GOT15",       /* name */
777          TRUE,                  /* partial_inplace */
778          0x00007fff,            /* src_mask */
779          0x00007fff,            /* dst_mask */
780          FALSE),                /* pcrel_offset */
781
782   /* Low 16 bits of displacement in global offset table.  */
783   HOWTO (R_SCORE_GOT_LO16,      /* type */
784          0,                     /* rightshift */
785          2,                     /* size (0 = byte, 1 = short, 2 = long) */
786          16,                    /* bitsize */
787          FALSE,                 /* pc_relative */
788          1,                     /* bitpos */
789          complain_overflow_dont,/* complain_on_overflow */
790          score_elf_got_lo16_reloc, /* special_function */
791          "R_SCORE_GOT_LO16",    /* name */
792          TRUE,                  /* partial_inplace */
793          0x37ffe,               /* src_mask */
794          0x37ffe,               /* dst_mask */
795          FALSE),                /* pcrel_offset */
796
797   /* 15 bit call through global offset table.  */
798   HOWTO (R_SCORE_CALL15,        /* type */
799          0,                     /* rightshift */
800          2,                     /* size (0 = byte, 1 = short, 2 = long) */
801          16,                    /* bitsize */
802          FALSE,                 /* pc_relative */
803          0,                     /* bitpos */
804          complain_overflow_signed, /* complain_on_overflow */
805          bfd_elf_generic_reloc, /* special_function */
806          "R_SCORE_CALL15",      /* name */
807          TRUE,                  /* partial_inplace */
808          0x0000ffff,            /* src_mask */
809          0x0000ffff,            /* dst_mask */
810          FALSE),                /* pcrel_offset */
811
812   /* 32 bit GP relative reference.  */
813   HOWTO (R_SCORE_GPREL32,       /* type */
814          0,                     /* rightshift */
815          2,                     /* size (0 = byte, 1 = short, 2 = long) */
816          32,                    /* bitsize */
817          FALSE,                 /* pc_relative */
818          0,                     /* bitpos */
819          complain_overflow_dont,/* complain_on_overflow */
820          score_elf_gprel32_reloc, /* special_function */
821          "R_SCORE_GPREL32",     /* name */
822          TRUE,                  /* partial_inplace */
823          0xffffffff,            /* src_mask */
824          0xffffffff,            /* dst_mask */
825          FALSE),                /* pcrel_offset */
826
827   /* 32 bit symbol relative relocation.  */
828   HOWTO (R_SCORE_REL32,         /* type */
829          0,                     /* rightshift */
830          2,                     /* size (0 = byte, 1 = short, 2 = long) */
831          32,                    /* bitsize */
832          FALSE,                 /* pc_relative */
833          0,                     /* bitpos */
834          complain_overflow_dont,/* complain_on_overflow */
835          bfd_elf_generic_reloc, /* special_function */
836          "R_SCORE_REL32",       /* name */
837          TRUE,                  /* partial_inplace */
838          0xffffffff,            /* src_mask */
839          0xffffffff,            /* dst_mask */
840          FALSE),                /* pcrel_offset */
841
842   /* R_SCORE_DUMMY_HI16 */
843   HOWTO (R_SCORE_DUMMY_HI16,    /* type */
844          0,                     /* rightshift */
845          2,                     /* size (0 = byte, 1 = short, 2 = long) */
846          16,                    /* bitsize */
847          FALSE,                 /* pc_relative */
848          1,                     /* bitpos */
849          complain_overflow_dont,/* complain_on_overflow */
850          score_elf_hi16_reloc,  /* special_function */
851          "R_SCORE_DUMMY_HI16",  /* name */
852          TRUE,                  /* partial_inplace */
853          0x37fff,               /* src_mask */
854          0x37fff,               /* dst_mask */
855          FALSE),                /* pcrel_offset */
856 };
857
858 struct score_reloc_map
859 {
860   bfd_reloc_code_real_type bfd_reloc_val;
861   unsigned char elf_reloc_val;
862 };
863
864 static const struct score_reloc_map elf32_score_reloc_map[] =
865 {
866   {BFD_RELOC_NONE,               R_SCORE_NONE},
867   {BFD_RELOC_HI16_S,             R_SCORE_HI16},
868   {BFD_RELOC_LO16,               R_SCORE_LO16},
869   {BFD_RELOC_SCORE_DUMMY1,       R_SCORE_DUMMY1},
870   {BFD_RELOC_SCORE_JMP,          R_SCORE_24},
871   {BFD_RELOC_SCORE_BRANCH,       R_SCORE_PC19},
872   {BFD_RELOC_SCORE16_JMP,        R_SCORE16_11},
873   {BFD_RELOC_SCORE16_BRANCH,     R_SCORE16_PC8},
874   {BFD_RELOC_32,                 R_SCORE_ABS32},
875   {BFD_RELOC_16,                 R_SCORE_ABS16},
876   {BFD_RELOC_SCORE_DUMMY2,       R_SCORE_DUMMY2},
877   {BFD_RELOC_SCORE_GPREL15,      R_SCORE_GP15},
878   {BFD_RELOC_VTABLE_INHERIT,     R_SCORE_GNU_VTINHERIT},
879   {BFD_RELOC_VTABLE_ENTRY,       R_SCORE_GNU_VTENTRY},
880   {BFD_RELOC_SCORE_GOT15,        R_SCORE_GOT15},
881   {BFD_RELOC_SCORE_GOT_LO16,     R_SCORE_GOT_LO16},
882   {BFD_RELOC_SCORE_CALL15,       R_SCORE_CALL15},
883   {BFD_RELOC_GPREL32,            R_SCORE_GPREL32},
884   {BFD_RELOC_32_PCREL,           R_SCORE_REL32},
885   {BFD_RELOC_SCORE_DUMMY_HI16,   R_SCORE_DUMMY_HI16},
886 };
887
888 /* got_entries only match if they're identical, except for gotidx, so
889    use all fields to compute the hash, and compare the appropriate
890    union members.  */
891
892 static hashval_t
893 score_elf_got_entry_hash (const void *entry_)
894 {
895   const struct score_got_entry *entry = (struct score_got_entry *)entry_;
896
897   return entry->symndx
898     + (!entry->abfd ? entry->d.address : entry->abfd->id);
899 }
900
901 static int
902 score_elf_got_entry_eq (const void *entry1, const void *entry2)
903 {
904   const struct score_got_entry *e1 = (struct score_got_entry *)entry1;
905   const struct score_got_entry *e2 = (struct score_got_entry *)entry2;
906
907   return e1->abfd == e2->abfd && e1->symndx == e2->symndx
908     && (! e1->abfd ? e1->d.address == e2->d.address
909         : e1->symndx >= 0 ? e1->d.addend == e2->d.addend
910         : e1->d.h == e2->d.h);
911 }
912
913 /* If H needs a GOT entry, assign it the highest available dynamic
914    index.  Otherwise, assign it the lowest available dynamic
915    index.  */
916
917 static bfd_boolean
918 score_elf_sort_hash_table_f (struct score_elf_link_hash_entry *h, void *data)
919 {
920   struct score_elf_hash_sort_data *hsd = data;
921
922   if (h->root.root.type == bfd_link_hash_warning)
923     h = (struct score_elf_link_hash_entry *) h->root.root.u.i.link;
924
925   /* Symbols without dynamic symbol table entries aren't interesting at all.  */
926   if (h->root.dynindx == -1)
927     return TRUE;
928
929   /* Global symbols that need GOT entries that are not explicitly
930      referenced are marked with got offset 2.  Those that are
931      referenced get a 1, and those that don't need GOT entries get
932      -1.  */
933   if (h->root.got.offset == 2)
934     {
935       if (hsd->max_unref_got_dynindx == hsd->min_got_dynindx)
936         hsd->low = (struct elf_link_hash_entry *) h;
937       h->root.dynindx = hsd->max_unref_got_dynindx++;
938     }
939   else if (h->root.got.offset != 1)
940     h->root.dynindx = hsd->max_non_got_dynindx++;
941   else
942     {
943       h->root.dynindx = --hsd->min_got_dynindx;
944       hsd->low = (struct elf_link_hash_entry *) h;
945     }
946
947   return TRUE;
948 }
949
950 static asection *
951 score_elf_got_section (bfd *abfd, bfd_boolean maybe_excluded)
952 {
953   asection *sgot = bfd_get_section_by_name (abfd, ".got");
954
955   if (sgot == NULL || (! maybe_excluded && (sgot->flags & SEC_EXCLUDE) != 0))
956     return NULL;
957   return sgot;
958 }
959
960 /* Returns the GOT information associated with the link indicated by
961    INFO.  If SGOTP is non-NULL, it is filled in with the GOT section.  */
962
963 static struct score_got_info *
964 score_elf_got_info (bfd *abfd, asection **sgotp)
965 {
966   asection *sgot;
967   struct score_got_info *g;
968
969   sgot = score_elf_got_section (abfd, TRUE);
970   BFD_ASSERT (sgot != NULL);
971   BFD_ASSERT (elf_section_data (sgot) != NULL);
972   g = score_elf_section_data (sgot)->u.got_info;
973   BFD_ASSERT (g != NULL);
974
975   if (sgotp)
976     *sgotp = sgot;
977   return g;
978 }
979
980 /* Sort the dynamic symbol table so that symbols that need GOT entries
981    appear towards the end.  This reduces the amount of GOT space
982    required.  MAX_LOCAL is used to set the number of local symbols
983    known to be in the dynamic symbol table.  During
984    _bfd_score_elf_size_dynamic_sections, this value is 1.  Afterward, the
985    section symbols are added and the count is higher.  */
986
987 static bfd_boolean
988 score_elf_sort_hash_table (struct bfd_link_info *info,
989                            unsigned long max_local)
990 {
991   struct score_elf_hash_sort_data hsd;
992   struct score_got_info *g;
993   bfd *dynobj;
994
995   dynobj = elf_hash_table (info)->dynobj;
996
997   g = score_elf_got_info (dynobj, NULL);
998
999   hsd.low = NULL;
1000   hsd.max_unref_got_dynindx =
1001     hsd.min_got_dynindx = elf_hash_table (info)->dynsymcount
1002     /* In the multi-got case, assigned_gotno of the master got_info
1003        indicate the number of entries that aren't referenced in the
1004        primary GOT, but that must have entries because there are
1005        dynamic relocations that reference it.  Since they aren't
1006        referenced, we move them to the end of the GOT, so that they
1007        don't prevent other entries that are referenced from getting
1008        too large offsets.  */
1009     - (g->next ? g->assigned_gotno : 0);
1010   hsd.max_non_got_dynindx = max_local;
1011   score_elf_link_hash_traverse (((struct score_elf_link_hash_table *)
1012                                  elf_hash_table (info)),
1013                                  score_elf_sort_hash_table_f,
1014                                  &hsd);
1015
1016   /* There should have been enough room in the symbol table to
1017      accommodate both the GOT and non-GOT symbols.  */
1018   BFD_ASSERT (hsd.max_non_got_dynindx <= hsd.min_got_dynindx);
1019   BFD_ASSERT ((unsigned long)hsd.max_unref_got_dynindx
1020               <= elf_hash_table (info)->dynsymcount);
1021
1022   /* Now we know which dynamic symbol has the lowest dynamic symbol
1023      table index in the GOT.  */
1024   g->global_gotsym = hsd.low;
1025
1026   return TRUE;
1027 }
1028
1029 /* Create an entry in an score ELF linker hash table.  */
1030
1031 static struct bfd_hash_entry *
1032 score_elf_link_hash_newfunc (struct bfd_hash_entry *entry,
1033                              struct bfd_hash_table *table,
1034                              const char *string)
1035 {
1036   struct score_elf_link_hash_entry *ret = (struct score_elf_link_hash_entry *)entry;
1037
1038   /* Allocate the structure if it has not already been allocated by a subclass.  */
1039   if (ret == NULL)
1040     ret = bfd_hash_allocate (table, sizeof (struct score_elf_link_hash_entry));
1041   if (ret == NULL)
1042     return (struct bfd_hash_entry *)ret;
1043
1044   /* Call the allocation method of the superclass.  */
1045   ret = ((struct score_elf_link_hash_entry *)
1046          _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *)ret, table, string));
1047
1048   if (ret != NULL)
1049     {
1050       ret->possibly_dynamic_relocs = 0;
1051       ret->readonly_reloc = FALSE;
1052       ret->no_fn_stub = FALSE;
1053       ret->forced_local = FALSE;
1054     }
1055
1056   return (struct bfd_hash_entry *)ret;
1057 }
1058
1059 /* Returns the first relocation of type r_type found, beginning with
1060    RELOCATION.  RELEND is one-past-the-end of the relocation table.  */
1061
1062 static const Elf_Internal_Rela *
1063 score_elf_next_relocation (bfd *abfd ATTRIBUTE_UNUSED, unsigned int r_type,
1064                            const Elf_Internal_Rela *relocation,
1065                            const Elf_Internal_Rela *relend)
1066 {
1067   while (relocation < relend)
1068     {
1069       if (ELF32_R_TYPE (relocation->r_info) == r_type)
1070         return relocation;
1071
1072       ++relocation;
1073     }
1074
1075   /* We didn't find it.  */
1076   bfd_set_error (bfd_error_bad_value);
1077   return NULL;
1078 }
1079
1080 /* This function is called via qsort() to sort the dynamic relocation
1081    entries by increasing r_symndx value.  */
1082
1083 static int
1084 score_elf_sort_dynamic_relocs (const void *arg1, const void *arg2)
1085 {
1086   Elf_Internal_Rela int_reloc1;
1087   Elf_Internal_Rela int_reloc2;
1088
1089   bfd_elf32_swap_reloc_in (reldyn_sorting_bfd, arg1, &int_reloc1);
1090   bfd_elf32_swap_reloc_in (reldyn_sorting_bfd, arg2, &int_reloc2);
1091
1092   return (ELF32_R_SYM (int_reloc1.r_info) - ELF32_R_SYM (int_reloc2.r_info));
1093 }
1094
1095 /* Return whether a relocation is against a local symbol.  */
1096
1097 static bfd_boolean
1098 score_elf_local_relocation_p (bfd *input_bfd,
1099                               const Elf_Internal_Rela *relocation,
1100                               asection **local_sections,
1101                               bfd_boolean check_forced)
1102 {
1103   unsigned long r_symndx;
1104   Elf_Internal_Shdr *symtab_hdr;
1105   struct score_elf_link_hash_entry *h;
1106   size_t extsymoff;
1107
1108   r_symndx = ELF32_R_SYM (relocation->r_info);
1109   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
1110   extsymoff = (elf_bad_symtab (input_bfd)) ? 0 : symtab_hdr->sh_info;
1111
1112   if (r_symndx < extsymoff)
1113     return TRUE;
1114   if (elf_bad_symtab (input_bfd) && local_sections[r_symndx] != NULL)
1115     return TRUE;
1116
1117   if (check_forced)
1118     {
1119       /* Look up the hash table to check whether the symbol was forced local.  */
1120       h = (struct score_elf_link_hash_entry *)
1121         elf_sym_hashes (input_bfd) [r_symndx - extsymoff];
1122       /* Find the real hash-table entry for this symbol.  */
1123       while (h->root.root.type == bfd_link_hash_indirect
1124              || h->root.root.type == bfd_link_hash_warning)
1125         h = (struct score_elf_link_hash_entry *) h->root.root.u.i.link;
1126       if (h->root.forced_local)
1127         return TRUE;
1128     }
1129
1130   return FALSE;
1131 }
1132
1133 /* Returns the dynamic relocation section for DYNOBJ.  */
1134
1135 static asection *
1136 score_elf_rel_dyn_section (bfd *dynobj, bfd_boolean create_p)
1137 {
1138   static const char dname[] = ".rel.dyn";
1139   asection *sreloc;
1140
1141   sreloc = bfd_get_section_by_name (dynobj, dname);
1142   if (sreloc == NULL && create_p)
1143     {
1144       sreloc = bfd_make_section (dynobj, dname);
1145       if (sreloc == NULL
1146           || ! bfd_set_section_flags (dynobj, sreloc,
1147                                       (SEC_ALLOC
1148                                        | SEC_LOAD
1149                                        | SEC_HAS_CONTENTS
1150                                        | SEC_IN_MEMORY
1151                                        | SEC_LINKER_CREATED
1152                                        | SEC_READONLY))
1153           || ! bfd_set_section_alignment (dynobj, sreloc, SCORE_ELF_LOG_FILE_ALIGN (dynobj)))
1154         return NULL;
1155     }
1156
1157   return sreloc;
1158 }
1159
1160 static void
1161 score_elf_allocate_dynamic_relocations (bfd *abfd, unsigned int n)
1162 {
1163   asection *s;
1164
1165   s = score_elf_rel_dyn_section (abfd, FALSE);
1166   BFD_ASSERT (s != NULL);
1167
1168   if (s->size == 0)
1169     {
1170       /* Make room for a null element.  */
1171       s->size += SCORE_ELF_REL_SIZE (abfd);
1172       ++s->reloc_count;
1173     }
1174   s->size += n * SCORE_ELF_REL_SIZE (abfd);
1175 }
1176
1177 /* Create a rel.dyn relocation for the dynamic linker to resolve.  REL
1178    is the original relocation, which is now being transformed into a
1179    dynamic relocation.  The ADDENDP is adjusted if necessary; the
1180    caller should store the result in place of the original addend.  */
1181
1182 static bfd_boolean
1183 score_elf_create_dynamic_relocation (bfd *output_bfd,
1184                                      struct bfd_link_info *info,
1185                                      const Elf_Internal_Rela *rel,
1186                                      struct score_elf_link_hash_entry *h,
1187                                      asection *sec, bfd_vma symbol,
1188                                      bfd_vma *addendp, asection *input_section)
1189 {
1190   Elf_Internal_Rela outrel[3];
1191   asection *sreloc;
1192   bfd *dynobj;
1193   int r_type;
1194   long indx;
1195   bfd_boolean defined_p;
1196
1197   r_type = ELF32_R_TYPE (rel->r_info);
1198   dynobj = elf_hash_table (info)->dynobj;
1199   sreloc = score_elf_rel_dyn_section (dynobj, FALSE);
1200   BFD_ASSERT (sreloc != NULL);
1201   BFD_ASSERT (sreloc->contents != NULL);
1202   BFD_ASSERT (sreloc->reloc_count * SCORE_ELF_REL_SIZE (output_bfd) < sreloc->size);
1203
1204   outrel[0].r_offset =
1205     _bfd_elf_section_offset (output_bfd, info, input_section, rel[0].r_offset);
1206   outrel[1].r_offset =
1207     _bfd_elf_section_offset (output_bfd, info, input_section, rel[1].r_offset);
1208   outrel[2].r_offset =
1209     _bfd_elf_section_offset (output_bfd, info, input_section, rel[2].r_offset);
1210
1211   if (outrel[0].r_offset == MINUS_ONE)
1212     /* The relocation field has been deleted.  */
1213     return TRUE;
1214
1215   if (outrel[0].r_offset == MINUS_TWO)
1216     {
1217       /* The relocation field has been converted into a relative value of
1218          some sort.  Functions like _bfd_elf_write_section_eh_frame expect
1219          the field to be fully relocated, so add in the symbol's value.  */
1220       *addendp += symbol;
1221       return TRUE;
1222     }
1223
1224   /* We must now calculate the dynamic symbol table index to use
1225      in the relocation.  */
1226   if (h != NULL
1227       && (! info->symbolic || !h->root.def_regular)
1228       /* h->root.dynindx may be -1 if this symbol was marked to
1229          become local.  */
1230       && h->root.dynindx != -1)
1231     {
1232       indx = h->root.dynindx;
1233         /* ??? glibc's ld.so just adds the final GOT entry to the
1234            relocation field.  It therefore treats relocs against
1235            defined symbols in the same way as relocs against
1236            undefined symbols.  */
1237       defined_p = FALSE;
1238     }
1239   else
1240     {
1241       if (sec != NULL && bfd_is_abs_section (sec))
1242         indx = 0;
1243       else if (sec == NULL || sec->owner == NULL)
1244         {
1245           bfd_set_error (bfd_error_bad_value);
1246           return FALSE;
1247         }
1248       else
1249         {
1250           indx = elf_section_data (sec->output_section)->dynindx;
1251           if (indx == 0)
1252             abort ();
1253         }
1254
1255       /* Instead of generating a relocation using the section
1256          symbol, we may as well make it a fully relative
1257          relocation.  We want to avoid generating relocations to
1258          local symbols because we used to generate them
1259          incorrectly, without adding the original symbol value,
1260          which is mandated by the ABI for section symbols.  In
1261          order to give dynamic loaders and applications time to
1262          phase out the incorrect use, we refrain from emitting
1263          section-relative relocations.  It's not like they're
1264          useful, after all.  This should be a bit more efficient
1265          as well.  */
1266       /* ??? Although this behavior is compatible with glibc's ld.so,
1267          the ABI says that relocations against STN_UNDEF should have
1268          a symbol value of 0.  Irix rld honors this, so relocations
1269          against STN_UNDEF have no effect.  */
1270       defined_p = TRUE;
1271     }
1272
1273   /* If the relocation was previously an absolute relocation and
1274      this symbol will not be referred to by the relocation, we must
1275      adjust it by the value we give it in the dynamic symbol table.
1276      Otherwise leave the job up to the dynamic linker.  */
1277   if (defined_p && r_type != R_SCORE_REL32)
1278     *addendp += symbol;
1279
1280   /* The relocation is always an REL32 relocation because we don't
1281      know where the shared library will wind up at load-time.  */
1282   outrel[0].r_info = ELF32_R_INFO ((unsigned long) indx, R_SCORE_REL32);
1283
1284   /* For strict adherence to the ABI specification, we should
1285      generate a R_SCORE_64 relocation record by itself before the
1286      _REL32/_64 record as well, such that the addend is read in as
1287      a 64-bit value (REL32 is a 32-bit relocation, after all).
1288      However, since none of the existing ELF64 SCORE dynamic
1289      loaders seems to care, we don't waste space with these
1290      artificial relocations.  If this turns out to not be true,
1291      score_elf_allocate_dynamic_relocations() should be tweaked so
1292      as to make room for a pair of dynamic relocations per
1293      invocation if ABI_64_P, and here we should generate an
1294      additional relocation record with R_SCORE_64 by itself for a
1295      NULL symbol before this relocation record.  */
1296   outrel[1].r_info = ELF32_R_INFO (0, R_SCORE_NONE);
1297   outrel[2].r_info = ELF32_R_INFO (0, R_SCORE_NONE);
1298
1299   /* Adjust the output offset of the relocation to reference the
1300      correct location in the output file.  */
1301   outrel[0].r_offset += (input_section->output_section->vma
1302                          + input_section->output_offset);
1303   outrel[1].r_offset += (input_section->output_section->vma
1304                          + input_section->output_offset);
1305   outrel[2].r_offset += (input_section->output_section->vma
1306                          + input_section->output_offset);
1307
1308   /* Put the relocation back out.  We have to use the special
1309      relocation outputter in the 64-bit case since the 64-bit
1310      relocation format is non-standard.  */
1311   bfd_elf32_swap_reloc_out
1312       (output_bfd, &outrel[0],
1313        (sreloc->contents + sreloc->reloc_count * sizeof (Elf32_External_Rel)));
1314
1315   /* We've now added another relocation.  */
1316   ++sreloc->reloc_count;
1317
1318   /* Make sure the output section is writable.  The dynamic linker
1319      will be writing to it.  */
1320   elf_section_data (input_section->output_section)->this_hdr.sh_flags |= SHF_WRITE;
1321
1322   return TRUE;
1323 }
1324
1325 static bfd_boolean
1326 score_elf_create_got_section (bfd *abfd,
1327                               struct bfd_link_info *info,
1328                               bfd_boolean maybe_exclude)
1329 {
1330   flagword flags;
1331   asection *s;
1332   struct elf_link_hash_entry *h;
1333   struct bfd_link_hash_entry *bh;
1334   struct score_got_info *g;
1335   bfd_size_type amt;
1336
1337   /* This function may be called more than once.  */
1338   s = score_elf_got_section (abfd, TRUE);
1339   if (s)
1340     {
1341       if (! maybe_exclude)
1342         s->flags &= ~SEC_EXCLUDE;
1343       return TRUE;
1344     }
1345
1346   flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
1347
1348   if (maybe_exclude)
1349     flags |= SEC_EXCLUDE;
1350
1351   /* We have to use an alignment of 2**4 here because this is hardcoded
1352      in the function stub generation and in the linker script.  */
1353   s = bfd_make_section (abfd, ".got");
1354   if (s == NULL
1355       || ! bfd_set_section_flags (abfd, s, flags)
1356       || ! bfd_set_section_alignment (abfd, s, 4))
1357     return FALSE;
1358
1359   /* Define the symbol _GLOBAL_OFFSET_TABLE_.  We don't do this in the
1360      linker script because we don't want to define the symbol if we
1361      are not creating a global offset table.  */
1362   bh = NULL;
1363   if (! (_bfd_generic_link_add_one_symbol
1364          (info, abfd, "_GLOBAL_OFFSET_TABLE_", BSF_GLOBAL, s,
1365           0, NULL, FALSE, get_elf_backend_data (abfd)->collect, &bh)))
1366     return FALSE;
1367
1368   h = (struct elf_link_hash_entry *) bh;
1369   h->non_elf = 0;
1370   h->def_regular = 1;
1371   h->type = STT_OBJECT;
1372
1373   if (info->shared && ! bfd_elf_link_record_dynamic_symbol (info, h))
1374     return FALSE;
1375
1376   amt = sizeof (struct score_got_info);
1377   g = bfd_alloc (abfd, amt);
1378   if (g == NULL)
1379     return FALSE;
1380
1381   g->global_gotsym = NULL;
1382   g->global_gotno = 0;
1383
1384   g->local_gotno = SCORE_RESERVED_GOTNO;
1385   g->assigned_gotno = SCORE_RESERVED_GOTNO;
1386   g->next = NULL;
1387
1388   g->got_entries = htab_try_create (1, score_elf_got_entry_hash,
1389                                     score_elf_got_entry_eq, NULL);
1390   if (g->got_entries == NULL)
1391     return FALSE;
1392   score_elf_section_data (s)->u.got_info = g;
1393   score_elf_section_data (s)->elf.this_hdr.sh_flags |= SHF_ALLOC | SHF_WRITE | SHF_SCORE_GPREL;
1394
1395   return TRUE;
1396 }
1397
1398 /* Calculate the %high function.  */
1399
1400 static bfd_vma
1401 score_elf_high (bfd_vma value)
1402 {
1403   return ((value + (bfd_vma) 0x8000) >> 16) & 0xffff;
1404 }
1405
1406 /* Create a local GOT entry for VALUE.  Return the index of the entry,
1407    or -1 if it could not be created.  */
1408
1409 static struct score_got_entry *
1410 score_elf_create_local_got_entry (bfd *abfd,
1411                                   bfd *ibfd ATTRIBUTE_UNUSED,
1412                                   struct score_got_info *gg,
1413                                   asection *sgot, bfd_vma value,
1414                                   unsigned long r_symndx ATTRIBUTE_UNUSED,
1415                                   struct score_elf_link_hash_entry *h ATTRIBUTE_UNUSED,
1416                                   int r_type ATTRIBUTE_UNUSED)
1417 {
1418   struct score_got_entry entry, **loc;
1419   struct score_got_info *g;
1420
1421   entry.abfd = NULL;
1422   entry.symndx = -1;
1423   entry.d.address = value;
1424
1425   g = gg;
1426   loc = (struct score_got_entry **) htab_find_slot (g->got_entries, &entry, INSERT);
1427   if (*loc)
1428     return *loc;
1429
1430   entry.gotidx = SCORE_ELF_GOT_SIZE (abfd) * g->assigned_gotno++;
1431
1432   *loc = bfd_alloc (abfd, sizeof entry);
1433
1434   if (! *loc)
1435     return NULL;
1436
1437   memcpy (*loc, &entry, sizeof entry);
1438
1439   if (g->assigned_gotno >= g->local_gotno)
1440     {
1441       (*loc)->gotidx = -1;
1442       /* We didn't allocate enough space in the GOT.  */
1443       (*_bfd_error_handler)
1444         (_("not enough GOT space for local GOT entries"));
1445       bfd_set_error (bfd_error_bad_value);
1446       return NULL;
1447     }
1448
1449   bfd_put_32 (abfd, value, (sgot->contents + entry.gotidx));
1450
1451   return *loc;
1452 }
1453
1454 /* Find a GOT entry whose higher-order 16 bits are the same as those
1455    for value.  Return the index into the GOT for this entry.  */
1456
1457 static bfd_vma
1458 score_elf_got16_entry (bfd *abfd, bfd *ibfd, struct bfd_link_info *info,
1459                       bfd_vma value, bfd_boolean external)
1460 {
1461   asection *sgot;
1462   struct score_got_info *g;
1463   struct score_got_entry *entry;
1464
1465   if (!external)
1466     {
1467       /* Although the ABI says that it is "the high-order 16 bits" that we
1468          want, it is really the %high value.  The complete value is
1469          calculated with a `addiu' of a LO16 relocation, just as with a
1470          HI16/LO16 pair.  */
1471       value = score_elf_high (value) << 16;
1472     }
1473
1474   g = score_elf_got_info (elf_hash_table (info)->dynobj, &sgot);
1475
1476   entry = score_elf_create_local_got_entry (abfd, ibfd, g, sgot, value, 0, NULL,
1477                                             R_SCORE_GOT15);
1478   if (entry)
1479     return entry->gotidx;
1480   else
1481     return MINUS_ONE;
1482 }
1483
1484 static void
1485 _bfd_score_elf_hide_symbol (struct bfd_link_info *info,
1486                             struct elf_link_hash_entry *entry,
1487                             bfd_boolean force_local)
1488 {
1489   bfd *dynobj;
1490   asection *got;
1491   struct score_got_info *g;
1492   struct score_elf_link_hash_entry *h;
1493
1494   h = (struct score_elf_link_hash_entry *) entry;
1495   if (h->forced_local)
1496     return;
1497   h->forced_local = TRUE;
1498
1499   dynobj = elf_hash_table (info)->dynobj;
1500   if (dynobj != NULL && force_local)
1501     {
1502       got = score_elf_got_section (dynobj, FALSE);
1503       if (got == NULL)
1504         return;
1505       g = score_elf_section_data (got)->u.got_info;
1506
1507       if (g->next)
1508         {
1509           struct score_got_entry e;
1510           struct score_got_info *gg = g;
1511
1512           /* Since we're turning what used to be a global symbol into a
1513              local one, bump up the number of local entries of each GOT
1514              that had an entry for it.  This will automatically decrease
1515              the number of global entries, since global_gotno is actually
1516              the upper limit of global entries.  */
1517           e.abfd = dynobj;
1518           e.symndx = -1;
1519           e.d.h = h;
1520
1521           for (g = g->next; g != gg; g = g->next)
1522             if (htab_find (g->got_entries, &e))
1523               {
1524                 BFD_ASSERT (g->global_gotno > 0);
1525                 g->local_gotno++;
1526                 g->global_gotno--;
1527               }
1528
1529           /* If this was a global symbol forced into the primary GOT, we
1530              no longer need an entry for it.  We can't release the entry
1531              at this point, but we must at least stop counting it as one
1532              of the symbols that required a forced got entry.  */
1533           if (h->root.got.offset == 2)
1534             {
1535               BFD_ASSERT (gg->assigned_gotno > 0);
1536               gg->assigned_gotno--;
1537             }
1538         }
1539       else if (g->global_gotno == 0 && g->global_gotsym == NULL)
1540         /* If we haven't got through GOT allocation yet, just bump up the
1541               number of local entries, as this symbol won't be counted as
1542               global.  */
1543         g->local_gotno++;
1544       else if (h->root.got.offset == 1)
1545         {
1546           /* If we're past non-multi-GOT allocation and this symbol had
1547                   been marked for a global got entry, give it a local entry
1548                   instead.  */
1549           BFD_ASSERT (g->global_gotno > 0);
1550           g->local_gotno++;
1551           g->global_gotno--;
1552         }
1553     }
1554
1555   _bfd_elf_link_hash_hide_symbol (info, &h->root, force_local);
1556 }
1557
1558 /* If H is a symbol that needs a global GOT entry, but has a dynamic
1559    symbol table index lower than any we've seen to date, record it for
1560    posterity.  */
1561
1562 static bfd_boolean
1563 score_elf_record_global_got_symbol (struct elf_link_hash_entry *h,
1564                                     bfd *abfd,
1565                                     struct bfd_link_info *info,
1566                                     struct score_got_info *g)
1567 {
1568   struct score_got_entry entry, **loc;
1569
1570   /* A global symbol in the GOT must also be in the dynamic symbol table.  */
1571   if (h->dynindx == -1)
1572     {
1573       switch (ELF_ST_VISIBILITY (h->other))
1574         {
1575         case STV_INTERNAL:
1576         case STV_HIDDEN:
1577           _bfd_score_elf_hide_symbol (info, h, TRUE);
1578           break;
1579         }
1580       if (!bfd_elf_link_record_dynamic_symbol (info, h))
1581         return FALSE;
1582     }
1583
1584   entry.abfd = abfd;
1585   entry.symndx = -1;
1586   entry.d.h = (struct score_elf_link_hash_entry *)h;
1587
1588   loc = (struct score_got_entry **)htab_find_slot (g->got_entries, &entry, INSERT);
1589
1590   /* If we've already marked this entry as needing GOT space, we don't
1591      need to do it again.  */
1592   if (*loc)
1593     return TRUE;
1594
1595   *loc = bfd_alloc (abfd, sizeof entry);
1596   if (! *loc)
1597     return FALSE;
1598
1599   entry.gotidx = -1;
1600
1601   memcpy (*loc, &entry, sizeof (entry));
1602
1603   if (h->got.offset != MINUS_ONE)
1604     return TRUE;
1605
1606   /* By setting this to a value other than -1, we are indicating that
1607      there needs to be a GOT entry for H.  Avoid using zero, as the
1608      generic ELF copy_indirect_symbol tests for <= 0.  */
1609   h->got.offset = 1;
1610
1611   return TRUE;
1612 }
1613
1614 /* Reserve space in G for a GOT entry containing the value of symbol
1615    SYMNDX in input bfd ABDF, plus ADDEND.  */
1616
1617 static bfd_boolean
1618 score_elf_record_local_got_symbol (bfd *abfd,
1619                                    long symndx,
1620                                    bfd_vma addend,
1621                                    struct score_got_info *g)
1622 {
1623   struct score_got_entry entry, **loc;
1624
1625   entry.abfd = abfd;
1626   entry.symndx = symndx;
1627   entry.d.addend = addend;
1628   loc = (struct score_got_entry **)htab_find_slot (g->got_entries, &entry, INSERT);
1629
1630   if (*loc)
1631     return TRUE;
1632
1633   entry.gotidx = g->local_gotno++;
1634
1635   *loc = bfd_alloc (abfd, sizeof(entry));
1636   if (! *loc)
1637     return FALSE;
1638
1639   memcpy (*loc, &entry, sizeof (entry));
1640
1641   return TRUE;
1642 }
1643
1644 /* Returns the GOT offset at which the indicated address can be found.
1645    If there is not yet a GOT entry for this value, create one.
1646    Returns -1 if no satisfactory GOT offset can be found.  */
1647
1648 static bfd_vma
1649 score_elf_local_got_index (bfd *abfd, bfd *ibfd, struct bfd_link_info *info,
1650                           bfd_vma value, unsigned long r_symndx,
1651                           struct score_elf_link_hash_entry *h, int r_type)
1652 {
1653   asection *sgot;
1654   struct score_got_info *g;
1655   struct score_got_entry *entry;
1656
1657   g = score_elf_got_info (elf_hash_table (info)->dynobj, &sgot);
1658
1659   entry = score_elf_create_local_got_entry (abfd, ibfd, g, sgot, value,
1660                                             r_symndx, h, r_type);
1661   if (!entry)
1662     return MINUS_ONE;
1663
1664   else
1665     return entry->gotidx;
1666 }
1667
1668 /* Returns the GOT index for the global symbol indicated by H.  */
1669
1670 static bfd_vma
1671 score_elf_global_got_index (bfd *abfd, struct elf_link_hash_entry *h)
1672 {
1673   bfd_vma index;
1674   asection *sgot;
1675   struct score_got_info *g;
1676   long global_got_dynindx = 0;
1677
1678   g = score_elf_got_info (abfd, &sgot);
1679   if (g->global_gotsym != NULL)
1680     global_got_dynindx = g->global_gotsym->dynindx;
1681
1682   /* Once we determine the global GOT entry with the lowest dynamic
1683      symbol table index, we must put all dynamic symbols with greater
1684      indices into the GOT.  That makes it easy to calculate the GOT
1685      offset.  */
1686   BFD_ASSERT (h->dynindx >= global_got_dynindx);
1687   index = ((h->dynindx - global_got_dynindx + g->local_gotno) * SCORE_ELF_GOT_SIZE (abfd));
1688   BFD_ASSERT (index < sgot->size);
1689
1690   return index;
1691 }
1692
1693 /* Returns the offset for the entry at the INDEXth position in the GOT.  */
1694
1695 static bfd_vma
1696 score_elf_got_offset_from_index (bfd *dynobj, bfd *output_bfd,
1697                                  bfd *input_bfd ATTRIBUTE_UNUSED, bfd_vma index)
1698 {
1699   asection *sgot;
1700   bfd_vma gp;
1701   struct score_got_info *g;
1702
1703   g = score_elf_got_info (dynobj, &sgot);
1704   gp = _bfd_get_gp_value (output_bfd);
1705
1706   return sgot->output_section->vma + sgot->output_offset + index - gp;
1707 }
1708
1709 /* Follow indirect and warning hash entries so that each got entry
1710    points to the final symbol definition.  P must point to a pointer
1711    to the hash table we're traversing.  Since this traversal may
1712    modify the hash table, we set this pointer to NULL to indicate
1713    we've made a potentially-destructive change to the hash table, so
1714    the traversal must be restarted.  */
1715 static int
1716 score_elf_resolve_final_got_entry (void **entryp, void *p)
1717 {
1718   struct score_got_entry *entry = (struct score_got_entry *)*entryp;
1719   htab_t got_entries = *(htab_t *)p;
1720
1721   if (entry->abfd != NULL && entry->symndx == -1)
1722     {
1723       struct score_elf_link_hash_entry *h = entry->d.h;
1724
1725       while (h->root.root.type == bfd_link_hash_indirect
1726              || h->root.root.type == bfd_link_hash_warning)
1727         h = (struct score_elf_link_hash_entry *) h->root.root.u.i.link;
1728
1729       if (entry->d.h == h)
1730         return 1;
1731
1732       entry->d.h = h;
1733
1734       /* If we can't find this entry with the new bfd hash, re-insert
1735          it, and get the traversal restarted.  */
1736       if (! htab_find (got_entries, entry))
1737         {
1738           htab_clear_slot (got_entries, entryp);
1739           entryp = htab_find_slot (got_entries, entry, INSERT);
1740           if (! *entryp)
1741             *entryp = entry;
1742           /* Abort the traversal, since the whole table may have
1743              moved, and leave it up to the parent to restart the
1744              process.  */
1745           *(htab_t *)p = NULL;
1746           return 0;
1747         }
1748       /* We might want to decrement the global_gotno count, but it's
1749          either too early or too late for that at this point.  */
1750     }
1751
1752   return 1;
1753 }
1754
1755 /* Turn indirect got entries in a got_entries table into their final locations.  */
1756 static void
1757 score_elf_resolve_final_got_entries (struct score_got_info *g)
1758 {
1759   htab_t got_entries;
1760
1761   do
1762     {
1763       got_entries = g->got_entries;
1764
1765       htab_traverse (got_entries,
1766                      score_elf_resolve_final_got_entry,
1767                      &got_entries);
1768     }
1769   while (got_entries == NULL);
1770 }
1771
1772 /* Add INCREMENT to the reloc (of type HOWTO) at ADDRESS. for -r  */
1773
1774 static void
1775 score_elf_add_to_rel (bfd *abfd,
1776                       bfd_byte *address,
1777                       reloc_howto_type *howto,
1778                       bfd_signed_vma increment)
1779 {
1780   bfd_signed_vma addend;
1781   bfd_vma contents;
1782   unsigned long offset;
1783   unsigned long r_type = howto->type;
1784   unsigned long hi16_addend, hi16_offset, hi16_value, uvalue;
1785
1786   contents = bfd_get_32 (abfd, address);
1787   /* Get the (signed) value from the instruction.  */
1788   addend = contents & howto->src_mask;
1789   if (addend & ((howto->src_mask + 1) >> 1))
1790     {
1791       bfd_signed_vma mask;
1792
1793       mask = -1;
1794       mask &= ~howto->src_mask;
1795       addend |= mask;
1796     }
1797   /* Add in the increment, (which is a byte value).  */
1798   switch (r_type)
1799     {
1800     case R_SCORE_PC19:
1801       offset =
1802         (((contents & howto->src_mask) & 0x3ff0000) >> 6) | ((contents & howto->src_mask) & 0x3ff);
1803       offset += increment;
1804       contents =
1805         (contents & ~howto->
1806          src_mask) | (((offset << 6) & howto->src_mask) & 0x3ff0000) | (offset & 0x3ff);
1807       bfd_put_32 (abfd, contents, address);
1808       break;
1809     case R_SCORE_HI16:
1810       break;
1811     case R_SCORE_LO16:
1812       hi16_addend = bfd_get_32 (abfd, address - 4);
1813       hi16_offset = ((((hi16_addend >> 16) & 0x3) << 15) | (hi16_addend & 0x7fff)) >> 1;
1814       offset = ((((contents >> 16) & 0x3) << 15) | (contents & 0x7fff)) >> 1;
1815       offset = (hi16_offset << 16) | (offset & 0xffff);
1816       uvalue = increment + offset;
1817       hi16_offset = (uvalue >> 16) << 1;
1818       hi16_value = (hi16_addend & (~(howto->dst_mask)))
1819         | (hi16_offset & 0x7fff) | ((hi16_offset << 1) & 0x30000);
1820       bfd_put_32 (abfd, hi16_value, address - 4);
1821       offset = (uvalue & 0xffff) << 1;
1822       contents = (contents & (~(howto->dst_mask))) | (offset & 0x7fff) | ((offset << 1) & 0x30000);
1823       bfd_put_32 (abfd, contents, address);
1824       break;
1825     case R_SCORE_24:
1826       offset =
1827         (((contents & howto->src_mask) >> 1) & 0x1ff8000) | ((contents & howto->src_mask) & 0x7fff);
1828       offset += increment;
1829       contents =
1830         (contents & ~howto->
1831          src_mask) | (((offset << 1) & howto->src_mask) & 0x3ff0000) | (offset & 0x7fff);
1832       bfd_put_32 (abfd, contents, address);
1833       break;
1834     case R_SCORE16_11:
1835
1836       contents = bfd_get_16 (abfd, address);
1837       offset = contents & howto->src_mask;
1838       offset += increment;
1839       contents = (contents & ~howto->src_mask) | (offset & howto->src_mask);
1840       bfd_put_16 (abfd, contents, address);
1841
1842       break;
1843     case R_SCORE16_PC8:
1844
1845       contents = bfd_get_16 (abfd, address);
1846       offset = (contents & howto->src_mask) + ((increment >> 1) & 0xff);
1847       contents = (contents & (~howto->src_mask)) | (offset & howto->src_mask);
1848       bfd_put_16 (abfd, contents, address);
1849
1850       break;
1851     default:
1852       addend += increment;
1853       contents = (contents & ~howto->dst_mask) | (addend & howto->dst_mask);
1854       bfd_put_32 (abfd, contents, address);
1855       break;
1856     }
1857 }
1858
1859 /* Perform a relocation as part of a final link.  */
1860
1861 static bfd_reloc_status_type
1862 score_elf_final_link_relocate (reloc_howto_type *howto,
1863                                bfd *input_bfd,
1864                                bfd *output_bfd,
1865                                asection *input_section,
1866                                bfd_byte *contents,
1867                                Elf_Internal_Rela *rel,
1868                                Elf_Internal_Rela *relocs,
1869                                bfd_vma symbol,
1870                                struct bfd_link_info *info,
1871                                asection *sym_sec,
1872                                const char *sym_name ATTRIBUTE_UNUSED,
1873                                int sym_flags ATTRIBUTE_UNUSED,
1874                                struct score_elf_link_hash_entry *h,
1875                                asection **local_sections,
1876                                bfd_boolean gp_disp_p)
1877 {
1878   unsigned long r_type;
1879   unsigned long r_symndx;
1880   bfd_byte *hit_data = contents + rel->r_offset;
1881   bfd_vma addend;
1882   /* The final GP value to be used for the relocatable, executable, or
1883      shared object file being produced.  */
1884   bfd_vma gp = MINUS_ONE;
1885   /* The place (section offset or address) of the storage unit being relocated.  */
1886   bfd_vma rel_addr;
1887   /* The value of GP used to create the relocatable object.  */
1888   bfd_vma gp0 = MINUS_ONE;
1889   /* The offset into the global offset table at which the address of the relocation entry
1890      symbol, adjusted by the addend, resides during execution.  */
1891   bfd_vma g = MINUS_ONE;
1892   /* TRUE if the symbol referred to by this relocation is a local symbol.  */
1893   bfd_boolean local_p;
1894   /* The eventual value we will relocate.  */
1895   bfd_vma value = symbol;
1896   unsigned long hi16_addend, hi16_offset, hi16_value, uvalue, offset, abs_value = 0;
1897
1898   if (elf_gp (output_bfd) == 0)
1899     {
1900       struct bfd_link_hash_entry *bh;
1901       asection *o;
1902
1903       bh = bfd_link_hash_lookup (info->hash, "_gp", 0, 0, 1);
1904       if (bh != (struct bfd_link_hash_entry *)NULL && bh->type == bfd_link_hash_defined)
1905         elf_gp (output_bfd) = (bh->u.def.value
1906                                + bh->u.def.section->output_section->vma
1907                                + bh->u.def.section->output_offset);
1908       else if (info->relocatable)
1909         {
1910           bfd_vma lo = -1;
1911
1912           /* Find the GP-relative section with the lowest offset.  */
1913           for (o = output_bfd->sections; o != (asection *) NULL; o = o->next)
1914             if (o->vma < lo)
1915               lo = o->vma;
1916           /* And calculate GP relative to that.  */
1917           elf_gp (output_bfd) = lo + ELF_SCORE_GP_OFFSET (input_bfd);
1918         }
1919       else
1920         {
1921           /* If the relocate_section function needs to do a reloc
1922              involving the GP value, it should make a reloc_dangerous
1923              callback to warn that GP is not defined.  */
1924         }
1925     }
1926
1927   /* Parse the relocation.  */
1928   r_symndx = ELF32_R_SYM (rel->r_info);
1929   r_type = ELF32_R_TYPE (rel->r_info);
1930   rel_addr = (input_section->output_section->vma + input_section->output_offset + rel->r_offset);
1931
1932   /* If the start address has been set, then set the EF_SCORE_HASENTRY
1933      flag.  Setting this more than once is redundant, but the cost is
1934      not too high, and it keeps the code simple.
1935      The test is done  here, rather than somewhere else, because the
1936      start address is only set just before the final link commences.
1937      Note - if the user deliberately sets a start address of 0, the flag will not be set.  */
1938   if (bfd_get_start_address (output_bfd) != 0)
1939     elf_elfheader (output_bfd)->e_flags |= EF_SCORE_HASENTRY;
1940
1941   if (r_type == R_SCORE_GOT15)
1942     {
1943       const Elf_Internal_Rela *relend;
1944       const Elf_Internal_Rela *lo16_rel;
1945       const struct elf_backend_data *bed;
1946       bfd_vma lo_value = 0;
1947
1948       addend = (bfd_get_32 (input_bfd, hit_data) >> howto->bitpos) & howto->src_mask;
1949
1950       bed = get_elf_backend_data (output_bfd);
1951       relend = relocs + input_section->reloc_count * bed->s->int_rels_per_ext_rel;
1952       lo16_rel = score_elf_next_relocation (input_bfd, R_SCORE_GOT_LO16, rel, relend);
1953       if (lo16_rel != NULL)
1954         {
1955           lo_value = (bfd_get_32 (input_bfd, contents + lo16_rel->r_offset) >> howto->bitpos)
1956                       & howto->src_mask;
1957         }
1958       addend = (addend << 16) + lo_value;
1959     }
1960   else
1961     {
1962       addend = (bfd_get_32 (input_bfd, hit_data) >> howto->bitpos) & howto->src_mask;
1963     }
1964
1965   local_p = score_elf_local_relocation_p (input_bfd, rel, local_sections, TRUE);
1966
1967   /* If we haven't already determined the GOT offset, or the GP value,
1968      and we're going to need it, get it now.  */
1969   switch (r_type)
1970     {
1971     case R_SCORE_CALL15:
1972     case R_SCORE_GOT15:
1973       if (!local_p)
1974         {
1975           g = score_elf_global_got_index (elf_hash_table (info)->dynobj,
1976                                           (struct elf_link_hash_entry *) h);
1977         }
1978       else if (r_type == R_SCORE_GOT15 || r_type == R_SCORE_CALL15)
1979         {
1980           /* There's no need to create a local GOT entry here; the
1981              calculation for a local GOT15 entry does not involve G.  */
1982           ;
1983         }
1984       else
1985         {
1986           g = score_elf_local_got_index (output_bfd, input_bfd, info,
1987                                          symbol + addend, r_symndx, h, r_type);
1988           if (g == MINUS_ONE)
1989             return bfd_reloc_outofrange;
1990         }
1991
1992       /* Convert GOT indices to actual offsets.  */
1993       g = score_elf_got_offset_from_index (elf_hash_table (info)->dynobj,
1994                                            output_bfd, input_bfd, g);
1995       break;
1996
1997     case R_SCORE_HI16:
1998     case R_SCORE_LO16:
1999     case R_SCORE_GPREL32:
2000       gp0 = _bfd_get_gp_value (input_bfd);
2001       gp = _bfd_get_gp_value (output_bfd);
2002       break;
2003
2004     case R_SCORE_GP15:
2005       gp = _bfd_get_gp_value (output_bfd);
2006
2007     default:
2008       break;
2009     }
2010
2011   switch (r_type)
2012     {
2013     case R_SCORE_NONE:
2014       return bfd_reloc_ok;
2015
2016     case R_SCORE_ABS32:
2017     case R_SCORE_REL32:
2018       if ((info->shared
2019            || (elf_hash_table (info)->dynamic_sections_created
2020                && h != NULL
2021                && h->root.def_dynamic
2022                && !h->root.def_regular))
2023            && r_symndx != 0
2024            && (input_section->flags & SEC_ALLOC) != 0)
2025         {
2026           /* If we're creating a shared library, or this relocation is against a symbol
2027              in a shared library, then we can't know where the symbol will end up.
2028              So, we create a relocation record in the output, and leave the job up
2029              to the dynamic linker.  */
2030           value = addend;
2031           if (!score_elf_create_dynamic_relocation (output_bfd, info, rel, h,
2032                                                     sym_sec, symbol, &value,
2033                                                     input_section))
2034             return bfd_reloc_undefined;
2035         }
2036       else
2037         {
2038           if (r_type != R_SCORE_REL32)
2039             value = symbol + addend;
2040           else
2041             value = addend;
2042         }
2043       value &= howto->dst_mask;
2044       bfd_put_32 (input_bfd, value, hit_data);
2045       return bfd_reloc_ok;
2046
2047     case R_SCORE_ABS16:
2048       value += addend;
2049       if ((long)value > 0x7fff || (long)value < -0x8000)
2050         return bfd_reloc_overflow;
2051       bfd_put_16 (input_bfd, value, hit_data);
2052       return bfd_reloc_ok;
2053
2054     case R_SCORE_24:
2055       addend = bfd_get_32 (input_bfd, hit_data);
2056       offset = (((addend & howto->src_mask) >> 1) & 0x1ff8000) | ((addend & howto->src_mask) & 0x7fff);
2057       if ((offset & 0x1000000) != 0)
2058         offset |= 0xfe000000;
2059       value += offset;
2060       addend = (addend & ~howto->src_mask)
2061                 | (((value << 1) & howto->src_mask) & 0x3ff0000) | (value & 0x7fff);
2062       bfd_put_32 (input_bfd, addend, hit_data);
2063       return bfd_reloc_ok;
2064
2065     case R_SCORE_PC19:
2066       addend = bfd_get_32 (input_bfd, hit_data);
2067       offset = (((addend & howto->src_mask) & 0x3ff0000) >> 6) | ((addend & howto->src_mask) & 0x3ff);
2068       if ((offset & 0x80000) != 0)
2069         offset |= 0xfff00000;
2070       abs_value = value = value - rel_addr + offset;
2071       /* exceed 20 bit : overflow.  */
2072       if ((abs_value & 0x80000000) == 0x80000000)
2073         abs_value = 0xffffffff - value + 1;
2074       if ((abs_value & 0xfff80000) != 0)
2075         return bfd_reloc_overflow;
2076       addend = (addend & ~howto->src_mask)
2077                 | (((value << 6) & howto->src_mask) & 0x3ff0000) | (value & 0x3ff);
2078       bfd_put_32 (input_bfd, addend, hit_data);
2079       return bfd_reloc_ok;
2080
2081     case R_SCORE16_11:
2082       addend = bfd_get_16 (input_bfd, hit_data);
2083       offset = addend & howto->src_mask;
2084       if ((offset & 0x800) != 0)        /* Offset is negative.  */
2085         offset |= 0xfffff000;
2086       value += offset;
2087       addend = (addend & ~howto->src_mask) | (value & howto->src_mask);
2088       bfd_put_16 (input_bfd, addend, hit_data);
2089       return bfd_reloc_ok;
2090
2091     case R_SCORE16_PC8:
2092       addend = bfd_get_16 (input_bfd, hit_data);
2093       offset = (addend & howto->src_mask) << 1;
2094       if ((offset & 0x100) != 0)        /* Offset is negative.  */
2095         offset |= 0xfffffe00;
2096       abs_value = value = value - rel_addr + offset;
2097       /* Sign bit + exceed 9 bit.  */
2098       if (((value & 0xffffff00) != 0) && ((value & 0xffffff00) != 0xffffff00))
2099         return bfd_reloc_overflow;
2100       value >>= 1;
2101       addend = (addend & ~howto->src_mask) | (value & howto->src_mask);
2102       bfd_put_16 (input_bfd, addend, hit_data);
2103       return bfd_reloc_ok;
2104
2105     case R_SCORE_HI16:
2106       return bfd_reloc_ok;
2107
2108     case R_SCORE_LO16:
2109       hi16_addend = bfd_get_32 (input_bfd, hit_data - 4);
2110       hi16_offset = ((((hi16_addend >> 16) & 0x3) << 15) | (hi16_addend & 0x7fff)) >> 1;
2111       addend = bfd_get_32 (input_bfd, hit_data);
2112       offset = ((((addend >> 16) & 0x3) << 15) | (addend & 0x7fff)) >> 1;
2113       offset = (hi16_offset << 16) | (offset & 0xffff);
2114
2115       if (!gp_disp_p)
2116         uvalue = value + offset;
2117       else
2118         uvalue = offset + gp - rel_addr + 4;
2119
2120       hi16_offset = (uvalue >> 16) << 1;
2121       hi16_value = (hi16_addend & (~(howto->dst_mask)))
2122                         | (hi16_offset & 0x7fff) | ((hi16_offset << 1) & 0x30000);
2123       bfd_put_32 (input_bfd, hi16_value, hit_data - 4);
2124       offset = (uvalue & 0xffff) << 1;
2125       value = (addend & (~(howto->dst_mask))) | (offset & 0x7fff) | ((offset << 1) & 0x30000);
2126       bfd_put_32 (input_bfd, value, hit_data);
2127       return bfd_reloc_ok;
2128
2129     case R_SCORE_GP15:
2130       addend = bfd_get_32 (input_bfd, hit_data);
2131       offset = addend & 0x7fff;
2132       if ((offset & 0x4000) == 0x4000)
2133         offset |= 0xffffc000;
2134       value = value + offset - gp;
2135       if (((value & 0xffffc000) != 0) && ((value & 0xffffc000) != 0xffffc000))
2136         return bfd_reloc_overflow;
2137       value = (addend & ~howto->src_mask) | (value & howto->src_mask);
2138       bfd_put_32 (input_bfd, value, hit_data);
2139       return bfd_reloc_ok;
2140
2141     case R_SCORE_GOT15:
2142     case R_SCORE_CALL15:
2143       if (local_p)
2144         {
2145           bfd_boolean forced;
2146
2147           /* The special case is when the symbol is forced to be local.  We need the
2148              full address in the GOT since no R_SCORE_GOT_LO16 relocation follows.  */
2149           forced = ! score_elf_local_relocation_p (input_bfd, rel,
2150                                                    local_sections, FALSE);
2151           value = score_elf_got16_entry (output_bfd, input_bfd, info,
2152                                          symbol + addend, forced);
2153           if (value == MINUS_ONE)
2154             return bfd_reloc_outofrange;
2155           value = score_elf_got_offset_from_index (elf_hash_table (info)->dynobj,
2156                                                    output_bfd, input_bfd, value);
2157         }
2158       else
2159         {
2160           value = g;
2161         }
2162
2163       if ((long) value > 0x3fff || (long) value < -0x4000)
2164         return bfd_reloc_overflow;
2165       bfd_put_16 (input_bfd, value, hit_data + 2);
2166       return bfd_reloc_ok;
2167
2168     case R_SCORE_GPREL32:
2169       value = (addend + symbol - gp);
2170       value &= howto->dst_mask;
2171       bfd_put_32 (input_bfd, value, hit_data);
2172       return bfd_reloc_ok;
2173
2174     case R_SCORE_GOT_LO16:
2175       addend = bfd_get_32 (input_bfd, hit_data);
2176       value = ((((addend >> 16) & 0x3) << 15) | (addend & 0x7fff)) >> 1;
2177       value += symbol;
2178       offset = (value & 0xffff) << 1;
2179       value = (addend & (~(howto->dst_mask))) | (offset & 0x7fff) | ((offset << 1) & 0x30000);
2180
2181       bfd_put_32 (input_bfd, value, hit_data);
2182       return bfd_reloc_ok;
2183
2184     case R_SCORE_DUMMY_HI16:
2185       return bfd_reloc_ok;
2186
2187     case R_SCORE_GNU_VTINHERIT:
2188     case R_SCORE_GNU_VTENTRY:
2189       /* We don't do anything with these at present.  */
2190       return bfd_reloc_continue;
2191
2192     default:
2193       return bfd_reloc_notsupported;
2194     }
2195 }
2196
2197 /* Score backend functions.  */
2198
2199 static void
2200 _bfd_score_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED,
2201                           arelent *bfd_reloc,
2202                           Elf_Internal_Rela *elf_reloc)
2203 {
2204   unsigned int r_type;
2205
2206   r_type = ELF32_R_TYPE (elf_reloc->r_info);
2207   if (r_type >= NUM_ELEM (elf32_score_howto_table))
2208     bfd_reloc->howto = NULL;
2209   else
2210     bfd_reloc->howto = &elf32_score_howto_table[r_type];
2211 }
2212
2213 /* Relocate an score ELF section.  */
2214
2215 static bfd_boolean
2216 _bfd_score_elf_relocate_section (bfd *output_bfd,
2217                                  struct bfd_link_info *info,
2218                                  bfd *input_bfd,
2219                                  asection *input_section,
2220                                  bfd_byte *contents,
2221                                  Elf_Internal_Rela *relocs,
2222                                  Elf_Internal_Sym *local_syms,
2223                                  asection **local_sections)
2224 {
2225   Elf_Internal_Shdr *symtab_hdr;
2226   struct elf_link_hash_entry **sym_hashes;
2227   Elf_Internal_Rela *rel;
2228   Elf_Internal_Rela *relend;
2229   const char *name;
2230   unsigned long offset;
2231   unsigned long hi16_addend, hi16_offset, hi16_value, uvalue;
2232   size_t extsymoff;
2233   bfd_boolean gp_disp_p = FALSE;
2234
2235 #ifndef USE_REL
2236   if (info->relocatable)
2237     return TRUE;
2238 #endif
2239
2240   /* Sort dynsym.  */
2241   if (elf_hash_table (info)->dynamic_sections_created)
2242     {
2243       bfd_size_type dynsecsymcount = 0;
2244       if (info->shared)
2245         {
2246           asection * p;
2247           const struct elf_backend_data *bed = get_elf_backend_data (output_bfd);
2248
2249           for (p = output_bfd->sections; p ; p = p->next)
2250             if ((p->flags & SEC_EXCLUDE) == 0
2251                 && (p->flags & SEC_ALLOC) != 0
2252                 && !(*bed->elf_backend_omit_section_dynsym) (output_bfd, info, p))
2253               ++ dynsecsymcount;
2254         }
2255
2256       if (!score_elf_sort_hash_table (info, dynsecsymcount + 1))
2257         return FALSE;
2258     }
2259
2260   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2261   extsymoff = (elf_bad_symtab (input_bfd)) ? 0 : symtab_hdr->sh_info;
2262   sym_hashes = elf_sym_hashes (input_bfd);
2263   rel = relocs;
2264   relend = relocs + input_section->reloc_count;
2265   for (; rel < relend; rel++)
2266     {
2267       int r_type;
2268       reloc_howto_type *howto;
2269       unsigned long r_symndx;
2270       Elf_Internal_Sym *sym;
2271       asection *sec;
2272       struct score_elf_link_hash_entry *h;
2273       bfd_vma relocation = 0;
2274       bfd_reloc_status_type r;
2275       arelent bfd_reloc;
2276
2277       r_symndx = ELF32_R_SYM (rel->r_info);
2278       r_type = ELF32_R_TYPE (rel->r_info);
2279
2280       _bfd_score_info_to_howto (input_bfd, &bfd_reloc, (Elf_Internal_Rela *) rel);
2281       howto = bfd_reloc.howto;
2282
2283       if (info->relocatable)
2284         {
2285           /* This is a relocatable link.  We don't have to change
2286              anything, unless the reloc is against a section symbol,
2287              in which case we have to adjust according to where the
2288              section symbol winds up in the output section.  */
2289           if (r_symndx < symtab_hdr->sh_info)
2290             {
2291               sym = local_syms + r_symndx;
2292               if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
2293                 {
2294                   sec = local_sections[r_symndx];
2295                   score_elf_add_to_rel (input_bfd, contents + rel->r_offset,
2296                                     howto, (bfd_signed_vma) (sec->output_offset + sym->st_value));
2297                 }
2298             }
2299           continue;
2300         }
2301
2302       /* This is a final link.  */
2303       h = NULL;
2304       sym = NULL;
2305       sec = NULL;
2306
2307       if (r_symndx < extsymoff)
2308         {
2309           sym = local_syms + r_symndx;
2310           sec = local_sections[r_symndx];
2311           relocation = (sec->output_section->vma + sec->output_offset + sym->st_value);
2312
2313           if ((sec->flags & SEC_MERGE) && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
2314             {
2315               asection *msec;
2316               bfd_vma addend, value;
2317
2318               switch (r_type)
2319                 {
2320                 case R_SCORE_HI16:
2321                   break;
2322                 case R_SCORE_LO16:
2323                   hi16_addend = bfd_get_32 (input_bfd, contents + rel->r_offset - 4);
2324                   hi16_offset = ((((hi16_addend >> 16) & 0x3) << 15) | (hi16_addend & 0x7fff)) >> 1;
2325                   value = bfd_get_32 (input_bfd, contents + rel->r_offset);
2326                   offset = ((((value >> 16) & 0x3) << 15) | (value & 0x7fff)) >> 1;
2327                   addend = (hi16_offset << 16) | (offset & 0xffff);
2328                   msec = sec;
2329                   addend = _bfd_elf_rel_local_sym (output_bfd, sym, &msec, addend);
2330                   addend -= relocation;
2331                   addend += msec->output_section->vma + msec->output_offset;
2332                   uvalue = addend;
2333                   hi16_offset = (uvalue >> 16) << 1;
2334                   hi16_value = (hi16_addend & (~(howto->dst_mask)))
2335                     | (hi16_offset & 0x7fff) | ((hi16_offset << 1) & 0x30000);
2336                   bfd_put_32 (input_bfd, hi16_value, contents + rel->r_offset - 4);
2337                   offset = (uvalue & 0xffff) << 1;
2338                   value = (value & (~(howto->dst_mask)))
2339                     | (offset & 0x7fff) | ((offset << 1) & 0x30000);
2340                   bfd_put_32 (input_bfd, value, contents + rel->r_offset);
2341                   break;
2342                 default:
2343                   value = bfd_get_32 (input_bfd, contents + rel->r_offset);
2344                   /* Get the (signed) value from the instruction.  */
2345                   addend = value & howto->src_mask;
2346                   if (addend & ((howto->src_mask + 1) >> 1))
2347                     {
2348                       bfd_signed_vma mask;
2349
2350                       mask = -1;
2351                       mask &= ~howto->src_mask;
2352                       addend |= mask;
2353                     }
2354                   msec = sec;
2355                   addend = _bfd_elf_rel_local_sym (output_bfd, sym, &msec, addend) - relocation;
2356                   addend += msec->output_section->vma + msec->output_offset;
2357                   value = (value & ~howto->dst_mask) | (addend & howto->dst_mask);
2358                   bfd_put_32 (input_bfd, value, contents + rel->r_offset);
2359                   break;
2360                 }
2361             }
2362         }
2363       else
2364         {
2365           /* For global symbols we look up the symbol in the hash-table.  */
2366           h = ((struct score_elf_link_hash_entry *)
2367                elf_sym_hashes (input_bfd) [r_symndx - extsymoff]);
2368           /* Find the real hash-table entry for this symbol.  */
2369           while (h->root.root.type == bfd_link_hash_indirect
2370                  || h->root.root.type == bfd_link_hash_warning)
2371             h = (struct score_elf_link_hash_entry *) h->root.root.u.i.link;
2372
2373           /* Record the name of this symbol, for our caller.  */
2374           name = h->root.root.root.string;
2375
2376           /* See if this is the special GP_DISP_LABEL symbol.  Note that such a
2377              symbol must always be a global symbol.  */
2378           if (strcmp (name, GP_DISP_LABEL) == 0)
2379             {
2380               /* Relocations against GP_DISP_LABEL are permitted only with
2381                  R_SCORE_HI16 and R_SCORE_LO16 relocations.  */
2382               if (r_type != R_SCORE_HI16 && r_type != R_SCORE_LO16)
2383                 return bfd_reloc_notsupported;
2384
2385               gp_disp_p = TRUE;
2386             }
2387
2388           /* If this symbol is defined, calculate its address.  Note that
2389               GP_DISP_LABEL is a magic symbol, always implicitly defined by the
2390               linker, so it's inappropriate to check to see whether or not
2391               its defined.  */
2392           else if ((h->root.root.type == bfd_link_hash_defined
2393                     || h->root.root.type == bfd_link_hash_defweak)
2394                    && h->root.root.u.def.section)
2395             {
2396               sec = h->root.root.u.def.section;
2397               if (sec->output_section)
2398                 relocation = (h->root.root.u.def.value
2399                               + sec->output_section->vma
2400                               + sec->output_offset);
2401               else
2402                 {
2403                   relocation = h->root.root.u.def.value;
2404                 }
2405             }
2406           else if (h->root.root.type == bfd_link_hash_undefweak)
2407             /* We allow relocations against undefined weak symbols, giving
2408                it the value zero, so that you can undefined weak functions
2409                and check to see if they exist by looking at their addresses.  */
2410             relocation = 0;
2411           else if (info->unresolved_syms_in_objects == RM_IGNORE
2412                    && ELF_ST_VISIBILITY (h->root.other) == STV_DEFAULT)
2413             relocation = 0;
2414           else if (strcmp (name, "_DYNAMIC_LINK") == 0)
2415             {
2416               /* If this is a dynamic link, we should have created a _DYNAMIC_LINK symbol
2417                  in _bfd_score_elf_create_dynamic_sections.  Otherwise, we should define
2418                  the symbol with a value of 0.  */
2419               BFD_ASSERT (! info->shared);
2420               BFD_ASSERT (bfd_get_section_by_name (output_bfd, ".dynamic") == NULL);
2421               relocation = 0;
2422             }
2423           else
2424             {
2425               if (! ((*info->callbacks->undefined_symbol)
2426                      (info, h->root.root.root.string, input_bfd,
2427                       input_section, rel->r_offset,
2428                       (info->unresolved_syms_in_objects == RM_GENERATE_ERROR)
2429                       || ELF_ST_VISIBILITY (h->root.other))))
2430                 return bfd_reloc_undefined;
2431               relocation = 0;
2432             }
2433         }
2434
2435       if (h == NULL)
2436         {
2437           name = (bfd_elf_string_from_elf_section (input_bfd, symtab_hdr->sh_link, sym->st_name));
2438           if (name == NULL || *name == '\0')
2439             name = bfd_section_name (input_bfd, sec);
2440         }
2441
2442       r = score_elf_final_link_relocate (howto, input_bfd, output_bfd,
2443                                          input_section, contents, rel, relocs,
2444                                          relocation, info, sec, name,
2445                                          (h ? ELF_ST_TYPE ((unsigned int)h->root.root.type) :
2446                                          ELF_ST_TYPE ((unsigned int)sym->st_info)), h, local_sections,
2447                                          gp_disp_p);
2448
2449       if (r != bfd_reloc_ok)
2450         {
2451           const char *msg = (const char *)0;
2452
2453           switch (r)
2454             {
2455             case bfd_reloc_overflow:
2456               /* If the overflowing reloc was to an undefined symbol,
2457                  we have already printed one error message and there
2458                  is no point complaining again.  */
2459               if (((!h) || (h->root.root.type != bfd_link_hash_undefined))
2460                   && (!((*info->callbacks->reloc_overflow)
2461                         (info, NULL, name, howto->name, (bfd_vma) 0,
2462                          input_bfd, input_section, rel->r_offset))))
2463                 return FALSE;
2464               break;
2465             case bfd_reloc_undefined:
2466               if (!((*info->callbacks->undefined_symbol)
2467                     (info, name, input_bfd, input_section, rel->r_offset, TRUE)))
2468                 return FALSE;
2469               break;
2470
2471             case bfd_reloc_outofrange:
2472               msg = _("internal error: out of range error");
2473               goto common_error;
2474
2475             case bfd_reloc_notsupported:
2476               msg = _("internal error: unsupported relocation error");
2477               goto common_error;
2478
2479             case bfd_reloc_dangerous:
2480               msg = _("internal error: dangerous error");
2481               goto common_error;
2482
2483             default:
2484               msg = _("internal error: unknown error");
2485               /* fall through */
2486
2487             common_error:
2488               if (!((*info->callbacks->warning)
2489                     (info, msg, name, input_bfd, input_section, rel->r_offset)))
2490                 return FALSE;
2491               break;
2492             }
2493         }
2494     }
2495
2496   return TRUE;
2497 }
2498
2499 /* Look through the relocs for a section during the first phase, and
2500    allocate space in the global offset table.  */
2501
2502 static bfd_boolean
2503 _bfd_score_elf_check_relocs (bfd *abfd,
2504                              struct bfd_link_info *info,
2505                              asection *sec,
2506                              const Elf_Internal_Rela *relocs)
2507 {
2508   const char *name;
2509   bfd *dynobj;
2510   Elf_Internal_Shdr *symtab_hdr;
2511   struct elf_link_hash_entry **sym_hashes;
2512   struct score_got_info *g;
2513   size_t extsymoff;
2514   const Elf_Internal_Rela *rel;
2515   const Elf_Internal_Rela *rel_end;
2516   asection *sgot;
2517   asection *sreloc;
2518   const struct elf_backend_data *bed;
2519
2520   if (info->relocatable)
2521     return TRUE;
2522
2523   dynobj = elf_hash_table (info)->dynobj;
2524   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
2525   sym_hashes = elf_sym_hashes (abfd);
2526   extsymoff = (elf_bad_symtab (abfd)) ? 0 : symtab_hdr->sh_info;
2527
2528   name = bfd_get_section_name (abfd, sec);
2529
2530   if (dynobj == NULL)
2531     {
2532       sgot = NULL;
2533       g = NULL;
2534     }
2535   else
2536     {
2537       sgot = score_elf_got_section (dynobj, FALSE);
2538       if (sgot == NULL)
2539         g = NULL;
2540       else
2541         {
2542           BFD_ASSERT (score_elf_section_data (sgot) != NULL);
2543           g = score_elf_section_data (sgot)->u.got_info;
2544           BFD_ASSERT (g != NULL);
2545         }
2546     }
2547
2548   sreloc = NULL;
2549   bed = get_elf_backend_data (abfd);
2550   rel_end = relocs + sec->reloc_count * bed->s->int_rels_per_ext_rel;
2551   for (rel = relocs; rel < rel_end; ++rel)
2552     {
2553       unsigned long r_symndx;
2554       unsigned int r_type;
2555       struct elf_link_hash_entry *h;
2556
2557       r_symndx = ELF32_R_SYM (rel->r_info);
2558       r_type = ELF32_R_TYPE (rel->r_info);
2559
2560       if (r_symndx < extsymoff)
2561         {
2562           h = NULL;
2563         }
2564       else if (r_symndx >= extsymoff + NUM_SHDR_ENTRIES (symtab_hdr))
2565         {
2566           (*_bfd_error_handler) (_("%s: Malformed reloc detected for section %s"), abfd, name);
2567           bfd_set_error (bfd_error_bad_value);
2568           return FALSE;
2569         }
2570       else
2571         {
2572           h = sym_hashes[r_symndx - extsymoff];
2573
2574           /* This may be an indirect symbol created because of a version.  */
2575           if (h != NULL)
2576             {
2577               while (h->root.type == bfd_link_hash_indirect)
2578                 h = (struct elf_link_hash_entry *)h->root.u.i.link;
2579             }
2580         }
2581
2582       /* Some relocs require a global offset table.  */
2583       if (dynobj == NULL || sgot == NULL)
2584         {
2585           switch (r_type)
2586             {
2587             case R_SCORE_GOT15:
2588             case R_SCORE_CALL15:
2589               if (dynobj == NULL)
2590                 elf_hash_table (info)->dynobj = dynobj = abfd;
2591               if (!score_elf_create_got_section (dynobj, info, FALSE))
2592                 return FALSE;
2593               g = score_elf_got_info (dynobj, &sgot);
2594               break;
2595             case R_SCORE_ABS32:
2596             case R_SCORE_REL32:
2597               if (dynobj == NULL && (info->shared || h != NULL) && (sec->flags & SEC_ALLOC) != 0)
2598                 elf_hash_table (info)->dynobj = dynobj = abfd;
2599               break;
2600             default:
2601               break;
2602             }
2603         }
2604
2605       if (!h && (r_type == R_SCORE_GOT_LO16))
2606         {
2607           if (! score_elf_record_local_got_symbol (abfd, r_symndx, rel->r_addend, g))
2608             return FALSE;
2609         }
2610
2611       switch (r_type)
2612         {
2613         case R_SCORE_CALL15:
2614           if (h == NULL)
2615             {
2616               (*_bfd_error_handler)
2617                 (_("%B: CALL15 reloc at 0x%lx not against global symbol"),
2618                  abfd, (unsigned long) rel->r_offset);
2619               bfd_set_error (bfd_error_bad_value);
2620               return FALSE;
2621             }
2622           else
2623             {
2624               /* This symbol requires a global offset table entry.  */
2625               if (! score_elf_record_global_got_symbol (h, abfd, info, g))
2626                 return FALSE;
2627
2628               /* We need a stub, not a plt entry for the undefined function.  But we record
2629                  it as if it needs plt.  See _bfd_elf_adjust_dynamic_symbol.  */
2630               h->needs_plt = 1;
2631               h->type = STT_FUNC;
2632             }
2633           break;
2634         case R_SCORE_GOT15:
2635           if (h && ! score_elf_record_global_got_symbol (h, abfd, info, g))
2636             return FALSE;
2637           break;
2638         case R_SCORE_ABS32:
2639         case R_SCORE_REL32:
2640           if ((info->shared || h != NULL) && (sec->flags & SEC_ALLOC) != 0)
2641             {
2642               if (sreloc == NULL)
2643                 {
2644                   sreloc = score_elf_rel_dyn_section (dynobj, TRUE);
2645                   if (sreloc == NULL)
2646                     return FALSE;
2647                 }
2648 #define SCORE_READONLY_SECTION (SEC_ALLOC | SEC_LOAD | SEC_READONLY)
2649               if (info->shared)
2650                 {
2651                   /* When creating a shared object, we must copy these reloc types into
2652                      the output file as R_SCORE_REL32 relocs.  We make room for this reloc
2653                      in the .rel.dyn reloc section.  */
2654                   score_elf_allocate_dynamic_relocations (dynobj, 1);
2655                   if ((sec->flags & SCORE_READONLY_SECTION)
2656                       == SCORE_READONLY_SECTION)
2657                     /* We tell the dynamic linker that there are
2658                        relocations against the text segment.  */
2659                     info->flags |= DF_TEXTREL;
2660                 }
2661               else
2662                 {
2663                   struct score_elf_link_hash_entry *hscore;
2664
2665                   /* We only need to copy this reloc if the symbol is
2666                      defined in a dynamic object.  */
2667                   hscore = (struct score_elf_link_hash_entry *)h;
2668                   ++hscore->possibly_dynamic_relocs;
2669                   if ((sec->flags & SCORE_READONLY_SECTION)
2670                       == SCORE_READONLY_SECTION)
2671                     /* We need it to tell the dynamic linker if there
2672                        are relocations against the text segment.  */
2673                     hscore->readonly_reloc = TRUE;
2674                 }
2675
2676               /* Even though we don't directly need a GOT entry for this symbol,
2677                  a symbol must have a dynamic symbol table index greater that
2678                  DT_SCORE_GOTSYM if there are dynamic relocations against it.  */
2679               if (h != NULL)
2680                 {
2681                   if (dynobj == NULL)
2682                     elf_hash_table (info)->dynobj = dynobj = abfd;
2683                   if (! score_elf_create_got_section (dynobj, info, TRUE))
2684                     return FALSE;
2685                   g = score_elf_got_info (dynobj, &sgot);
2686                   if (! score_elf_record_global_got_symbol (h, abfd, info, g))
2687                     return FALSE;
2688                 }
2689             }
2690           break;
2691
2692           /* This relocation describes the C++ object vtable hierarchy.
2693              Reconstruct it for later use during GC.  */
2694         case R_SCORE_GNU_VTINHERIT:
2695           if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
2696             return FALSE;
2697           break;
2698
2699           /* This relocation describes which C++ vtable entries are actually
2700              used.  Record for later use during GC.  */
2701         case R_SCORE_GNU_VTENTRY:
2702           if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_offset))
2703             return FALSE;
2704           break;
2705         default:
2706           break;
2707         }
2708
2709       /* We must not create a stub for a symbol that has relocations
2710          related to taking the function's address.  */
2711       switch (r_type)
2712         {
2713         default:
2714           if (h != NULL)
2715             {
2716               struct score_elf_link_hash_entry *sh;
2717
2718               sh = (struct score_elf_link_hash_entry *) h;
2719               sh->no_fn_stub = TRUE;
2720             }
2721           break;
2722         case R_SCORE_CALL15:
2723           break;
2724         }
2725     }
2726
2727   return TRUE;
2728 }
2729
2730 static bfd_boolean
2731 _bfd_score_elf_add_symbol_hook (bfd *abfd,
2732                                 struct bfd_link_info *info ATTRIBUTE_UNUSED,
2733                                 Elf_Internal_Sym *sym,
2734                                 const char **namep ATTRIBUTE_UNUSED,
2735                                 flagword *flagsp ATTRIBUTE_UNUSED,
2736                                 asection **secp,
2737                                 bfd_vma *valp)
2738 {
2739   switch (sym->st_shndx)
2740     {
2741     case SHN_COMMON:
2742       if (sym->st_size > elf_gp_size (abfd))
2743         break;
2744       /* Fall through.  */
2745     case SHN_SCORE_SCOMMON:
2746       *secp = bfd_make_section_old_way (abfd, ".scommon");
2747       (*secp)->flags |= SEC_IS_COMMON;
2748       *valp = sym->st_size;
2749       break;
2750     }
2751
2752   return TRUE;
2753 }
2754
2755 static void
2756 _bfd_score_elf_symbol_processing (bfd *abfd, asymbol *asym)
2757 {
2758   elf_symbol_type *elfsym;
2759
2760   elfsym = (elf_symbol_type *) asym;
2761   switch (elfsym->internal_elf_sym.st_shndx)
2762     {
2763     case SHN_COMMON:
2764       if (asym->value > elf_gp_size (abfd))
2765         break;
2766       /* Fall through.  */
2767     case SHN_SCORE_SCOMMON:
2768       if (score_elf_scom_section.name == NULL)
2769         {
2770           /* Initialize the small common section.  */
2771           score_elf_scom_section.name = ".scommon";
2772           score_elf_scom_section.flags = SEC_IS_COMMON;
2773           score_elf_scom_section.output_section = &score_elf_scom_section;
2774           score_elf_scom_section.symbol = &score_elf_scom_symbol;
2775           score_elf_scom_section.symbol_ptr_ptr = &score_elf_scom_symbol_ptr;
2776           score_elf_scom_symbol.name = ".scommon";
2777           score_elf_scom_symbol.flags = BSF_SECTION_SYM;
2778           score_elf_scom_symbol.section = &score_elf_scom_section;
2779           score_elf_scom_symbol_ptr = &score_elf_scom_symbol;
2780         }
2781       asym->section = &score_elf_scom_section;
2782       asym->value = elfsym->internal_elf_sym.st_size;
2783       break;
2784     }
2785 }
2786
2787 static bfd_boolean
2788 _bfd_score_elf_link_output_symbol_hook (struct bfd_link_info *info ATTRIBUTE_UNUSED,
2789      const char *name ATTRIBUTE_UNUSED,
2790      Elf_Internal_Sym *sym,
2791      asection *input_sec,
2792      struct elf_link_hash_entry *h ATTRIBUTE_UNUSED)
2793 {
2794   /* If we see a common symbol, which implies a relocatable link, then
2795      if a symbol was small common in an input file, mark it as small
2796      common in the output file.  */
2797   if (sym->st_shndx == SHN_COMMON && strcmp (input_sec->name, ".scommon") == 0)
2798     sym->st_shndx = SHN_SCORE_SCOMMON;
2799
2800   return TRUE;
2801 }
2802
2803 static bfd_boolean
2804 _bfd_score_elf_section_from_bfd_section (bfd *abfd ATTRIBUTE_UNUSED,
2805                                          asection *sec,
2806                                          int *retval)
2807 {
2808   if (strcmp (bfd_get_section_name (abfd, sec), ".scommon") == 0)
2809     {
2810       *retval = SHN_SCORE_SCOMMON;
2811       return TRUE;
2812     }
2813
2814   return FALSE;
2815 }
2816
2817 /* Adjust a symbol defined by a dynamic object and referenced by a
2818    regular object.  The current definition is in some section of the
2819    dynamic object, but we're not including those sections.  We have to
2820    change the definition to something the rest of the link can understand.  */
2821
2822 static bfd_boolean
2823 _bfd_score_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
2824                                       struct elf_link_hash_entry *h)
2825 {
2826   bfd *dynobj;
2827   struct score_elf_link_hash_entry *hscore;
2828   asection *s;
2829
2830   dynobj = elf_hash_table (info)->dynobj;
2831
2832   /* Make sure we know what is going on here.  */
2833   BFD_ASSERT (dynobj != NULL
2834               && (h->needs_plt
2835                   || h->u.weakdef != NULL
2836                   || (h->def_dynamic && h->ref_regular && !h->def_regular)));
2837
2838   /* If this symbol is defined in a dynamic object, we need to copy
2839      any R_SCORE_ABS32 or R_SCORE_REL32 relocs against it into the output
2840      file.  */
2841   hscore = (struct score_elf_link_hash_entry *)h;
2842   if (!info->relocatable
2843       && hscore->possibly_dynamic_relocs != 0
2844       && (h->root.type == bfd_link_hash_defweak || !h->def_regular))
2845     {
2846       score_elf_allocate_dynamic_relocations (dynobj, hscore->possibly_dynamic_relocs);
2847       if (hscore->readonly_reloc)
2848         /* We tell the dynamic linker that there are relocations
2849            against the text segment.  */
2850         info->flags |= DF_TEXTREL;
2851     }
2852
2853   /* For a function, create a stub, if allowed.  */
2854   if (!hscore->no_fn_stub && h->needs_plt)
2855     {
2856       if (!elf_hash_table (info)->dynamic_sections_created)
2857         return TRUE;
2858
2859       /* If this symbol is not defined in a regular file, then set
2860          the symbol to the stub location.  This is required to make
2861          function pointers compare as equal between the normal
2862          executable and the shared library.  */
2863       if (!h->def_regular)
2864         {
2865           /* We need .stub section.  */
2866           s = bfd_get_section_by_name (dynobj, SCORE_ELF_STUB_SECTION_NAME);
2867           BFD_ASSERT (s != NULL);
2868
2869           h->root.u.def.section = s;
2870           h->root.u.def.value = s->size;
2871
2872           /* XXX Write this stub address somewhere.  */
2873           h->plt.offset = s->size;
2874
2875           /* Make room for this stub code.  */
2876           s->size += SCORE_FUNCTION_STUB_SIZE;
2877
2878           /* The last half word of the stub will be filled with the index
2879              of this symbol in .dynsym section.  */
2880           return TRUE;
2881         }
2882     }
2883   else if ((h->type == STT_FUNC) && !h->needs_plt)
2884     {
2885       /* This will set the entry for this symbol in the GOT to 0, and
2886          the dynamic linker will take care of this.  */
2887       h->root.u.def.value = 0;
2888       return TRUE;
2889     }
2890
2891   /* If this is a weak symbol, and there is a real definition, the
2892      processor independent code will have arranged for us to see the
2893      real definition first, and we can just use the same value.  */
2894   if (h->u.weakdef != NULL)
2895     {
2896       BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
2897                   || h->u.weakdef->root.type == bfd_link_hash_defweak);
2898       h->root.u.def.section = h->u.weakdef->root.u.def.section;
2899       h->root.u.def.value = h->u.weakdef->root.u.def.value;
2900       return TRUE;
2901     }
2902
2903   /* This is a reference to a symbol defined by a dynamic object which
2904      is not a function.  */
2905   return TRUE;
2906 }
2907
2908 /* This function is called after all the input files have been read,
2909    and the input sections have been assigned to output sections.  */
2910
2911 static bfd_boolean
2912 _bfd_score_elf_always_size_sections (bfd *output_bfd,
2913                                      struct bfd_link_info *info)
2914 {
2915   bfd *dynobj;
2916   asection *s;
2917   struct score_got_info *g;
2918   int i;
2919   bfd_size_type loadable_size = 0;
2920   bfd_size_type local_gotno;
2921   bfd *sub;
2922
2923   dynobj = elf_hash_table (info)->dynobj;
2924   if (dynobj == NULL)
2925     /* Relocatable links don't have it.  */
2926     return TRUE;
2927
2928   g = score_elf_got_info (dynobj, &s);
2929   if (s == NULL)
2930     return TRUE;
2931
2932   /* Calculate the total loadable size of the output.  That will give us the
2933      maximum number of GOT_PAGE entries required.  */
2934   for (sub = info->input_bfds; sub; sub = sub->link_next)
2935     {
2936       asection *subsection;
2937
2938       for (subsection = sub->sections;
2939            subsection;
2940            subsection = subsection->next)
2941         {
2942           if ((subsection->flags & SEC_ALLOC) == 0)
2943             continue;
2944           loadable_size += ((subsection->size + 0xf)
2945                             &~ (bfd_size_type) 0xf);
2946         }
2947     }
2948
2949   /* There has to be a global GOT entry for every symbol with
2950      a dynamic symbol table index of DT_SCORE_GOTSYM or
2951      higher.  Therefore, it make sense to put those symbols
2952      that need GOT entries at the end of the symbol table.  We
2953      do that here.  */
2954   if (! score_elf_sort_hash_table (info, 1))
2955     return FALSE;
2956
2957   if (g->global_gotsym != NULL)
2958     i = elf_hash_table (info)->dynsymcount - g->global_gotsym->dynindx;
2959   else
2960     /* If there are no global symbols, or none requiring
2961        relocations, then GLOBAL_GOTSYM will be NULL.  */
2962     i = 0;
2963
2964   /* In the worst case, we'll get one stub per dynamic symbol.  */
2965   loadable_size += SCORE_FUNCTION_STUB_SIZE * i;
2966
2967   /* Assume there are two loadable segments consisting of
2968      contiguous sections.  Is 5 enough?  */
2969   local_gotno = (loadable_size >> 16) + 5;
2970
2971   g->local_gotno += local_gotno;
2972   s->size += g->local_gotno * SCORE_ELF_GOT_SIZE (output_bfd);
2973
2974   g->global_gotno = i;
2975   s->size += i * SCORE_ELF_GOT_SIZE (output_bfd);
2976
2977   score_elf_resolve_final_got_entries (g);
2978
2979   if (s->size > SCORE_ELF_GOT_MAX_SIZE (output_bfd))
2980     {
2981       /* Fixme. Error message or Warning message should be issued here.  */
2982     }
2983
2984   return TRUE;
2985 }
2986
2987 /* Set the sizes of the dynamic sections.  */
2988
2989 static bfd_boolean
2990 _bfd_score_elf_size_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
2991 {
2992   bfd *dynobj;
2993   asection *s;
2994   bfd_boolean reltext;
2995
2996   dynobj = elf_hash_table (info)->dynobj;
2997   BFD_ASSERT (dynobj != NULL);
2998
2999   if (elf_hash_table (info)->dynamic_sections_created)
3000     {
3001       /* Set the contents of the .interp section to the interpreter.  */
3002       if (!info->shared)
3003         {
3004           s = bfd_get_section_by_name (dynobj, ".interp");
3005           BFD_ASSERT (s != NULL);
3006           s->size = strlen (ELF_DYNAMIC_INTERPRETER) + 1;
3007           s->contents = (bfd_byte *) ELF_DYNAMIC_INTERPRETER;
3008         }
3009     }
3010
3011   /* The check_relocs and adjust_dynamic_symbol entry points have
3012      determined the sizes of the various dynamic sections.  Allocate
3013      memory for them.  */
3014   reltext = FALSE;
3015   for (s = dynobj->sections; s != NULL; s = s->next)
3016     {
3017       const char *name;
3018
3019       if ((s->flags & SEC_LINKER_CREATED) == 0)
3020         continue;
3021
3022       /* It's OK to base decisions on the section name, because none
3023          of the dynobj section names depend upon the input files.  */
3024       name = bfd_get_section_name (dynobj, s);
3025
3026       if (CONST_STRNEQ (name, ".rel"))
3027         {
3028           if (s->size == 0)
3029             {
3030               /* We only strip the section if the output section name
3031                  has the same name.  Otherwise, there might be several
3032                  input sections for this output section.  FIXME: This
3033                  code is probably not needed these days anyhow, since
3034                  the linker now does not create empty output sections.  */
3035               if (s->output_section != NULL
3036                   && strcmp (name,
3037                              bfd_get_section_name (s->output_section->owner,
3038                                                    s->output_section)) == 0)
3039                 s->flags |= SEC_EXCLUDE;
3040             }
3041           else
3042             {
3043               const char *outname;
3044               asection *target;
3045
3046               /* If this relocation section applies to a read only
3047                  section, then we probably need a DT_TEXTREL entry.
3048                  If the relocation section is .rel.dyn, we always
3049                  assert a DT_TEXTREL entry rather than testing whether
3050                  there exists a relocation to a read only section or
3051                  not.  */
3052               outname = bfd_get_section_name (output_bfd, s->output_section);
3053               target = bfd_get_section_by_name (output_bfd, outname + 4);
3054               if ((target != NULL
3055                    && (target->flags & SEC_READONLY) != 0
3056                    && (target->flags & SEC_ALLOC) != 0) || strcmp (outname, ".rel.dyn") == 0)
3057                 reltext = TRUE;
3058
3059               /* We use the reloc_count field as a counter if we need
3060                  to copy relocs into the output file.  */
3061               if (strcmp (name, ".rel.dyn") != 0)
3062                 s->reloc_count = 0;
3063             }
3064         }
3065       else if (CONST_STRNEQ (name, ".got"))
3066         {
3067           /* _bfd_score_elf_always_size_sections() has already done
3068              most of the work, but some symbols may have been mapped
3069              to versions that we must now resolve in the got_entries
3070              hash tables.  */
3071         }
3072       else if (strcmp (name, SCORE_ELF_STUB_SECTION_NAME) == 0)
3073         {
3074           /* IRIX rld assumes that the function stub isn't at the end
3075              of .text section. So put a dummy. XXX  */
3076           s->size += SCORE_FUNCTION_STUB_SIZE;
3077         }
3078       else if (! CONST_STRNEQ (name, ".init"))
3079         {
3080           /* It's not one of our sections, so don't allocate space.  */
3081           continue;
3082         }
3083
3084       /* Allocate memory for the section contents.  */
3085       s->contents = bfd_zalloc (dynobj, s->size);
3086       if (s->contents == NULL && s->size != 0)
3087         {
3088           bfd_set_error (bfd_error_no_memory);
3089           return FALSE;
3090         }
3091     }
3092
3093   if (elf_hash_table (info)->dynamic_sections_created)
3094     {
3095       /* Add some entries to the .dynamic section.  We fill in the
3096          values later, in _bfd_score_elf_finish_dynamic_sections, but we
3097          must add the entries now so that we get the correct size for
3098          the .dynamic section.  The DT_DEBUG entry is filled in by the
3099          dynamic linker and used by the debugger.  */
3100
3101       if (!SCORE_ELF_ADD_DYNAMIC_ENTRY (info, DT_DEBUG, 0))
3102         return FALSE;
3103
3104       if (reltext)
3105         info->flags |= DF_TEXTREL;
3106
3107       if ((info->flags & DF_TEXTREL) != 0)
3108         {
3109           if (!SCORE_ELF_ADD_DYNAMIC_ENTRY (info, DT_TEXTREL, 0))
3110             return FALSE;
3111         }
3112
3113       if (! SCORE_ELF_ADD_DYNAMIC_ENTRY (info, DT_PLTGOT, 0))
3114         return FALSE;
3115
3116       if (score_elf_rel_dyn_section (dynobj, FALSE))
3117         {
3118           if (!SCORE_ELF_ADD_DYNAMIC_ENTRY (info, DT_REL, 0))
3119             return FALSE;
3120
3121           if (!SCORE_ELF_ADD_DYNAMIC_ENTRY (info, DT_RELSZ, 0))
3122             return FALSE;
3123
3124           if (!SCORE_ELF_ADD_DYNAMIC_ENTRY (info, DT_RELENT, 0))
3125             return FALSE;
3126         }
3127
3128       if (!SCORE_ELF_ADD_DYNAMIC_ENTRY (info, DT_SCORE_BASE_ADDRESS, 0))
3129         return FALSE;
3130
3131       if (!SCORE_ELF_ADD_DYNAMIC_ENTRY (info, DT_SCORE_LOCAL_GOTNO, 0))
3132         return FALSE;
3133
3134       if (!SCORE_ELF_ADD_DYNAMIC_ENTRY (info, DT_SCORE_SYMTABNO, 0))
3135         return FALSE;
3136
3137       if (!SCORE_ELF_ADD_DYNAMIC_ENTRY (info, DT_SCORE_UNREFEXTNO, 0))
3138         return FALSE;
3139
3140       if (!SCORE_ELF_ADD_DYNAMIC_ENTRY (info, DT_SCORE_GOTSYM, 0))
3141         return FALSE;
3142
3143       if (!SCORE_ELF_ADD_DYNAMIC_ENTRY (info, DT_SCORE_HIPAGENO, 0))
3144         return FALSE;
3145     }
3146
3147   return TRUE;
3148 }
3149
3150 static bfd_boolean
3151 _bfd_score_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
3152 {
3153   struct elf_link_hash_entry *h;
3154   struct bfd_link_hash_entry *bh;
3155   flagword flags;
3156   asection *s;
3157
3158   flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
3159            | SEC_LINKER_CREATED | SEC_READONLY);
3160
3161   /* ABI requests the .dynamic section to be read only.  */
3162   s = bfd_get_section_by_name (abfd, ".dynamic");
3163   if (s != NULL)
3164     {
3165       if (!bfd_set_section_flags (abfd, s, flags))
3166         return FALSE;
3167     }
3168
3169   /* We need to create .got section.  */
3170   if (!score_elf_create_got_section (abfd, info, FALSE))
3171     return FALSE;
3172
3173   if (!score_elf_rel_dyn_section (elf_hash_table (info)->dynobj, TRUE))
3174     return FALSE;
3175
3176   /* Create .stub section.  */
3177   if (bfd_get_section_by_name (abfd, SCORE_ELF_STUB_SECTION_NAME) == NULL)
3178     {
3179       s = bfd_make_section (abfd, SCORE_ELF_STUB_SECTION_NAME);
3180       if (s == NULL
3181           || !bfd_set_section_flags (abfd, s, flags | SEC_CODE)
3182           || !bfd_set_section_alignment (abfd, s, 2))
3183
3184         return FALSE;
3185     }
3186
3187   if (!info->shared)
3188     {
3189       const char *name;
3190
3191       name = "_DYNAMIC_LINK";
3192       bh = NULL;
3193       if (!(_bfd_generic_link_add_one_symbol
3194             (info, abfd, name, BSF_GLOBAL, bfd_abs_section_ptr,
3195              (bfd_vma) 0, (const char *)NULL, FALSE, get_elf_backend_data (abfd)->collect, &bh)))
3196         return FALSE;
3197
3198       h = (struct elf_link_hash_entry *)bh;
3199       h->non_elf = 0;
3200       h->def_regular = 1;
3201       h->type = STT_SECTION;
3202
3203       if (!bfd_elf_link_record_dynamic_symbol (info, h))
3204         return FALSE;
3205     }
3206
3207   return TRUE;
3208 }
3209
3210
3211 /* Finish up dynamic symbol handling.  We set the contents of various
3212    dynamic sections here.  */
3213
3214 static bfd_boolean
3215 _bfd_score_elf_finish_dynamic_symbol (bfd *output_bfd,
3216                                       struct bfd_link_info *info,
3217                                       struct elf_link_hash_entry *h,
3218                                       Elf_Internal_Sym *sym)
3219 {
3220   bfd *dynobj;
3221   asection *sgot;
3222   struct score_got_info *g;
3223   const char *name;
3224
3225   dynobj = elf_hash_table (info)->dynobj;
3226
3227   if (h->plt.offset != MINUS_ONE)
3228     {
3229       asection *s;
3230       bfd_byte stub[SCORE_FUNCTION_STUB_SIZE];
3231
3232       /* This symbol has a stub.  Set it up.  */
3233       BFD_ASSERT (h->dynindx != -1);
3234
3235       s = bfd_get_section_by_name (dynobj, SCORE_ELF_STUB_SECTION_NAME);
3236       BFD_ASSERT (s != NULL);
3237
3238       /* FIXME: Can h->dynindex be more than 64K?  */
3239       if (h->dynindx & 0xffff0000)
3240         return FALSE;
3241
3242       /* Fill the stub.  */
3243       bfd_put_32 (output_bfd, STUB_LW, stub);
3244       bfd_put_32 (output_bfd, STUB_MOVE, stub + 4);
3245       bfd_put_32 (output_bfd, STUB_LI16 | (h->dynindx << 1), stub + 8);
3246       bfd_put_32 (output_bfd, STUB_BRL, stub + 12);
3247
3248       BFD_ASSERT (h->plt.offset <= s->size);
3249       memcpy (s->contents + h->plt.offset, stub, SCORE_FUNCTION_STUB_SIZE);
3250
3251       /* Mark the symbol as undefined.  plt.offset != -1 occurs
3252          only for the referenced symbol.  */
3253       sym->st_shndx = SHN_UNDEF;
3254
3255       /* The run-time linker uses the st_value field of the symbol
3256           to reset the global offset table entry for this external
3257           to its stub address when unlinking a shared object.  */
3258       sym->st_value = (s->output_section->vma + s->output_offset + h->plt.offset);
3259     }
3260
3261   BFD_ASSERT (h->dynindx != -1 || h->forced_local);
3262
3263   sgot = score_elf_got_section (dynobj, FALSE);
3264   BFD_ASSERT (sgot != NULL);
3265   BFD_ASSERT (score_elf_section_data (sgot) != NULL);
3266   g = score_elf_section_data (sgot)->u.got_info;
3267   BFD_ASSERT (g != NULL);
3268
3269   /* Run through the global symbol table, creating GOT entries for all
3270      the symbols that need them.  */
3271   if (g->global_gotsym != NULL && h->dynindx >= g->global_gotsym->dynindx)
3272     {
3273       bfd_vma offset;
3274       bfd_vma value;
3275
3276       value = sym->st_value;
3277       offset = score_elf_global_got_index (dynobj, h);
3278       bfd_put_32 (output_bfd, value, sgot->contents + offset);
3279     }
3280
3281   /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute.  */
3282   name = h->root.root.string;
3283   if (strcmp (name, "_DYNAMIC") == 0 || strcmp (name, "_GLOBAL_OFFSET_TABLE_") == 0)
3284     sym->st_shndx = SHN_ABS;
3285   else if (strcmp (name, "_DYNAMIC_LINK") == 0)
3286     {
3287       sym->st_shndx = SHN_ABS;
3288       sym->st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION);
3289       sym->st_value = 1;
3290     }
3291   else if (strcmp (name, GP_DISP_LABEL) == 0)
3292     {
3293       sym->st_shndx = SHN_ABS;
3294       sym->st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION);
3295       sym->st_value = elf_gp (output_bfd);
3296     }
3297
3298   return TRUE;
3299 }
3300
3301 /* Finish up the dynamic sections.  */
3302
3303 static bfd_boolean
3304 _bfd_score_elf_finish_dynamic_sections (bfd *output_bfd,
3305                                         struct bfd_link_info *info)
3306 {
3307   bfd *dynobj;
3308   asection *sdyn;
3309   asection *sgot;
3310   asection *s;
3311   struct score_got_info *g;
3312
3313   dynobj = elf_hash_table (info)->dynobj;
3314
3315   sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
3316
3317   sgot = score_elf_got_section (dynobj, FALSE);
3318   if (sgot == NULL)
3319     g = NULL;
3320   else
3321     {
3322       BFD_ASSERT (score_elf_section_data (sgot) != NULL);
3323       g = score_elf_section_data (sgot)->u.got_info;
3324       BFD_ASSERT (g != NULL);
3325     }
3326
3327   if (elf_hash_table (info)->dynamic_sections_created)
3328     {
3329       bfd_byte *b;
3330
3331       BFD_ASSERT (sdyn != NULL);
3332       BFD_ASSERT (g != NULL);
3333
3334       for (b = sdyn->contents;
3335            b < sdyn->contents + sdyn->size;
3336            b += SCORE_ELF_DYN_SIZE (dynobj))
3337         {
3338           Elf_Internal_Dyn dyn;
3339           const char *name;
3340           size_t elemsize;
3341           bfd_boolean swap_out_p;
3342
3343           /* Read in the current dynamic entry.  */
3344           (*get_elf_backend_data (dynobj)->s->swap_dyn_in) (dynobj, b, &dyn);
3345
3346           /* Assume that we're going to modify it and write it out.  */
3347           swap_out_p = TRUE;
3348
3349           switch (dyn.d_tag)
3350             {
3351             case DT_RELENT:
3352               s = score_elf_rel_dyn_section (dynobj, FALSE);
3353               BFD_ASSERT (s != NULL);
3354               dyn.d_un.d_val = SCORE_ELF_REL_SIZE (dynobj);
3355               break;
3356
3357             case DT_STRSZ:
3358               /* Rewrite DT_STRSZ.  */
3359               dyn.d_un.d_val = _bfd_elf_strtab_size (elf_hash_table (info)->dynstr);
3360                     break;
3361
3362             case DT_PLTGOT:
3363               name = ".got";
3364               s = bfd_get_section_by_name (output_bfd, name);
3365               BFD_ASSERT (s != NULL);
3366               dyn.d_un.d_ptr = s->vma;
3367               break;
3368
3369             case DT_SCORE_BASE_ADDRESS:
3370               s = output_bfd->sections;
3371               BFD_ASSERT (s != NULL);
3372               dyn.d_un.d_ptr = s->vma & ~(bfd_vma) 0xffff;
3373               break;
3374
3375             case DT_SCORE_LOCAL_GOTNO:
3376               dyn.d_un.d_val = g->local_gotno;
3377               break;
3378
3379             case DT_SCORE_UNREFEXTNO:
3380               /* The index into the dynamic symbol table which is the
3381                  entry of the first external symbol that is not
3382                  referenced within the same object.  */
3383               dyn.d_un.d_val = bfd_count_sections (output_bfd) + 1;
3384               break;
3385
3386             case DT_SCORE_GOTSYM:
3387               if (g->global_gotsym)
3388                 {
3389                   dyn.d_un.d_val = g->global_gotsym->dynindx;
3390                   break;
3391                 }
3392               /* In case if we don't have global got symbols we default
3393                   to setting DT_SCORE_GOTSYM to the same value as
3394                   DT_SCORE_SYMTABNO, so we just fall through.  */
3395
3396             case DT_SCORE_SYMTABNO:
3397               name = ".dynsym";
3398               elemsize = SCORE_ELF_SYM_SIZE (output_bfd);
3399               s = bfd_get_section_by_name (output_bfd, name);
3400               BFD_ASSERT (s != NULL);
3401
3402               dyn.d_un.d_val = s->size / elemsize;
3403               break;
3404
3405             case DT_SCORE_HIPAGENO:
3406               dyn.d_un.d_val = g->local_gotno - SCORE_RESERVED_GOTNO;
3407               break;
3408
3409             default:
3410               swap_out_p = FALSE;
3411               break;
3412             }
3413
3414           if (swap_out_p)
3415             (*get_elf_backend_data (dynobj)->s->swap_dyn_out) (dynobj, &dyn, b);
3416         }
3417     }
3418
3419   /* The first entry of the global offset table will be filled at
3420      runtime. The second entry will be used by some runtime loaders.
3421      This isn't the case of IRIX rld.  */
3422   if (sgot != NULL && sgot->size > 0)
3423     {
3424       bfd_put_32 (output_bfd, 0, sgot->contents);
3425       bfd_put_32 (output_bfd, 0x80000000, sgot->contents + SCORE_ELF_GOT_SIZE (output_bfd));
3426     }
3427
3428   if (sgot != NULL)
3429     elf_section_data (sgot->output_section)->this_hdr.sh_entsize
3430       = SCORE_ELF_GOT_SIZE (output_bfd);
3431
3432
3433   /* We need to sort the entries of the dynamic relocation section.  */
3434   s = score_elf_rel_dyn_section (dynobj, FALSE);
3435
3436   if (s != NULL && s->size > (bfd_vma)2 * SCORE_ELF_REL_SIZE (output_bfd))
3437     {
3438       reldyn_sorting_bfd = output_bfd;
3439       qsort ((Elf32_External_Rel *) s->contents + 1, s->reloc_count - 1,
3440              sizeof (Elf32_External_Rel), score_elf_sort_dynamic_relocs);
3441     }
3442
3443   return TRUE;
3444 }
3445
3446 /* This function set up the ELF section header for a BFD section in preparation for writing
3447    it out.  This is where the flags and type fields are set for unusual sections.  */
3448
3449 static bfd_boolean
3450 _bfd_score_elf_fake_sections (bfd *abfd ATTRIBUTE_UNUSED,
3451                               Elf_Internal_Shdr *hdr,
3452                               asection *sec)
3453 {
3454   const char *name;
3455
3456   name = bfd_get_section_name (abfd, sec);
3457
3458   if (strcmp (name, ".got") == 0
3459       || strcmp (name, ".srdata") == 0
3460       || strcmp (name, ".sdata") == 0
3461       || strcmp (name, ".sbss") == 0)
3462     hdr->sh_flags |= SHF_SCORE_GPREL;
3463
3464   return TRUE;
3465 }
3466
3467 /* This function do additional processing on the ELF section header before writing
3468    it out.  This is used to set the flags and type fields for some sections.  */
3469
3470 /* assign_file_positions_except_relocs() check section flag and if it is allocatable,
3471    warning message will be issued.  backend_fake_section is called before
3472    assign_file_positions_except_relocs(); backend_section_processing after it.  so, we
3473    modify section flag there, but not backend_fake_section.  */
3474
3475 static bfd_boolean
3476 _bfd_score_elf_section_processing (bfd *abfd ATTRIBUTE_UNUSED, Elf_Internal_Shdr *hdr)
3477 {
3478   if (hdr->bfd_section != NULL)
3479     {
3480       const char *name = bfd_get_section_name (abfd, hdr->bfd_section);
3481
3482       if (strcmp (name, ".sdata") == 0)
3483         {
3484           hdr->sh_flags |= SHF_ALLOC | SHF_WRITE | SHF_SCORE_GPREL;
3485           hdr->sh_type = SHT_PROGBITS;
3486         }
3487       else if (strcmp (name, ".sbss") == 0)
3488         {
3489           hdr->sh_flags |= SHF_ALLOC | SHF_WRITE | SHF_SCORE_GPREL;
3490           hdr->sh_type = SHT_NOBITS;
3491         }
3492       else if (strcmp (name, ".srdata") == 0)
3493         {
3494           hdr->sh_flags |= SHF_ALLOC | SHF_SCORE_GPREL;
3495           hdr->sh_type = SHT_PROGBITS;
3496         }
3497     }
3498
3499   return TRUE;
3500 }
3501
3502 static bfd_boolean
3503 _bfd_score_elf_write_section (bfd *output_bfd, asection *sec, bfd_byte *contents)
3504 {
3505   bfd_byte *to, *from, *end;
3506   int i;
3507
3508   if (strcmp (sec->name, ".pdr") != 0)
3509     return FALSE;
3510
3511   if (score_elf_section_data (sec)->u.tdata == NULL)
3512     return FALSE;
3513
3514   to = contents;
3515   end = contents + sec->size;
3516   for (from = contents, i = 0; from < end; from += PDR_SIZE, i++)
3517     {
3518       if ((score_elf_section_data (sec)->u.tdata)[i] == 1)
3519         continue;
3520
3521       if (to != from)
3522         memcpy (to, from, PDR_SIZE);
3523
3524       to += PDR_SIZE;
3525     }
3526   bfd_set_section_contents (output_bfd, sec->output_section, contents,
3527                             (file_ptr) sec->output_offset, sec->size);
3528
3529   return TRUE;
3530 }
3531
3532 /* Copy data from a SCORE ELF indirect symbol to its direct symbol, hiding the old
3533    indirect symbol.  Process additional relocation information.  */
3534
3535 static void
3536 _bfd_score_elf_copy_indirect_symbol (struct bfd_link_info *info,
3537                                      struct elf_link_hash_entry *dir,
3538                                      struct elf_link_hash_entry *ind)
3539 {
3540   struct score_elf_link_hash_entry *dirscore, *indscore;
3541
3542   _bfd_elf_link_hash_copy_indirect (info, dir, ind);
3543
3544   if (ind->root.type != bfd_link_hash_indirect)
3545     return;
3546
3547   dirscore = (struct score_elf_link_hash_entry *) dir;
3548   indscore = (struct score_elf_link_hash_entry *) ind;
3549   dirscore->possibly_dynamic_relocs += indscore->possibly_dynamic_relocs;
3550
3551   if (indscore->readonly_reloc)
3552     dirscore->readonly_reloc = TRUE;
3553
3554   if (indscore->no_fn_stub)
3555     dirscore->no_fn_stub = TRUE;
3556 }
3557
3558 /* Remove information about discarded functions from other sections which mention them.  */
3559
3560 static bfd_boolean
3561 _bfd_score_elf_discard_info (bfd *abfd, struct elf_reloc_cookie *cookie,
3562                          struct bfd_link_info *info)
3563 {
3564   asection *o;
3565   bfd_boolean ret = FALSE;
3566   unsigned char *tdata;
3567   size_t i, skip;
3568
3569   o = bfd_get_section_by_name (abfd, ".pdr");
3570   if ((!o) || (o->size == 0) || (o->size % PDR_SIZE != 0)
3571       || (o->output_section != NULL && bfd_is_abs_section (o->output_section)))
3572     return FALSE;
3573
3574   tdata = bfd_zmalloc (o->size / PDR_SIZE);
3575   if (!tdata)
3576     return FALSE;
3577
3578   cookie->rels = _bfd_elf_link_read_relocs (abfd, o, NULL, NULL, info->keep_memory);
3579   if (!cookie->rels)
3580     {
3581       free (tdata);
3582       return FALSE;
3583     }
3584
3585   cookie->rel = cookie->rels;
3586   cookie->relend = cookie->rels + o->reloc_count;
3587
3588   for (i = 0, skip = 0; i < o->size; i++)
3589     {
3590       if (bfd_elf_reloc_symbol_deleted_p (i * PDR_SIZE, cookie))
3591         {
3592           tdata[i] = 1;
3593           skip++;
3594         }
3595     }
3596
3597   if (skip != 0)
3598     {
3599       score_elf_section_data (o)->u.tdata = tdata;
3600       o->size -= skip * PDR_SIZE;
3601       ret = TRUE;
3602     }
3603   else
3604     free (tdata);
3605
3606   if (!info->keep_memory)
3607     free (cookie->rels);
3608
3609   return ret;
3610 }
3611
3612 /* Signal that discard_info() has removed the discarded relocations for this section.  */
3613
3614 static bfd_boolean
3615 _bfd_score_elf_ignore_discarded_relocs (asection *sec)
3616 {
3617   if (strcmp (sec->name, ".pdr") == 0)
3618     return TRUE;
3619   return FALSE;
3620 }
3621
3622 /* This function discover the section a particular relocation refers to.
3623    Return the section that should be marked against GC for a given relocation.  */
3624
3625 static asection *
3626 _bfd_score_elf_gc_mark_hook (asection *sec,
3627                              struct bfd_link_info *info ATTRIBUTE_UNUSED,
3628                              Elf_Internal_Rela *rel,
3629                              struct elf_link_hash_entry *h,
3630                              Elf_Internal_Sym *sym)
3631 {
3632   if (h != NULL)
3633     {
3634       switch (ELF32_R_TYPE (rel->r_info))
3635         {
3636         case R_SCORE_GNU_VTINHERIT:
3637         case R_SCORE_GNU_VTENTRY:
3638           break;
3639         default:
3640           switch (h->root.type)
3641             {
3642             case bfd_link_hash_defined:
3643             case bfd_link_hash_defweak:
3644               return h->root.u.def.section;
3645             case bfd_link_hash_common:
3646               return h->root.u.c.p->section;
3647             default:
3648               break;
3649             }
3650         }
3651     }
3652   else
3653     return bfd_section_from_elf_index (sec->owner, sym->st_shndx);
3654
3655   return NULL;
3656 }
3657
3658 /* Support for core dump NOTE sections.  */
3659
3660 static bfd_boolean
3661 _bfd_score_elf_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
3662 {
3663   int offset;
3664   unsigned int raw_size;
3665
3666   switch (note->descsz)
3667     {
3668     default:
3669       return FALSE;
3670
3671     case 148:                  /* Linux/Score 32-bit.  */
3672       /* pr_cursig */
3673       elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
3674
3675       /* pr_pid */
3676       elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 24);
3677
3678       /* pr_reg */
3679       offset = 72;
3680       raw_size = 72;
3681
3682       break;
3683     }
3684
3685   /* Make a ".reg/999" section.  */
3686   return _bfd_elfcore_make_pseudosection (abfd, ".reg", raw_size, note->descpos + offset);
3687 }
3688
3689 static bfd_boolean
3690 _bfd_score_elf_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
3691 {
3692   switch (note->descsz)
3693     {
3694     default:
3695       return FALSE;
3696
3697     case 124:                  /* Linux/Score elf_prpsinfo.  */
3698       elf_tdata (abfd)->core_program = _bfd_elfcore_strndup (abfd, note->descdata + 28, 16);
3699       elf_tdata (abfd)->core_command = _bfd_elfcore_strndup (abfd, note->descdata + 44, 80);
3700     }
3701
3702   /* Note that for some reason, a spurious space is tacked
3703      onto the end of the args in some (at least one anyway)
3704      implementations, so strip it off if it exists.  */
3705
3706   {
3707     char *command = elf_tdata (abfd)->core_command;
3708     int n = strlen (command);
3709
3710     if (0 < n && command[n - 1] == ' ')
3711       command[n - 1] = '\0';
3712   }
3713
3714   return TRUE;
3715 }
3716
3717
3718 /* Score BFD functions.  */
3719
3720 static reloc_howto_type *
3721 elf32_score_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED, bfd_reloc_code_real_type code)
3722 {
3723   unsigned int i;
3724
3725   for (i = 0; i < NUM_ELEM (elf32_score_reloc_map); i++)
3726     if (elf32_score_reloc_map[i].bfd_reloc_val == code)
3727       return &elf32_score_howto_table[elf32_score_reloc_map[i].elf_reloc_val];
3728
3729   return NULL;
3730 }
3731
3732 /* Create a score elf linker hash table.  */
3733
3734 static struct bfd_link_hash_table *
3735 elf32_score_link_hash_table_create (bfd *abfd)
3736 {
3737   struct score_elf_link_hash_table *ret;
3738   bfd_size_type amt = sizeof (struct score_elf_link_hash_table);
3739
3740   ret = bfd_malloc (amt);
3741   if (ret == NULL)
3742     return NULL;
3743
3744   if (!_bfd_elf_link_hash_table_init (&ret->root, abfd, score_elf_link_hash_newfunc,
3745                                       sizeof (struct score_elf_link_hash_entry)))
3746     {
3747       free (ret);
3748       return NULL;
3749     }
3750
3751   return &ret->root.root;
3752 }
3753
3754 static bfd_boolean
3755 elf32_score_print_private_bfd_data (bfd *abfd, void * ptr)
3756 {
3757   FILE *file = (FILE *) ptr;
3758
3759   BFD_ASSERT (abfd != NULL && ptr != NULL);
3760
3761   /* Print normal ELF private data.  */
3762   _bfd_elf_print_private_bfd_data (abfd, ptr);
3763
3764   /* xgettext:c-format */
3765   fprintf (file, _("private flags = %lx:"), elf_elfheader (abfd)->e_flags);
3766   if (elf_elfheader (abfd)->e_flags & EF_SCORE_PIC)
3767     {
3768       fprintf (file, _(" [pic]"));
3769     }
3770   if (elf_elfheader (abfd)->e_flags & EF_SCORE_FIXDEP)
3771     {
3772       fprintf (file, _(" [fix dep]"));
3773     }
3774   fputc ('\n', file);
3775
3776   return TRUE;
3777 }
3778
3779 static bfd_boolean
3780 elf32_score_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
3781 {
3782   flagword in_flags;
3783   flagword out_flags;
3784
3785   if (!_bfd_generic_verify_endian_match (ibfd, obfd))
3786     return FALSE;
3787
3788   in_flags  = elf_elfheader (ibfd)->e_flags;
3789   out_flags = elf_elfheader (obfd)->e_flags;
3790
3791   if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
3792       || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
3793     return TRUE;
3794
3795   in_flags = elf_elfheader (ibfd)->e_flags;
3796   out_flags = elf_elfheader (obfd)->e_flags;
3797
3798   if (! elf_flags_init (obfd))
3799     {
3800       elf_flags_init (obfd) = TRUE;
3801       elf_elfheader (obfd)->e_flags = in_flags;
3802
3803       if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
3804           && bfd_get_arch_info (obfd)->the_default)
3805         {
3806           return bfd_set_arch_mach (obfd, bfd_get_arch (ibfd), bfd_get_mach (ibfd));
3807         }
3808
3809       return TRUE;
3810     }
3811
3812   if (((in_flags & EF_SCORE_PIC) != 0) != ((out_flags & EF_SCORE_PIC) != 0))
3813     {
3814       (*_bfd_error_handler) (_("%B: warning: linking PIC files with non-PIC files"), ibfd);
3815     }
3816
3817   /* FIXME: Maybe dependency fix compatibility should be checked here.  */
3818
3819   return TRUE;
3820 }
3821
3822 static bfd_boolean
3823 elf32_score_new_section_hook (bfd *abfd, asection *sec)
3824 {
3825   struct _score_elf_section_data *sdata;
3826   bfd_size_type amt = sizeof (*sdata);
3827
3828   sdata = bfd_zalloc (abfd, amt);
3829   if (sdata == NULL)
3830     return FALSE;
3831   sec->used_by_bfd = sdata;
3832
3833   return _bfd_elf_new_section_hook (abfd, sec);
3834 }
3835
3836
3837 #define USE_REL                         1
3838 #define TARGET_LITTLE_SYM               bfd_elf32_littlescore_vec
3839 #define TARGET_LITTLE_NAME              "elf32-littlescore"
3840 #define TARGET_BIG_SYM                  bfd_elf32_bigscore_vec
3841 #define TARGET_BIG_NAME                 "elf32-bigscore"
3842 #define ELF_ARCH                        bfd_arch_score
3843 #define ELF_MACHINE_CODE                EM_SCORE
3844 #define ELF_MAXPAGESIZE                 0x8000
3845
3846 #define elf_info_to_howto                             0
3847 #define elf_info_to_howto_rel                         _bfd_score_info_to_howto
3848 #define elf_backend_relocate_section                  _bfd_score_elf_relocate_section
3849 #define elf_backend_check_relocs                      _bfd_score_elf_check_relocs
3850 #define elf_backend_add_symbol_hook                   _bfd_score_elf_add_symbol_hook
3851 #define elf_backend_symbol_processing                 _bfd_score_elf_symbol_processing
3852 #define elf_backend_link_output_symbol_hook           _bfd_score_elf_link_output_symbol_hook
3853 #define elf_backend_section_from_bfd_section          _bfd_score_elf_section_from_bfd_section
3854 #define elf_backend_adjust_dynamic_symbol             _bfd_score_elf_adjust_dynamic_symbol
3855 #define elf_backend_always_size_sections              _bfd_score_elf_always_size_sections
3856 #define elf_backend_size_dynamic_sections             _bfd_score_elf_size_dynamic_sections
3857 #define elf_backend_create_dynamic_sections           _bfd_score_elf_create_dynamic_sections
3858 #define elf_backend_finish_dynamic_symbol             _bfd_score_elf_finish_dynamic_symbol
3859 #define elf_backend_finish_dynamic_sections           _bfd_score_elf_finish_dynamic_sections
3860 #define elf_backend_fake_sections                     _bfd_score_elf_fake_sections
3861 #define elf_backend_section_processing                _bfd_score_elf_section_processing
3862 #define elf_backend_write_section                     _bfd_score_elf_write_section
3863 #define elf_backend_copy_indirect_symbol              _bfd_score_elf_copy_indirect_symbol
3864 #define elf_backend_hide_symbol                       _bfd_score_elf_hide_symbol
3865 #define elf_backend_discard_info                      _bfd_score_elf_discard_info
3866 #define elf_backend_ignore_discarded_relocs           _bfd_score_elf_ignore_discarded_relocs
3867 #define elf_backend_gc_mark_hook                      _bfd_score_elf_gc_mark_hook
3868 #define elf_backend_grok_prstatus                     _bfd_score_elf_grok_prstatus
3869 #define elf_backend_grok_psinfo                       _bfd_score_elf_grok_psinfo
3870 #define elf_backend_can_gc_sections                   1
3871 #define elf_backend_want_plt_sym                      0
3872 #define elf_backend_got_header_size                   (4 * SCORE_RESERVED_GOTNO)
3873 #define elf_backend_plt_header_size                   0
3874 #define elf_backend_collect                           TRUE
3875 #define elf_backend_type_change_ok                    TRUE
3876
3877 #define bfd_elf32_bfd_reloc_type_lookup               elf32_score_reloc_type_lookup
3878 #define bfd_elf32_bfd_link_hash_table_create          elf32_score_link_hash_table_create
3879 #define bfd_elf32_bfd_print_private_bfd_data          elf32_score_print_private_bfd_data
3880 #define bfd_elf32_bfd_merge_private_bfd_data          elf32_score_merge_private_bfd_data
3881 #define bfd_elf32_new_section_hook                    elf32_score_new_section_hook
3882
3883 #include "elf32-target.h"