View | Details | Raw Unified
Collapse All | Expand All

(-) binutils-2.16.91.0.5.orig/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 398-403    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 1276-1281    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 1376-1381    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.91.0.5.orig/bfd/elf.c (+2 lines)
 Lines 1220-1225    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_DIRECT: name = "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 1573-1578    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.91.0.5.orig/bfd/elflink.c (+144 lines)
 Lines 194-199    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, ".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_with_flags (abfd, ".gnu.version_d",
  s = bfd_make_section_with_flags (abfd, ".gnu.version_d",
 Lines 2844-2849    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 3139-3144    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 3146-3151    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 3165-3170    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, ".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 3814-3819    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_DIRECT_VAGUE))
		    h->vague_ref = 1;
		  if (!h->vague_ref &&
		      (direct_entry & DT_DIRECT_MASK) != DT_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 3827-3832    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 4446-4451    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 5695-5700    Link Here 
	    return FALSE;
	    return FALSE;
	}
	}
      /* Create the direct bindings section - 1 entry per dynsym */
      s = bfd_get_section_by_name (dynobj, ".direct");
      if (s)
        {
  	  if (dynsymcount == 0)
	    _bfd_strip_section_from_output (info, s);
	  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_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 5769-5774    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 6625-6630    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_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_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_DIRECT_VAGUE;
		    }
		  else if (h->vague_ref)
		    dt_index |= DT_DIRECT_VAGUE;
		  else if (!h->concrete_ref)
		    dt_index = DT_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_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 7768-7773    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.direct_sec = NULL;
    }
    }
  else
  else
    {
    {
 Lines 7776-7781    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.direct_sec = bfd_get_section_by_name (dynobj, ".direct");
    }
    }
  finfo.contents = NULL;
  finfo.contents = NULL;
 Lines 8527-8532    Link Here 
	    case DT_VERNEED:
	    case DT_VERNEED:
	      name = ".gnu.version_r";
	      name = ".gnu.version_r";
	      goto get_vma;
	      goto get_vma;
	    case DT_DIRECT:
	      name = ".direct";
	      goto get_vma;
	    case DT_VERSYM:
	    case DT_VERSYM:
	      name = ".gnu.version";
	      name = ".gnu.version";
	    get_vma:
	    get_vma:
(-) binutils-2.16.91.0.5.orig/binutils/readelf.c (-2 / +138 lines)
 Lines 145-150    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 1477-1482    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_DIRECT:	return "DIRECT";
    case DT_RELACOUNT:	return "RELACOUNT";
    case DT_RELACOUNT:	return "RELACOUNT";
    case DT_RELCOUNT:	return "RELCOUNT";
    case DT_RELCOUNT:	return "RELCOUNT";
 Lines 2573-2578    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 2610-2615    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 2699-2705    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 2716-2721    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 2749-2754    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 2955-2961    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 4599-4604    Link Here 
  return 1;
  return 1;
}
}
static void
print_dt_needed_name (int idx)
{
  const char *name = NULL;
  Elf_Internal_Dyn *entry;
  idx &= DT_DIRECT_MASK;
 
  switch (idx)
    {
    case 0:
      name = _("<self>");
      break;
    case DT_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), ".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, _("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, _("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_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 8934-8939    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.91.0.5.orig/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 419-424    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.91.0.5.orig/include/elf/common.h (+6 lines)
 Lines 592-597    Link Here 
/* This tag is a GNU extension to the Solaris version scheme.  */
/* This tag is a GNU extension to the Solaris version scheme.  */
#define DT_VERSYM	0x6ffffff0
#define DT_VERSYM	0x6ffffff0
#define DT_DIRECT	0x6ffffff1 /* FIXME - how are these allocated ? */
#define DT_LOPROC	0x70000000
#define DT_LOPROC	0x70000000
#define DT_HIPROC	0x7fffffff
#define DT_HIPROC	0x7fffffff
 Lines 641-646    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_DIRECT_VAGUE   (1<<15)
#define DT_DIRECT_MASK     0x3ff
#define DT_DIRECT_UNKNOWN  DT_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.91.0.5.orig/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.91.0.5.orig/ld/lexsup.c (+6 lines)
 Lines 72-77    Link Here 
  OPTION_DEFSYM,
  OPTION_DEFSYM,
  OPTION_DEMANGLE,
  OPTION_DEMANGLE,
  OPTION_DEMANGLER,
  OPTION_DEMANGLER,
  OPTION_DIRECT,
  OPTION_DYNAMIC_LINKER,
  OPTION_DYNAMIC_LINKER,
  OPTION_SYSROOT,
  OPTION_SYSROOT,
  OPTION_EB,
  OPTION_EB,
 Lines 343-348    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 
	case OPTION_DEMANGLER:
	case OPTION_DEMANGLER:
	  demangler = optarg;
	  demangler = optarg;
	  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;