diff options
author | Anas Nashif <anas.nashif@intel.com> | 2012-10-30 12:41:34 -0700 |
---|---|---|
committer | Vyacheslav Barinov <v.barinov@samsung.com> | 2015-02-16 10:34:03 +0300 |
commit | 23dd9a009ebe9ddec2aef02c9f54ba0730e41290 (patch) | |
tree | d8a967850170521502509c395c27c2080cd8e8cc | |
parent | 68b975af7ef47a9d28f21f4c93431f35777a5109 (diff) | |
download | binutils-23dd9a009ebe9ddec2aef02c9f54ba0730e41290.tar.gz binutils-23dd9a009ebe9ddec2aef02c9f54ba0730e41290.tar.bz2 binutils-23dd9a009ebe9ddec2aef02c9f54ba0730e41290.zip |
skip rpaths
-rw-r--r-- | ld/emultempl/elf32.em | 92 |
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) |