ldmain.c (ld_canon_sysroot, ld_canon_sysroot_len): Define. (main): Initialize them.
authorNick Clifton <nickc@redhat.com>
Tue, 25 Mar 2003 10:29:28 +0000 (10:29 +0000)
committerNick Clifton <nickc@redhat.com>
Tue, 25 Mar 2003 10:29:28 +0000 (10:29 +0000)
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.

ld/ChangeLog
ld/Makefile.am
ld/Makefile.in
ld/ldfile.c
ld/ldmain.c
ld/ldmain.h

index aa78d98..715ce95 100644 (file)
@@ -1,3 +1,18 @@
+2003-03-25  Alexandre Oliva  <aoliva@redhat.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.
+       * Makefile.am: Updated dependencies.
+       * Makefile.in: Rebuild.
+
 2003-03-24  Daniel NĂ©ri  <dne@mayonnaise.net>
 
        * ld.texinfo: Rename all occurances of C54X to TIC54X.
index 0fd8b5e..41af307 100644 (file)
@@ -1613,7 +1613,7 @@ ldfile.o: ldfile.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
   $(INCDIR)/symcat.h sysdep.h config.h $(INCDIR)/fopen-same.h \
   $(INCDIR)/bfdlink.h $(INCDIR)/safe-ctype.h ld.h $(INCDIR)/bin-bugs.h \
   ldmisc.h ldexp.h ldlang.h ldfile.h ldmain.h ldgram.h \
-  ldlex.h ldemul.h $(INCDIR)/libiberty.h
+  ldlex.h ldemul.h $(INCDIR)/libiberty.h $(INCDIR)/filenames.h
 ldlang.o: ldlang.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
   $(INCDIR)/symcat.h sysdep.h config.h $(INCDIR)/fopen-same.h \
   $(INCDIR)/libiberty.h $(INCDIR)/safe-ctype.h $(INCDIR)/obstack.h \
index dca69a4..23b7d5b 100644 (file)
@@ -2313,7 +2313,7 @@ ldfile.o: ldfile.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
   $(INCDIR)/symcat.h sysdep.h config.h $(INCDIR)/fopen-same.h \
   $(INCDIR)/bfdlink.h $(INCDIR)/safe-ctype.h ld.h $(INCDIR)/bin-bugs.h \
   ldmisc.h ldexp.h ldlang.h ldfile.h ldmain.h ldgram.h \
-  ldlex.h ldemul.h $(INCDIR)/libiberty.h
+  ldlex.h ldemul.h $(INCDIR)/libiberty.h $(INCDIR)/filenames.h
 ldlang.o: ldlang.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
   $(INCDIR)/symcat.h sysdep.h config.h $(INCDIR)/fopen-same.h \
   $(INCDIR)/libiberty.h $(INCDIR)/safe-ctype.h $(INCDIR)/obstack.h \
index 34e468e..fbcd7b9 100644 (file)
@@ -2,22 +2,22 @@
    Copyright 1991, 1992, 1993, 1994, 1995, 1998, 1999, 2000, 2001, 2002, 2003
    Free Software Foundation, Inc.
 
-This file is part of GLD, the Gnu Linker.
+   This file is part of GLD, the Gnu Linker.
 
-GLD is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
-any later version.
+   GLD is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
 
-GLD is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
+   GLD is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
 
-You should have received a copy of the GNU General Public License
-along with GLD; see the file COPYING.  If not, write to the Free
-Software Foundation, 59 Temple Place - Suite 330, Boston, MA
-02111-1307, USA.  */
+   You should have received a copy of the GNU General Public License
+   along with GLD; see the file COPYING.  If not, write to the Free
+   Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+   02111-1307, USA.  */
 
 /* ldfile.c:  look after all the file stuff.  */
 
@@ -35,42 +35,76 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 #include "ldlex.h"
 #include "ldemul.h"
 #include "libiberty.h"
+#include "filenames.h"
 
-const char *ldfile_input_filename;
-bfd_boolean ldfile_assumed_script = FALSE;
-const char *ldfile_output_machine_name = "";
+const char * ldfile_input_filename;
+bfd_boolean  ldfile_assumed_script = FALSE;
+const char * ldfile_output_machine_name = "";
 unsigned long ldfile_output_machine;
 enum bfd_architecture ldfile_output_architecture;
-search_dirs_type *search_head;
+search_dirs_type * search_head;
 
 #ifndef MPW
 #ifdef VMS
-char *slash = "";
+char * slash = "";
 #else
 #if defined (_WIN32) && ! defined (__CYGWIN32__)
-char *slash = "\\";
+char * slash = "\\";
 #else
-char *slash = "/";
+char * slash = "/";
 #endif
 #endif
 #else /* MPW */
 /* The MPW path char is a colon.  */
-char *slash = ":";
+char * slash = ":";
 #endif /* MPW */
 
-/* LOCAL */
-
-static search_dirs_type **search_tail_ptr = &search_head;
-
-typedef struct search_arch {
+typedef struct search_arch
+{
   char *name;
   struct search_arch *next;
 } search_arch_type;
 
+static search_dirs_type **search_tail_ptr = &search_head;
 static search_arch_type *search_arch_head;
 static search_arch_type **search_arch_tail_ptr = &search_arch_head;
 
-static FILE *try_open PARAMS ((const char *name, const char *exten));
+static FILE *try_open
+  PARAMS ((const char *, const char *));
+static bfd_boolean is_sysrooted_pathname
+  PARAMS ((const char *, bfd_boolean));
+
+/* 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;
+  
+  len = strlen (realname);
+
+  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 +131,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 +305,7 @@ ldfile_open_file_search (arch, entry, lib, suffix)
      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 +318,13 @@ ldfile_open_file_search (arch, entry, lib, suffix)
        }
       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 +353,6 @@ ldfile_open_file_search (arch, entry, lib, suffix)
       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 +415,11 @@ 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 214847d..284b975 100644 (file)
@@ -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;
 
@@ -234,6 +238,14 @@ main (argc, argv)
 #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,
      and linked against a shared BFD library which was configured for
index 30f872d..d21b3fd 100644 (file)
@@ -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;
@@ -37,6 +39,6 @@ extern struct bfd_link_info link_info;
 
 extern void add_ysym PARAMS ((const char *));
 extern void add_wrap PARAMS ((const char *));
-extern void add_keepsyms_file PARAMS ((const char *filename));
+extern void add_keepsyms_file PARAMS ((const char *));
 
 #endif