View | Details | Raw Unified
Collapse All | Expand All

(-) binutils-2.16.91.0.4/bfd/elf.c (+1 lines)
 Lines 1212-1217    Link Here 
	    case DT_AUXILIARY: name = "AUXILIARY"; stringp = TRUE; break;
	    case DT_AUXILIARY: name = "AUXILIARY"; stringp = TRUE; break;
	    case DT_USED: name = "USED"; break;
	    case DT_USED: name = "USED"; break;
	    case DT_FILTER: name = "FILTER"; stringp = TRUE; break;
	    case DT_FILTER: name = "FILTER"; stringp = TRUE; break;
	    case DT_SUSE_HASHVALS: name = "SUSE_HASHVALS"; break;
	    }
	    }
	  fprintf (f, "  %-11s ", name);
	  fprintf (f, "  %-11s ", name);
(-) binutils-2.16.91.0.4/bfd/elflink.c (+46 lines)
 Lines 174-179    Link Here 
  flags = bed->dynamic_sec_flags;
  flags = bed->dynamic_sec_flags;
  if (info->hashvals)
    {
      s = bfd_make_section (abfd, ".suse.hashvals");
      if (s == NULL
	  || ! bfd_set_section_flags (abfd, s, flags | SEC_READONLY)
	  || ! bfd_set_section_alignment (abfd, s, 2))
	return FALSE;
    }
  /* A dynamically linked executable has a .interp section, but a
  /* A dynamically linked executable has a .interp section, but a
     shared library does not.  */
     shared library does not.  */
  if (info->executable)
  if (info->executable)
 Lines 5728-5733    Link Here 
	  memset (s->contents, 0, section_sym_count * bed->s->sizeof_sym);
	  memset (s->contents, 0, section_sym_count * bed->s->sizeof_sym);
	}
	}
      /* Create the direct bindings section - 1 entry per dynsym */
      s = bfd_get_section_by_name (dynobj, ".suse.hashvals");
      if (s)
        {
  	  if (dynsymcount == 0)
	    s->flags |= SEC_EXCLUDE;
	  else
	    {
	      s->size = dynsymcount * bed->s->sizeof_hash_entry;
	      s->contents = bfd_zalloc (output_bfd, s->size);
	      if (s->contents == NULL)
	        return FALSE;
	      memset (s->contents, 0xfe, s->size);
	      if (!_bfd_elf_add_dynamic_entry (info, DT_SUSE_HASHVALS, 0))
	        return FALSE;
	    }
	}
      /* Compute the size of the hashing table.  As a side effect this
      /* Compute the size of the hashing table.  As a side effect this
	 computes the hash values for all the names we export.  */
	 computes the hash values for all the names we export.  */
      bucketcount = compute_bucket_count (info);
      bucketcount = compute_bucket_count (info);
 Lines 5799-5804    Link Here 
  /* Array large enough to hold a section pointer for each local
  /* Array large enough to hold a section pointer for each local
     symbol of any input BFD.  */
     symbol of any input BFD.  */
  asection **sections;
  asection **sections;
  /* .suse.hashvals section */
  asection *hashvals_sec;
  /* Buffer to hold swapped out symbols.  */
  /* Buffer to hold swapped out symbols.  */
  bfd_byte *symbuf;
  bfd_byte *symbuf;
  /* And one for symbol section indices.  */
  /* And one for symbol section indices.  */
 Lines 6614-6619    Link Here 
	       ((bfd_byte *) finfo->hash_sec->contents
	       ((bfd_byte *) finfo->hash_sec->contents
		+ (bucketcount + 2 + h->dynindx) * hash_entry_size));
		+ (bucketcount + 2 + h->dynindx) * hash_entry_size));
      if (finfo->hashvals_sec)
      {
	  bfd_vma offset = hash_entry_size * h->dynindx;
	  if (offset > finfo->hashvals_sec->size)
	    fprintf (stderr, "Out of bounds hashvals section index %d size %d\n",
		     (int) offset, (int) finfo->hashvals_sec->size);
	  else
	    bfd_put (8 * hash_entry_size, finfo->output_bfd,
		     h->u.elf_hash_value,
		     finfo->hashvals_sec->contents + offset);
      }
      if (finfo->symver_sec != NULL && finfo->symver_sec->contents != NULL)
      if (finfo->symver_sec != NULL && finfo->symver_sec->contents != NULL)
	{
	{
	  Elf_Internal_Versym iversym;
	  Elf_Internal_Versym iversym;
 Lines 7786-7791    Link Here 
      finfo.dynsym_sec = NULL;
      finfo.dynsym_sec = NULL;
      finfo.hash_sec = NULL;
      finfo.hash_sec = NULL;
      finfo.symver_sec = NULL;
      finfo.symver_sec = NULL;
      finfo.hashvals_sec = NULL;
    }
    }
  else
  else
    {
    {
 Lines 7794-7799    Link Here 
      BFD_ASSERT (finfo.dynsym_sec != NULL && finfo.hash_sec != NULL);
      BFD_ASSERT (finfo.dynsym_sec != NULL && finfo.hash_sec != NULL);
      finfo.symver_sec = bfd_get_section_by_name (dynobj, ".gnu.version");
      finfo.symver_sec = bfd_get_section_by_name (dynobj, ".gnu.version");
      /* Note that it is OK if symver_sec is NULL.  */
      /* Note that it is OK if symver_sec is NULL.  */
      finfo.hashvals_sec = bfd_get_section_by_name (dynobj, ".suse.hashvals");
    }
    }
  finfo.contents = NULL;
  finfo.contents = NULL;
 Lines 8533-8538    Link Here 
	    case DT_HASH:
	    case DT_HASH:
	      name = ".hash";
	      name = ".hash";
	      goto get_vma;
	      goto get_vma;
	    case DT_SUSE_HASHVALS:
	      name = ".suse.hashvals";
	      goto get_vma;
	    case DT_STRTAB:
	    case DT_STRTAB:
	      name = ".dynstr";
	      name = ".dynstr";
	      goto get_vma;
	      goto get_vma;
