PATCH: PR gold/13507: Gold assumes GOT entry size is the same as ELF class size

Ian Lance Taylor iant@google.com
Fri Dec 16 05:53:00 GMT 2011


"H.J. Lu" <hjl.tools@gmail.com> writes:

> On Thu, Dec 15, 2011 at 6:37 PM, Ian Lance Taylor <iant@google.com> wrote:
>> "H.J. Lu" <hongjiu.lu@intel.com> writes:
>>
>>> This patch adds a parameter, got_entry_size, to Output_data_got
>>> constructor so that a target can have a different GOT entry size.
>>
>> Why not just use Output_data_got<got_entry_size, endianness>?
>>
>> Ian
>
> There are
>
> template<int size, bool big_endian>
> class Output_data_got : public Output_section_data_build
> {
>  public:
>   typedef typename elfcpp::Elf_types<size>::Elf_Addr Valtype;
>   typedef Output_data_reloc<elfcpp::SHT_REL, true, size, big_endian> Rel_dyn;
>   typedef Output_data_reloc<elfcpp::SHT_RELA, true, size, big_endian> Rela_dyn;
> ....
>   bool
>   add_local(Sized_relobj_file<size, big_endian>* object, unsigned int sym_index,
>             unsigned int got_type);
>
>   // Like add_local, but use the PLT offset of the local symbol if it
>   // has one.
>   bool
>   add_local_plt(Sized_relobj_file<size, big_endian>* object,
>                 unsigned int sym_index,
>                 unsigned int got_type);
>
>   // Add an entry for a local symbol to the GOT, and add a dynamic
>   // relocation of type R_TYPE for the GOT entry.
>   void
>   add_local_with_rel(Sized_relobj_file<size, big_endian>* object,
>                      unsigned int sym_index, unsigned int got_type,
>                      Rel_dyn* rel_dyn, unsigned int r_type);
>
>   void
>   add_local_with_rela(Sized_relobj_file<size, big_endian>* object,
>                       unsigned int sym_index, unsigned int got_type,
>                       Rela_dyn* rela_dyn, unsigned int r_type);
>
> The "size" parameter is the ELF class size.  32bit ELF targets
> have to use 32.

Ah, I see.  Output_data_got does conflate the GOT entry size with the
Sized_relobj_file<size, big_endian> argument.  Sorry to be a pain, but
that is really an error in how Output_data_got is written.  The size
should be the size of a GOT entry, not the ELF class size.  The
arguments should be Relobj, not Sized_relobj_file.  Of course this will
require some other work as well.

In general I think the size of entries in the GOT ought to be a template
parameter for Output_data_got.

As far as I can tell your patch is incorrect, because you haven't
changed Output_data_got<size, big_endian>::Got_entry::write.  When that
function calls elfcpp::Swap<size, big_endian>::writeval, it has to use
the size of a GOT entry.

Ian



More information about the Binutils mailing list