GOLD handling of weak symbols (including x86 vs. ARM)
Cary Coutant
ccoutant@google.com
Thu Nov 11 18:59:00 GMT 2010
> ===================================================================
> --- gold/i386.cc 2010-11-09 08:21:13.000000000 +0000
> +++ gold/i386.cc 2010-11-09 08:21:23.000000000 +0000
> -// Return whether we need to make a PLT entry for a relocation of a
> -// given type against a STT_GNU_IFUNC symbol.
> +// Get the Reference_flags for a particular relocation.
>
> -bool
> -Target_i386::Scan::reloc_needs_plt_for_ifunc(Sized_relobj<32, false>* object,
> - unsigned int r_type)
> +int
> +Target_i386::Scan::get_reference_flags(unsigned int r_type)
> {
> switch (r_type)
> {
> case elfcpp::R_386_NONE:
> case elfcpp::R_386_GNU_VTINHERIT:
> case elfcpp::R_386_GNU_VTENTRY:
> - return false;
> + case elfcpp::R_386_GOTPC:
> + // No symbol reference.
> + return 0;
> +// Return whether we need to make a PLT entry for a relocation of a
> +// given type against a STT_GNU_IFUNC symbol.
> +
> +bool
> +Target_i386::Scan::reloc_needs_plt_for_ifunc(Sized_relobj<32, false>* object,
> + unsigned int r_type)
> +{
> + int flags = get_reference_flags(r_type);
> + if (flags & Symbol::TLS_REF)
> + gold_error(_("%s: unsupported TLS reloc %u for IFUNC symbol"),
> + object->name().c_str(), r_type);
> + return flags != 0;
> +}
It looks like reloc_needs_plt_for_ifunc will now return a different
answer for R_386_GOTPC than it did before. Was that a bug before?
This function could probably use a comment explaining why (flags != 0)
is the right answer.
-cary
More information about the Binutils
mailing list