gdb: add target_ops::supports_displaced_step
[deliverable/binutils-gdb.git] / gold / target.cc
index 2c0cbbf16d8945ffb4299edc730a65c95358cf4c..45148018964fe0be8b7ca629a04f524e65553e31 100644 (file)
@@ -1,6 +1,6 @@
-// target.cc
+// target.cc -- target support for gold.
 
-// Copyright 2009, 2010 Free Software Foundation, Inc.
+// Copyright (C) 2009-2020 Free Software Foundation, Inc.
 // Written by Doug Kwan <dougkwan@google.com>.
 
 // This file is part of gold.
@@ -72,10 +72,13 @@ Target::do_make_elf_object_implementation(
     const elfcpp::Ehdr<size, big_endian>& ehdr)
 {
   int et = ehdr.get_e_type();
-  if (et == elfcpp::ET_REL)
+  // ET_EXEC files are valid input for --just-symbols/-R,
+  // and we treat them as relocatable objects.
+  if (et == elfcpp::ET_REL
+      || (et == elfcpp::ET_EXEC && input_file->just_symbols()))
     {
-      Sized_relobj<size, big_endian>* obj =
-       new Sized_relobj<size, big_endian>(name, input_file, offset, ehdr);
+      Sized_relobj_file<size, big_endian>* obj =
+       new Sized_relobj_file<size, big_endian>(name, input_file, offset, ehdr);
       obj->setup();
       return obj;
     }
@@ -149,7 +152,8 @@ Target::do_make_output_section(const char* name, elfcpp::Elf_Word type,
 // whether the symbol is a function.
 
 bool
-Target::do_is_call_to_non_split(const Symbol* sym, unsigned int) const
+Target::do_is_call_to_non_split(const Symbol* sym, const unsigned char*,
+                               const unsigned char*, section_size_type) const
 {
   return sym->type() == elfcpp::STT_FUNC;
 }
@@ -158,7 +162,8 @@ Target::do_is_call_to_non_split(const Symbol* sym, unsigned int) const
 
 void
 Target::do_calls_non_split(Relobj* object, unsigned int, section_offset_type,
-                          section_size_type, unsigned char*, section_size_type,
+                          section_size_type, const unsigned char*, size_t,
+                          unsigned char*, section_size_type,
                           std::string*, std::string*) const
 {
   static bool warned;
@@ -200,4 +205,58 @@ Target::set_view_to_nop(unsigned char* view, section_size_type view_size,
     }
 }
 
+// Return address and size to plug into eh_frame FDEs associated with a PLT.
+void
+Target::do_plt_fde_location(const Output_data* plt, unsigned char*,
+                           uint64_t* address, off_t* len) const
+{
+  *address = plt->address();
+  *len = plt->data_size();
+}
+
+// Class Sized_target.
+
+// Set the EI_OSABI field of the ELF header if requested.
+
+template<int size, bool big_endian>
+void
+Sized_target<size, big_endian>::do_adjust_elf_header(unsigned char* view,
+                                                    int len)
+{
+  elfcpp::ELFOSABI osabi = this->osabi();
+  if (osabi != elfcpp::ELFOSABI_NONE)
+    {
+      gold_assert(len == elfcpp::Elf_sizes<size>::ehdr_size);
+
+      elfcpp::Ehdr<size, big_endian> ehdr(view);
+      unsigned char e_ident[elfcpp::EI_NIDENT];
+      memcpy(e_ident, ehdr.get_e_ident(), elfcpp::EI_NIDENT);
+
+      e_ident[elfcpp::EI_OSABI] = osabi;
+
+      elfcpp::Ehdr_write<size, big_endian> oehdr(view);
+      oehdr.put_e_ident(e_ident);
+    }
+}
+
+#ifdef HAVE_TARGET_32_LITTLE
+template
+class Sized_target<32, false>;
+#endif
+
+#ifdef HAVE_TARGET_32_BIG
+template
+class Sized_target<32, true>;
+#endif
+
+#ifdef HAVE_TARGET_64_LITTLE
+template
+class Sized_target<64, false>;
+#endif
+
+#ifdef HAVE_TARGET_64_BIG
+template
+class Sized_target<64, true>;
+#endif
+
 } // End namespace gold.
This page took 0.023921 seconds and 4 git commands to generate.