[PATCH x86_64] Optimize access to globals in "-fpie -pie" builds with copy relocations
H.J. Lu
hjl.tools@gmail.com
Thu Feb 5 19:01:00 GMT 2015
On Thu, Feb 5, 2015 at 10:54 AM, Richard Henderson <rth@redhat.com> wrote:
> On 02/04/2015 03:29 PM, H.J. Lu wrote:
>> +++ b/gcc/varasm.c
>> @@ -6826,11 +6826,17 @@ default_binds_local_p_1 (const_tree exp, int shlib)
>> && (TREE_STATIC (exp) || DECL_EXTERNAL (exp)))
>> {
>> varpool_node *vnode = varpool_node::get (exp);
>> - if (vnode && (resolution_local_p (vnode->resolution) || vnode->in_other_partition))
>> - resolved_locally = true;
>> - if (vnode
>> - && resolution_to_local_definition_p (vnode->resolution))
>> - resolved_to_local_def = true;
>> + /* If not building shared library, common or initialized symbols
>> + are also resolved locally, regardless they are weak or not. */
>> + if (vnode)
>> + {
>> + if ((!shlib && vnode->definition)
>> + || vnode->in_other_partition
>> + || resolution_local_p (vnode->resolution))
>> + resolved_locally = true;
>> + if (resolution_to_local_definition_p (vnode->resolution))
>> + resolved_to_local_def = true;
>> + }
>
> This is only true if the target uses COPY relocations, which is not universally
> true for all ELF targets.
>
Can you elaborate why it depends on COPY relocation? There
is no COPY relocation on x86-64.
--
H.J.
---
[hjl@gnu-6 copyreloc-3]$ cat x.c
__attribute__((weak))
int foo;
extern void bar (void);
int main()
{
if (foo != 0)
__builtin_abort();
bar ();
if (foo != 30)
__builtin_abort();
return 0;
}
[hjl@gnu-6 copyreloc-3]$ cat bar.c
int foo = -1;
void
bar ()
{
foo = 30;
}
[hjl@gnu-6 copyreloc-3]$ make x
gcc -pie -fpie -O3 -g -fuse-ld=gold -fpie -c -o x.o x.c
gcc -pie -fpie -O3 -g -fuse-ld=gold -fpic -c -o bar.o bar.c
gcc -pie -fpie -shared -o libbar.so bar.o
gcc -pie -fpie -O3 -g -fuse-ld=gold -o x x.o libbar.so -Wl,-R,.
[hjl@gnu-6 copyreloc-3]$ ./x
[hjl@gnu-6 copyreloc-3]$ readelf -rW x.o | grep foo
0000000000000004 0000001100000009 R_X86_64_GOTPCREL
0000000000000000 foo - 4
0000000000000079 0000001100000001 R_X86_64_64
0000000000000000 foo + 0
[hjl@gnu-6 copyreloc-3]$ readelf -rW x | grep foo
[hjl@gnu-6 copyreloc-3]$ readelf -rW libbar.so | grep foo
00000000002008c8 0000000900000006 R_X86_64_GLOB_DAT
0000000000200900 foo + 0
[hjl@gnu-6 copyreloc-3]$
More information about the Gcc-patches
mailing list