View | Details | Raw Unified
Collapse All | Expand All

(-) binutils-2.16/bfd/elf-bfd.h (+13 lines)
 Lines 170-175    Link Here 
     matters.  */
     matters.  */
  unsigned int pointer_equality_needed : 1;
  unsigned int pointer_equality_needed : 1;
  /* FIXME: these 2 bits consume another 4 bytes */
  /* Symbol is concrete, ie. non-vague if we can detect that, from the
     .direct section */
  unsigned int concrete_ref : 1;
  /* Symbol is certainly vague (if we can detect that), from the
     .direct section */
  unsigned int vague_ref : 1;
  /* String table index in .dynstr if this is a dynamic symbol.  */
  /* String table index in .dynstr if this is a dynamic symbol.  */
  unsigned long dynstr_index;
  unsigned long dynstr_index;
 Lines 396-401    Link Here 
  asection *tls_sec;
  asection *tls_sec;
  bfd_size_type tls_size;
  bfd_size_type tls_size;
  /* Direct linkage output section */
  asection *direct_sec;
  /* A linked list of BFD's loaded in the link.  */
  /* A linked list of BFD's loaded in the link.  */
  struct elf_link_loaded_list *loaded;
  struct elf_link_loaded_list *loaded;
 Lines 1238-1243    Link Here 
     name actually used, which will be the DT_SONAME entry if there is
     name actually used, which will be the DT_SONAME entry if there is
     one.  */
     one.  */
  const char *dt_name;
  const char *dt_name;
  int         dt_needed_idx;
  /* Records the result of `get_program_header_size'.  */
  /* Records the result of `get_program_header_size'.  */
  bfd_size_type program_header_size;
  bfd_size_type program_header_size;
 Lines 1338-1343    Link Here 
#define elf_local_got_offsets(bfd) (elf_tdata(bfd) -> local_got.offsets)
#define elf_local_got_offsets(bfd) (elf_tdata(bfd) -> local_got.offsets)
#define elf_local_got_ents(bfd) (elf_tdata(bfd) -> local_got.ents)
#define elf_local_got_ents(bfd) (elf_tdata(bfd) -> local_got.ents)
#define elf_dt_name(bfd)	(elf_tdata(bfd) -> dt_name)
#define elf_dt_name(bfd)	(elf_tdata(bfd) -> dt_name)
#define elf_dt_needed_idx(bfd)	(elf_tdata(bfd) -> dt_needed_idx)
#define elf_dyn_lib_class(bfd)	(elf_tdata(bfd) -> dyn_lib_class)
#define elf_dyn_lib_class(bfd)	(elf_tdata(bfd) -> dyn_lib_class)
#define elf_bad_symtab(bfd)	(elf_tdata(bfd) -> bad_symtab)
#define elf_bad_symtab(bfd)	(elf_tdata(bfd) -> bad_symtab)
#define elf_flags_init(bfd)	(elf_tdata(bfd) -> flags_init)
#define elf_flags_init(bfd)	(elf_tdata(bfd) -> flags_init)
(-) binutils-2.16/bfd/elf.c (+2 lines)
 Lines 1145-1150    Link Here 
	    case DT_RELCOUNT: name = "RELCOUNT"; break;
	    case DT_RELCOUNT: name = "RELCOUNT"; break;
	    case DT_FLAGS_1: name = "FLAGS_1"; break;
	    case DT_FLAGS_1: name = "FLAGS_1"; break;
	    case DT_VERSYM: name = "VERSYM"; break;
	    case DT_VERSYM: name = "VERSYM"; break;
	    case DT_SUSE_DIRECT: name = "SUSE_DIRECT"; break;
	    case DT_VERDEF: name = "VERDEF"; break;
	    case DT_VERDEF: name = "VERDEF"; break;
	    case DT_VERDEFNUM: name = "VERDEFNUM"; break;
	    case DT_VERDEFNUM: name = "VERDEFNUM"; break;
	    case DT_VERNEED: name = "VERNEED"; break;
	    case DT_VERNEED: name = "VERNEED"; break;
 Lines 1495-1500    Link Here 
  table->runpath = NULL;
  table->runpath = NULL;
  table->tls_sec = NULL;
  table->tls_sec = NULL;
  table->tls_size = 0;
  table->tls_size = 0;
  table->direct_sec = NULL;
  table->loaded = NULL;
  table->loaded = NULL;
  table->is_relocatable_executable = FALSE;
  table->is_relocatable_executable = FALSE;
