Add -h/-soname option.
authorIan Lance Taylor <iant@google.com>
Fri, 4 Jan 2008 05:35:24 +0000 (05:35 +0000)
committerIan Lance Taylor <iant@google.com>
Fri, 4 Jan 2008 05:35:24 +0000 (05:35 +0000)
gold/layout.cc
gold/options.cc
gold/options.h

index eebb26c5686fdfa0a97742ef3e5639977445d720..75aecfe2b5d7a23f3dd8b44c877cd6816bcbf6a8 100644 (file)
@@ -1713,6 +1713,13 @@ Layout::finish_dynamic_section(const Input_objects* input_objects,
       odyn->add_string(elfcpp::DT_NEEDED, (*p)->soname());
     }
 
+  if (parameters->output_is_shared())
+    {
+      const char* soname = this->options_.soname();
+      if (soname != NULL)
+       odyn->add_string(elfcpp::DT_SONAME, soname);
+    }
+
   // FIXME: Support --init and --fini.
   Symbol* sym = symtab->lookup("_init");
   if (sym != NULL && sym->is_defined() && !sym->is_from_dynobj())
index 20ddc6ad386aadeb16adec2dabc2423358d45ddd..c3f174718bb91c49fcb786ea5919b03e8a6bb69f 100644 (file)
@@ -399,6 +399,9 @@ options::Command_line_options::options[] =
                 NULL, TWO_DASHES, &General_options::set_export_dynamic),
   GENERAL_NOARG('\0', "eh-frame-hdr", N_("Create exception frame header"),
                 NULL, TWO_DASHES, &General_options::set_create_eh_frame_hdr),
+  GENERAL_ARG('h', "soname", N_("Set shared library name"),
+             N_("-h FILENAME, --soname FILENAME"), ONE_DASH,
+             &General_options::set_soname),
   GENERAL_ARG('I', "dynamic-linker", N_("Set dynamic linker path"),
              N_("-I PROGRAM, --dynamic-linker PROGRAM"), TWO_DASHES,
              &General_options::set_dynamic_linker),
@@ -528,6 +531,7 @@ const int options::Command_line_options::debug_options_size =
 
 General_options::General_options()
   : export_dynamic_(false),
+    soname_(NULL),
     dynamic_linker_(NULL),
     search_path_(),
     optimization_level_(0),
index cae1b1a4750939a76b4bccfbe9345f2c0134069b..86d9bd7b6b29588d9b44c20b3fd08659f80d2308 100644 (file)
@@ -113,6 +113,11 @@ class General_options
   export_dynamic() const
   { return this->export_dynamic_; }
 
+  // -h: shared library name.
+  const char*
+  soname() const
+  { return this->soname_; }
+
   // -I: dynamic linker name.
   const char*
   dynamic_linker() const
@@ -310,6 +315,10 @@ class General_options
   set_export_dynamic()
   { this->export_dynamic_ = true; }
 
+  void
+  set_soname(const char* arg)
+  { this->soname_ = arg; }
+
   void
   set_dynamic_linker(const char* arg)
   { this->dynamic_linker_ = arg; }
@@ -501,6 +510,7 @@ class General_options
   add_sysroot();
 
   bool export_dynamic_;
+  const char* soname_;
   const char* dynamic_linker_;
   Dir_list search_path_;
   int optimization_level_;