summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Clifton <nickc@redhat.com>2003-03-25 10:29:28 +0000
committerNick Clifton <nickc@redhat.com>2003-03-25 10:29:28 +0000
commit4eb6360e89ca91dfd449364b146c2040db1ad01f (patch)
tree5e2af8dbd1c7b73d1c3f8c7c381eab0e1d7e670f
parent14f4c216e6491f5b7f7a1b672cc32cf46057140f (diff)
downloadbinutils-redhat-4eb6360e89ca91dfd449364b146c2040db1ad01f.tar.gz
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.
-rw-r--r--ld/ChangeLog15
-rw-r--r--ld/Makefile.am2
-rw-r--r--ld/Makefile.in2
-rw-r--r--ld/ldfile.c111
-rw-r--r--ld/ldmain.c12
-rw-r--r--ld/ldmain.h4
6 files changed, 105 insertions, 41 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog
index aa78d98712..715ce95e38 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -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.
diff --git a/ld/Makefile.am b/ld/Makefile.am
index 0fd8b5eeee..41af307a07 100644
--- a/ld/Makefile.am
+++ b/ld/Makefile.am
@@ -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 \
diff --git a/ld/Makefile.in b/ld/Makefile.in
index dca69a4eaf..23b7d5b5c0 100644
--- a/ld/Makefile.in
+++ b/ld/Makefile.in
@@ -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 \
diff --git a/ld/ldfile.c b/ld/ldfile.c
index 34e468e380..fbcd7b93d7 100644
--- a/ld/ldfile.c
+++ b/ld/ldfile.c
@@ -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);
}
diff --git a/ld/ldmain.c b/ld/ldmain.c
index 214847d9a0..284b975ad6 100644
--- a/ld/ldmain.c
+++ b/ld/ldmain.c
@@ -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
diff --git a/ld/ldmain.h b/ld/ldmain.h
index 30f872d860..d21b3fdbca 100644
--- a/ld/ldmain.h
+++ b/ld/ldmain.h
@@ -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