This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC 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: [PATCH x86_64] Optimize access to globals in "-fpie -pie" builds with copy relocations


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]$


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