[Bug ld/15167] ld merges gnu_unique def and normal ref into normal symbol

2013-02-21 Thread cvs-commit at gcc dot gnu.org
http://sourceware.org/bugzilla/show_bug.cgi?id=15167

--- Comment #2 from cvs-commit at gcc dot gnu.org  2013-02-22 01:20:55 UTC ---
CVSROOT:/cvs/src
Module name:src
Changes by:h...@sourceware.org2013-02-22 01:20:48

Modified files:
ld/testsuite   : ChangeLog 
ld/testsuite/ld-unique: unique.exp 
bfd: ChangeLog elf64-ia64-vms.c elflink.c 

Log message:
Set unique_global only for definition

bfd/

PR ld/15167
* elf64-ia64-vms.c (elf64_vms_link_add_object_symbols): Set
unique_global only for definition.
* elflink.c (_bfd_elf_merge_symbol): Don't set unique_global
here.
(elf_link_add_object_symbols): Set unique_global only
for definition.

ld/testsuite/

PR ld/15167
* ld-unique/unique.exp: Add a test for shared library with
reference.

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/src/ld/testsuite/ChangeLog.diff?cvsroot=src&r1=1.1690&r2=1.1691
http://sourceware.org/cgi-bin/cvsweb.cgi/src/ld/testsuite/ld-unique/unique.exp.diff?cvsroot=src&r1=1.3&r2=1.4
http://sourceware.org/cgi-bin/cvsweb.cgi/src/bfd/ChangeLog.diff?cvsroot=src&r1=1.5980&r2=1.5981
http://sourceware.org/cgi-bin/cvsweb.cgi/src/bfd/elf64-ia64-vms.c.diff?cvsroot=src&r1=1.7&r2=1.8
http://sourceware.org/cgi-bin/cvsweb.cgi/src/bfd/elflink.c.diff?cvsroot=src&r1=1.471&r2=1.472

-- 
Configure bugmail: http://sourceware.org/bugzilla/userprefs.cgi?tab=email
--- You are receiving this mail because: ---
You are on the CC list for the bug.

___
bug-binutils mailing list
bug-binutils@gnu.org
https://lists.gnu.org/mailman/listinfo/bug-binutils


[Bug ld/15167] ld merges gnu_unique def and normal ref into normal symbol

2013-02-21 Thread hjl.tools at gmail dot com
http://sourceware.org/bugzilla/show_bug.cgi?id=15167

H.J. Lu  changed:

   What|Removed |Added

 CC||hjl.tools at gmail dot com

--- Comment #1 from H.J. Lu  2013-02-21 19:12:37 
UTC ---
[hjl@gnu-6 pr15167]$ cat unique_shared1.s
.type b, %gnu_unique_object
b:.long 0
.size b, .-b
[hjl@gnu-6 pr15167]$ cat unique_shared2.s
.data
.dc.ab
[hjl@gnu-6 pr15167]$ make
as   -o unique_shared1.o unique_shared1.s
as   -o unique_shared2.o unique_shared2.s
./ld -shared -o unique_shared.so unique_shared1.o unique_shared2.o
readelf -s unique_shared.so | grep UNIQ
make: *** [all] Error 1
[hjl@gnu-6 pr15167]$

-- 
Configure bugmail: http://sourceware.org/bugzilla/userprefs.cgi?tab=email
--- You are receiving this mail because: ---
You are on the CC list for the bug.

___
bug-binutils mailing list
bug-binutils@gnu.org
https://lists.gnu.org/mailman/listinfo/bug-binutils


[Bug ld/15167] ld merges gnu_unique def and normal ref into normal symbol

2013-02-21 Thread sbergman at redhat dot com
http://sourceware.org/bugzilla/show_bug.cgi?id=15167

Stephan Bergmann  changed:

   What|Removed |Added

 CC||sbergman at redhat dot com

-- 
Configure bugmail: http://sourceware.org/bugzilla/userprefs.cgi?tab=email
--- You are receiving this mail because: ---
You are on the CC list for the bug.

