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