xref: /netbsd-src/external/gpl3/binutils.old/dist/bfd/elf64-sparc.c (revision eceb233b9bd0dfebb902ed73b531ae6964fa3f9b)
1 /* SPARC-specific support for 64-bit ELF
2    Copyright (C) 1993-2018 Free Software Foundation, Inc.
3 
4    This file is part of BFD, the Binary File Descriptor library.
5 
6    This program is free software; you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 3 of the License, or
9    (at your option) any later version.
10 
11    This program is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
15 
16    You should have received a copy of the GNU General Public License
17    along with this program; if not, write to the Free Software
18    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19    MA 02110-1301, USA.  */
20 
21 #include "sysdep.h"
22 #include "bfd.h"
23 #include "libbfd.h"
24 #include "elf-bfd.h"
25 #include "elf/sparc.h"
26 #include "opcode/sparc.h"
27 #include "elfxx-sparc.h"
28 
29 /* In case we're on a 32-bit machine, construct a 64-bit "-1" value.  */
30 #define MINUS_ONE (~ (bfd_vma) 0)
31 
32 /* Due to the way how we handle R_SPARC_OLO10, each entry in a SHT_RELA
33    section can represent up to two relocs, we must tell the user to allocate
34    more space.  */
35 
36 static long
37 elf64_sparc_get_reloc_upper_bound (bfd *abfd ATTRIBUTE_UNUSED, asection *sec)
38 {
39   return (sec->reloc_count * 2 + 1) * sizeof (arelent *);
40 }
41 
42 static long
43 elf64_sparc_get_dynamic_reloc_upper_bound (bfd *abfd)
44 {
45   return _bfd_elf_get_dynamic_reloc_upper_bound (abfd) * 2;
46 }
47 
48 /* Read  relocations for ASECT from REL_HDR.  There are RELOC_COUNT of
49    them.  We cannot use generic elf routines for this,  because R_SPARC_OLO10
50    has secondary addend in ELF64_R_TYPE_DATA.  We handle it as two relocations
51    for the same location,  R_SPARC_LO10 and R_SPARC_13.  */
52 
53 static bfd_boolean
54 elf64_sparc_slurp_one_reloc_table (bfd *abfd, asection *asect,
55 				   Elf_Internal_Shdr *rel_hdr,
56 				   asymbol **symbols, bfd_boolean dynamic)
57 {
58   void * allocated = NULL;
59   bfd_byte *native_relocs;
60   arelent *relent;
61   unsigned int i;
62   int entsize;
63   bfd_size_type count;
64   arelent *relents;
65 
66   allocated = bfd_malloc (rel_hdr->sh_size);
67   if (allocated == NULL)
68     goto error_return;
69 
70   if (bfd_seek (abfd, rel_hdr->sh_offset, SEEK_SET) != 0
71       || bfd_bread (allocated, rel_hdr->sh_size, abfd) != rel_hdr->sh_size)
72     goto error_return;
73 
74   native_relocs = (bfd_byte *) allocated;
75 
76   relents = asect->relocation + canon_reloc_count (asect);
77 
78   entsize = rel_hdr->sh_entsize;
79   BFD_ASSERT (entsize == sizeof (Elf64_External_Rela));
80 
81   count = rel_hdr->sh_size / entsize;
82 
83   for (i = 0, relent = relents; i < count;
84        i++, relent++, native_relocs += entsize)
85     {
86       Elf_Internal_Rela rela;
87       unsigned int r_type;
88 
89       bfd_elf64_swap_reloca_in (abfd, native_relocs, &rela);
90 
91       /* The address of an ELF reloc is section relative for an object
92 	 file, and absolute for an executable file or shared library.
93 	 The address of a normal BFD reloc is always section relative,
94 	 and the address of a dynamic reloc is absolute..  */
95       if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0 || dynamic)
96 	relent->address = rela.r_offset;
97       else
98 	relent->address = rela.r_offset - asect->vma;
99 
100       if (ELF64_R_SYM (rela.r_info) == STN_UNDEF
101 	  /* PR 17512: file: 996185f8.  */
102 	  || (!dynamic && ELF64_R_SYM(rela.r_info) > bfd_get_symcount(abfd))
103 	  || (dynamic
104 	      && ELF64_R_SYM(rela.r_info) > bfd_get_dynamic_symcount(abfd)))
105 	relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
106       else
107 	{
108 	  asymbol **ps, *s;
109 
110 	  ps = symbols + ELF64_R_SYM (rela.r_info) - 1;
111 	  s = *ps;
112 
113 	  /* Canonicalize ELF section symbols.  FIXME: Why?  */
114 	  if ((s->flags & BSF_SECTION_SYM) == 0)
115 	    relent->sym_ptr_ptr = ps;
116 	  else
117 	    relent->sym_ptr_ptr = s->section->symbol_ptr_ptr;
118 	}
119 
120       relent->addend = rela.r_addend;
121 
122       r_type = ELF64_R_TYPE_ID (rela.r_info);
123       if (r_type == R_SPARC_OLO10)
124 	{
125 	  relent->howto = _bfd_sparc_elf_info_to_howto_ptr (abfd, R_SPARC_LO10);
126 	  relent[1].address = relent->address;
127 	  relent++;
128 	  relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
129 	  relent->addend = ELF64_R_TYPE_DATA (rela.r_info);
130 	  relent->howto = _bfd_sparc_elf_info_to_howto_ptr (abfd, R_SPARC_13);
131 	}
132       else
133 	{
134 	  relent->howto = _bfd_sparc_elf_info_to_howto_ptr (abfd, r_type);
135 	  if (relent->howto == NULL)
136 	    goto error_return;
137 	}
138     }
139 
140   canon_reloc_count (asect) += relent - relents;
141 
142   if (allocated != NULL)
143     free (allocated);
144 
145   return TRUE;
146 
147  error_return:
148   if (allocated != NULL)
149     free (allocated);
150   return FALSE;
151 }
152 
153 /* Read in and swap the external relocs.  */
154 
155 static bfd_boolean
156 elf64_sparc_slurp_reloc_table (bfd *abfd, asection *asect,
157 			       asymbol **symbols, bfd_boolean dynamic)
158 {
159   struct bfd_elf_section_data * const d = elf_section_data (asect);
160   Elf_Internal_Shdr *rel_hdr;
161   Elf_Internal_Shdr *rel_hdr2;
162   bfd_size_type amt;
163 
164   if (asect->relocation != NULL)
165     return TRUE;
166 
167   if (! dynamic)
168     {
169       if ((asect->flags & SEC_RELOC) == 0
170 	  || asect->reloc_count == 0)
171 	return TRUE;
172 
173       rel_hdr = d->rel.hdr;
174       rel_hdr2 = d->rela.hdr;
175 
176       BFD_ASSERT ((rel_hdr && asect->rel_filepos == rel_hdr->sh_offset)
177 		  || (rel_hdr2 && asect->rel_filepos == rel_hdr2->sh_offset));
178     }
179   else
180     {
181       /* Note that ASECT->RELOC_COUNT tends not to be accurate in this
182 	 case because relocations against this section may use the
183 	 dynamic symbol table, and in that case bfd_section_from_shdr
184 	 in elf.c does not update the RELOC_COUNT.  */
185       if (asect->size == 0)
186 	return TRUE;
187 
188       rel_hdr = &d->this_hdr;
189       asect->reloc_count = NUM_SHDR_ENTRIES (rel_hdr);
190       rel_hdr2 = NULL;
191     }
192 
193   amt = asect->reloc_count;
194   amt *= 2 * sizeof (arelent);
195   asect->relocation = (arelent *) bfd_alloc (abfd, amt);
196   if (asect->relocation == NULL)
197     return FALSE;
198 
199   /* The elf64_sparc_slurp_one_reloc_table routine increments
200      canon_reloc_count.  */
201   canon_reloc_count (asect) = 0;
202 
203   if (rel_hdr
204       && !elf64_sparc_slurp_one_reloc_table (abfd, asect, rel_hdr, symbols,
205 					     dynamic))
206     return FALSE;
207 
208   if (rel_hdr2
209       && !elf64_sparc_slurp_one_reloc_table (abfd, asect, rel_hdr2, symbols,
210 					     dynamic))
211     return FALSE;
212 
213   return TRUE;
214 }
215 
216 /* Canonicalize the relocs.  */
217 
218 static long
219 elf64_sparc_canonicalize_reloc (bfd *abfd, sec_ptr section,
220 				arelent **relptr, asymbol **symbols)
221 {
222   arelent *tblptr;
223   unsigned int i;
224   const struct elf_backend_data *bed = get_elf_backend_data (abfd);
225 
226   if (! bed->s->slurp_reloc_table (abfd, section, symbols, FALSE))
227     return -1;
228 
229   tblptr = section->relocation;
230   for (i = 0; i < canon_reloc_count (section); i++)
231     *relptr++ = tblptr++;
232 
233   *relptr = NULL;
234 
235   return canon_reloc_count (section);
236 }
237 
238 
239 /* Canonicalize the dynamic relocation entries.  Note that we return
240    the dynamic relocations as a single block, although they are
241    actually associated with particular sections; the interface, which
242    was designed for SunOS style shared libraries, expects that there
243    is only one set of dynamic relocs.  Any section that was actually
244    installed in the BFD, and has type SHT_REL or SHT_RELA, and uses
245    the dynamic symbol table, is considered to be a dynamic reloc
246    section.  */
247 
248 static long
249 elf64_sparc_canonicalize_dynamic_reloc (bfd *abfd, arelent **storage,
250 					asymbol **syms)
251 {
252   asection *s;
253   long ret;
254 
255   if (elf_dynsymtab (abfd) == 0)
256     {
257       bfd_set_error (bfd_error_invalid_operation);
258       return -1;
259     }
260 
261   ret = 0;
262   for (s = abfd->sections; s != NULL; s = s->next)
263     {
264       if (elf_section_data (s)->this_hdr.sh_link == elf_dynsymtab (abfd)
265 	  && (elf_section_data (s)->this_hdr.sh_type == SHT_RELA))
266 	{
267 	  arelent *p;
268 	  long count, i;
269 
270 	  if (! elf64_sparc_slurp_reloc_table (abfd, s, syms, TRUE))
271 	    return -1;
272 	  count = canon_reloc_count (s);
273 	  p = s->relocation;
274 	  for (i = 0; i < count; i++)
275 	    *storage++ = p++;
276 	  ret += count;
277 	}
278     }
279 
280   *storage = NULL;
281 
282   return ret;
283 }
284 
285 /* Install a new set of internal relocs.  */
286 
287 static void
288 elf64_sparc_set_reloc (bfd *abfd ATTRIBUTE_UNUSED,
289 		       asection *asect,
290 		       arelent **location,
291 		       unsigned int count)
292 {
293   asect->orelocation = location;
294   canon_reloc_count (asect) = count;
295 }
296 
297 /* Write out the relocs.  */
298 
299 static void
300 elf64_sparc_write_relocs (bfd *abfd, asection *sec, void * data)
301 {
302   bfd_boolean *failedp = (bfd_boolean *) data;
303   Elf_Internal_Shdr *rela_hdr;
304   bfd_vma addr_offset;
305   Elf64_External_Rela *outbound_relocas, *src_rela;
306   unsigned int idx, count;
307   asymbol *last_sym = 0;
308   int last_sym_idx = 0;
309 
310   /* If we have already failed, don't do anything.  */
311   if (*failedp)
312     return;
313 
314   if ((sec->flags & SEC_RELOC) == 0)
315     return;
316 
317   /* The linker backend writes the relocs out itself, and sets the
318      reloc_count field to zero to inhibit writing them here.  Also,
319      sometimes the SEC_RELOC flag gets set even when there aren't any
320      relocs.  */
321   if (canon_reloc_count (sec) == 0)
322     return;
323 
324   /* We can combine two relocs that refer to the same address
325      into R_SPARC_OLO10 if first one is R_SPARC_LO10 and the
326      latter is R_SPARC_13 with no associated symbol.  */
327   count = 0;
328   for (idx = 0; idx < canon_reloc_count (sec); idx++)
329     {
330       bfd_vma addr;
331 
332       ++count;
333 
334       addr = sec->orelocation[idx]->address;
335       if (sec->orelocation[idx]->howto->type == R_SPARC_LO10
336 	  && idx < canon_reloc_count (sec) - 1)
337 	{
338 	  arelent *r = sec->orelocation[idx + 1];
339 
340 	  if (r->howto->type == R_SPARC_13
341 	      && r->address == addr
342 	      && bfd_is_abs_section ((*r->sym_ptr_ptr)->section)
343 	      && (*r->sym_ptr_ptr)->value == 0)
344 	    ++idx;
345 	}
346     }
347 
348   rela_hdr = elf_section_data (sec)->rela.hdr;
349 
350   rela_hdr->sh_size = rela_hdr->sh_entsize * count;
351   rela_hdr->contents = bfd_alloc (abfd, rela_hdr->sh_size);
352   if (rela_hdr->contents == NULL)
353     {
354       *failedp = TRUE;
355       return;
356     }
357 
358   /* Figure out whether the relocations are RELA or REL relocations.  */
359   if (rela_hdr->sh_type != SHT_RELA)
360     abort ();
361 
362   /* The address of an ELF reloc is section relative for an object
363      file, and absolute for an executable file or shared library.
364      The address of a BFD reloc is always section relative.  */
365   addr_offset = 0;
366   if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
367     addr_offset = sec->vma;
368 
369   /* orelocation has the data, reloc_count has the count...  */
370   outbound_relocas = (Elf64_External_Rela *) rela_hdr->contents;
371   src_rela = outbound_relocas;
372 
373   for (idx = 0; idx < canon_reloc_count (sec); idx++)
374     {
375       Elf_Internal_Rela dst_rela;
376       arelent *ptr;
377       asymbol *sym;
378       int n;
379 
380       ptr = sec->orelocation[idx];
381       sym = *ptr->sym_ptr_ptr;
382       if (sym == last_sym)
383 	n = last_sym_idx;
384       else if (bfd_is_abs_section (sym->section) && sym->value == 0)
385 	n = STN_UNDEF;
386       else
387 	{
388 	  last_sym = sym;
389 	  n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym);
390 	  if (n < 0)
391 	    {
392 	      *failedp = TRUE;
393 	      return;
394 	    }
395 	  last_sym_idx = n;
396 	}
397 
398       if ((*ptr->sym_ptr_ptr)->the_bfd != NULL
399 	  && (*ptr->sym_ptr_ptr)->the_bfd->xvec != abfd->xvec
400 	  && ! _bfd_elf_validate_reloc (abfd, ptr))
401 	{
402 	  *failedp = TRUE;
403 	  return;
404 	}
405 
406       if (ptr->howto->type == R_SPARC_LO10
407 	  && idx < canon_reloc_count (sec) - 1)
408 	{
409 	  arelent *r = sec->orelocation[idx + 1];
410 
411 	  if (r->howto->type == R_SPARC_13
412 	      && r->address == ptr->address
413 	      && bfd_is_abs_section ((*r->sym_ptr_ptr)->section)
414 	      && (*r->sym_ptr_ptr)->value == 0)
415 	    {
416 	      idx++;
417 	      dst_rela.r_info
418 		= ELF64_R_INFO (n, ELF64_R_TYPE_INFO (r->addend,
419 						      R_SPARC_OLO10));
420 	    }
421 	  else
422 	    dst_rela.r_info = ELF64_R_INFO (n, R_SPARC_LO10);
423 	}
424       else
425 	dst_rela.r_info = ELF64_R_INFO (n, ptr->howto->type);
426 
427       dst_rela.r_offset = ptr->address + addr_offset;
428       dst_rela.r_addend = ptr->addend;
429 
430       bfd_elf64_swap_reloca_out (abfd, &dst_rela, (bfd_byte *) src_rela);
431       ++src_rela;
432     }
433 }
434 
435 /* Hook called by the linker routine which adds symbols from an object
436    file.  We use it for STT_REGISTER symbols.  */
437 
438 static bfd_boolean
439 elf64_sparc_add_symbol_hook (bfd *abfd, struct bfd_link_info *info,
440 			     Elf_Internal_Sym *sym, const char **namep,
441 			     flagword *flagsp ATTRIBUTE_UNUSED,
442 			     asection **secp ATTRIBUTE_UNUSED,
443 			     bfd_vma *valp ATTRIBUTE_UNUSED)
444 {
445   static const char *const stt_types[] = { "NOTYPE", "OBJECT", "FUNCTION" };
446 
447   if (ELF_ST_TYPE (sym->st_info) == STT_REGISTER)
448     {
449       int reg;
450       struct _bfd_sparc_elf_app_reg *p;
451 
452       reg = (int)sym->st_value;
453       switch (reg & ~1)
454 	{
455 	case 2: reg -= 2; break;
456 	case 6: reg -= 4; break;
457 	default:
458 	  _bfd_error_handler
459 	    (_("%pB: only registers %%g[2367] can be declared using STT_REGISTER"),
460 	     abfd);
461 	  return FALSE;
462 	}
463 
464       if (info->output_bfd->xvec != abfd->xvec
465 	  || (abfd->flags & DYNAMIC) != 0)
466 	{
467 	  /* STT_REGISTER only works when linking an elf64_sparc object.
468 	     If STT_REGISTER comes from a dynamic object, don't put it into
469 	     the output bfd.  The dynamic linker will recheck it.  */
470 	  *namep = NULL;
471 	  return TRUE;
472 	}
473 
474       p = _bfd_sparc_elf_hash_table(info)->app_regs + reg;
475 
476       if (p->name != NULL && strcmp (p->name, *namep))
477 	{
478 	  _bfd_error_handler
479 	    /* xgettext:c-format */
480 	    (_("register %%g%d used incompatibly: %s in %pB,"
481 	       " previously %s in %pB"),
482 	     (int) sym->st_value, **namep ? *namep : "#scratch", abfd,
483 	     *p->name ? p->name : "#scratch", p->abfd);
484 	  return FALSE;
485 	}
486 
487       if (p->name == NULL)
488 	{
489 	  if (**namep)
490 	    {
491 	      struct elf_link_hash_entry *h;
492 
493 	      h = (struct elf_link_hash_entry *)
494 		bfd_link_hash_lookup (info->hash, *namep, FALSE, FALSE, FALSE);
495 
496 	      if (h != NULL)
497 		{
498 		  unsigned char type = h->type;
499 
500 		  if (type > STT_FUNC)
501 		    type = 0;
502 		  _bfd_error_handler
503 		    /* xgettext:c-format */
504 		    (_("symbol `%s' has differing types: REGISTER in %pB,"
505 		       " previously %s in %pB"),
506 		     *namep, abfd, stt_types[type], p->abfd);
507 		  return FALSE;
508 		}
509 
510 	      p->name = bfd_hash_allocate (&info->hash->table,
511 					   strlen (*namep) + 1);
512 	      if (!p->name)
513 		return FALSE;
514 
515 	      strcpy (p->name, *namep);
516 	    }
517 	  else
518 	    p->name = "";
519 	  p->bind = ELF_ST_BIND (sym->st_info);
520 	  p->abfd = abfd;
521 	  p->shndx = sym->st_shndx;
522 	}
523       else
524 	{
525 	  if (p->bind == STB_WEAK
526 	      && ELF_ST_BIND (sym->st_info) == STB_GLOBAL)
527 	    {
528 	      p->bind = STB_GLOBAL;
529 	      p->abfd = abfd;
530 	    }
531 	}
532       *namep = NULL;
533       return TRUE;
534     }
535   else if (*namep && **namep
536 	   && info->output_bfd->xvec == abfd->xvec)
537     {
538       int i;
539       struct _bfd_sparc_elf_app_reg *p;
540 
541       p = _bfd_sparc_elf_hash_table(info)->app_regs;
542       for (i = 0; i < 4; i++, p++)
543 	if (p->name != NULL && ! strcmp (p->name, *namep))
544 	  {
545 	    unsigned char type = ELF_ST_TYPE (sym->st_info);
546 
547 	    if (type > STT_FUNC)
548 	      type = 0;
549 	    _bfd_error_handler
550 	      /* xgettext:c-format */
551 	      (_("Symbol `%s' has differing types: %s in %pB,"
552 		 " previously REGISTER in %pB"),
553 	       *namep, stt_types[type], abfd, p->abfd);
554 	    return FALSE;
555 	  }
556     }
557   return TRUE;
558 }
559 
560 /* This function takes care of emitting STT_REGISTER symbols
561    which we cannot easily keep in the symbol hash table.  */
562 
563 static bfd_boolean
564 elf64_sparc_output_arch_syms (bfd *output_bfd ATTRIBUTE_UNUSED,
565 			      struct bfd_link_info *info,
566 			      void * flaginfo,
567 			      int (*func) (void *, const char *,
568 					   Elf_Internal_Sym *,
569 					   asection *,
570 					   struct elf_link_hash_entry *))
571 {
572   int reg;
573   struct _bfd_sparc_elf_app_reg *app_regs =
574     _bfd_sparc_elf_hash_table(info)->app_regs;
575   Elf_Internal_Sym sym;
576 
577   /* We arranged in size_dynamic_sections to put the STT_REGISTER entries
578      at the end of the dynlocal list, so they came at the end of the local
579      symbols in the symtab.  Except that they aren't STB_LOCAL, so we need
580      to back up symtab->sh_info.  */
581   if (elf_hash_table (info)->dynlocal)
582     {
583       bfd * dynobj = elf_hash_table (info)->dynobj;
584       asection *dynsymsec = bfd_get_linker_section (dynobj, ".dynsym");
585       struct elf_link_local_dynamic_entry *e;
586 
587       for (e = elf_hash_table (info)->dynlocal; e ; e = e->next)
588 	if (e->input_indx == -1)
589 	  break;
590       if (e)
591 	{
592 	  elf_section_data (dynsymsec->output_section)->this_hdr.sh_info
593 	    = e->dynindx;
594 	}
595     }
596 
597   if (info->strip == strip_all)
598     return TRUE;
599 
600   for (reg = 0; reg < 4; reg++)
601     if (app_regs [reg].name != NULL)
602       {
603 	if (info->strip == strip_some
604 	    && bfd_hash_lookup (info->keep_hash,
605 				app_regs [reg].name,
606 				FALSE, FALSE) == NULL)
607 	  continue;
608 
609 	sym.st_value = reg < 2 ? reg + 2 : reg + 4;
610 	sym.st_size = 0;
611 	sym.st_other = 0;
612 	sym.st_info = ELF_ST_INFO (app_regs [reg].bind, STT_REGISTER);
613 	sym.st_shndx = app_regs [reg].shndx;
614 	sym.st_target_internal = 0;
615 	if ((*func) (flaginfo, app_regs [reg].name, &sym,
616 		     sym.st_shndx == SHN_ABS
617 		     ? bfd_abs_section_ptr : bfd_und_section_ptr,
618 		     NULL) != 1)
619 	  return FALSE;
620       }
621 
622   return TRUE;
623 }
624 
625 static int
626 elf64_sparc_get_symbol_type (Elf_Internal_Sym *elf_sym, int type)
627 {
628   if (ELF_ST_TYPE (elf_sym->st_info) == STT_REGISTER)
629     return STT_REGISTER;
630   else
631     return type;
632 }
633 
634 /* A STB_GLOBAL,STT_REGISTER symbol should be BSF_GLOBAL
635    even in SHN_UNDEF section.  */
636 
637 static void
638 elf64_sparc_symbol_processing (bfd *abfd ATTRIBUTE_UNUSED, asymbol *asym)
639 {
640   elf_symbol_type *elfsym;
641 
642   elfsym = (elf_symbol_type *) asym;
643   if (elfsym->internal_elf_sym.st_info
644       == ELF_ST_INFO (STB_GLOBAL, STT_REGISTER))
645     {
646       asym->flags |= BSF_GLOBAL;
647     }
648 }
649 
650 
651 /* Functions for dealing with the e_flags field.  */
652 
653 /* Merge backend specific data from an object file to the output
654    object file when linking.  */
655 
656 static bfd_boolean
657 elf64_sparc_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
658 {
659   bfd *obfd = info->output_bfd;
660   bfd_boolean error;
661   flagword new_flags, old_flags;
662   int new_mm, old_mm;
663 
664   if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
665       || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
666     return TRUE;
667 
668   new_flags = elf_elfheader (ibfd)->e_flags;
669   old_flags = elf_elfheader (obfd)->e_flags;
670 
671   if (!elf_flags_init (obfd))   /* First call, no flags set */
672     {
673       elf_flags_init (obfd) = TRUE;
674       elf_elfheader (obfd)->e_flags = new_flags;
675     }
676 
677   else if (new_flags == old_flags)      /* Compatible flags are ok */
678     ;
679 
680   else					/* Incompatible flags */
681     {
682       error = FALSE;
683 
684 #define EF_SPARC_ISA_EXTENSIONS \
685   (EF_SPARC_SUN_US1 | EF_SPARC_SUN_US3 | EF_SPARC_HAL_R1)
686 
687       if ((ibfd->flags & DYNAMIC) != 0)
688 	{
689 	  /* We don't want dynamic objects memory ordering and
690 	     architecture to have any role. That's what dynamic linker
691 	     should do.  */
692 	  new_flags &= ~(EF_SPARCV9_MM | EF_SPARC_ISA_EXTENSIONS);
693 	  new_flags |= (old_flags
694 			& (EF_SPARCV9_MM | EF_SPARC_ISA_EXTENSIONS));
695 	}
696       else
697 	{
698 	  /* Choose the highest architecture requirements.  */
699 	  old_flags |= (new_flags & EF_SPARC_ISA_EXTENSIONS);
700 	  new_flags |= (old_flags & EF_SPARC_ISA_EXTENSIONS);
701 	  if ((old_flags & (EF_SPARC_SUN_US1 | EF_SPARC_SUN_US3))
702 	      && (old_flags & EF_SPARC_HAL_R1))
703 	    {
704 	      error = TRUE;
705 	      _bfd_error_handler
706 		(_("%pB: linking UltraSPARC specific with HAL specific code"),
707 		 ibfd);
708 	    }
709 	  /* Choose the most restrictive memory ordering.  */
710 	  old_mm = (old_flags & EF_SPARCV9_MM);
711 	  new_mm = (new_flags & EF_SPARCV9_MM);
712 	  old_flags &= ~EF_SPARCV9_MM;
713 	  new_flags &= ~EF_SPARCV9_MM;
714 	  if (new_mm < old_mm)
715 	    old_mm = new_mm;
716 	  old_flags |= old_mm;
717 	  new_flags |= old_mm;
718 	}
719 
720       /* Warn about any other mismatches */
721       if (new_flags != old_flags)
722 	{
723 	  error = TRUE;
724 	  _bfd_error_handler
725 	    /* xgettext:c-format */
726 	    (_("%pB: uses different e_flags (%#x) fields than previous modules (%#x)"),
727 	     ibfd, new_flags, old_flags);
728 	}
729 
730       elf_elfheader (obfd)->e_flags = old_flags;
731 
732       if (error)
733 	{
734 	  bfd_set_error (bfd_error_bad_value);
735 	  return FALSE;
736 	}
737     }
738   return _bfd_sparc_elf_merge_private_bfd_data (ibfd, info);
739 }
740 
741 /* MARCO: Set the correct entry size for the .stab section.  */
742 
743 static bfd_boolean
744 elf64_sparc_fake_sections (bfd *abfd ATTRIBUTE_UNUSED,
745 			   Elf_Internal_Shdr *hdr ATTRIBUTE_UNUSED,
746 			   asection *sec)
747 {
748   const char *name;
749 
750   name = bfd_get_section_name (abfd, sec);
751 
752   if (strcmp (name, ".stab") == 0)
753     {
754       /* Even in the 64bit case the stab entries are only 12 bytes long.  */
755       elf_section_data (sec)->this_hdr.sh_entsize = 12;
756     }
757 
758   return TRUE;
759 }
760 
761 /* Print a STT_REGISTER symbol to file FILE.  */
762 
763 static const char *
764 elf64_sparc_print_symbol_all (bfd *abfd ATTRIBUTE_UNUSED, void * filep,
765 			      asymbol *symbol)
766 {
767   FILE *file = (FILE *) filep;
768   int reg, type;
769 
770   if (ELF_ST_TYPE (((elf_symbol_type *) symbol)->internal_elf_sym.st_info)
771       != STT_REGISTER)
772     return NULL;
773 
774   reg = ((elf_symbol_type *) symbol)->internal_elf_sym.st_value;
775   type = symbol->flags;
776   fprintf (file, "REG_%c%c%11s%c%c    R", "GOLI" [reg / 8], '0' + (reg & 7), "",
777 		 ((type & BSF_LOCAL)
778 		  ? (type & BSF_GLOBAL) ? '!' : 'l'
779 		  : (type & BSF_GLOBAL) ? 'g' : ' '),
780 		 (type & BSF_WEAK) ? 'w' : ' ');
781   if (symbol->name == NULL || symbol->name [0] == '\0')
782     return "#scratch";
783   else
784     return symbol->name;
785 }
786 
787 static enum elf_reloc_type_class
788 elf64_sparc_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
789 			      const asection *rel_sec ATTRIBUTE_UNUSED,
790 			      const Elf_Internal_Rela *rela)
791 {
792   switch ((int) ELF64_R_TYPE (rela->r_info))
793     {
794     case R_SPARC_RELATIVE:
795       return reloc_class_relative;
796     case R_SPARC_JMP_SLOT:
797       return reloc_class_plt;
798     case R_SPARC_COPY:
799       return reloc_class_copy;
800     default:
801       return reloc_class_normal;
802     }
803 }
804 
805 /* Relocations in the 64 bit SPARC ELF ABI are more complex than in
806    standard ELF, because R_SPARC_OLO10 has secondary addend in
807    ELF64_R_TYPE_DATA field.  This structure is used to redirect the
808    relocation handling routines.  */
809 
810 const struct elf_size_info elf64_sparc_size_info =
811 {
812   sizeof (Elf64_External_Ehdr),
813   sizeof (Elf64_External_Phdr),
814   sizeof (Elf64_External_Shdr),
815   sizeof (Elf64_External_Rel),
816   sizeof (Elf64_External_Rela),
817   sizeof (Elf64_External_Sym),
818   sizeof (Elf64_External_Dyn),
819   sizeof (Elf_External_Note),
820   4,		/* hash-table entry size.  */
821   /* Internal relocations per external relocations.
822      For link purposes we use just 1 internal per
823      1 external, for assembly and slurp symbol table
824      we use 2.  */
825   1,
826   64,		/* arch_size.  */
827   3,		/* log_file_align.  */
828   ELFCLASS64,
829   EV_CURRENT,
830   bfd_elf64_write_out_phdrs,
831   bfd_elf64_write_shdrs_and_ehdr,
832   bfd_elf64_checksum_contents,
833   elf64_sparc_write_relocs,
834   bfd_elf64_swap_symbol_in,
835   bfd_elf64_swap_symbol_out,
836   elf64_sparc_slurp_reloc_table,
837   bfd_elf64_slurp_symbol_table,
838   bfd_elf64_swap_dyn_in,
839   bfd_elf64_swap_dyn_out,
840   bfd_elf64_swap_reloc_in,
841   bfd_elf64_swap_reloc_out,
842   bfd_elf64_swap_reloca_in,
843   bfd_elf64_swap_reloca_out
844 };
845 
846 #define TARGET_BIG_SYM	sparc_elf64_vec
847 #define TARGET_BIG_NAME	"elf64-sparc"
848 #define ELF_ARCH	bfd_arch_sparc
849 #define ELF_MAXPAGESIZE 0x100000
850 #define ELF_COMMONPAGESIZE 0x2000
851 
852 /* This is the official ABI value.  */
853 #define ELF_MACHINE_CODE EM_SPARCV9
854 
855 /* This is the value that we used before the ABI was released.  */
856 #define ELF_MACHINE_ALT1 EM_OLD_SPARCV9
857 
858 #define elf_backend_reloc_type_class \
859   elf64_sparc_reloc_type_class
860 #define bfd_elf64_get_reloc_upper_bound \
861   elf64_sparc_get_reloc_upper_bound
862 #define bfd_elf64_get_dynamic_reloc_upper_bound \
863   elf64_sparc_get_dynamic_reloc_upper_bound
864 #define bfd_elf64_canonicalize_reloc \
865   elf64_sparc_canonicalize_reloc
866 #define bfd_elf64_canonicalize_dynamic_reloc \
867   elf64_sparc_canonicalize_dynamic_reloc
868 #define bfd_elf64_set_reloc \
869   elf64_sparc_set_reloc
870 #define elf_backend_add_symbol_hook \
871   elf64_sparc_add_symbol_hook
872 #define elf_backend_get_symbol_type \
873   elf64_sparc_get_symbol_type
874 #define elf_backend_symbol_processing \
875   elf64_sparc_symbol_processing
876 #define elf_backend_print_symbol_all \
877   elf64_sparc_print_symbol_all
878 #define elf_backend_output_arch_syms \
879   elf64_sparc_output_arch_syms
880 #define bfd_elf64_bfd_merge_private_bfd_data \
881   elf64_sparc_merge_private_bfd_data
882 #define elf_backend_fake_sections \
883   elf64_sparc_fake_sections
884 #define elf_backend_size_info \
885   elf64_sparc_size_info
886 
887 #define elf_backend_plt_sym_val	\
888   _bfd_sparc_elf_plt_sym_val
889 #define bfd_elf64_bfd_link_hash_table_create \
890   _bfd_sparc_elf_link_hash_table_create
891 #define elf_info_to_howto \
892   _bfd_sparc_elf_info_to_howto
893 #define elf_backend_copy_indirect_symbol \
894   _bfd_sparc_elf_copy_indirect_symbol
895 #define bfd_elf64_bfd_reloc_type_lookup \
896   _bfd_sparc_elf_reloc_type_lookup
897 #define bfd_elf64_bfd_reloc_name_lookup \
898   _bfd_sparc_elf_reloc_name_lookup
899 #define bfd_elf64_bfd_relax_section \
900   _bfd_sparc_elf_relax_section
901 #define bfd_elf64_new_section_hook \
902   _bfd_sparc_elf_new_section_hook
903 
904 #define elf_backend_create_dynamic_sections \
905   _bfd_sparc_elf_create_dynamic_sections
906 #define elf_backend_relocs_compatible \
907   _bfd_elf_relocs_compatible
908 #define elf_backend_check_relocs \
909   _bfd_sparc_elf_check_relocs
910 #define elf_backend_adjust_dynamic_symbol \
911   _bfd_sparc_elf_adjust_dynamic_symbol
912 #define elf_backend_omit_section_dynsym \
913   _bfd_sparc_elf_omit_section_dynsym
914 #define elf_backend_size_dynamic_sections \
915   _bfd_sparc_elf_size_dynamic_sections
916 #define elf_backend_relocate_section \
917   _bfd_sparc_elf_relocate_section
918 #define elf_backend_finish_dynamic_symbol \
919   _bfd_sparc_elf_finish_dynamic_symbol
920 #define elf_backend_finish_dynamic_sections \
921   _bfd_sparc_elf_finish_dynamic_sections
922 #define elf_backend_fixup_symbol \
923   _bfd_sparc_elf_fixup_symbol
924 
925 #define bfd_elf64_mkobject \
926   _bfd_sparc_elf_mkobject
927 #define elf_backend_object_p \
928   _bfd_sparc_elf_object_p
929 #define elf_backend_gc_mark_hook \
930   _bfd_sparc_elf_gc_mark_hook
931 #define elf_backend_init_index_section \
932   _bfd_elf_init_1_index_section
933 
934 #define elf_backend_can_gc_sections 1
935 #define elf_backend_can_refcount 1
936 #define elf_backend_want_got_plt 0
937 #define elf_backend_plt_readonly 0
938 #define elf_backend_want_plt_sym 1
939 #define elf_backend_got_header_size 8
940 #define elf_backend_want_dynrelro 1
941 #define elf_backend_rela_normal 1
942 
943 /* Section 5.2.4 of the ABI specifies a 256-byte boundary for the table.  */
944 #define elf_backend_plt_alignment 8
945 
946 #include "elf64-target.h"
947 
948 /* FreeBSD support */
949 #undef  TARGET_BIG_SYM
950 #define TARGET_BIG_SYM sparc_elf64_fbsd_vec
951 #undef  TARGET_BIG_NAME
952 #define TARGET_BIG_NAME "elf64-sparc-freebsd"
953 #undef	ELF_OSABI
954 #define	ELF_OSABI ELFOSABI_FREEBSD
955 
956 #undef  elf64_bed
957 #define elf64_bed				elf64_sparc_fbsd_bed
958 
959 #include "elf64-target.h"
960 
961 /* Solaris 2.  */
962 
963 #undef	TARGET_BIG_SYM
964 #define	TARGET_BIG_SYM				sparc_elf64_sol2_vec
965 #undef	TARGET_BIG_NAME
966 #define	TARGET_BIG_NAME				"elf64-sparc-sol2"
967 
968 /* Restore default: we cannot use ELFOSABI_SOLARIS, otherwise ELFOSABI_NONE
969    objects won't be recognized.  */
970 #undef	ELF_OSABI
971 
972 #undef elf64_bed
973 #define elf64_bed				elf64_sparc_sol2_bed
974 
975 /* The 64-bit static TLS arena size is rounded to the nearest 16-byte
976    boundary.  */
977 #undef elf_backend_static_tls_alignment
978 #define elf_backend_static_tls_alignment	16
979 
980 #include "elf64-target.h"
981