This is the mail archive of the binutils@sources.redhat.com mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

more sysroot support in the linker


Sometimes GCC passes to the linker -L flags that point into the
sysroot tree.  In this case, our sysroot triggers didn't take effect,
so full pathnames in say glibc libc.so linker scripts wouldn't be
searched inside the sysroot.  I found it confusing that -L flags would
override sysroot.  Also, a full pathname of such a linker script,
specified in the linker command line, would not be regarded as inside
the sysroot either.  This patch fixes both cases, also making the
error message that you get about the linker not having been able to
find a full pathname inside the sys-root (even if it would be found if
searched outside the sys-root, which we don't want to do; I ran into
this because I still had an old libc.so in the sysroot tree, with
pathnames containing the sysroot pathnames).  It also removes a
situation I consider wrong, which is that we'd iterate the search for a
full pathname over all search directories.  This is silly.  We already
do the search for full pathnames before entering the loop, so I just
got us to return immediately when given full pathnames.

Tested on athlon-pc-linux-gnu-x-mips64-linux-gnu.  Ok to install?

Index: ld/ChangeLog
from  Alexandre Oliva  <aoliva at redhat dot com>

	* ldmain.h (ld_canon_sysroot, ld_canon_sysroot_len): Declare.
	* ldmain.c (ld_canon_sysroot, ld_canon_sysroot_len): Define.
	(main): Initialize them.
	* ldfile.c: Include pathnames.h.
	(is_sysrooted_pathname): New.
	(ldfile_add_library_path): Use it.
	(ldfile_open_file_search): Likewise.  Use IS_ABSOLUTE_PATH.  Don't
	search_dirs if given an absolute pathname.
	(ldfile_open_file): Issue error message for sysrooted
	absolute pathnames.

Index: ld/ldfile.c
===================================================================
RCS file: /cvs/uberbaum/ld/ldfile.c,v
retrieving revision 1.27
diff -u -p -r1.27 ldfile.c
--- ld/ldfile.c 19 Mar 2003 09:56:06 -0000 1.27
+++ ld/ldfile.c 22 Mar 2003 11:55:01 -0000
@@ -35,6 +35,7 @@ Software Foundation, 59 Temple Place - S
 #include "ldlex.h"
 #include "ldemul.h"
 #include "libiberty.h"
+#include "filenames.h"
 
 const char *ldfile_input_filename;
 bfd_boolean ldfile_assumed_script = FALSE;
@@ -71,6 +72,37 @@ static search_arch_type *search_arch_hea
 static search_arch_type **search_arch_tail_ptr = &search_arch_head;
 
 static FILE *try_open PARAMS ((const char *name, const char *exten));
+static bfd_boolean is_sysrooted_pathname
+  PARAMS ((const char *name, bfd_boolean notsame));
+
+/* Test whether a pathname, after canonicalization, is the same or a
+   sub-directory of the sysroot directory.  */
+static bfd_boolean
+is_sysrooted_pathname (name, notsame)
+     const char *name;
+     bfd_boolean notsame;
+{
+  char *realname = ld_canon_sysroot ? lrealpath (name) : NULL;
+  int len;
+  bfd_boolean result;
+
+  if (! realname)
+    return FALSE;
+  
+  if (((! notsame && len == ld_canon_sysroot_len)
+       || (len >= ld_canon_sysroot_len
+	   && IS_DIR_SEPARATOR (realname[ld_canon_sysroot_len])
+	   && (realname[ld_canon_sysroot_len] = '\0') == '\0'))
+      && FILENAME_CMP (ld_canon_sysroot, realname) == 0)
+    result = TRUE;
+  else
+    result = FALSE;
+
+  if (realname)
+    free (realname);
+
+  return result;
+}
 
 void
 ldfile_add_library_path (name, cmdline)
@@ -97,7 +129,7 @@ ldfile_add_library_path (name, cmdline)
       new->sysrooted = TRUE;
     }
   else
-    new->sysrooted = FALSE;
+    new->sysrooted = is_sysrooted_pathname (new->name, FALSE);
 }
 
 /* Try to open a BFD for a lang_input_statement.  */