(-) binutils-2.16/bfd/elflink.c (+146 lines)
 Lines 172-177    Link Here 
      elf_hash_table (info)->eh_info.hdr_sec = s;
      elf_hash_table (info)->eh_info.hdr_sec = s;
    }
    }
  if ( info->direct && !info->executable )
    {
      s = bfd_make_section (abfd, ".suse.direct");
      if (s == NULL
	  || ! bfd_set_section_flags (abfd, s, flags | SEC_READONLY)
	  || ! bfd_set_section_alignment (abfd, s, 2))
	return FALSE;
      elf_hash_table (info)->direct_sec = s;
    }
  /* Create sections to hold version informations.  These are removed
  /* Create sections to hold version informations.  These are removed
     if they are not needed.  */
     if they are not needed.  */
  s = bfd_make_section (abfd, ".gnu.version_d");
  s = bfd_make_section (abfd, ".gnu.version_d");
 Lines 2193-2199    Link Here 
  return TRUE;
  return TRUE;
}
}


/* Fix up the flags for a symbol.  This handles various cases which
/* Fix up the flags for a symbol.  This handles various cases which
   can only be fixed after all the input files are seen.  This is
   can only be fixed after all the input files are seen.  This is
   currently called by both adjust_dynamic_symbol and
   currently called by both adjust_dynamic_symbol and
 Lines 2848-2853    Link Here 
      if (!_bfd_elf_add_dynamic_entry (info, DT_NEEDED, strindex))
      if (!_bfd_elf_add_dynamic_entry (info, DT_NEEDED, strindex))
	return -1;
	return -1;
      elf_dt_needed_idx (abfd) = ++(info->dt_needed_index);
/*      fprintf (stderr, "Set soname '%s' as index %d\n",
	       soname, info->dt_needed_index); */
    }
    }
  else
  else
    /* We were just checking for existence of the tag.  */
    /* We were just checking for existence of the tag.  */
 Lines 3143-3148    Link Here 
  bfd_boolean add_needed;
  bfd_boolean add_needed;
  struct elf_link_hash_table * hash_table;
  struct elf_link_hash_table * hash_table;
  bfd_size_type amt;
  bfd_size_type amt;
  asection *direct_sec;
  unsigned char *direct_data;
  hash_table = elf_hash_table (info);
  hash_table = elf_hash_table (info);
 Lines 3150-3155    Link Here 
  add_symbol_hook = bed->elf_add_symbol_hook;
  add_symbol_hook = bed->elf_add_symbol_hook;
  collect = bed->collect;
  collect = bed->collect;
  direct_sec = NULL;
  direct_data = NULL;
  if ((abfd->flags & DYNAMIC) == 0)
  if ((abfd->flags & DYNAMIC) == 0)
    dynamic = FALSE;
    dynamic = FALSE;
  else
  else
 Lines 3169-3174    Link Here 
	    bfd_set_error (bfd_error_wrong_format);
	    bfd_set_error (bfd_error_wrong_format);
	  goto error_return;
	  goto error_return;
	}
	}
      if (info->direct &&
	  (direct_sec = bfd_get_section_by_name (abfd, ".suse.direct")))
        {
          direct_data = bfd_alloc (abfd, direct_sec->size);
	  if (direct_data == NULL ||
	      ! bfd_get_section_contents (abfd, direct_sec, direct_data, 0, direct_sec->size))
	    goto error_return;
	}
    }
    }
  /* As a GNU extension, any input sections which are named
  /* As a GNU extension, any input sections which are named
 Lines 3817-3822    Link Here 
	      && vernum > 1
	      && vernum > 1
	      && definition)
	      && definition)
	    h->verinfo.verdef = &elf_tdata (abfd)->verdef[vernum - 1];
	    h->verinfo.verdef = &elf_tdata (abfd)->verdef[vernum - 1];
	  if (direct_sec)
	    {
	      unsigned long d_idx = isym - isymbuf;
	      /* FIXME: does bfd_elf_get_elf_syms read dynsym or the symbol
		 table ? */
	      d_idx += extsymoff;
	      d_idx *= 2;
	      if (d_idx > bfd_get_section_size (direct_sec))
	        fprintf (stderr, "Warning - strange error on '%s': 0x%x 0x%x\n",
			 h->root.root.string, (int)d_idx,
			 (int)bfd_get_section_size (direct_sec));
	      else
	        {
		  unsigned int direct_entry;
		  direct_entry = bfd_get_16 (abfd, direct_data + d_idx);
		  if ((direct_entry & DT_SUSE_DIRECT_VAGUE))
		    h->vague_ref = 1;
		  if (!h->vague_ref &&
		      (direct_entry & DT_SUSE_DIRECT_MASK) != DT_SUSE_DIRECT_UNKNOWN)
		      h->concrete_ref = 1;
#if 0
		  fprintf (stderr, "symbol '%s': %s direct entry 0x%x (index %d) section '%s' : '%s'\n",
			   h->root.root.string,
			   h->vague_ref ? "vague " : h->concrete_ref ? "concrete" : "unknown",
			   direct_entry, (int)d_idx/2,
			   new_sec ? new_sec->name : "<nosec>",
			   new_sec && new_sec->owner ? new_sec->owner->filename : "<noownername>");
#endif
		}
	    }
	}
	}
      if (! (_bfd_generic_link_add_one_symbol
      if (! (_bfd_generic_link_add_one_symbol
 Lines 3830-3835    Link Here 
	h = (struct elf_link_hash_entry *) h->root.u.i.link;
	h = (struct elf_link_hash_entry *) h->root.u.i.link;
      *sym_hash = h;
      *sym_hash = h;
      /* FIXME: move direct bits here ? - seem fine where they are ... */
      new_weakdef = FALSE;
      new_weakdef = FALSE;
      if (dynamic
      if (dynamic
	  && definition
	  && definition
 Lines 4450-4455    Link Here 
  if (isymbuf != NULL)
  if (isymbuf != NULL)
    free (isymbuf);
    free (isymbuf);
 error_return:
 error_return:
  if (direct_data != NULL)
    free (direct_data);
  return FALSE;
  return FALSE;
}
}
 Lines 5671-5676    Link Here 
	    return FALSE;
	    return FALSE;
	}
	}
      /* Create the direct bindings section - 1 entry per dynsym */
      s = bfd_get_section_by_name (dynobj, ".suse.direct");
      if (s)
        {
  	  if (dynsymcount == 0)
            s->flags |= SEC_EXCLUDE;
	  else
	    {
	      s->size = dynsymcount * sizeof (Elf_External_Direct);
	      s->contents = bfd_zalloc (output_bfd, s->size);
	      if (s->contents == NULL)
	        return FALSE;
	      memset (s->contents, 0xff, s->size);
	      if (!_bfd_elf_add_dynamic_entry (info, DT_SUSE_DIRECT, 0))
	        return FALSE;
	    }
	}
      /* Set the size of the .dynsym and .hash sections.  We counted
      /* Set the size of the .dynsym and .hash sections.  We counted
	 the number of dynamic symbols in elf_link_add_object_symbols.
	 the number of dynamic symbols in elf_link_add_object_symbols.
	 We will build the contents of .dynsym and .hash when we build
	 We will build the contents of .dynsym and .hash when we build
 Lines 5749-5754    Link Here 
  asection *hash_sec;
  asection *hash_sec;
  /* symbol version section (.gnu.version).  */
  /* symbol version section (.gnu.version).  */
  asection *symver_sec;
  asection *symver_sec;
  /* .direct linkage section */
  asection *direct_sec;
  /* Buffer large enough to hold contents of any section.  */
  /* Buffer large enough to hold contents of any section.  */
  bfd_byte *contents;
  bfd_byte *contents;
  /* Buffer large enough to hold external relocs of any section.  */
  /* Buffer large enough to hold external relocs of any section.  */
 Lines 6603-6608    Link Here 
	  eversym += h->dynindx;
	  eversym += h->dynindx;
	  _bfd_elf_swap_versym_out (finfo->output_bfd, &iversym, eversym);
	  _bfd_elf_swap_versym_out (finfo->output_bfd, &iversym, eversym);
	}
	}
      if (finfo->direct_sec)
	{
	  bfd_vma offset = 2 * h->dynindx;
	  if (offset > finfo->direct_sec->size)
	    fprintf (stderr, "Out of bounds direct section index %d\n",
		     (int) offset);
	  else
	    {
	      int dt_index = DT_SUSE_DIRECT_UNKNOWN;
#if 0
	      fprintf (stderr, "Symbol '%s' type %d\n",
	               h->root.root.string, h->root.type);
#endif
	      if ((h->root.type == bfd_link_hash_defined
		   || h->root.type == bfd_link_hash_defweak) &&
		  h->root.u.def.section != NULL &&
		  h->root.u.def.section->owner != NULL)
							   
	        {
		  asection *sec = h->root.u.def.section;
		  dt_index = elf_dt_needed_idx (sec->owner);
		  if (!(sec->owner->flags & DYNAMIC))
		    {
		      if (!sec->name ||
			  !strncmp (sec->name, ".gnu.linkonce", sizeof ".gnu.linkonce" - 1))
			dt_index |= DT_SUSE_DIRECT_VAGUE;
		      /* app -> library data references get turned into copy
			 relocs, so objects can migrate unpredictably into the
			 application itself. */
		      else if (h->type == STT_OBJECT)
			dt_index |= DT_SUSE_DIRECT_VAGUE;
		    }
		  else if (h->vague_ref)
		    dt_index |= DT_SUSE_DIRECT_VAGUE;
		  else if (!h->concrete_ref)
		    dt_index = DT_SUSE_DIRECT_UNKNOWN;
#if 0
		  fprintf (stderr, "Sym '%s' (type %d) [type %d] section  %s [%s] owner '%s' [%d] offset %d resolves '%s'\n",
			   h->root.root.string, h->root.type, h->type,
			   sec->name ? sec->name : "<null>",
			   sec->owner->flags & DYNAMIC ? "dynamic" : "static",
			   sec->owner ? sec->owner->filename : "<noowner?>",
			   dt_index, (int) offset,
			   dt_index & DT_SUSE_DIRECT_VAGUE ? "<vague>" : "concrete");
#endif
		}
	      bfd_put_16 (finfo->output_bfd,
			  dt_index,
			  finfo->direct_sec->contents + offset);
	    }
	}
    }
    }
  /* If we're stripping it, then it was just a dynamic symbol, and
  /* If we're stripping it, then it was just a dynamic symbol, and
 Lines 7732-7737    Link Here 
  if (! dynamic)
  if (! dynamic)
    {
    {
      finfo.direct_sec = NULL;
      finfo.dynsym_sec = NULL;
      finfo.dynsym_sec = NULL;
      finfo.hash_sec = NULL;
      finfo.hash_sec = NULL;
      finfo.symver_sec = NULL;
      finfo.symver_sec = NULL;
 Lines 7740-7745    Link Here 
    }
    }
  else
  else
    {
    {
      finfo.direct_sec = bfd_get_section_by_name (dynobj, ".suse.direct");
      finfo.dynsym_sec = bfd_get_section_by_name (dynobj, ".dynsym");
      finfo.dynsym_sec = bfd_get_section_by_name (dynobj, ".dynsym");
      finfo.hash_sec = bfd_get_section_by_name (dynobj, ".hash");
      finfo.hash_sec = bfd_get_section_by_name (dynobj, ".hash");
      BFD_ASSERT (finfo.dynsym_sec != NULL && finfo.hash_sec != NULL);
      BFD_ASSERT (finfo.dynsym_sec != NULL && finfo.hash_sec != NULL);
 Lines 8492-8497    Link Here 
	    case DT_VERNEED:
	    case DT_VERNEED:
	      name = ".gnu.version_r";
	      name = ".gnu.version_r";
	      goto get_vma;
	      goto get_vma;
	    case DT_SUSE_DIRECT:
	      name = ".suse.direct";
	      goto get_vma;
	    case DT_VERSYM:
	    case DT_VERSYM:
	      name = ".gnu.version";
	      name = ".gnu.version";
	    get_vma:
	    get_vma:
(-) binutils-2.16/binutils/readelf.c (-2 / +138 lines)
 Lines 143-148    Link Here 
static int do_dynamic;
static int do_dynamic;
static int do_syms;
static int do_syms;
static int do_reloc;
static int do_reloc;
static int do_direct;
static int do_sections;
static int do_sections;
static int do_section_groups;
static int do_section_groups;
static int do_section_details;
static int do_section_details;
 Lines 1519-1524    Link Here 
    case DT_SYMINFO:	return "SYMINFO"; /* aka ADDRRNGHI */
    case DT_SYMINFO:	return "SYMINFO"; /* aka ADDRRNGHI */
    case DT_VERSYM:	return "VERSYM";
    case DT_VERSYM:	return "VERSYM";
    case DT_SUSE_DIRECT:	return "SUSE_DIRECT";
    case DT_RELACOUNT:	return "RELACOUNT";
    case DT_RELACOUNT:	return "RELACOUNT";
    case DT_RELCOUNT:	return "RELCOUNT";
    case DT_RELCOUNT:	return "RELCOUNT";
 Lines 2590-2595    Link Here 
  {"symbols",	       no_argument, 0, 's'},
  {"symbols",	       no_argument, 0, 's'},
  {"syms",	       no_argument, 0, 's'},
  {"syms",	       no_argument, 0, 's'},
  {"relocs",	       no_argument, 0, 'r'},
  {"relocs",	       no_argument, 0, 'r'},
  {"direct",	       no_argument, 0, 'y'},
  {"notes",	       no_argument, 0, 'n'},
  {"notes",	       no_argument, 0, 'n'},
  {"dynamic",	       no_argument, 0, 'd'},
  {"dynamic",	       no_argument, 0, 'd'},
  {"arch-specific",    no_argument, 0, 'A'},
  {"arch-specific",    no_argument, 0, 'A'},
 Lines 2626-2631    Link Here 
      --symbols          An alias for --syms\n\
      --symbols          An alias for --syms\n\
  -n --notes             Display the core notes (if present)\n\
  -n --notes             Display the core notes (if present)\n\
  -r --relocs            Display the relocations (if present)\n\
  -r --relocs            Display the relocations (if present)\n\
  -y --direct            Display direct linkage table (if present)\n\
  -u --unwind            Display the unwind info (if present)\n\
  -u --unwind            Display the unwind info (if present)\n\
  -d --dynamic           Display the dynamic section (if present)\n\
  -d --dynamic           Display the dynamic section (if present)\n\
  -V --version-info      Display the version sections (if present)\n\
  -V --version-info      Display the version sections (if present)\n\
 Lines 2693-2699    Link Here 
    usage ();
    usage ();
  while ((c = getopt_long
  while ((c = getopt_long
	  (argc, argv, "ersuahnldSDAINtgw::x:i:vVWH", options, NULL)) != EOF)
	  (argc, argv, "erysuahnldSDAINtgw::x:i:vVWH", options, NULL)) != EOF)
    {
    {
      char *cp;
      char *cp;
      int section;
      int section;
 Lines 2710-2715    Link Here 
	case 'a':
	case 'a':
	  do_syms++;
	  do_syms++;
	  do_reloc++;
	  do_reloc++;
	  do_direct++;
	  do_unwind++;
	  do_unwind++;
	  do_dynamic++;
	  do_dynamic++;
	  do_header++;
	  do_header++;
 Lines 2738-2743    Link Here 
	case 'r':
	case 'r':
	  do_reloc++;
	  do_reloc++;
	  break;
	  break;
	case 'y':
	  do_direct++;
	  break;
	case 'u':
	case 'u':
	  do_unwind++;
	  do_unwind++;
	  break;
	  break;
 Lines 2943-2949    Link Here 
	}
	}
    }
    }
  if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
  if (!do_dynamic && !do_syms && !do_reloc && !do_direct && !do_unwind && !do_sections
      && !do_segments && !do_header && !do_dump && !do_version
      && !do_segments && !do_header && !do_dump && !do_version
      && !do_histogram && !do_debugging && !do_arch && !do_notes
      && !do_histogram && !do_debugging && !do_arch && !do_notes
      && !do_section_groups)
      && !do_section_groups)
 Lines 4328-4333    Link Here 
  return 1;
  return 1;
}
}
static void
print_dt_needed_name (int idx)
{
  const char *name = NULL;
  Elf_Internal_Dyn *entry;
  idx &= DT_SUSE_DIRECT_MASK;
 
  switch (idx)
    {
    case 0:
      name = _("<self>");
      break;
    case DT_SUSE_DIRECT_UNKNOWN:
      name = _("<unknown>");
      break;
    default:
      idx--;
      for (entry = dynamic_section;
	   entry < dynamic_section + dynamic_nent && idx > 0;
	   entry++)
	if (entry->d_tag == DT_NEEDED)
	  idx--;
  
      if (idx == 0)
        {
          if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
	    name = GET_DYNAMIC_NAME (entry->d_un.d_val);
	  else
	    name = NULL;
	}
      break;
    }
  if (!name)
    name = _("<out-of-range>");
  if (do_wide)
    printf ("%s", name);
  else
    printf ("%-25s", name);
}
static int
process_direct (FILE *file)
{
  unsigned int i;
  unsigned int si;
  char *strtab;
  unsigned char *directtab;
  Elf_Internal_Sym *symtab = NULL;
  Elf_Internal_Sym *psym;
  Elf_Internal_Shdr *direct = NULL;
  Elf_Internal_Shdr *dynsym = NULL;
  Elf_Internal_Shdr *section;
  if (!do_direct)
    return 1;
  if (!dynamic_symbols || !dynamic_section || !dynamic_strings)
    return 1;
  for (i = 0, section = section_headers;
       i < elf_header.e_shnum;
       i++, section++)
    {
      if (section->sh_type == SHT_DYNSYM)
        dynsym = section;
      if (!strcmp (SECTION_NAME (section), ".suse.direct"))
        direct = section;
    }
  if (!dynsym || !direct)
    return 1;
  
  symtab = GET_ELF_SYMBOLS (file, dynsym);
  if (!symtab)
    return 1;
  directtab = get_data (NULL, file, direct->sh_offset,
			direct->sh_size, 1, _("direct linkage table"));
  if (!symtab)
  {
    free (symtab);
    return 1;
  }
  if (dynsym->sh_link == elf_header.e_shstrndx)
    strtab = string_table;
  else
    {
      Elf_Internal_Shdr *string_sec;
      string_sec = SECTION_HEADER (dynsym->sh_link);
      strtab = get_data (NULL, file, string_sec->sh_offset,
			 string_sec->sh_size, 1, _("string table"));
    }
  assert (strtab != NULL);
  printf (_("\nDirect relocations for image:\n"));
  printf (_("   Num:  Index     Vague   Binding                    Symbol\n"));
  for (si = 0, psym = symtab;
       si < dynsym->sh_size / dynsym->sh_entsize;
       si++, psym++)
    {
       unsigned int field;
       printf ("%6d: ", si);
       field = byte_get (directtab + (si * 2), 2);
       printf ("[0x%.4x]   ", field);
       printf ("%s", (field & DT_SUSE_DIRECT_VAGUE) ? "Vague" : "     ");
       printf ("  ");
       print_dt_needed_name (field);
       printf ("  ");
       print_symbol (25, strtab + psym->st_name);
       printf ("\n");
    }
  free (symtab);
  if (strtab != string_table)
    free (strtab);
  return 1;
}
/* Process the unwind section.  */
/* Process the unwind section.  */
#include "unwind-ia64.h"
#include "unwind-ia64.h"
 Lines 11784-11789    Link Here 
  process_relocs (file);
  process_relocs (file);
  process_direct (file);
  process_unwind (file);
  process_unwind (file);
  process_symbol_table (file);
  process_symbol_table (file);
