[nonworking patch] gold/arm: define $a/$d markers in .plt

Cary Coutant ccoutant@google.com
Tue Apr 17 23:57:00 GMT 2012


> I tried this, to no avail (the symbols don't appear in the output at all).
> Patch below for reference.

I think your patch is pretty close to working. The problem is that
Symbol_table::sized_write_globals() only visits symbols in the global
symbol table, so it never sees the ones in forced_locals_ that weren't
also added to the global table. I think you need a separate
generated_locals_ list, change Symbol_table::sized_finalize() to
iterate over that list the same way it does over forced_locals_, and
add a loop to Symbol_table::sized_write_globals() to iterate over the
generated_locals_ list to write them out.

+template<int size>
+Sized_symbol<size>*
+Symbol_table::do_define_local_in_output_data(
+    const char* name, Defined defined, Output_data* od,
+    typename elfcpp::Elf_types<size>::Elf_Addr value,
+    typename elfcpp::Elf_types<size>::Elf_WXword symsize,
+    elfcpp::STT type, bool offset_is_from_end)
+{
+  Sized_symbol<size>* sym = new Sized_symbol<size>();

You should probably check for target.has_make_symbol(), like this:

  const Target& target = parameters->target();
  if (!target.has_make_symbol())
    sym = new Sized_symbol<size>();
  else
    {
      Sized_target<size, big_endian>* sized_target =
	parameters->sized_target<size, big_endian>();
      sym = sized_target->make_symbol();
      if (sym == NULL)
        return NULL;
    }

-cary



More information about the Binutils mailing list