https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88954

--- Comment #4 from H.J. Lu <hjl.tools at gmail dot com> ---
(In reply to Martin Sebor from comment #3)
> My question is about the change you are proposing.  How do you expect g() to
> be called if the test case from comment #0 is modified for example as
> follows:
> 
>   void f_plt(void);
>   void f_noplt(void) __attribute__((noplt));
>   void (*p_noplt)(void) = f_noplt;
>   void g(void (*)(void));
> 
>   int main()
>   {
>     if (getenv ("USE_PLT"))
>       p_noplt = f_plt;   // should this be diagnosed?

f_plt will be handled by

000000404020  000600000007 R_X86_64_JUMP_SLO 0000000000401040 f_plt + 0

>     g (p_noplt);
>   }
> 
> In most other cases, initializing a pointer with the address of a function
> declared with some function attribute (e.g., const, nonnull, noreturn, pure,
> or warn_unused_result) doesn't transfer the special properties to the
> pointer, so I'm trying to understand what semantics you are after and if
> there is any potential for user errors and decide whether they should be
> detected.
> 
> I happen to think it would make sense to make it possible to imbue function
> pointers with some (but not all) of the same attributes as those that apply
> to functions, but there certainly are cases where doing so could cause
> problems, just as there are cases where not doing so can.

__attribute__((noplt)) only applies to functions, which instructors
compiler to avoid PLT when accessing the marked function, via function
pointer nor direct call.  The function pointer itself has no impact
on PLT.

Reply via email to