Merge rev 1.2 (teach `ld' how to access FreeBSD's ld ELF hints)

into Binutils 2.11.2.
This commit is contained in:
David E. O'Brien 2001-06-26 17:57:37 +00:00
parent 9cbaab2ae7
commit 098abe2f2a

View File

@ -10,7 +10,7 @@ cat >e${EMULATION_NAME}.c <<EOF
/* This file is is generated by a shell script. DO NOT EDIT! */
/* ${ELFSIZE} bit ELF emulation code for ${EMULATION_NAME}
Copyright (C) 1991, 93, 94, 95, 96, 97, 98, 99, 2000, 2001
Copyright 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
Free Software Foundation, Inc.
Written by Steve Chamberlain <sac@cygnus.com>
ELF support by Ian Lance Taylor <ian@cygnus.com>
@ -35,6 +35,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#include "bfd.h"
#include "sysdep.h"
#include "libiberty.h"
#include <ctype.h>
@ -133,7 +134,7 @@ static void
gld${EMULATION_NAME}_vercheck (s)
lang_input_statement_type *s;
{
const char *soname, *f;
const char *soname;
struct bfd_link_needed_list *l;
if (global_vercheck_failed)
@ -144,19 +145,13 @@ gld${EMULATION_NAME}_vercheck (s)
soname = bfd_elf_get_dt_soname (s->the_bfd);
if (soname == NULL)
soname = bfd_get_filename (s->the_bfd);
f = strrchr (soname, '/');
if (f != NULL)
++f;
else
f = soname;
soname = basename (bfd_get_filename (s->the_bfd));
for (l = global_vercheck_needed; l != NULL; l = l->next)
{
const char *suffix;
if (strcmp (f, l->name) == 0)
if (strcmp (soname, l->name) == 0)
{
/* Probably can't happen, but it's an easy check. */
continue;
@ -171,7 +166,7 @@ gld${EMULATION_NAME}_vercheck (s)
suffix += sizeof ".so." - 1;
if (strncmp (f, l->name, suffix - l->name) == 0)
if (strncmp (soname, l->name, suffix - l->name) == 0)
{
/* Here we know that S is a dynamic object FOO.SO.VER1, and
the object we are considering needs a dynamic object
@ -195,7 +190,6 @@ gld${EMULATION_NAME}_stat_needed (s)
struct stat st;
const char *suffix;
const char *soname;
const char *f;
if (global_found)
return;
@ -233,17 +227,12 @@ gld${EMULATION_NAME}_stat_needed (s)
soname = bfd_elf_get_dt_soname (s->the_bfd);
if (soname == NULL)
soname = s->filename;
soname = basename (s->filename);
f = strrchr (soname, '/');
if (f != NULL)
++f;
else
f = soname;
if (strncmp (f, global_needed->name, suffix - global_needed->name) == 0)
if (strncmp (soname, global_needed->name,
suffix - global_needed->name) == 0)
einfo ("%P: warning: %s, needed by %B, may conflict with %s\n",
global_needed->name, global_needed->by, f);
global_needed->name, global_needed->by, soname);
}
@ -343,11 +332,7 @@ cat >>e${EMULATION_NAME}.c <<EOF
einfo ("%F%P:%B: bfd_stat failed: %E\n", abfd);
/* First strip off everything before the last '/'. */
soname = strrchr (abfd->filename, '/');
if (soname)
soname++;
else
soname = abfd->filename;
soname = basename (abfd->filename);
if (trace_file_tries)
info_msg (_("found %s at %s\n"), soname, name);
@ -1020,20 +1005,13 @@ gld${EMULATION_NAME}_open_dynamic_archive (arch, search, entry)
if (bfd_check_format (entry->the_bfd, bfd_object)
&& (entry->the_bfd->flags & DYNAMIC) != 0)
{
char *needed_name;
ASSERT (entry->is_archive && entry->search_dirs_flag);
/* Rather than duplicating the logic above. Just use the
filename we recorded earlier.
filename we recorded earlier. */
First strip off everything before the last '/'. */
filename = strrchr (entry->filename, '/');
filename++;
needed_name = (char *) xmalloc (strlen (filename) + 1);
strcpy (needed_name, filename);
bfd_elf_set_dt_needed_name (entry->the_bfd, needed_name);
filename = xstrdup (basename (entry->filename));
bfd_elf_set_dt_needed_name (entry->the_bfd, filename);
}
return true;
@ -1408,6 +1386,7 @@ cat >>e${EMULATION_NAME}.c <<EOF
#define OPTION_DISABLE_NEW_DTAGS (400)
#define OPTION_ENABLE_NEW_DTAGS (OPTION_DISABLE_NEW_DTAGS + 1)
#define OPTION_GROUP (OPTION_ENABLE_NEW_DTAGS + 1)
static struct option longopts[] =
{
@ -1421,6 +1400,8 @@ cat >>e${EMULATION_NAME}.c <<EOF
{"disable-new-dtags", no_argument, NULL, OPTION_DISABLE_NEW_DTAGS},
{"enable-new-dtags", no_argument, NULL, OPTION_ENABLE_NEW_DTAGS},
{"enable-new-dtags", no_argument, NULL, OPTION_ENABLE_NEW_DTAGS},
{"Bgroup", no_argument, NULL, OPTION_GROUP},
{"Bgroup", no_argument, NULL, OPTION_GROUP},
EOF
fi
@ -1479,6 +1460,12 @@ cat >>e${EMULATION_NAME}.c <<EOF
link_info.new_dtags = true;
break;
case OPTION_GROUP:
link_info.flags_1 |= (bfd_vma) DF_1_GROUP;
/* Groups must be self-contained. */
link_info.no_undefined = true;
break;
case 'z':
if (strcmp (optarg, "initfirst") == 0)
link_info.flags_1 |= (bfd_vma) DF_1_INITFIRST;
@ -1504,6 +1491,8 @@ cat >>e${EMULATION_NAME}.c <<EOF
link_info.flags |= (bfd_vma) DF_ORIGIN;
link_info.flags_1 |= (bfd_vma) DF_1_ORIGIN;
}
else if (strcmp (optarg, "defs") == 0)
link_info.no_undefined = true;
/* What about the other Solaris -z options? FIXME. */
break;
EOF
@ -1537,8 +1526,10 @@ EOF
if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
cat >>e${EMULATION_NAME}.c <<EOF
fprintf (file, _(" -Bgroup\t\tSelects group name lookup rules for DSO\n"));
fprintf (file, _(" --disable-new-dtags\tDisable new dynamic tags\n"));
fprintf (file, _(" --enable-new-dtags\tEnable new dynamic tags\n"));
fprintf (file, _(" -z defs\t\tDisallows undefined symbols\n"));
fprintf (file, _(" -z initfirst\t\tMark DSO to be initialized first at runtime\n"));
fprintf (file, _(" -z interpose\t\tMark object to interpose all DSOs but executable\n"));
fprintf (file, _(" -z loadfltr\t\tMark object requiring immediate process\n"));