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:
H.J. Lu 2002-10-19 17:13:58 +00:00
parent e377ab71da
commit 5d603aa984
2 changed files with 23 additions and 16 deletions

View File

@ -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.

View File

@ -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