|
|
a6dfc0 |
diff -rup binutils.orig/gold/layout.cc binutils-2.30/gold/layout.cc
|
|
|
a6dfc0 |
--- binutils.orig/gold/layout.cc 2018-10-09 15:24:05.987282736 +0100
|
|
|
a6dfc0 |
+++ binutils-2.30/gold/layout.cc 2018-10-09 16:08:29.445946736 +0100
|
|
|
a6dfc0 |
@@ -2052,12 +2052,15 @@ Layout::attach_allocated_section_to_segm
|
|
|
a6dfc0 |
// segment.
|
|
|
a6dfc0 |
if (os->type() == elfcpp::SHT_NOTE)
|
|
|
a6dfc0 |
{
|
|
|
a6dfc0 |
+ uint64_t os_align = os->addralign();
|
|
|
a6dfc0 |
+
|
|
|
a6dfc0 |
// See if we already have an equivalent PT_NOTE segment.
|
|
|
a6dfc0 |
for (p = this->segment_list_.begin();
|
|
|
a6dfc0 |
p != segment_list_.end();
|
|
|
a6dfc0 |
++p)
|
|
|
a6dfc0 |
{
|
|
|
a6dfc0 |
if ((*p)->type() == elfcpp::PT_NOTE
|
|
|
a6dfc0 |
+ && (*p)->align() == os_align
|
|
|
a6dfc0 |
&& (((*p)->flags() & elfcpp::PF_W)
|
|
|
a6dfc0 |
== (seg_flags & elfcpp::PF_W)))
|
|
|
a6dfc0 |
{
|
|
|
a6dfc0 |
@@ -2071,6 +2074,7 @@ Layout::attach_allocated_section_to_segm
|
|
|
a6dfc0 |
Output_segment* oseg = this->make_output_segment(elfcpp::PT_NOTE,
|
|
|
a6dfc0 |
seg_flags);
|
|
|
a6dfc0 |
oseg->add_output_section_to_nonload(os, seg_flags);
|
|
|
a6dfc0 |
+ oseg->set_align(os_align);
|
|
|
a6dfc0 |
}
|
|
|
a6dfc0 |
}
|
|
|
a6dfc0 |
|
|
|
a6dfc0 |
@@ -3171,6 +3175,10 @@ Layout::create_note(const char* name, in
|
|
|
a6dfc0 |
#else
|
|
|
a6dfc0 |
const int size = 32;
|
|
|
a6dfc0 |
#endif
|
|
|
a6dfc0 |
+ // The NT_GNU_PROPERTY_TYPE_0 note conforms to gABI.
|
|
|
a6dfc0 |
+ const int addralign = ((note_type == elfcpp::NT_GNU_PROPERTY_TYPE_0
|
|
|
a6dfc0 |
+ ? parameters->target().get_size()
|
|
|
a6dfc0 |
+ : size) / 8);
|
|
|
a6dfc0 |
|
|
|
a6dfc0 |
// The contents of the .note section.
|
|
|
a6dfc0 |
size_t namesz = strlen(name) + 1;
|
|
|
a6dfc0 |
@@ -3234,7 +3242,7 @@ Layout::create_note(const char* name, in
|
|
|
a6dfc0 |
return NULL;
|
|
|
a6dfc0 |
|
|
|
a6dfc0 |
Output_section_data* posd = new Output_data_const_buffer(buffer, notehdrsz,
|
|
|
a6dfc0 |
- size / 8,
|
|
|
a6dfc0 |
+ addralign,
|
|
|
a6dfc0 |
"** note header");
|
|
|
a6dfc0 |
os->add_output_section_data(posd);
|
|
|
a6dfc0 |
|
|
|
a6dfc0 |
@@ -3692,6 +3700,11 @@ Layout::segment_precedes(const Output_se
|
|
|
a6dfc0 |
{
|
|
|
a6dfc0 |
if (type1 != type2)
|
|
|
a6dfc0 |
return type1 < type2;
|
|
|
a6dfc0 |
+ uint64_t align1 = seg1->align();
|
|
|
a6dfc0 |
+ uint64_t align2 = seg2->align();
|
|
|
a6dfc0 |
+ // Place segments with larger alignments first.
|
|
|
a6dfc0 |
+ if (align1 != align2)
|
|
|
a6dfc0 |
+ return align1 > align2;
|
|
|
a6dfc0 |
gold_assert(flags1 != flags2
|
|
|
a6dfc0 |
|| this->script_options_->saw_phdrs_clause());
|
|
|
a6dfc0 |
return flags1 < flags2;
|
|
|
a6dfc0 |
diff -rup binutils.orig/gold/output.cc binutils-2.30/gold/output.cc
|
|
|
a6dfc0 |
--- binutils.orig/gold/output.cc 2018-10-09 15:24:05.986282744 +0100
|
|
|
a6dfc0 |
+++ binutils-2.30/gold/output.cc 2018-10-09 16:09:03.749670846 +0100
|
|
|
a6dfc0 |
@@ -4107,6 +4107,7 @@ Output_segment::Output_segment(elfcpp::E
|
|
|
a6dfc0 |
: vaddr_(0),
|
|
|
a6dfc0 |
paddr_(0),
|
|
|
a6dfc0 |
memsz_(0),
|
|
|
a6dfc0 |
+ align_(0),
|
|
|
a6dfc0 |
max_align_(0),
|
|
|
a6dfc0 |
min_p_align_(0),
|
|
|
a6dfc0 |
offset_(0),
|
|
|
a6dfc0 |
diff -rup binutils.orig/gold/output.h binutils-2.30/gold/output.h
|
|
|
a6dfc0 |
--- binutils.orig/gold/output.h 2018-10-09 15:24:05.984282760 +0100
|
|
|
a6dfc0 |
+++ binutils-2.30/gold/output.h 2018-10-09 16:09:45.665333727 +0100
|
|
|
a6dfc0 |
@@ -4676,6 +4676,16 @@ class Output_segment
|
|
|
a6dfc0 |
offset() const
|
|
|
a6dfc0 |
{ return this->offset_; }
|
|
|
a6dfc0 |
|
|
|
a6dfc0 |
+ // Return the segment alignment.
|
|
|
a6dfc0 |
+ uint64_t
|
|
|
a6dfc0 |
+ align() const
|
|
|
a6dfc0 |
+ { return this->align_; }
|
|
|
a6dfc0 |
+
|
|
|
a6dfc0 |
+ // Set the segment alignment.
|
|
|
a6dfc0 |
+ void
|
|
|
a6dfc0 |
+ set_align(uint64_t align)
|
|
|
a6dfc0 |
+ { this->align_ = align; }
|
|
|
a6dfc0 |
+
|
|
|
a6dfc0 |
// Whether this is a segment created to hold large data sections.
|
|
|
a6dfc0 |
bool
|
|
|
a6dfc0 |
is_large_data_segment() const
|
|
|
a6dfc0 |
@@ -4898,6 +4908,8 @@ class Output_segment
|
|
|
a6dfc0 |
uint64_t paddr_;
|
|
|
a6dfc0 |
// The size of the segment in memory.
|
|
|
a6dfc0 |
uint64_t memsz_;
|
|
|
a6dfc0 |
+ // The segment alignment.
|
|
|
a6dfc0 |
+ uint64_t align_;
|
|
|
a6dfc0 |
// The maximum section alignment. The is_max_align_known_ field
|
|
|
a6dfc0 |
// indicates whether this has been finalized.
|
|
|
a6dfc0 |
uint64_t max_align_;
|