On Tue, Feb 03, 2015 at 11:25:38AM -0800, Sriraman Tallam wrote:
> This was the original patch to i386.c to let global accesses take
> advantage of copy relocations and avoid the GOT.
>
>
> @@ -13113,7 +13113,11 @@ legitimate_pic_address_disp_p (rtx disp)
> return true;
> }
> else if (!SYMBOL_REF_FAR_ADDR_P (op0)
> - && SYMBOL_REF_LOCAL_P (op0)
> + && (SYMBOL_REF_LOCAL_P (op0)
> + || (HAVE_LD_PIE_COPYRELOC
> + && flag_pie
> + && !SYMBOL_REF_WEAK (op0)
> + && !SYMBOL_REF_FUNCTION_P (op0)))
> && ix86_cmodel != CM_LARGE_PIC)
>
> I do not understand here why weak global data access must go through
> the GOT and not use copy relocations. Ultimately, there is only going
> to be one copy of the global either defined in the executable or the
> shared object right?
>
> Can we remove the check for SYMBOL_REF_WEAK?
So, what will then happen if the weak undef symbol isn't defined anywhere?
In non-PIE binaries that is fine, the linker will store 0.
But in PIE binaries, the 0 would be biased by the PIE load bias and thus
wouldn't be NULL.
You can only optimize weak vars if there is some weak definition in the
current TU.
Jakub