[Bug bootstrap/60830] [4.9 Regression] ICE on bootstrapping on cygwin
ktietz at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Mon Apr 21 14:52:00 GMT 2014
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=60830
--- Comment #31 from Kai Tietz <ktietz at gcc dot gnu.org> ---
(In reply to Bernd Edlinger from comment #30)
> It looks like a bug in the assembler!
>
> with objdump -d -r crtbegin.o we have wrong code:
>
> f3: 83 ec 04 sub $0x4,%esp
> f6: 85 c0 test %eax,%eax
> f8: ba f0 ff ff ff mov $0xfffffff0,%edx
> f9: dir32 ___deregister_frame_info
> fd: 74 16 je 115 <___gcc_deregister_frame+0x35>
>
>
> but the cygming-crtbegin.s looks correct:
>
> LVL17:
> .loc 1 158 0
> testl %eax, %eax
> .loc 1 162 0
> movl $___deregister_frame_info, %edx
> .loc 1 158 0
> je L27
>
>
> whenever there is a weak definition the reference is actually minus
> the offset of the previous weak definition. Everything is OK if that was
> at offset zero.
>
> test case:
>
> $ cat test.c
> #include <stdio.h>
>
> extern void test() __attribute__((weak));
>
> int main()
> {
> printf("hello\n");
> test();
> return 0;
> }
>
> __attribute__((weak))
> void test()
> {
> printf("weak\n");
> }
>
> $ cat test1.c
> #include <stdio.h>
>
> void test()
> {
> printf("strong\n");
> }
>
>
> $ gcc -o test test.c test1.c
> $ ./test
> hello
> Segmentation fault (core dumped)
Interesting finding. So second issue cooks down to be an binutils bug about
weak. I remember the cause of the change to gcc's crtbegin, and it is pretty
important one (at least for x64). As the implicit zero-relocation doesn't work
on x64 as instructions have +/-2^31 offset in max.
So I would suggest to report this issue on binutils. gcc's bz isn't the right
place to discuss that issue further.
More information about the Gcc-bugs
mailing list