(-) binutils-2.16/include/bfdlink.h (+6 lines)
 Lines 244-249    Link Here 
  /* TRUE if BFD should pre-bind symbols in a shared object.  */
  /* TRUE if BFD should pre-bind symbols in a shared object.  */
  unsigned int symbolic: 1;
  unsigned int symbolic: 1;
  /* TRUE if BFD should bind symbols directly to resolved at link time.  */
  unsigned int direct: 1;
  /* TRUE if BFD should export all symbols in the dynamic symbol table
  /* TRUE if BFD should export all symbols in the dynamic symbol table
     of an executable, rather than only those used.  */
     of an executable, rather than only those used.  */
  unsigned int export_dynamic: 1;
  unsigned int export_dynamic: 1;
 Lines 416-421    Link Here 
  /* Start and end of RELRO region.  */
  /* Start and end of RELRO region.  */
  bfd_vma relro_start, relro_end;
  bfd_vma relro_start, relro_end;
  /* current max dtinfo section number */
  int dt_needed_index;
};
};
/* This structures holds a set of callback functions.  These are
/* This structures holds a set of callback functions.  These are
(-) binutils-2.16/include/elf/common.h (+5 lines)
 Lines 635-640    Link Here 
#define DF_BIND_NOW	(1 << 3)
#define DF_BIND_NOW	(1 << 3)
#define DF_STATIC_TLS	(1 << 4)
#define DF_STATIC_TLS	(1 << 4)
/* Constants for the DT_DIRECT entries. */
#define DT_SUSE_DIRECT_VAGUE   (1<<15)
#define DT_SUSE_DIRECT_MASK     0xfff
#define DT_SUSE_DIRECT_UNKNOWN  DT_SUSE_DIRECT_MASK
/* These constants are used for the version number of a Elf32_Verdef
/* These constants are used for the version number of a Elf32_Verdef
   structure.  */
   structure.  */
