* options.h (class Search_directory): Add is_system_directory.
(class General_options): Declare is_in_system_directory.
* options.cc (get_relative_sysroot): Make static.
(get_default_sysroot): Make static.
(General_optoins::is_in_system_directory): New function.
* fileread.cc (Input_file::is_in_system_directory): New function.
* fileread.h (class Input_file): Declare is_in_system_directory.
* object.h (class Object): Add is_in_system_directory.
(class Input_objects): Remove system_library_directory_ field.
* object.cc (Input_objects::add_object): Don't set
system_library_directory_.
(input_objects::found_in_system_library_directory): Remove.
* symtab.cc (Symbol_table::write_globals): Remove input_objects
parameter. Change all callers.
(Symbol_table::sized_write_globals): Likewise.
(Symbol_table::warn_about_undefined_dynobj_symbol): Likewise.
Call Object::is_in_system_directory.
* symtab.h (class Symbol_table): Update declarations.
2009-02-27 Ian Lance Taylor <iant@google.com>
+ PR 6811
+ * options.h (class Search_directory): Add is_system_directory.
+ (class General_options): Declare is_in_system_directory.
+ * options.cc (get_relative_sysroot): Make static.
+ (get_default_sysroot): Make static.
+ (General_optoins::is_in_system_directory): New function.
+ * fileread.cc (Input_file::is_in_system_directory): New function.
+ * fileread.h (class Input_file): Declare is_in_system_directory.
+ * object.h (class Object): Add is_in_system_directory.
+ (class Input_objects): Remove system_library_directory_ field.
+ * object.cc (Input_objects::add_object): Don't set
+ system_library_directory_.
+ (input_objects::found_in_system_library_directory): Remove.
+ * symtab.cc (Symbol_table::write_globals): Remove input_objects
+ parameter. Change all callers.
+ (Symbol_table::sized_write_globals): Likewise.
+ (Symbol_table::warn_about_undefined_dynobj_symbol): Likewise.
+ Call Object::is_in_system_directory.
+ * symtab.h (class Symbol_table): Update declarations.
+
PR 5990
* descriptors.h (Open_descriptor): Add is_on_stack field.
* descriptors.cc (Descriptors::open): If the descriptor is on the
return this->input_argument_->name();
}
+// Return whether this file is in a system directory.
+
+bool
+Input_file::is_in_system_directory() const
+{
+ if (this->is_in_sysroot())
+ return true;
+ return parameters->options().is_in_system_directory(this->filename());
+}
+
// Return whether we are only reading symbols.
bool
is_in_sysroot() const
{ return this->is_in_sysroot_; }
+ // Whether this file is in a system directory.
+ bool
+ is_in_system_directory() const;
+
// Return whether this file is to be read only for its symbols.
bool
just_symbols() const;
void
Write_symbols_task::run(Workqueue*)
{
- this->symtab_->write_globals(this->input_objects_, this->sympool_,
- this->dynpool_, this->layout_->symtab_xindex(),
+ this->symtab_->write_globals(this->sympool_, this->dynpool_,
+ this->layout_->symtab_xindex(),
this->layout_->dynsym_xindex(), this->of_);
}
}
this->dynobj_list_.push_back(dynobj);
-
- // If this is -lc, remember the directory in which we found it.
- // We use this when issuing warnings about undefined symbols: as
- // a heuristic, we don't warn about system libraries found in
- // the same directory as -lc.
- if (strncmp(soname, "libc.so", 7) == 0)
- {
- const char* object_name = dynobj->name().c_str();
- const char* base = lbasename(object_name);
- if (base != object_name)
- this->system_library_directory_.assign(object_name,
- base - 1 - object_name);
- }
}
// Add this object to the cross-referencer if requested.
return true;
}
-// Return whether an object was found in the system library directory.
-
-bool
-Input_objects::found_in_system_library_directory(const Object* object) const
-{
- return (!this->system_library_directory_.empty()
- && object->name().compare(0,
- this->system_library_directory_.size(),
- this->system_library_directory_) == 0);
-}
-
// For each dynamic object, record whether we've seen all of its
// explicit dependencies.
set_target(Target* target)
{ this->target_ = target; }
+ // Return whether this object was found in a system directory.
+ bool
+ is_in_system_directory() const
+ { return this->input_file()->is_in_system_directory(); }
+
protected:
// Returns NULL for Objects that are not plugin objects. This method
// is overridden in the Pluginobj class.
{
public:
Input_objects()
- : relobj_list_(), dynobj_list_(), sonames_(), system_library_directory_(),
- cref_(NULL)
+ : relobj_list_(), dynobj_list_(), sonames_(), cref_(NULL)
{ }
// The type of the list of input relocateable objects.
Dynobj_list dynobj_list_;
// SONAMEs that we have seen.
Unordered_set<std::string> sonames_;
- // The directory in which we find the libc.so.
- std::string system_library_directory_;
// Manage cross-references if requested.
Cref* cref_;
};
// options.c -- handle command line options for gold
-// Copyright 2006, 2007, 2008 Free Software Foundation, Inc.
+// Copyright 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
// Written by Ian Lance Taylor <iant@google.com>.
// This file is part of gold.
// If the default sysroot is relocatable, try relocating it based on
// the prefix FROM.
-char*
+static char*
get_relative_sysroot(const char* from)
{
char* path = make_relative_prefix(gold::program_name, from,
// get_relative_sysroot, which is a small memory leak, but is
// necessary since we store this pointer directly in General_options.
-const char*
+static const char*
get_default_sysroot()
{
const char* sysroot = TARGET_SYSTEM_ROOT;
free(canonical_sysroot);
}
+// Return whether FILENAME is in a system directory.
+
+bool
+General_options::is_in_system_directory(const std::string& filename) const
+{
+ for (Dir_list::const_iterator p = this->library_path_.value.begin();
+ p != this->library_path_.value.end();
+ ++p)
+ {
+ // We use a straight string comparison rather than calling
+ // FILENAME_CMP because we are only interested in the cases
+ // where we found the file in a system directory, which means
+ // that we used the directory name as a prefix for a -L search.
+ if (p->is_system_directory()
+ && filename.compare(0, p->name().size(), p->name()) == 0)
+ return true;
+ }
+ return false;
+}
+
// Add a plugin to the list of plugins.
void
is_in_sysroot() const
{ return this->is_in_sysroot_; }
+ // Return whether this is considered a system directory.
+ bool
+ is_system_directory() const
+ { return this->put_in_sysroot_ || this->is_in_sysroot_; }
+
private:
+ // The directory name.
std::string name_;
+ // True if the sysroot should be added as a prefix for this
+ // directory (if there is a sysroot). This is true for system
+ // directories that we search by default.
bool put_in_sysroot_;
+ // True if this directory is in the sysroot (if there is a sysroot).
+ // This is true if there is a sysroot and either 1) put_in_sysroot_
+ // is true, or 2) the directory happens to be in the sysroot based
+ // on a pathname comparison.
bool is_in_sysroot_;
};
Object_format format_enum() const;
Object_format oformat_enum() const;
+ // Return whether FILENAME is in a system directory.
+ bool
+ is_in_system_directory(const std::string& name) const;
+
// These are the best way to get access to the execstack state,
// not execstack() and noexecstack() which are hard to use properly.
bool
// Write out the global symbols.
void
-Symbol_table::write_globals(const Input_objects* input_objects,
- const Stringpool* sympool,
+Symbol_table::write_globals(const Stringpool* sympool,
const Stringpool* dynpool,
Output_symtab_xindex* symtab_xindex,
Output_symtab_xindex* dynsym_xindex,
{
#ifdef HAVE_TARGET_32_LITTLE
case Parameters::TARGET_32_LITTLE:
- this->sized_write_globals<32, false>(input_objects, sympool,
- dynpool, symtab_xindex,
+ this->sized_write_globals<32, false>(sympool, dynpool, symtab_xindex,
dynsym_xindex, of);
break;
#endif
#ifdef HAVE_TARGET_32_BIG
case Parameters::TARGET_32_BIG:
- this->sized_write_globals<32, true>(input_objects, sympool,
- dynpool, symtab_xindex,
+ this->sized_write_globals<32, true>(sympool, dynpool, symtab_xindex,
dynsym_xindex, of);
break;
#endif
#ifdef HAVE_TARGET_64_LITTLE
case Parameters::TARGET_64_LITTLE:
- this->sized_write_globals<64, false>(input_objects, sympool,
- dynpool, symtab_xindex,
+ this->sized_write_globals<64, false>(sympool, dynpool, symtab_xindex,
dynsym_xindex, of);
break;
#endif
#ifdef HAVE_TARGET_64_BIG
case Parameters::TARGET_64_BIG:
- this->sized_write_globals<64, true>(input_objects, sympool,
- dynpool, symtab_xindex,
+ this->sized_write_globals<64, true>(sympool, dynpool, symtab_xindex,
dynsym_xindex, of);
break;
#endif
template<int size, bool big_endian>
void
-Symbol_table::sized_write_globals(const Input_objects* input_objects,
- const Stringpool* sympool,
+Symbol_table::sized_write_globals(const Stringpool* sympool,
const Stringpool* dynpool,
Output_symtab_xindex* symtab_xindex,
Output_symtab_xindex* dynsym_xindex,
Sized_symbol<size>* sym = static_cast<Sized_symbol<size>*>(p->second);
// Possibly warn about unresolved symbols in shared libraries.
- this->warn_about_undefined_dynobj_symbol(input_objects, sym);
+ this->warn_about_undefined_dynobj_symbol(sym);
unsigned int sym_index = sym->symtab_index();
unsigned int dynsym_index;
// entry, we aren't going to be able to reliably report whether the
// symbol is undefined.
-// We also don't warn about libraries found in the system library
-// directory (the directory were we find libc.so); we assume that
-// those libraries are OK. This heuristic avoids problems in
-// GNU/Linux, in which -ldl can have undefined references satisfied by
-// ld-linux.so.
+// We also don't warn about libraries found in a system library
+// directory (e.g., /lib or /usr/lib); we assume that those libraries
+// are OK. This heuristic avoids problems on GNU/Linux, in which -ldl
+// can have undefined references satisfied by ld-linux.so.
inline void
-Symbol_table::warn_about_undefined_dynobj_symbol(
- const Input_objects* input_objects,
- Symbol* sym) const
+Symbol_table::warn_about_undefined_dynobj_symbol(Symbol* sym) const
{
bool dummy;
if (sym->source() == Symbol::FROM_OBJECT
&& sym->binding() != elfcpp::STB_WEAK
&& !parameters->options().allow_shlib_undefined()
&& !parameters->target().is_defined_by_abi(sym)
- && !input_objects->found_in_system_library_directory(sym->object()))
+ && !sym->object()->is_in_system_directory())
{
// A very ugly cast.
Dynobj* dynobj = static_cast<Dynobj*>(sym->object());
// Write out the global symbols.
void
- write_globals(const Input_objects*, const Stringpool*, const Stringpool*,
+ write_globals(const Stringpool*, const Stringpool*,
Output_symtab_xindex*, Output_symtab_xindex*,
Output_file*) const;
// Write globals specialized for size and endianness.
template<int size, bool big_endian>
void
- sized_write_globals(const Input_objects*, const Stringpool*,
- const Stringpool*, Output_symtab_xindex*,
- Output_symtab_xindex*, Output_file*) const;
+ sized_write_globals(const Stringpool*, const Stringpool*,
+ Output_symtab_xindex*, Output_symtab_xindex*,
+ Output_file*) const;
// Write out a symbol to P.
template<int size, bool big_endian>
// Possibly warn about an undefined symbol from a dynamic object.
void
- warn_about_undefined_dynobj_symbol(const Input_objects*, Symbol*) const;
+ warn_about_undefined_dynobj_symbol(Symbol*) const;
// Write out a section symbol, specialized for size and endianness.
template<int size, bool big_endian>