diff options
Diffstat (limited to 'contrib/binutils/ld/ldctor.c')
| -rw-r--r-- | contrib/binutils/ld/ldctor.c | 256 | 
1 files changed, 0 insertions, 256 deletions
diff --git a/contrib/binutils/ld/ldctor.c b/contrib/binutils/ld/ldctor.c deleted file mode 100644 index 6e40938d7f18..000000000000 --- a/contrib/binutils/ld/ldctor.c +++ /dev/null @@ -1,256 +0,0 @@ -/* ldctor.c -- constructor support routines -   Copyright (C) 1991, 92, 93, 94, 1995 Free Software Foundation, Inc. -   By Steve Chamberlain <sac@cygnus.com> -    -This file is part of GLD, the Gnu Linker. - -GLD is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2, or (at your option) -any later version. - -GLD is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GLD; see the file COPYING.  If not, write to -the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */ - -#include "bfd.h" -#include "sysdep.h" -#include "bfdlink.h" - -#include "ld.h" -#include "ldexp.h" -#include "ldlang.h" -#include "ldmisc.h" -#include "ldgram.h" -#include "ldmain.h" -#include "ldctor.h" - -/* The list of statements needed to handle constructors.  These are -   invoked by the command CONSTRUCTORS in the linker script.  */ -lang_statement_list_type constructor_list; - -/* The sets we have seen.  */ -struct set_info *sets; - -/* Add an entry to a set.  H is the entry in the linker hash table. -   RELOC is the relocation to use for an entry in the set.  SECTION -   and VALUE are the value to add.  This is called during the first -   phase of the link, when we are still gathering symbols together. -   We just record the information now.  The ldctor_find_constructors -   function will construct the sets.  */ - -void -ldctor_add_set_entry (h, reloc, name, section, value) -     struct bfd_link_hash_entry *h; -     bfd_reloc_code_real_type reloc; -     const char *name; -     asection *section; -     bfd_vma value; -{ -  struct set_info *p; -  struct set_element *e; -  struct set_element **epp; - -  for (p = sets; p != (struct set_info *) NULL; p = p->next) -    if (p->h == h) -      break; - -  if (p == (struct set_info *) NULL) -    { -      p = (struct set_info *) xmalloc (sizeof (struct set_info)); -      p->next = sets; -      sets = p; -      p->h = h; -      p->reloc = reloc; -      p->count = 0; -      p->elements = NULL; -    } -  else -    { -      if (p->reloc != reloc) -	{ -	  einfo ("%P%X: Different relocs used in set %s\n", h->root.string); -	  return; -	} - -      /* Don't permit a set to be constructed from different object -         file formats.  The same reloc may have different results.  We -         actually could sometimes handle this, but the case is -         unlikely to ever arise.  Sometimes constructor symbols are in -         unusual sections, such as the absolute section--this appears -         to be the case in Linux a.out--and in such cases we just -         assume everything is OK.  */ -      if (p->elements != NULL -	  && section->owner != NULL -	  && p->elements->section->owner != NULL -	  && strcmp (bfd_get_target (section->owner), -		     bfd_get_target (p->elements->section->owner)) != 0) -	{ -	  einfo ("%P%X: Different object file formats composing set %s\n", -		 h->root.string); -	  return; -	} -    } - -  e = (struct set_element *) xmalloc (sizeof (struct set_element)); -  e->next = NULL; -  e->name = name; -  e->section = section; -  e->value = value; - -  for (epp = &p->elements; *epp != NULL; epp = &(*epp)->next) -    ; -  *epp = e; - -  ++p->count; -} - -/* This function is called after the first phase of the link and -   before the second phase.  At this point all set information has -   been gathered.  We now put the statements to build the sets -   themselves into constructor_list.  */ - -void -ldctor_build_sets () -{ -  static boolean called; -  lang_statement_list_type *old; -  boolean header_printed; -  struct set_info *p; - -  /* The emulation code may call us directly, but we only want to do -     this once.  */ -  if (called) -    return; -  called = true; - -  old = stat_ptr; -  stat_ptr = &constructor_list; - -  lang_list_init (stat_ptr); - -  header_printed = false; -  for (p = sets; p != (struct set_info *) NULL; p = p->next) -    { -      struct set_element *e; -      reloc_howto_type *howto; -      int reloc_size, size; - -      /* If the symbol is defined, we may have been invoked from -	 collect, and the sets may already have been built, so we do -	 not do anything.  */ -      if (p->h->type == bfd_link_hash_defined -	  || p->h->type == bfd_link_hash_defweak) -	continue; - -      /* For each set we build: -	   set: -	     .long number_of_elements -	     .long element0 -	     ... -	     .long elementN -	     .long 0 -	 except that we use the right size instead of .long.  When -	 generating relocateable output, we generate relocs instead of -	 addresses.  */ -      howto = bfd_reloc_type_lookup (output_bfd, p->reloc); -      if (howto == (reloc_howto_type *) NULL) -	{ -	  if (link_info.relocateable) -	    { -	      einfo ("%P%X: %s does not support reloc %s for set %s\n", -		     bfd_get_target (output_bfd), -		     bfd_get_reloc_code_name (p->reloc), -		     p->h->root.string); -	      continue; -	    } - -	  /* If this is not a relocateable link, all we need is the -	     size, which we can get from the input BFD.  */ -	  howto = bfd_reloc_type_lookup (p->elements->section->owner, -					 p->reloc); -	  if (howto == NULL) -	    { -	      einfo ("%P%X: %s does not support reloc %s for set %s\n", -		     bfd_get_target (p->elements->section->owner), -		     bfd_get_reloc_code_name (p->reloc), -		     p->h->root.string); -	      continue; -	    } -	} - -      reloc_size = bfd_get_reloc_size (howto); -      switch (reloc_size) -	{ -	case 1: size = BYTE; break; -	case 2: size = SHORT; break; -	case 4: size = LONG; break; -	case 8: -	  if (howto->complain_on_overflow == complain_overflow_signed) -	    size = SQUAD; -	  else -	    size = QUAD; -	  break; -	default: -	  einfo ("%P%X: Unsupported size %d for set %s\n", -		 bfd_get_reloc_size (howto), p->h->root.string); -	  size = LONG; -	  break; -	} - -      lang_add_assignment (exp_assop ('=', ".", -				      exp_unop (ALIGN_K, -						exp_intop (reloc_size)))); -      lang_add_assignment (exp_assop ('=', p->h->root.string, -				      exp_nameop (NAME, "."))); -      lang_add_data (size, exp_intop ((bfd_vma) p->count)); - -      for (e = p->elements; e != (struct set_element *) NULL; e = e->next) -	{ -	  if (config.map_file != NULL) -	    { -	      int len; - -	      if (! header_printed) -		{ -		  minfo ("\nSet                 Symbol\n\n"); -		  header_printed = true; -		} - -	      minfo ("%s", p->h->root.string); -	      len = strlen (p->h->root.string); - -	      if (len >= 19) -		{ -		  print_nl (); -		  len = 0; -		} -	      while (len < 20) -		{ -		  print_space (); -		  ++len; -		} - -	      if (e->name != NULL) -		minfo ("%T\n", e->name); -	      else -		minfo ("%G\n", e->section->owner, e->section, e->value); -	    } - -	  if (link_info.relocateable) -	    lang_add_reloc (p->reloc, howto, e->section, e->name, -			    exp_intop (e->value)); -	  else -	    lang_add_data (size, exp_relop (e->section, e->value)); -	} - -      lang_add_data (size, exp_intop (0)); -    } - -  stat_ptr = old; -}  | 
