https://sourceware.org/bugzilla/show_bug.cgi?id=16858

Mikael Pettersson <mikpelinux at gmail dot com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |mikpelinux at gmail dot com

--- Comment #3 from Mikael Pettersson <mikpelinux at gmail dot com> ---
I can reproduce the crash on cygwin-1.7.29 (32-bit), with binutils 2.21,
2.21.1, 2.23.2, and cygwin's 2.24.51.20140326.

Modifying test.c to optionally move the test() definition before main(), .e.g:

> cat test.c
#include <stdio.h>

#ifdef REORDER
__attribute__((weak))
void test()
{
  printf("weak\n");
}
#else
extern void test() __attribute__((weak));
#endif

int main()
{
  printf("hello\n");
  test();
  return 0;
}

#ifndef REORDER
__attribute__((weak))
void test()
{
  printf("weak\n");
}
#endif

illustrates that the bug is ordering-dependent:

> gcc -UREORDER -g test.c test1.c ; ./a.exe
hello
Segmentation fault (core dumped)
> gcc -DREORDER -g test.c test1.c ; ./a.exe
hello
strong

An objdump -d -r of the broken a.exe shows that what should have been a call to
the strong test() in fact calls an immediate field in main() itself:

00401190 <_main>:
  401190:       55                      push   %ebp
  401191:       89 e5                   mov    %esp,%ebp
  401193:       83 e4 f0                and    $0xfffffff0,%esp
  401196:       83 ec 10                sub    $0x10,%esp
  401199:       e8 b2 00 00 00          call   401250 <___main>
  40119e:       c7 04 24 60 30 40 00    movl   $0x403060,(%esp)
  4011a5:       e8 ae 00 00 00          call   401258 <_puts>
  4011aa:       e8 f7 ff ff ff          call   4011a6 <_main+0x16>
  4011af:       b8 00 00 00 00          mov    $0x0,%eax
  4011b4:       c9                      leave  
  4011b5:       c3                      ret    

The insn at 0x4011aa should have called test() [at 0x4011cc in this exe], but
instead calls the immediate in the preceding _puts call.

-- 
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

Reply via email to