2010-09-08 Rafael Espindola <espindola@google.com>
authorRafael Ávila de Espíndola <respindola@mozilla.com>
Wed, 8 Sep 2010 18:31:35 +0000 (18:31 +0000)
committerRafael Ávila de Espíndola <respindola@mozilla.com>
Wed, 8 Sep 2010 18:31:35 +0000 (18:31 +0000)
* arm.cc (do_finalize_sections): Create the __exidx_start and
__exdix_end symbols even when the section is missing.

gold/ChangeLog
gold/arm.cc

index 45b3d7ccefc7853e04229fadb9b56f3a9a5f5ab9..c5f3bda1ee3a8fbb0a58f703d95ad07af835e939 100644 (file)
@@ -1,3 +1,8 @@
+2010-09-08  Rafael Espindola  <espindola@google.com>
+
+       * arm.cc (do_finalize_sections): Create the __exidx_start and
+       __exdix_end symbols even when the section is missing.
+
 2010-09-08  Nick Clifton  <nickc@redhat.com>
 
        * README: Remove claim that MEMORY is not supported.
index 4353489d317586f6cb49208dd2e8ac544f387595..85f95429a4b7f1bfa22abcab7af284f145722706 100644 (file)
@@ -8426,33 +8426,50 @@ Target_arm<big_endian>::do_finalize_sections(
 
   // Handle the .ARM.exidx section.
   Output_section* exidx_section = layout->find_output_section(".ARM.exidx");
-  if (exidx_section != NULL
-      && exidx_section->type() == elfcpp::SHT_ARM_EXIDX
-      && !parameters->options().relocatable())
-    {
-      // Create __exidx_start and __exdix_end symbols.
-      symtab->define_in_output_data("__exidx_start", NULL,
-                                   Symbol_table::PREDEFINED,
-                                   exidx_section, 0, 0, elfcpp::STT_OBJECT,
-                                   elfcpp::STB_GLOBAL, elfcpp::STV_HIDDEN, 0,
-                                   false, true);
-      symtab->define_in_output_data("__exidx_end", NULL,
-                                   Symbol_table::PREDEFINED,
-                                   exidx_section, 0, 0, elfcpp::STT_OBJECT,
-                                   elfcpp::STB_GLOBAL, elfcpp::STV_HIDDEN, 0,
-                                   true, true);
 
-      // For the ARM target, we need to add a PT_ARM_EXIDX segment for
-      // the .ARM.exidx section.
-      if (!layout->script_options()->saw_phdrs_clause())
-       {
-         gold_assert(layout->find_output_segment(elfcpp::PT_ARM_EXIDX, 0, 0)
-                     == NULL);
-         Output_segment*  exidx_segment =
-           layout->make_output_segment(elfcpp::PT_ARM_EXIDX, elfcpp::PF_R);
-         exidx_segment->add_output_section_to_nonload(exidx_section,
-                                                      elfcpp::PF_R);
-       }
+  if (!parameters->options().relocatable())
+    {
+      if (exidx_section != NULL
+          && exidx_section->type() == elfcpp::SHT_ARM_EXIDX)
+        {
+          // Create __exidx_start and __exdix_end symbols.
+          symtab->define_in_output_data("__exidx_start", NULL,
+                                        Symbol_table::PREDEFINED,
+                                        exidx_section, 0, 0, elfcpp::STT_OBJECT,
+                                        elfcpp::STB_GLOBAL, elfcpp::STV_HIDDEN,
+                                        0, false, true);
+          symtab->define_in_output_data("__exidx_end", NULL,
+                                        Symbol_table::PREDEFINED,
+                                        exidx_section, 0, 0, elfcpp::STT_OBJECT,
+                                        elfcpp::STB_GLOBAL, elfcpp::STV_HIDDEN,
+                                        0, true, true);
+
+          // For the ARM target, we need to add a PT_ARM_EXIDX segment for
+          // the .ARM.exidx section.
+          if (!layout->script_options()->saw_phdrs_clause())
+            {
+              gold_assert(layout->find_output_segment(elfcpp::PT_ARM_EXIDX, 0,
+                                                      0)
+                          == NULL);
+              Output_segment*  exidx_segment =
+                layout->make_output_segment(elfcpp::PT_ARM_EXIDX, elfcpp::PF_R);
+              exidx_segment->add_output_section_to_nonload(exidx_section,
+                                                           elfcpp::PF_R);
+            }
+        }
+      else
+        {
+          symtab->define_as_constant("__exidx_start", NULL,
+                                     Symbol_table::PREDEFINED,
+                                     0, 0, elfcpp::STT_OBJECT,
+                                     elfcpp::STB_GLOBAL, elfcpp::STV_HIDDEN, 0,
+                                     true, false);
+          symtab->define_as_constant("__exidx_end", NULL,
+                                     Symbol_table::PREDEFINED,
+                                     0, 0, elfcpp::STT_OBJECT,
+                                     elfcpp::STB_GLOBAL, elfcpp::STV_HIDDEN, 0,
+                                     true, false);
+        }
     }
 
   // Create an .ARM.attributes section if we have merged any attributes