This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[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>


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]