PR gold/12898

* layout.cc (Layout::segment_precedes): Don't crash if a linker
	script create indistinguishable segments.
	(Layout::set_segment_offsets): Use stable_sort when sorting
	segments.  Pass this to Compare_segments constructor.
	* layout.h (class Layout): Make segment_precedes non-static.
	(class Compare_segments): Change from struct to class.  Add
	layout_ field.  Add constructor.
	* script-sections.cc
	(Script_sections::attach_sections_using_phdrs_clause): Rename
	local orphan to is_orphan.  Don't report failure to put empty
	section in segment.  On attachment failure, report name of
	section, and attach to first PT_LOAD segment.
This commit is contained in:
Ian Lance Taylor
2011-06-29 00:39:54 +00:00
parent d555a4fbf3
commit aecf301fb9
4 changed files with 63 additions and 16 deletions

View File

@ -1052,7 +1052,7 @@ class Layout
place_orphan_sections_in_script();
// Return whether SEG1 comes before SEG2 in the output file.
static bool
bool
segment_precedes(const Output_segment* seg1, const Output_segment* seg2);
// Use to save and restore segments during relaxation.
@ -1102,11 +1102,19 @@ class Layout
// A comparison class for segments.
struct Compare_segments
class Compare_segments
{
public:
Compare_segments(Layout* layout)
: layout_(layout)
{ }
bool
operator()(const Output_segment* seg1, const Output_segment* seg2)
{ return Layout::segment_precedes(seg1, seg2); }
{ return this->layout_->segment_precedes(seg1, seg2); }
private:
Layout* layout_;
};
typedef std::vector<Output_section_data*> Output_section_data_list;