(-) binutils-2.16.91.0.4/include/bfdlink.h (+4 lines)
 Lines 261-266    Link Here 
     need much more time and therefore must be explicitly selected.  */
     need much more time and therefore must be explicitly selected.  */
  unsigned int optimize: 1;
  unsigned int optimize: 1;
  /* TRUE if we want to produced a section containing pre-computed
     hash values. This consumes more space. */
  unsigned int hashvals: 1;
  /* TRUE if ok to have multiple definition.  */
  /* TRUE if ok to have multiple definition.  */
  unsigned int allow_multiple_definition: 1;
  unsigned int allow_multiple_definition: 1;
(-) binutils-2.16.91.0.4/include/elf/common.h (+6 lines)
 Lines 604-609    Link Here 
#define DT_FILTER	0x7fffffff
#define DT_FILTER	0x7fffffff
/* Selected at random */
#define DT_SUSE_LO 0x6cbdd030
#define DT_SUSE_HASHVALS DT_SUSE_LO
#define DT_SUSE_DIRECT DT_SUSE_LO + 1
#define DT_SUSE_HI 0x6cbdd040
/* Values used in DT_FEATURE .dynamic entry.  */
/* Values used in DT_FEATURE .dynamic entry.  */
#define DTF_1_PARINIT	0x00000001
#define DTF_1_PARINIT	0x00000001
/* From
/* From
(-) binutils-2.16.91.0.4/ld/lexsup.c (+6 lines)
 Lines 78-83    Link Here 
  OPTION_EL,
  OPTION_EL,
  OPTION_EMBEDDED_RELOCS,
  OPTION_EMBEDDED_RELOCS,
  OPTION_EXPORT_DYNAMIC,
  OPTION_EXPORT_DYNAMIC,
  OPTION_HASHVALS,
  OPTION_HELP,
  OPTION_HELP,
  OPTION_IGNORE,
  OPTION_IGNORE,
  OPTION_MAP,
  OPTION_MAP,
 Lines 341-346    Link Here 
    '\0', NULL, NULL, ONE_DASH },
    '\0', NULL, NULL, ONE_DASH },
  { {"static", no_argument, NULL, OPTION_NON_SHARED},
  { {"static", no_argument, NULL, OPTION_NON_SHARED},
    '\0', NULL, NULL, ONE_DASH },
    '\0', NULL, NULL, ONE_DASH },
  { {"hashvals", no_argument, NULL, OPTION_HASHVALS},
    '\0', NULL, N_("Store pre-computed elf hash codes"), ONE_DASH },
  { {"Bsymbolic", no_argument, NULL, OPTION_SYMBOLIC},
  { {"Bsymbolic", no_argument, NULL, OPTION_SYMBOLIC},
    '\0', NULL, N_("Bind global references locally"), ONE_DASH },
    '\0', NULL, N_("Bind global references locally"), ONE_DASH },
  { {"check-sections", no_argument, NULL, OPTION_CHECK_SECTIONS},
  { {"check-sections", no_argument, NULL, OPTION_CHECK_SECTIONS},
 Lines 1111-1116    Link Here 
	case OPTION_SYMBOLIC:
	case OPTION_SYMBOLIC:
	  link_info.symbolic = TRUE;
	  link_info.symbolic = TRUE;
	  break;
	  break;
	case OPTION_HASHVALS:
	  link_info.hashvals = TRUE;
	  break;
	case 't':
	case 't':
	  trace_files = TRUE;
	  trace_files = TRUE;
	  break;
	  break;