* i386linux.c (NEEDS_SHRLIB): Define.
(linux_tally_symbols): Crash if a NEEDS_SHRLIB symbol is undefined. From hjl@nynexst.com (H.J. Lu).
This commit is contained in:
parent
62e5acdce9
commit
c93e959c81
|
@ -1,5 +1,9 @@
|
||||||
Thu Feb 9 12:02:35 1995 Ian Lance Taylor <ian@cygnus.com>
|
Thu Feb 9 12:02:35 1995 Ian Lance Taylor <ian@cygnus.com>
|
||||||
|
|
||||||
|
* i386linux.c (NEEDS_SHRLIB): Define.
|
||||||
|
(linux_tally_symbols): Crash if a NEEDS_SHRLIB symbol is
|
||||||
|
undefined. From hjl@nynexst.com (H.J. Lu).
|
||||||
|
|
||||||
* elfcode.h (elf_bfd_final_link): Add assertion to make sure that
|
* elfcode.h (elf_bfd_final_link): Add assertion to make sure that
|
||||||
dynamic and dynobj are in synch.
|
dynamic and dynobj are in synch.
|
||||||
|
|
||||||
|
|
|
@ -94,6 +94,12 @@ i386linux_write_object_contents (abfd)
|
||||||
#define IS_PLT_SYM(name) \
|
#define IS_PLT_SYM(name) \
|
||||||
(strncmp (name, PLT_REF_PREFIX, sizeof PLT_REF_PREFIX - 1) == 0)
|
(strncmp (name, PLT_REF_PREFIX, sizeof PLT_REF_PREFIX - 1) == 0)
|
||||||
|
|
||||||
|
/* This string is used to generate specialized error messages. */
|
||||||
|
|
||||||
|
#ifndef NEEDS_SHRLIB
|
||||||
|
#define NEEDS_SHRLIB "__NEEDS_SHRLIB_"
|
||||||
|
#endif
|
||||||
|
|
||||||
/* This special symbol is a set vector that contains a list of
|
/* This special symbol is a set vector that contains a list of
|
||||||
pointers to fixup tables. It will be present in any dynamicly
|
pointers to fixup tables. It will be present in any dynamicly
|
||||||
linked file. The linker generated fixup table should also be added
|
linked file. The linker generated fixup table should also be added
|
||||||
|
@ -422,6 +428,36 @@ linux_tally_symbols (h, data)
|
||||||
struct linux_link_hash_entry *h1, *h2;
|
struct linux_link_hash_entry *h1, *h2;
|
||||||
boolean exists;
|
boolean exists;
|
||||||
|
|
||||||
|
if (h->root.root.type == bfd_link_hash_undefined
|
||||||
|
&& strncmp (h->root.root.root.string, NEEDS_SHRLIB,
|
||||||
|
sizeof NEEDS_SHRLIB - 1) == 0)
|
||||||
|
{
|
||||||
|
const char *name;
|
||||||
|
char *p;
|
||||||
|
char *alloc = NULL;
|
||||||
|
|
||||||
|
name = h->root.root.root.string + sizeof NEEDS_SHRLIB - 1;
|
||||||
|
p = strrchr (name, '_');
|
||||||
|
if (p != NULL)
|
||||||
|
alloc = (char *) malloc (strlen (name) + 1);
|
||||||
|
|
||||||
|
/* FIXME! BFD should not call printf! */
|
||||||
|
if (p == NULL || alloc == NULL)
|
||||||
|
fprintf (stderr, "Output file requires shared library `%s'\n", name);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
strcpy (alloc, name);
|
||||||
|
p = strrchr (alloc, '_');
|
||||||
|
*p++ = '\0';
|
||||||
|
fprintf (stderr,
|
||||||
|
"Output file requires shared library `%s.so.%s'\n",
|
||||||
|
alloc, p);
|
||||||
|
free (alloc);
|
||||||
|
}
|
||||||
|
|
||||||
|
abort ();
|
||||||
|
}
|
||||||
|
|
||||||
/* If this symbol is not a PLT/GOT, we do not even need to look at it */
|
/* If this symbol is not a PLT/GOT, we do not even need to look at it */
|
||||||
is_plt = IS_PLT_SYM (h->root.root.root.string);
|
is_plt = IS_PLT_SYM (h->root.root.root.string);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue