Move definition of wsadata into wsock_init

The problem this patch fixes showed up after updating to gcc-5.3.0.  The
cuplrit is a change in gcc when emitting section attributes.  It only
shows up when building without optimization.  Effect in Cygwin: ws2_32
functions failed to load.

In the original code the definition of "NO_COPY wsadata" was preceeding
an __asm__ block (the definition of the _wsock_init wrapper), while the
definition of "NO_COPY here" immediately follows the same assembler
block.  When gcc-5.3.0 emits assembler code for the wsadata definition,
it emits the .data_cygwin_nocopy section attribute.

Next it emits the assembler output for the __asm_ block, entirely ignoring
its content.  The __asm__ block adds a .text section definition.

Eventually gcc emits assembler code for the here definition.  However,
apparently gcc still "knows" that it just emitted the .data_cygwin_nocopy
section attribute and so doesn't redefine it.  Remember the __asm__?  It
changed the section to .text.

So with gcc-4.9.3 we got:

    .section .data_cygwin_nocopy,"w"
  wsadata:

  __asm__ block:
    .text

    .section .data_cygwin_nocopy,"w"
  here:

With gcc 5.3.0 we now get:

    .section .data_cygwin_nocopy,"w"
  wsadata:

  __asm__ block:
    .text

  here:

So "here" is now in the .text segment which is read-only.  Hilarity ensues.

Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
This commit is contained in:
Corinna Vinschen 2016-03-09 22:55:28 +01:00
parent c09e96fda0
commit 264b5e137e
1 changed files with 4 additions and 1 deletions

View File

@ -480,7 +480,6 @@ std_dll_init ()
}
/* Initialization function for winsock stuff. */
WSADATA NO_COPY wsadata;
#ifdef __x86_64__
/* See above comment preceeding std_dll_init. */
@ -493,6 +492,10 @@ __attribute__ ((used, noinline)) static two_addr_t
wsock_init ()
#endif
{
/* CV 2016-03-09: Moved wsadata into wsock_init to workaround a problem
with the NO_COPY definition of wsadata and here starting with gcc-5.3.0.
See the git log for a description. */
static WSADATA NO_COPY wsadata;
static LONG NO_COPY here = -1L;
#ifndef __x86_64__
struct func_info *func = (struct func_info *) __builtin_return_address (0);