PR 6811
authorIan Lance Taylor <ian@airs.com>
Sat, 28 Feb 2009 04:39:57 +0000 (04:39 +0000)
committerIan Lance Taylor <ian@airs.com>
Sat, 28 Feb 2009 04:39:57 +0000 (04:39 +0000)
* 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.

gold/ChangeLog
gold/fileread.cc
gold/fileread.h
gold/layout.cc
gold/object.cc
gold/object.h
gold/options.cc
gold/options.h
gold/symtab.cc
gold/symtab.h

index dfc99b728df3fd8fd4d8271c103077f43a8d0f96..3f9d219fb070c5d3eb87696c78624a882622146a 100644 (file)
@@ -1,5 +1,25 @@
 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
index 36eee6c0ab638fdfd212d29ac879b9044628c0ec..13442ff4be89370f951b57ad0049402e1105ce70 100644 (file)
@@ -738,6 +738,16 @@ Input_file::name() const
   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
index 3afba862676c9594ed6ef70fdf9ab41921fa812e..1c0969c641a769c664c413f2d520032b35e6f2c7 100644 (file)
@@ -471,6 +471,10 @@ class Input_file
   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;
index 2bc14831a0190c07f9ddf1335318596e1f71c812..01b7c870fd6b85c3ff4a7e071ebedb6bb58a6c74 100644 (file)
@@ -3317,8 +3317,8 @@ Write_symbols_task::locks(Task_locker* tl)
 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_);
 }
 
index 82c5dd6e30d19dfc31939f42fa58fcd9c7544bf6..0f618c1ce3e5b36084ff356486595e5f34803337 100644 (file)
@@ -1941,19 +1941,6 @@ Input_objects::add_object(Object* obj)
        }
 
       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.
@@ -1967,17 +1954,6 @@ Input_objects::add_object(Object* obj)
   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.
 
index 6efc0fe5455fc8fb011dfacd6317e3f9cc2112b9..9e4c66f27cca92f4eb080aee5e41869f79c5793e 100644 (file)
@@ -444,6 +444,11 @@ class Object
   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.
@@ -1832,8 +1837,7 @@ class Input_objects
 {
  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.
@@ -1911,8 +1915,6 @@ class Input_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_;
 };
index 35ed86313754e8ce5e80ac2523e688c369c2f9a9..3f6fbfa4aa9ed8b3b013957684fcafaeddbd2a5b 100644 (file)
@@ -1,6 +1,6 @@
 // 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.
@@ -451,7 +451,7 @@ string_to_object_format(const char* arg)
 // 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,
@@ -472,7 +472,7 @@ get_relative_sysroot(const char* 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;
@@ -684,6 +684,26 @@ General_options::add_sysroot()
   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
index 1d30a5645139e13a1608d924d305909c158017ef..7fd9a00bca1345d854b45018837b7bbd3838a486 100644 (file)
@@ -534,9 +534,22 @@ class Search_directory
   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_;
 };
 
@@ -962,6 +975,10 @@ class General_options
   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
index dcbb46e20dab25920c611a4a7898132846845fd3..46bed6892116eb57ebf0dfe6fb6c6ae130fa7c87 100644 (file)
@@ -2373,8 +2373,7 @@ Symbol_table::sized_finalize_symbol(Symbol* unsized_sym)
 // 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,
@@ -2384,29 +2383,25 @@ Symbol_table::write_globals(const Input_objects* input_objects,
     {
 #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
@@ -2419,8 +2414,7 @@ Symbol_table::write_globals(const Input_objects* input_objects,
 
 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,
@@ -2456,7 +2450,7 @@ Symbol_table::sized_write_globals(const Input_objects* input_objects,
       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;
@@ -2621,16 +2615,13 @@ Symbol_table::sized_write_symbol(
 // 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
@@ -2639,7 +2630,7 @@ Symbol_table::warn_about_undefined_dynobj_symbol(
       && 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());
index b504d0a833a379017579964f8f7d5752e6054e7a..003318ce043cd028102698027356316aadf17f32 100644 (file)
@@ -1342,7 +1342,7 @@ class Symbol_table
 
   // 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;
 
@@ -1509,9 +1509,9 @@ class Symbol_table
   // 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>
@@ -1523,7 +1523,7 @@ class Symbol_table
 
   // 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>