(-) binutils-2.16/include/elf/external.h (+4 lines)
 Lines 213-218    Link Here 
  unsigned char		vd_next[4];
  unsigned char		vd_next[4];
} Elf_External_Verdef;
} Elf_External_Verdef;
typedef struct {
  unsigned char		dir_libidx[2];
} Elf_External_Direct;
/* This structure appears in a SHT_GNU_verdef section.  */
/* This structure appears in a SHT_GNU_verdef section.  */
typedef struct {
typedef struct {
(-) binutils-2.16/ld/lexsup.c (+6 lines)
 Lines 70-75    Link Here 
  OPTION_CREF,
  OPTION_CREF,
  OPTION_DEFSYM,
  OPTION_DEFSYM,
  OPTION_DEMANGLE,
  OPTION_DEMANGLE,
  OPTION_DIRECT,
  OPTION_DEMANGLER,
  OPTION_DEMANGLER,
  OPTION_DYNAMIC_LINKER,
  OPTION_DYNAMIC_LINKER,
  OPTION_SYSROOT,
  OPTION_SYSROOT,
 Lines 341-346    Link Here 
    '\0', NULL, NULL, ONE_DASH },
    '\0', NULL, NULL, 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 },
  { {"Bdirect", no_argument, NULL, OPTION_DIRECT},
    '\0', NULL, N_("Direct-linkage the the shared libraries"), ONE_DASH },
  { {"check-sections", no_argument, NULL, OPTION_CHECK_SECTIONS},
  { {"check-sections", no_argument, NULL, OPTION_CHECK_SECTIONS},
    '\0', NULL, N_("Check section addresses for overlaps (default)"),
    '\0', NULL, N_("Check section addresses for overlaps (default)"),
    TWO_DASHES },
    TWO_DASHES },
 Lines 746-751    Link Here 
	      cplus_demangle_set_style (style);
	      cplus_demangle_set_style (style);
	    }
	    }
	  break;
	  break;
	case OPTION_DIRECT:
	  link_info.direct = TRUE;
	  break;
	case 'I':		/* Used on Solaris.  */
	case 'I':		/* Used on Solaris.  */
	case OPTION_DYNAMIC_LINKER:
	case OPTION_DYNAMIC_LINKER:
	  command_line.interpreter = optarg;
	  command_line.interpreter = optarg;