This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
[PATCH] gold: use one-byte nops for code fill on NaCl x86 targets
- From: Roland McGrath <mcgrathr at google dot com>
- To: "binutils at sourceware dot org" <binutils at sourceware dot org>
- Date: Thu, 15 Aug 2013 17:00:52 -0700
- Subject: [PATCH] gold: use one-byte nops for code fill on NaCl x86 targets
For NaCl targets, if a code fill starts at an odd alignment and extends
past a 32-byte alignment boundary, it can wind up producing single long nop
instructions that straddle those boundaries, which violates NaCl's ABI
constraints.
Ok for trunk and 2.23?
Thanks,
Roland
gold/
2013-08-15 Roland McGrath <mcgrathr@google.com>
* i386.cc (Target_i386_nacl::do_code_fill): New virtual function.
* x86_64.cc (Target_x86_64_nacl::do_code_fill): New virtual function.
--- a/gold/i386.cc
+++ b/gold/i386.cc
@@ -3939,6 +3939,9 @@ class Target_i386_nacl : public Target_i386
return new Output_data_plt_i386_nacl_exec(layout, got_plt,
got_irelative);
}
+ virtual std::string
+ do_code_fill(section_size_type length) const;
+
private:
static const Target::Target_info i386_nacl_info;
};
@@ -4139,6 +4142,15 @@
Output_data_plt_i386_nacl::plt_eh_frame_fde[plt_eh_frame_fde_size] =
elfcpp::DW_CFA_nop
};
+// Return a string used to fill a code section with nops.
+// For NaCl, long NOPs are only valid if they do not cross
+// bundle alignment boundaries, so keep it simple with one-byte NOPs.
+std::string
+Target_i386_nacl::do_code_fill(section_size_type length) const
+{
+ return std::string(length, static_cast<char>(0x90));
+}
+
// The selector for i386-nacl object files.
class Target_selector_i386_nacl
--- a/gold/x86_64.cc
+++ b/gold/x86_64.cc
@@ -4572,6 +4572,9 @@ class Target_x86_64_nacl : public Target_x86_64<size>
plt_count);
}
+ virtual std::string
+ do_code_fill(section_size_type length) const;
+
private:
static const Target::Target_info x86_64_nacl_info;
};
@@ -4798,6 +4801,16 @@
Output_data_plt_x86_64_nacl<size>::plt_eh_frame_fde[plt_eh_frame_fde_size]
=
elfcpp::DW_CFA_nop
};
+// Return a string used to fill a code section with nops.
+// For NaCl, long NOPs are only valid if they do not cross
+// bundle alignment boundaries, so keep it simple with one-byte NOPs.
+template<int size>
+std::string
+Target_x86_64_nacl<size>::do_code_fill(section_size_type length) const
+{
+ return std::string(length, static_cast<char>(0x90));
+}
+
// The selector for x86_64-nacl object files.
template<int size>