Define __start and __stop symbols.
authorIan Lance Taylor <iant@google.com>
Sat, 22 Sep 2007 04:42:09 +0000 (04:42 +0000)
committerIan Lance Taylor <iant@google.com>
Sat, 22 Sep 2007 04:42:09 +0000 (04:42 +0000)
gold/gold.cc
gold/layout.cc
gold/layout.h

index e7b7ae2939d7d470c5d6506a68eae7c1ab3dd217..2d334625e833925d5da1ba6c871755047f6ca055 100644 (file)
@@ -148,6 +148,10 @@ queue_middle_tasks(const General_options& options,
   // bother to create a task for it.
   define_standard_symbols(symtab, layout, input_objects->target());
 
+  // Define __start and __stop symbols for output sections where
+  // appropriate.
+  layout->define_section_symbols(symtab, input_objects->target());
+
   // Read the relocations of the input files.  We do this to find
   // which symbols are used by relocations which require a GOT and/or
   // a PLT entry, or a COPY reloc.  When we implement garbage
index 9d4b644d112195890e94e2ad78729a4b9d6c1c26..d72b7e70c0df44b9ab983879609f022368e9df9c 100644 (file)
@@ -337,6 +337,58 @@ Layout::create_initial_dynamic_sections(const Input_objects* input_objects,
   this->dynamic_section_->add_output_section_data(this->dynamic_data_);
 }
 
+// For each output section whose name can be represented as C symbol,
+// define __start and __stop symbols for the section.  This is a GNU
+// extension.
+
+void
+Layout::define_section_symbols(Symbol_table* symtab, const Target* target)
+{
+  for (Section_list::const_iterator p = this->section_list_.begin();
+       p != this->section_list_.end();
+       ++p)
+    {
+      const char* const name = (*p)->name();
+      if (name[strspn(name,
+                     ("0123456789"
+                      "ABCDEFGHIJKLMNOPWRSTUVWXYZ"
+                      "abcdefghijklmnopqrstuvwxyz"
+                      "_"))]
+         == '\0')
+       {
+         const std::string name_string(name);
+         const std::string start_name("__start_" + name_string);
+         const std::string stop_name("__stop_" + name_string);
+
+         symtab->define_in_output_data(target,
+                                       start_name.c_str(),
+                                       NULL, // version
+                                       *p,
+                                       0, // value
+                                       0, // symsize
+                                       elfcpp::STT_NOTYPE,
+                                       elfcpp::STB_GLOBAL,
+                                       elfcpp::STV_DEFAULT,
+                                       0, // nonvis
+                                       false, // offset_is_from_end
+                                       false); // only_if_ref
+
+         symtab->define_in_output_data(target,
+                                       stop_name.c_str(),
+                                       NULL, // version
+                                       *p,
+                                       0, // value
+                                       0, // symsize
+                                       elfcpp::STT_NOTYPE,
+                                       elfcpp::STB_GLOBAL,
+                                       elfcpp::STV_DEFAULT,
+                                       0, // nonvis
+                                       true, // offset_is_from_end
+                                       false); // only_if_ref
+       }
+    }
+}
+
 // Find the first read-only PT_LOAD segment, creating one if
 // necessary.
 
index 8b349cc0a4bda2675a912233c1528756a2b36d31..ecb0490a58991301b9ee788b5962dc9b1aa399f6 100644 (file)
@@ -85,6 +85,10 @@ class Layout
   void
   create_initial_dynamic_sections(const Input_objects*, Symbol_table*);
 
+  // Define __start and __stop symbols for output sections.
+  void
+  define_section_symbols(Symbol_table*, const Target*);
+
   // Return the Stringpool used for symbol names.
   const Stringpool*
   sympool() const