* options.h (class General_options): Define --check-sections.
authorIan Lance Taylor <ian@airs.com>
Tue, 22 Jul 2008 23:55:24 +0000 (23:55 +0000)
committerIan Lance Taylor <ian@airs.com>
Tue, 22 Jul 2008 23:55:24 +0000 (23:55 +0000)
* layout.cc (Layout::set_segment_offsets): Handle
--check-sections.

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

index 372c8d9388ca927675df3c933e016b354680c470..6fb10a1649bbaf455fa360e91e26563522c973e1 100644 (file)
@@ -1,5 +1,9 @@
 2008-07-22  Ian Lance Taylor  <iant@google.com>
 
+       * options.h (class General_options): Define --check-sections.
+       * layout.cc (Layout::set_segment_offsets): Handle
+       --check-sections.
+
        * options.h (class General_options): Define -n/--nmagic and
        -N/--omagic.
        * options.cc (General_options::finalize): For -n/--nmagic or
index 8c7cd9968bb0f471eb991c669333978da70ba70a..37edbb6c8366645b9d886082bfbf279ba79ed27f 100644 (file)
@@ -1732,6 +1732,9 @@ Layout::set_segment_offsets(const Target* target, Output_segment* load_seg,
        }
     }
 
+  const bool check_sections = parameters->options().check_sections();
+  Output_segment* last_load_segment = NULL;
+
   bool was_readonly = false;
   for (Segment_list::iterator p = this->segment_list_.begin();
        p != this->segment_list_.end();
@@ -1848,6 +1851,25 @@ Layout::set_segment_offsets(const Target* target, Output_segment* load_seg,
 
          if (((*p)->flags() & elfcpp::PF_W) == 0)
            was_readonly = true;
+
+         // Implement --check-sections.  We know that the segments
+         // are sorted by LMA.
+         if (check_sections && last_load_segment != NULL)
+           {
+             gold_assert(last_load_segment->paddr() <= (*p)->paddr());
+             if (last_load_segment->paddr() + last_load_segment->memsz()
+                 > (*p)->paddr())
+               {
+                 unsigned long long lb1 = last_load_segment->paddr();
+                 unsigned long long le1 = lb1 + last_load_segment->memsz();
+                 unsigned long long lb2 = (*p)->paddr();
+                 unsigned long long le2 = lb2 + (*p)->memsz();
+                 gold_error(_("load segment overlap [0x%llx -> 0x%llx] and "
+                              "[0x%llx -> 0x%llx]"),
+                            lb1, le1, lb2, le2);
+               }
+           }
+         last_load_segment = *p;
        }
     }
 
index 91f9552b92cb7379e870046d4e9ac467800931cf..6a456f171d9b7660540e1cd661f07212e5cbe94a 100644 (file)
@@ -576,6 +576,10 @@ class General_options
                         N_("Generate build ID note"),
                         N_("[=STYLE]"));
 
+  DEFINE_bool(check_sections, options::TWO_DASHES, '\0', true,
+             N_("Check segment addresses for overlaps (default)"),
+             N_("Do not check segment addresses for overlaps"));
+
 #ifdef HAVE_ZLIB_H
   DEFINE_enum(compress_debug_sections, options::TWO_DASHES, '\0', "none",
               N_("Compress .debug_* sections in the output file"),