2002-10-19 H.J. Lu <hjl@gnu.org>
* elflink.h (elf_link_add_object_symbols): Correctly handle DT_RPATH and DT_RUNPATH. :VS: ----------------------------------------------------------------------
This commit is contained in:
parent
e377ab71da
commit
5d603aa984
|
@ -1,3 +1,8 @@
|
||||||
|
2002-10-19 H.J. Lu <hjl@gnu.org>
|
||||||
|
|
||||||
|
* elflink.h (elf_link_add_object_symbols): Correctly handle
|
||||||
|
DT_RPATH and DT_RUNPATH.
|
||||||
|
|
||||||
2002-10-19 Mark Kettenis <kettenis@gnu.org>
|
2002-10-19 Mark Kettenis <kettenis@gnu.org>
|
||||||
|
|
||||||
* elf.c (elfcore_grok_note): Fix recognition on NT_PRXFPREG notes.
|
* elf.c (elfcore_grok_note): Fix recognition on NT_PRXFPREG notes.
|
||||||
|
|
|
@ -1298,6 +1298,7 @@ elf_link_add_object_symbols (abfd, info)
|
||||||
const char *name;
|
const char *name;
|
||||||
bfd_size_type oldsize;
|
bfd_size_type oldsize;
|
||||||
bfd_size_type strindex;
|
bfd_size_type strindex;
|
||||||
|
struct bfd_link_needed_list *rpath = NULL, *runpath = NULL;
|
||||||
|
|
||||||
/* ld --just-symbols and dynamic objects don't mix very well.
|
/* ld --just-symbols and dynamic objects don't mix very well.
|
||||||
Test for --just-symbols by looking at info set up by
|
Test for --just-symbols by looking at info set up by
|
||||||
|
@ -1334,8 +1335,6 @@ elf_link_add_object_symbols (abfd, info)
|
||||||
Elf_External_Dyn *extdynend;
|
Elf_External_Dyn *extdynend;
|
||||||
int elfsec;
|
int elfsec;
|
||||||
unsigned long shlink;
|
unsigned long shlink;
|
||||||
int rpath;
|
|
||||||
int runpath;
|
|
||||||
|
|
||||||
dynbuf = (Elf_External_Dyn *) bfd_malloc (s->_raw_size);
|
dynbuf = (Elf_External_Dyn *) bfd_malloc (s->_raw_size);
|
||||||
if (dynbuf == NULL)
|
if (dynbuf == NULL)
|
||||||
|
@ -1352,8 +1351,6 @@ elf_link_add_object_symbols (abfd, info)
|
||||||
|
|
||||||
extdyn = dynbuf;
|
extdyn = dynbuf;
|
||||||
extdynend = extdyn + s->_raw_size / sizeof (Elf_External_Dyn);
|
extdynend = extdyn + s->_raw_size / sizeof (Elf_External_Dyn);
|
||||||
rpath = 0;
|
|
||||||
runpath = 0;
|
|
||||||
for (; extdyn < extdynend; extdyn++)
|
for (; extdyn < extdynend; extdyn++)
|
||||||
{
|
{
|
||||||
Elf_Internal_Dyn dyn;
|
Elf_Internal_Dyn dyn;
|
||||||
|
@ -1397,13 +1394,6 @@ elf_link_add_object_symbols (abfd, info)
|
||||||
char *fnm, *anm;
|
char *fnm, *anm;
|
||||||
unsigned int tagv = dyn.d_un.d_val;
|
unsigned int tagv = dyn.d_un.d_val;
|
||||||
|
|
||||||
/* When we see DT_RPATH before DT_RUNPATH, we have
|
|
||||||
to clear runpath. Do _NOT_ bfd_release, as that
|
|
||||||
frees all more recently bfd_alloc'd blocks as
|
|
||||||
well. */
|
|
||||||
if (rpath && hash_table->runpath)
|
|
||||||
hash_table->runpath = NULL;
|
|
||||||
|
|
||||||
amt = sizeof (struct bfd_link_needed_list);
|
amt = sizeof (struct bfd_link_needed_list);
|
||||||
n = (struct bfd_link_needed_list *) bfd_alloc (abfd, amt);
|
n = (struct bfd_link_needed_list *) bfd_alloc (abfd, amt);
|
||||||
fnm = bfd_elf_string_from_elf_section (abfd, shlink, tagv);
|
fnm = bfd_elf_string_from_elf_section (abfd, shlink, tagv);
|
||||||
|
@ -1417,13 +1407,11 @@ elf_link_add_object_symbols (abfd, info)
|
||||||
n->name = anm;
|
n->name = anm;
|
||||||
n->by = abfd;
|
n->by = abfd;
|
||||||
n->next = NULL;
|
n->next = NULL;
|
||||||
for (pn = & hash_table->runpath;
|
for (pn = & runpath;
|
||||||
*pn != NULL;
|
*pn != NULL;
|
||||||
pn = &(*pn)->next)
|
pn = &(*pn)->next)
|
||||||
;
|
;
|
||||||
*pn = n;
|
*pn = n;
|
||||||
runpath = 1;
|
|
||||||
rpath = 0;
|
|
||||||
}
|
}
|
||||||
/* Ignore DT_RPATH if we have seen DT_RUNPATH. */
|
/* Ignore DT_RPATH if we have seen DT_RUNPATH. */
|
||||||
if (!runpath && dyn.d_tag == DT_RPATH)
|
if (!runpath && dyn.d_tag == DT_RPATH)
|
||||||
|
@ -1449,18 +1437,32 @@ elf_link_add_object_symbols (abfd, info)
|
||||||
n->name = anm;
|
n->name = anm;
|
||||||
n->by = abfd;
|
n->by = abfd;
|
||||||
n->next = NULL;
|
n->next = NULL;
|
||||||
for (pn = & hash_table->runpath;
|
for (pn = & rpath;
|
||||||
*pn != NULL;
|
*pn != NULL;
|
||||||
pn = &(*pn)->next)
|
pn = &(*pn)->next)
|
||||||
;
|
;
|
||||||
*pn = n;
|
*pn = n;
|
||||||
rpath = 1;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
free (dynbuf);
|
free (dynbuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* DT_RUNPATH overrides DT_RPATH. Do _NOT_ bfd_release, as that
|
||||||
|
frees all more recently bfd_alloc'd blocks as well. */
|
||||||
|
if (runpath)
|
||||||
|
rpath = runpath;
|
||||||
|
|
||||||
|
if (rpath)
|
||||||
|
{
|
||||||
|
struct bfd_link_needed_list **pn;
|
||||||
|
for (pn = & hash_table->runpath;
|
||||||
|
*pn != NULL;
|
||||||
|
pn = &(*pn)->next)
|
||||||
|
;
|
||||||
|
*pn = rpath;
|
||||||
|
}
|
||||||
|
|
||||||
/* We do not want to include any of the sections in a dynamic
|
/* We do not want to include any of the sections in a dynamic
|
||||||
object in the output file. We hack by simply clobbering the
|
object in the output file. We hack by simply clobbering the
|
||||||
list of sections in the BFD. This could be handled more
|
list of sections in the BFD. This could be handled more
|
||||||
|
|
Loading…
Reference in New Issue