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]

Re: [GOLD] PATCH: PR gold/10893: gold doesn't support IFUNC


"H.J. Lu" <hongjiu.lu@intel.com> writes:

> elfcpp/
>
> 2009-12-03  H.J. Lu  <hongjiu.lu@intel.com>
>
> 	PR gold/10893
> 	* elfcpp.h (Sym): Add is_func,
>
> gold/
>
> 2009-12-03  H.J. Lu  <hongjiu.lu@intel.com>
>
> 	PR gold/10893
> 	* i386.cc (Target_i386::Scan::globa): Use is_func instead
> 	of checking elfcpp::STT_FUNC.
> 	(Target_i386::Relocate::relocate): Likewise.
> 	* reloc.cc (Sized_relobj<size, big_endian>::split_stack_adjust_reltype): Likewise.
> 	(Sized_relobj<size, big_endian>::find_functions): Likewise.
> 	* x86_64.cc (Target_x86_64::Scan::global): Likewise.
>
> 	* symtab.cc (Symbol_table::sized_write_symbol): Turn IFUNC
> 	symbols from shared libraries into normal FUNC symbols.
>
> 	* symtab.h (Symbol): Add is_func an use it.


> --- a/elfcpp/elfcpp.h
> +++ b/elfcpp/elfcpp.h
> @@ -1292,6 +1292,11 @@ class Sym
>    get_st_shndx() const
>    { return Convert<16, big_endian>::convert_host(this->p_->st_shndx); }
>  
> +  bool
> +  is_func() const
> +  { return (this->get_st_type() == STT_FUNC
> +	    || this->get_st_type() == STT_GNU_IFUNC); }
> +
>   private:
>    const internal::Sym_data<size>* p_;
>  };

I don't think you need this one.  In any case, it shouldn't be there,
and please don't add it.  If you explain why you need it, we can
figure out where to handle it.


> --- a/gold/i386.cc
> +++ b/gold/i386.cc

You didn't fix anything in arm.cc, powerpc.cc, or sparc.cc.  Why not?
Is it because STT_GNU_IFUNC does not work for those targets?


> @@ -1233,7 +1233,7 @@ Sized_relobj<size, big_endian>::find_functions(
>  
>        // FIXME: Some targets can have functions which do not have type
>        // STT_FUNC, e.g., STT_ARM_TFUNC.
> -      if (isym.get_st_type() != elfcpp::STT_FUNC
> +      if (!isym.is_func()
>  	  || isym.get_st_size() == 0)
>  	continue;

Ah, here is where you are using the elfcpp method.  You should write
this as
    if ((isym.get_st_type() != elfcpp::STT_FUNC
         && isym.get_st_type() != elfcpp::STT_GNU_IFUNC)
        || isym.get_st_size() == 0)

> --- a/gold/symtab.h
> +++ b/gold/symtab.h
> @@ -205,6 +205,12 @@ class Symbol
>    type() const
>    { return this->type_; }
>  
> +  // Return true for function symbol.
> +  bool
> +  is_func() const
> +  { return (this->type_ == elfcpp::STT_FUNC
> +	    || this->type_ == elfcpp::STT_GNU_IFUNC); }
> +

Format this as:

  bool
  is_func() const
  {
    return (this->type_ == elfcpp::STT_FUNC
            || this->type_ == elfcpp::STT_GNU_IFUNC);
  }


This patch is OK with those change if it still works.

Thanks.

Ian


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