@@ -271,7 +303,7 @@ ldfile_open_file_search (arch, entry, li
      directory first.  */
   if (! entry->is_archive)
     {
-      if (entry->sysrooted && entry->filename[0] == '/')
+      if (entry->sysrooted && IS_ABSOLUTE_PATH (entry->filename))
 	{
 	  char *name = concat (ld_sysroot, entry->filename,
 			       (const char *) NULL);
@@ -284,9 +316,13 @@ ldfile_open_file_search (arch, entry, li
 	}
       else if (ldfile_try_open_bfd (entry->filename, entry))
 	{
-	  entry->sysrooted = FALSE;
+	  entry->sysrooted = IS_ABSOLUTE_PATH (entry->filename)
+	    && is_sysrooted_pathname (entry->filename, TRUE);
 	  return TRUE;
 	}
+
+      if (IS_ABSOLUTE_PATH (entry->filename))
+	return FALSE;
     }
 
   for (search = search_head;
@@ -315,14 +351,6 @@ ldfile_open_file_search (arch, entry, li
       if (entry->is_archive)
 	sprintf (string, "%s%s%s%s%s%s", search->name, slash,
 		 lib, entry->filename, arch, suffix);
-      else if (entry->filename[0] == '/' || entry->filename[0] == '.'
-#if defined (__MSDOS__) || defined (_WIN32)
-	       || entry->filename[0] == '\\'
-	       || (ISALPHA (entry->filename[0])
-	           && entry->filename[1] == ':')
-#endif
-	  )
-	strcpy (string, entry->filename);
       else
 	sprintf (string, "%s%s%s", search->name, slash, entry->filename);
 
@@ -385,6 +413,10 @@ ldfile_open_file (entry)
 	 again.  */
       if (found)
 	entry->search_dirs_flag = FALSE;
+      else if (entry->sysrooted && ld_sysroot
+	       && IS_ABSOLUTE_PATH (entry->local_sym_name))
+	einfo (_("%F%P: cannot find %s inside %s\n"),
+	       entry->local_sym_name, ld_sysroot);
       else
 	einfo (_("%F%P: cannot find %s\n"), entry->local_sym_name);
     }
Index: ld/ldmain.c
===================================================================
RCS file: /cvs/uberbaum/ld/ldmain.c,v
retrieving revision 1.64
diff -u -p -r1.64 ldmain.c
--- ld/ldmain.c 3 Mar 2003 20:01:02 -0000 1.64
+++ ld/ldmain.c 22 Mar 2003 11:55:02 -0000
@@ -72,6 +72,10 @@ char *program_name;
 /* The prefix for system library directories.  */
 char *ld_sysroot;
 
+/* The canonical representation of ld_sysroot.  */
+char *ld_canon_sysroot;
+int ld_canon_sysroot_len;
+
 /* The file that we're creating.  */
 bfd *output_bfd = 0;
 
@@ -233,6 +237,14 @@ main (argc, argv)
   if (! ld_sysroot)
 #endif
     ld_sysroot = TARGET_SYSTEM_ROOT;
+
+  if (ld_sysroot && *ld_sysroot)
+    ld_canon_sysroot = lrealpath (ld_sysroot);
+
+  if (ld_canon_sysroot)
+    ld_canon_sysroot_len = strlen (ld_canon_sysroot);
+  else
+    ld_canon_sysroot_len = -1;
 
   /* Set the default BFD target based on the configured target.  Doing
      this permits the linker to be configured for a particular target,
Index: ld/ldmain.h
===================================================================
RCS file: /cvs/uberbaum/ld/ldmain.h,v
retrieving revision 1.4
diff -u -p -r1.4 ldmain.h
--- ld/ldmain.h 6 Jan 2003 16:13:57 -0000 1.4
+++ ld/ldmain.h 22 Mar 2003 11:55:02 -0000
@@ -24,6 +24,8 @@
 
 extern char *program_name;
 extern char *ld_sysroot;
+extern char *ld_canon_sysroot;
+extern int ld_canon_sysroot_len;
 extern bfd *output_bfd;
 extern char *default_target;
 extern bfd_boolean trace_files;
-- 
Alexandre Oliva   Enjoy Guarana', see http://www.ic.unicamp.br/~oliva/
Red Hat GCC Developer                 aoliva at {redhat dot com, gcc.gnu.org}
CS PhD student at IC-Unicamp        oliva at {lsd dot ic dot unicamp dot br, gnu.org}
Free Software Evangelist                Professional serial bug killer

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]