PR gold/12957
authorIan Lance Taylor <ian@airs.com>
Sun, 3 Jul 2011 04:46:56 +0000 (04:46 +0000)
committerIan Lance Taylor <ian@airs.com>
Sun, 3 Jul 2011 04:46:56 +0000 (04:46 +0000)
* options.h (class General_options): Add -f and -F.
* options.cc (General_options::finalize): Fatal error if -f/-F
are used without -shared.
* layout.cc (Layout::finish_dynamic_section): Implement -f/-F.

gold/ChangeLog
gold/layout.cc
gold/options.cc
gold/options.h

index 4ac6808a412e5f230f45b2ac1ca523a31f35131b..fdedd86e8152cd023a7f4910ca612418b6a70f14 100644 (file)
@@ -1,3 +1,11 @@
+2011-07-02  Ian Lance Taylor  <iant@google.com>
+
+       PR gold/12957
+       * options.h (class General_options): Add -f and -F.
+       * options.cc (General_options::finalize): Fatal error if -f/-F
+       are used without -shared.
+       * layout.cc (Layout::finish_dynamic_section): Implement -f/-F.
+
 2011-07-02  Ian Lance Taylor  <iant@google.com>
 
        * dirsearch.cc (Dir_cache::read_files): Ignore ENOTDIR errors.
index 11dbbef6e8277be362909e73840155855cc6bb16..e6fd7e51149f529909390d123586f5037e964abc 100644 (file)
@@ -4218,8 +4218,18 @@ Layout::finish_dynamic_section(const Input_objects* input_objects,
         }
     }
 
-  // Add a DT_FLAGS entry. We add it even if no flags are set so that
-  // post-link tools can easily modify these flags if desired.
+  if (parameters->options().filter() != NULL)
+    odyn->add_string(elfcpp::DT_FILTER, parameters->options().filter());
+  if (parameters->options().any_auxiliary())
+    {
+      for (options::String_set::const_iterator p =
+            parameters->options().auxiliary_begin();
+          p != parameters->options().auxiliary_end();
+          ++p)
+       odyn->add_string(elfcpp::DT_AUXILIARY, *p);
+    }
+
+  // Add a DT_FLAGS entry if necessary.
   unsigned int flags = 0;
   if (have_textrel)
     {
index 50fc557bee945884928e81007b0142a6353d70f7..f1dc1cb91845843c80b405096b0e9e2157e16d83 100644 (file)
@@ -1166,6 +1166,14 @@ General_options::finalize()
   if (this->pie() && this->relocatable())
     gold_fatal(_("-pie and -r are incompatible"));
 
+  if (!this->shared())
+    {
+      if (this->filter() != NULL)
+       gold_fatal(_("-F/--filter may not used without -shared"));
+      if (this->any_auxiliary())
+       gold_fatal(_("-f/--auxiliary may not be used without -shared"));
+    }
+
   // TODO: implement support for -retain-symbols-file with -r, if needed.
   if (this->relocatable() && this->retain_symbols_file())
     gold_fatal(_("-retain-symbols-file does not yet work with -r"));
index 506c376fd1a30bc7113d3bb0ee37b6aa45eb02d0..57d58108b8fff3bc44cee693ba0154e1ac86156a 100644 (file)
@@ -735,6 +735,14 @@ class General_options
              N_("(ARM only) Do not warn about objects with incompatible "
                 "enum sizes"));
 
+  DEFINE_set(auxiliary, options::TWO_DASHES, 'f',
+            N_("Auxiliary filter for shared object symbol table"),
+            N_("SHLIB"));
+
+  DEFINE_string(filter, options::TWO_DASHES, 'F', NULL,
+               N_("Filter for shared object symbol table"),
+               N_("SHLIB"));
+
   DEFINE_bool(fatal_warnings, options::TWO_DASHES, '\0', false,
              N_("Treat warnings as errors"),
              N_("Do not treat warnings as errors"));