On Thu, Feb 5, 2015 at 10:54 AM, Richard Henderson <r...@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]$