From 057cac083006e9c5e43e5f5ce7ed18730f499af2 Mon Sep 17 00:00:00 2001
From: Nick Clifton <nickc@redhat.com>
Date: Wed, 7 Mar 2007 07:52:09 +0000
Subject: [PATCH] PR ld/4023 * emultempl/aix.em (..._before_allocation): Strip
 sysroot prefix   from any paths being inserted into the output binary's
 DT_RPATH.

---
 ld/ChangeLog        |  6 +++++
 ld/emultempl/aix.em | 54 ++++++++++++++++++++++++++++++++++++---------
 2 files changed, 50 insertions(+), 10 deletions(-)

diff --git a/ld/ChangeLog b/ld/ChangeLog
index ba7af36f700..01902c01820 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,9 @@
+2007-03-07  Nick Clifton  <nickc@redhat.com>
+
+	PR ld/4023
+	* emultempl/aix.em (..._before_allocation): Strip sysroot prefix
+	from any paths being inserted into the output binary's DT_RPATH.
+
 2007-03-02  Nathan Sidwell  <nathan@codesourcery.com>
 
 	* emulparams/shelf_uclinux.sh: New. Missed in 2007-02-28 commit.
diff --git a/ld/emultempl/aix.em b/ld/emultempl/aix.em
index a85f7d0c057..17639464b82 100644
--- a/ld/emultempl/aix.em
+++ b/ld/emultempl/aix.em
@@ -651,18 +651,52 @@ gld${EMULATION_NAME}_before_allocation (void)
       size_t len;
       search_dirs_type *search;
 
-      len = strlen (search_head->name);
-      libpath = xmalloc (len + 1);
-      strcpy (libpath, search_head->name);
-      for (search = search_head->next; search != NULL; search = search->next)
+      /* PR ld/4023: Strip sysroot prefix from any paths
+	 being inserted into the output binary's DT_RPATH.  */
+      if (ld_sysroot != NULL
+	  && * ld_sysroot != 0)
 	{
-	  size_t nlen;
+	  const char * name = search_head->name;
+	  size_t ld_sysroot_len = strlen (ld_sysroot);
 
-	  nlen = strlen (search->name);
-	  libpath = xrealloc (libpath, len + nlen + 2);
-	  libpath[len] = ':';
-	  strcpy (libpath + len + 1, search->name);
-	  len += nlen + 1;
+	  if (strncmp (name, ld_sysroot, ld_sysroot_len) == 0)
+	    name += ld_sysroot_len;
+
+	  len = strlen (name);
+	  libpath = xmalloc (len + 1);
+	  strcpy (libpath, name);
+
+	  for (search = search_head->next; search != NULL; search = search->next)
+	    {
+	      size_t nlen;
+
+	      name = search->name;
+	      if (strncmp (name, ld_sysroot, ld_sysroot_len) == 0)
+		name += ld_sysroot_len;
+
+	      nlen = strlen (name);
+	      libpath = xrealloc (libpath, len + nlen + 2);
+	      libpath[len] = ':';
+	      strcpy (libpath + len + 1, name);
+	      len += nlen + 1;
+	    }
+	}
+      else
+	{
+	  len = strlen (search_head->name);
+	  libpath = xmalloc (len + 1);
+	  strcpy (libpath, search_head->name);
+
+	  for (search = search_head->next; search != NULL; search = search->next)
+	    {
+	      size_t nlen;
+
+	      nlen = strlen (search->name);
+	      libpath = xrealloc (libpath, len + nlen + 2);
+	      libpath[len] = ':';
+	      strcpy (libpath + len + 1, search->name);
+	      len += nlen + 1;
+	    }
 	}
     }