___
bug-binutils mailing list
bug-binutils@gnu.org
https://lists.gnu.org/mailman/listinfo/bug-binutils


[Bug ld/15167] New: ld merges gnu_unique def and normal ref into normal symbol

2013-02-21 Thread matz at suse dot de
http://sourceware.org/bugzilla/show_bug.cgi?id=15167

 Bug #: 15167
   Summary: ld merges gnu_unique def and normal ref into normal
symbol
   Product: binutils
   Version: 2.24 (HEAD)
Status: NEW
  Severity: normal
  Priority: P2
 Component: ld
AssignedTo: unassig...@sourceware.org
ReportedBy: m...@suse.de
Classification: Unclassified


This came up over at http://gcc.gnu.org/ml/gcc/2013-02/msg00227.html
describing a strange mismatch between two symbols that are unique, but
in the shared object one is normal and the other is unique.  I traced
this back to an ordering problem in ld at
http://gcc.gnu.org/ml/gcc/2013-02/msg00239.html .  The binutils involved
there are 2.21.1, but current upstream still exhibits the issue.  I made a
minimal testcase with two asm files:

% cat unique1.s
.file   "unique.cc"
.weak   _ZN1SIiE1iE
.section.bss._ZN1SIiE1iE,"awG",@nobits,_ZN1SIiE1iE,comdat
.align 4
.type   _ZN1SIiE1iE, @gnu_unique_object
.size   _ZN1SIiE1iE, 4
_ZN1SIiE1iE:
.zero   4
.ident  "GCC: (GNU) 4.6.1 20110505 (prerelease)"
.section.note.GNU-stack,"",@progbits

% cat unique2.s
.file   "unique.cc"
.text
.align 2
.globl  _ZN1SIiE3getEv
.type   _ZN1SIiE3getEv, @function
_ZN1SIiE3getEv:
.LFB0:
.cfi_startproc
pushq   %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq%rsp, %rbp
.cfi_def_cfa_register 6
movq%rdi, -8(%rbp)
movq_ZN1SIiE1iE@GOTPCREL(%rip), %rax
movl(%rax), %eax
popq%rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size   _ZN1SIiE3getEv, .-_ZN1SIiE3getEv
.ident  "GCC: (GNU) 4.6.1 20110505 (prerelease)"
.section.note.GNU-stack,"",@progbits

% gcc -c unique1.s unique2.s
% ./ld/ld-new -shared -o unique-ok.so unique2.o unique1.o
% ./ld/ld-new -shared -o unique-bad.so unique1.o unique2.o
% nm -D unique-bad.so | grep _ZN1SIiE1iE
00200398 B _ZN1SIiE1iE
% nm -D unique-ok.so | grep _ZN1SIiE1iE
00200398 u _ZN1SIiE1iE

In difference is that for unique-ok.so the reference to _ZN1SIiE1iE comes
first (in unique2.o), then the definition (in unique1.o), and that results
correctly in a global unique symbol exported from the DSO.
For unique-bad.so the definition comes first, and the uniqueness seems to
get lost when the normal reference is seen, so a normal global (not even weak)
symbol is now exported from the DSO.

This can (and as the thread at gcc@ shows actually does) lead to problems
when the system relies on some symbols to be indeed globally unique.
The empty_rep static member of libstdc++'s string<> and wstring<> templates
is one example.

As said, this is broken in at least 2.21.1 and in current trunk.  FWIW,
the C++ source I used to initially generate the above asms is:

template 
struct S {
static T i;
T get();
};
template  T S::i;
template <> int S::get() { return i; }

compiled with -fPIC, and then split the .s into two by hand.

-- 
Configure bugmail: http://sourceware.org/bugzilla/userprefs.cgi?tab=email
--- You are receiving this mail because: ---
You are on the CC list for the bug.

___
bug-binutils mailing list
bug-binutils@gnu.org
https://lists.gnu.org/mailman/listinfo/bug-binutils