* ldfile.h (struct search_dirs): Added sysrooted field.
* ldlang.h (struct lang_input_statement_struct): Likewise. * ldfile.c (ldfile_add_library_path): Mark sysrooted paths. (ldfile_open_file_search): Look for sysrooted filename starting with / in ld_sysroot instead of in the current directory. Clear sysrooted flag if it's found in the current directory. Set it from the search directory's sysrooted flag where it is found otherwise. * ldlang.c (ldlang_sysrooted_script): New static variable. (new_afile): Mark search_file_enums as sysrooted if ldlang_sysrooted_script. (load_symbols): Set ldlang_sysrooted_script according to the script's sysrooted field while processing it. * ld.texinfo: Document INPUT behavior in sysroot.
This commit is contained in:
parent
832a94844f
commit
e3f2db7fa6
17
ld/ChangeLog
17
ld/ChangeLog
@ -1,3 +1,20 @@
|
||||
2003-03-03 Alexandre Oliva <aoliva@redhat.com>
|
||||
|
||||
* ldfile.h (struct search_dirs): Added sysrooted field.
|
||||
* ldlang.h (struct lang_input_statement_struct): Likewise.
|
||||
* ldfile.c (ldfile_add_library_path): Mark sysrooted paths.
|
||||
(ldfile_open_file_search): Look for sysrooted filename starting
|
||||
with / in ld_sysroot instead of in the current directory. Clear
|
||||
sysrooted flag if it's found in the current directory. Set it
|
||||
from the search directory's sysrooted flag where it is found
|
||||
otherwise.
|
||||
* ldlang.c (ldlang_sysrooted_script): New static variable.
|
||||
(new_afile): Mark search_file_enums as sysrooted if
|
||||
ldlang_sysrooted_script.
|
||||
(load_symbols): Set ldlang_sysrooted_script according to the
|
||||
script's sysrooted field while processing it.
|
||||
* ld.texinfo: Document INPUT behavior in sysroot.
|
||||
|
||||
2003-03-02 Danny Smith <dannysmith@users.sourceforge.net>
|
||||
|
||||
* scripttempl/pe.sc: Use PROVIDE with etext, end, _end,
|
||||
|
@ -2305,10 +2305,13 @@ then you can put @samp{INPUT (subr.o)} in your linker script.
|
||||
In fact, if you like, you can list all of your input files in the linker
|
||||
script, and then invoke the linker with nothing but a @samp{-T} option.
|
||||
|
||||
The linker will first try to open the file in the current directory. If
|
||||
it is not found, the linker will search through the archive library
|
||||
search path. See the description of @samp{-L} in @ref{Options,,Command
|
||||
Line Options}.
|
||||
In case a @dfn{sysroot prefix} is configured, and the filename starts
|
||||
with the @samp{/} character, and the script being processed was
|
||||
located inside the @dfn{sysroot prefix}, the filename will be looked
|
||||
for in the @dfn{sysroot prefix}. Otherwise, the linker will try to
|
||||
open the file in the current directory. If it is not found, the
|
||||
linker will search through the archive library search path. See the
|
||||
description of @samp{-L} in @ref{Options,,Command Line Options}.
|
||||
|
||||
If you use @samp{INPUT (-l@var{file})}, @command{ld} will transform the
|
||||
name to @code{lib@var{file}.a}, as with the command line argument
|
||||
|
31
ld/ldfile.c
31
ld/ldfile.c
@ -92,7 +92,12 @@ ldfile_add_library_path (name, cmdline)
|
||||
/* If a directory is marked as honoring sysroot, prepend the sysroot path
|
||||
now. */
|
||||
if (new->name[0] == '=')
|
||||
new->name = concat (ld_sysroot, &new->name[1], NULL);
|
||||
{
|
||||
new->name = concat (ld_sysroot, &new->name[1], NULL);
|
||||
new->sysrooted = TRUE;
|
||||
}
|
||||
else
|
||||
new->sysrooted = FALSE;
|
||||
}
|
||||
|
||||
/* Try to open a BFD for a lang_input_statement. */
|
||||
@ -265,8 +270,22 @@ ldfile_open_file_search (arch, entry, lib, suffix)
|
||||
directory first. */
|
||||
if (! entry->is_archive)
|
||||
{
|
||||
if (ldfile_try_open_bfd (entry->filename, entry))
|
||||
return TRUE;
|
||||
if (entry->sysrooted && entry->filename[0] == '/')
|
||||
{
|
||||
char *name = concat (ld_sysroot, entry->filename,
|
||||
(const char *) NULL);
|
||||
if (ldfile_try_open_bfd (name, entry))
|
||||
{
|
||||
entry->filename = name;
|
||||
return TRUE;
|
||||
}
|
||||
free (name);
|
||||
}
|
||||
else if (ldfile_try_open_bfd (entry->filename, entry))
|
||||
{
|
||||
entry->sysrooted = FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
for (search = search_head;
|
||||
@ -278,7 +297,10 @@ ldfile_open_file_search (arch, entry, lib, suffix)
|
||||
if (entry->dynamic && ! link_info.relocateable)
|
||||
{
|
||||
if (ldemul_open_dynamic_archive (arch, search, entry))
|
||||
return TRUE;
|
||||
{
|
||||
entry->sysrooted = search->sysrooted;
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
string = (char *) xmalloc (strlen (search->name)
|
||||
@ -306,6 +328,7 @@ ldfile_open_file_search (arch, entry, lib, suffix)
|
||||
if (ldfile_try_open_bfd (string, entry))
|
||||
{
|
||||
entry->filename = string;
|
||||
entry->sysrooted = search->sysrooted;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
@ -1,12 +1,12 @@
|
||||
/* ldfile.h -
|
||||
Copyright 1991, 1992, 1993, 1994, 1995, 2000, 2002
|
||||
Copyright 1991, 1992, 1993, 1994, 1995, 2000, 2002, 2003
|
||||
Free Software Foundation, Inc.
|
||||
|
||||
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 1, or (at your option)
|
||||
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,
|
||||
@ -37,6 +37,8 @@ typedef struct search_dirs {
|
||||
const char *name;
|
||||
/* TRUE if this is from the command line. */
|
||||
bfd_boolean cmdline;
|
||||
/* true if this is from within the sys-root. */
|
||||
bfd_boolean sysrooted;
|
||||
} search_dirs_type;
|
||||
|
||||
extern search_dirs_type *search_head;
|
||||
|
@ -240,6 +240,7 @@ bfd_boolean lang_float_flag = FALSE;
|
||||
bfd_boolean delete_output_file_on_failure = FALSE;
|
||||
struct lang_nocrossrefs *nocrossref_list;
|
||||
struct unique_sections *unique_section_list;
|
||||
static bfd_boolean ldlang_sysrooted_script = FALSE;
|
||||
|
||||
etree_type *base; /* Relocation base - or null */
|
||||
|
||||
@ -547,6 +548,7 @@ new_afile (name, file_type, target, add_to_list)
|
||||
|
||||
lang_has_input_file = TRUE;
|
||||
p->target = target;
|
||||
p->sysrooted = FALSE;
|
||||
switch (file_type)
|
||||
{
|
||||
case lang_input_file_is_symbols_only_enum:
|
||||
@ -582,6 +584,7 @@ new_afile (name, file_type, target, add_to_list)
|
||||
p->search_dirs_flag = TRUE;
|
||||
break;
|
||||
case lang_input_file_is_search_file_enum:
|
||||
p->sysrooted = ldlang_sysrooted_script;
|
||||
p->filename = name;
|
||||
p->is_archive = FALSE;
|
||||
p->real = TRUE;
|
||||
@ -1539,6 +1542,7 @@ load_symbols (entry, place)
|
||||
bfd_error_type err;
|
||||
lang_statement_list_type *hold;
|
||||
bfd_boolean bad_load = TRUE;
|
||||
bfd_boolean save_ldlang_sysrooted_script;
|
||||
|
||||
err = bfd_get_error ();
|
||||
|
||||
@ -1570,12 +1574,15 @@ load_symbols (entry, place)
|
||||
|
||||
hold = stat_ptr;
|
||||
stat_ptr = place;
|
||||
save_ldlang_sysrooted_script = ldlang_sysrooted_script;
|
||||
ldlang_sysrooted_script = entry->sysrooted;
|
||||
|
||||
ldfile_assumed_script = TRUE;
|
||||
parser_input = input_script;
|
||||
yyparse ();
|
||||
ldfile_assumed_script = FALSE;
|
||||
|
||||
ldlang_sysrooted_script = save_ldlang_sysrooted_script;
|
||||
stat_ptr = hold;
|
||||
|
||||
return ! bad_load;
|
||||
|
@ -230,6 +230,12 @@ typedef struct lang_input_statement_struct {
|
||||
/* 1 means search a set of directories for this file. */
|
||||
bfd_boolean search_dirs_flag;
|
||||
|
||||
/* 1 means this was found in a search directory marked as sysrooted,
|
||||
if search_dirs_flag is false, otherwise, that it should be
|
||||
searched in ld_sysroot before any other location, as long as it
|
||||
starts with a slash. */
|
||||
bfd_boolean sysrooted;
|
||||
|
||||
/* 1 means this is base file of incremental load.
|
||||
Do not load this file's text or data.
|
||||
Also default text_start to after this file's bss. */
|
||||
|
Loading…
Reference in New Issue
Block a user