This is the mail archive of the
binutils@sources.redhat.com
mailing list for the binutils project.
more sysroot support in the linker
- From: Alexandre Oliva <aoliva at redhat dot com>
- To: binutils at sources dot redhat dot com
- Date: 22 Mar 2003 09:03:28 -0300
- Subject: more sysroot support in the linker
- Organization: GCC Team, Red Hat
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