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); }
ldctor_build_sets (){  static boolean called;  lang_statement_list_type *old;  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);  for (p = sets; p != (struct set_info *) NULL; p = p->next)    {      struct set_element *e;      reloc_howto_type *howto;      int 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;	    }	}      switch (bfd_get_reloc_size (howto))	{	case 1: size = BYTE; break;	case 2: size = SHORT; break;	case 4: size = LONG; break;	case 8: 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 ('=', 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 (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;}