On Tue, Feb 3, 2015 at 2:19 PM, Jakub Jelinek <ja...@redhat.com> wrote: > On Tue, Feb 03, 2015 at 02:03:14PM -0800, H.J. Lu wrote: >> So we aren't SYMBOL_REF_EXTERNAL_P nor >> SYMBOL_REF_LOCAL_P. What do we reference? > > That is reasonable. There is no guarantee the extern weak symbol is local, > it could very well be non-local. All that you know about the symbols is > that its address is non-NULL in that case. >
This may be true for shared library. But it isn't true for PIE: [hjl@gnu-6 copyreloc-3]$ cat x.c __attribute__((weak)) int a; extern void bar (void); int main() { if (a != 0) __builtin_abort(); bar (); if (a != 30) __builtin_abort(); return 0; } [hjl@gnu-6 copyreloc-3]$ cat bar.c int a = -1; void bar () { a = 30; } [hjl@gnu-6 copyreloc-3]$ make gcc -pie -O3 -g -fuse-ld=gold -fpie -c x.i gcc -pie -O3 -g -fuse-ld=gold -fpic -c -o bar.o bar.c gcc -pie -shared -o libbar.so bar.o gcc -pie -O3 -g -fuse-ld=gold -o x x.o libbar.so -Wl,-R,. ./x [hjl@gnu-6 copyreloc-3]$ Even if a common symbol, a, is weak, all references to a within PIE is local. -- H.J.