------- Comment #12 from ro at CeBiTec dot Uni-Bielefeld dot DE 2010-03-09 19:14 ------- Subject: Re: amd64 TLS IE code sequence on Solaris 2/x86 violates spec
> ------- Comment #11 from hjl dot tools at gmail dot com 2010-03-09 18:45 > ------- > Sun linker changes > > 4: 64 48 8b 14 25 00 00 00 00 mov %fs:0x0,%rdx > d: 48 8b 05 00 00 00 00 mov 0x0(%rip),%rax # 14 <main+0x14> > > 10: R_X86_64_GOTTPOFF cnt-0x4 > > to > > 400e0c: 64 48 8b 04 25 00 00 00 00 mov %fs:0x0,%rax > 400e15: 48 8d 80 f0 ff ff ff lea -0x10(%rax),%rax > > Nowhere in TLS spec allows the linker to change > > d: 48 8b 05 00 00 00 00 mov 0x0(%rip),%rax # 14 <main+0x14> > > 10: R_X86_64_GOTTPOFF cnt-0x4 > > to > > 400e15: 48 8d 80 f0 ff ff ff lea -0x10(%rax),%rax > > It is Sun linker bug. Please report it to them. True, this is a bug, but the input sequence isn't valid according to the spec: 4: 64 48 8b 14 25 00 00 00 00 mov %fs:0x0,%rdx d: 48 8b 05 00 00 00 00 mov 0x0(%rip),%rax # 14 <main+0x14> This should be mov %fs:0x0,%rax instead. As I said, garbage in, garbage out. If you disagree, point me at where the spec allows this. Even if so, we should either fix (if allowing other registers is a GNU extension to the base spec) or work around (if it is a misunderstanding on Sun's part) the problem if targetting Solaris: there are linkers in the field that behave as observed, and generating code that causes binaries to crash isn't a good option. Rainer -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43309