summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnas Nashif <anas.nashif@intel.com>2012-10-30 12:41:34 -0700
committerVyacheslav Barinov <v.barinov@samsung.com>2015-02-16 10:34:03 +0300
commit23dd9a009ebe9ddec2aef02c9f54ba0730e41290 (patch)
treed8a967850170521502509c395c27c2080cd8e8cc
parent68b975af7ef47a9d28f21f4c93431f35777a5109 (diff)
downloadbinutils-23dd9a009ebe9ddec2aef02c9f54ba0730e41290.tar.gz
binutils-23dd9a009ebe9ddec2aef02c9f54ba0730e41290.tar.bz2
binutils-23dd9a009ebe9ddec2aef02c9f54ba0730e41290.zip
skip rpaths
-rw-r--r--ld/emultempl/elf32.em92
1 files changed, 90 insertions, 2 deletions
diff --git a/ld/emultempl/elf32.em b/ld/emultempl/elf32.em
index 137446fe973..4f13c1c54cf 100644
--- a/ld/emultempl/elf32.em
+++ b/ld/emultempl/elf32.em
@@ -1357,8 +1357,38 @@ if test x"$LDEMUL_BEFORE_ALLOCATION" != xgld"$EMULATION_NAME"_before_allocation;
else
ELF_INTERPRETER_SET_DEFAULT=
fi
+
+ libpath_nl=
+ for path in $NATIVE_LIB_DIRS; do
+ libpath_nl="$libpath_nl\n$path"
+ done
fragment <<EOF
+static int
+gld${EMULATION_NAME}_is_contained (const char *path, const char *dc)
+{
+ while (*dc)
+ {
+ const char *pc = path;
+
+ while (*dc && *pc && *dc == *pc && *dc != '\n'
+ && *pc != ':' && *dc != '=')
+ {
+ dc++;
+ pc++;
+ }
+ if ((*pc == 0 || *pc == ':') && (*dc == '\n' || *dc == '=' || *dc == 0))
+ return 1;
+
+ while (*dc && *dc != '\n')
+ dc++;
+ if (*dc == '\n')
+ dc++;
+ }
+
+ return 0;
+}
+
/* used by before_allocation and handle_option. */
static void
gld${EMULATION_NAME}_append_to_separated_string (char **to, char *op_arg)
@@ -1405,7 +1435,7 @@ gld${EMULATION_NAME}_append_to_separated_string (char **to, char *op_arg)
static void
gld${EMULATION_NAME}_before_allocation (void)
{
- const char *rpath;
+ char *rpath;
asection *sinterp;
bfd *abfd;
struct elf_link_hash_entry *ehdr_start = NULL;
@@ -1457,7 +1487,65 @@ gld${EMULATION_NAME}_before_allocation (void)
by dynamic linking. */
rpath = command_line.rpath;
if (rpath == NULL)
- rpath = (const char *) getenv ("LD_RUN_PATH");
+ rpath = getenv ("LD_RUN_PATH");
+
+ if (rpath != NULL && getenv ("SUSE_IGNORED_RPATHS"))
+ {
+ char *dirs = 0;
+ FILE *ldso = fopen (getenv ("SUSE_IGNORED_RPATHS"), "r");
+ if (ldso)
+ {
+ off_t endcur = 0;
+ fseek (ldso, 0, SEEK_END);
+ endcur = ftell (ldso);
+ fseek (ldso, 0, SEEK_SET);
+ dirs = xmalloc (endcur);
+ if (fread (dirs, 1, endcur, ldso) != (size_t) endcur)
+ {
+ free (dirs);
+ dirs = NULL;
+ }
+ }
+ if (dirs)
+ {
+ char *cr;
+ rpath = xstrdup (rpath);
+ cr = rpath; /* cursor read */
+
+ while (*cr)
+ {
+ if (gld${EMULATION_NAME}_is_contained (cr, dirs)
+ || gld${EMULATION_NAME}_is_contained (cr, "$libpath_nl"))
+ {
+ char *cc = cr, *cw = cr;
+ while (*cc && *cc != ':')
+ cc++;
+ if (*cc == ':')
+ {
+ cc++;
+ for (; *cc; cc++, cw++)
+ *cw = *cc;
+ }
+ else if (cw > rpath)
+ cw[-1] = 0;
+
+ *cw = 0;
+ }
+ else
+ {
+ while (*cr && *cr != ':')
+ cr++;
+ if (*cr == ':')
+ cr++;
+ }
+ }
+ if (*rpath == '\0')
+ {
+ free (rpath);
+ rpath = NULL;
+ }
+ }
+ }
for (abfd = link_info.input_bfds; abfd; abfd = abfd->link.next)
if (bfd_get_flavour (abfd) == bfd_target_elf_flavour)