--- a/gcc/calls.c +++ b/gcc/calls.c @@ -176,6 +176,12 @@ prepare_call_address (tree fndecl, rtx f && targetm.small_register_classes_for_mode_p (FUNCTION_MODE)) ? force_not_mem (memory_address (FUNCTION_MODE, funexp)) : memory_address (FUNCTION_MODE, funexp)); + else if (flag_pic && !flag_plt && fndecl + && TREE_CODE (fndecl) == FUNCTION_DECL + && !targetm.binds_local_p (fndecl)) + { + funexp = force_reg (Pmode, funexp); + } else if (! sibcallp) { #ifndef NO_FUNCTION_CSE --- a/gcc/common.opt +++ b/gcc/common.opt @@ -1617,6 +1617,10 @@ fpie Common Report Var(flag_pie,1) Negative(fPIC) Generate position-independent code for executables if possible (small mode) +fplt +Common Report Var(flag_plt) Init(1) +Use PLT for PIC calls (-fno-plt: load the address from GOT at call site) + fplugin= Common Joined RejectNegative Var(common_deferred_options) Defer Specify a plugin to load