diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2002-10-19 17:13:58 +0000 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2002-10-19 17:13:58 +0000 |
commit | 5d603aa984322b9ab70570671ce3f9dfe2a5d044 (patch) | |
tree | e608b8be8e11bc49ce7496ace8f51d704e77c291 /bfd/elflink.h | |
parent | e377ab71daa0e8865219cde37f190c918825200b (diff) | |
download | gdb-5d603aa984322b9ab70570671ce3f9dfe2a5d044.zip gdb-5d603aa984322b9ab70570671ce3f9dfe2a5d044.tar.gz gdb-5d603aa984322b9ab70570671ce3f9dfe2a5d044.tar.bz2 |
2002-10-19 H.J. Lu <hjl@gnu.org>
* elflink.h (elf_link_add_object_symbols): Correctly handle
DT_RPATH and DT_RUNPATH.
:VS: ----------------------------------------------------------------------
Diffstat (limited to 'bfd/elflink.h')
-rw-r--r-- | bfd/elflink.h | 34 |
1 files changed, 18 insertions, 16 deletions
diff --git a/bfd/elflink.h b/bfd/elflink.h index 5e2acbd..079917e 100644 --- a/bfd/elflink.h +++ b/bfd/elflink.h @@ -1298,6 +1298,7 @@ elf_link_add_object_symbols (abfd, info) const char *name; bfd_size_type oldsize; bfd_size_type strindex; + struct bfd_link_needed_list *rpath = NULL, *runpath = NULL; /* ld --just-symbols and dynamic objects don't mix very well. 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; int elfsec; unsigned long shlink; - int rpath; - int runpath; dynbuf = (Elf_External_Dyn *) bfd_malloc (s->_raw_size); if (dynbuf == NULL) @@ -1352,8 +1351,6 @@ elf_link_add_object_symbols (abfd, info) extdyn = dynbuf; extdynend = extdyn + s->_raw_size / sizeof (Elf_External_Dyn); - rpath = 0; - runpath = 0; for (; extdyn < extdynend; extdyn++) { Elf_Internal_Dyn dyn; @@ -1397,13 +1394,6 @@ elf_link_add_object_symbols (abfd, info) char *fnm, *anm; 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); n = (struct bfd_link_needed_list *) bfd_alloc (abfd, amt); 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->by = abfd; n->next = NULL; - for (pn = & hash_table->runpath; + for (pn = & runpath; *pn != NULL; pn = &(*pn)->next) ; *pn = n; - runpath = 1; - rpath = 0; } /* Ignore DT_RPATH if we have seen DT_RUNPATH. */ if (!runpath && dyn.d_tag == DT_RPATH) @@ -1449,18 +1437,32 @@ elf_link_add_object_symbols (abfd, info) n->name = anm; n->by = abfd; n->next = NULL; - for (pn = & hash_table->runpath; + for (pn = & rpath; *pn != NULL; pn = &(*pn)->next) ; *pn = n; - rpath = 1; } } 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 object in the output file. We hack by simply clobbering the list of sections in the BFD. This could be handled more |