With your latest two patches, the toolchain compiles but I get an
error when building a shared library:

/nix/store/k481dhv5hivggnjyb9rs95fz1k6ylhjz-mingw-w64-2017-08-03-i686-w64-mingw32/lib/../lib/libmingw32.a(lib32_libmingw32_a-gccmain.o):
In function `_do_global_dtors':
/tmp/nix-build-mingw-w64-2017-08-03-i686-w64-mingw32.drv-0/build_crt_and_headers/mingw-w64-crt/../../mingw-w64/mingw-w64-crt/crt/gccmain.c:25:
undefined reference to `__DTOR_END__'
/tmp/nix-build-mingw-w64-2017-08-03-i686-w64-mingw32.drv-0/build_crt_and_headers/mingw-w64-crt/../../mingw-w64/mingw-w64-crt/crt/gccmain.c:25:
undefined reference to `__DTOR_END__'
/nix/store/k481dhv5hivggnjyb9rs95fz1k6ylhjz-mingw-w64-2017-08-03-i686-w64-mingw32/lib/../lib/libmingw32.a(lib32_libmingw32_a-gccmain.o):gccmain.c:(.data+0x0):
undefined reference to `__CTOR_END__'

Maybe crtexe.c is not linked into shared libraries since they are not EXEs.

--David

On Fri, Aug 4, 2017 at 6:12 PM, David Grayson <davidegray...@gmail.com> wrote:
> Oh, I mean that I got the patch to apply, but I don't know if it
> really *works*; the toolchain is still building at this time.  --David
>
> On Fri, Aug 4, 2017 at 6:11 PM, David Grayson <davidegray...@gmail.com> wrote:
>> Your binutils patch did not apply cleanly to binutils-2.27 but I got
>> it to work.  It looks pretty dangerous to me because you removed the
>> lines for keeping the .dtors, .dtor, .ctors, and .ctor sections.  And
>> you're using .ctors and .dtors in your other patch, and other code
>> might use them too I suppose.
>>
>> --David
>>
>> On Fri, Aug 4, 2017 at 5:39 PM, Martell Malone <martellmal...@gmail.com> 
>> wrote:
>>> Hey David,
>>>
>>> This could be caused by gcc including it's own crtbegin.o and crtend.o
>>> I managed to install a toolchain with brew and I swapped out gcc's and
>>> mingw-w64's crtbegin and crtend.
>>> Everything seems to work here as intended.
>>> Attached is an updated patch that avoids crtbegin and crtend that should
>>> work along with a patch for binutils.
>>>
>>> Kai could you give some input on the binutils patch.
>>> On a side note while we are at this we should change __image_base__
>>> to ___ImageBase and __ImageBase on x86 and x64 respectively.
>>> Best,
>>> Martell
>>>
>>> On Sat, Aug 5, 2017 at 12:20 AM, David Grayson <davidegray...@gmail.com>
>>> wrote:
>>>
>>>> Martell:
>>>>
>>>> My setup ( https://github.com/DavidEGrayson/nixcrpkgs ) makes it quite
>>>> easy to try random patches and make sure that GCC can still be
>>>> bootstrapped and that I can build non-trivial applications.  I tried
>>>> your patch (after fixing the linebreaks added by GMail) but
>>>> unfortunately it doesn't work.
>>>>
>>>> When building the final GCC, I got this error:
>>>>
>>>> ~~~~
>>>> checking for ld that supports -Wl,--gc-sections... configure: error:
>>>> Link tests are not allowed after GCC_NO_EXECUTABLES.
>>>> make[1]: *** [Makefile:9917: configure-target-libstdc++-v3] Error 1
>>>> make[1]: Leaving directory
>>>> '/tmp/nix-build-gcc-6.3.0-i686-w64-mingw32.drv-0/build'
>>>> make: *** [Makefile:878: all] Error 2
>>>> ~~~~
>>>>
>>>> I've experienced this before and it just means something went wrong
>>>> earlier in the configure script, and GCC, in its infinite wisdom,
>>>> decided that it was targeting a system that does not support
>>>> executables (?).  Digging through the config.log for libstdc++-v3, I
>>>> found a suspicious error:
>>>>
>>>> ~~~~
>>>> configure:3952: $? = 1
>>>> configure:3968:
>>>> /tmp/nix-build-gcc-6.3.0-i686-w64-mingw32.drv-0/build/./gcc/xgcc
>>>> -B/tmp/nix-build-gcc-6.3.0-i686-w64-m
>>>> ingw32.drv-0/build/./gcc/
>>>> -L/nix/store/s27xhxkbq4qxadhzpn5vh5kkffnfvizy-gcc-6.3.0-
>>>> i686-w64-mingw32/i686-w64-mingw32/li
>>>> b -L/nix/store/s27xhxkbq4qxadhzpn5vh5kkffnfvizy-gcc-6.3.0-
>>>> i686-w64-mingw32/mingw/lib
>>>> -isystem /nix/store/s27xhxkbq4qxa
>>>> dhzpn5vh5kkffnfvizy-gcc-6.3.0-i686-w64-mingw32/i686-w64-mingw32/include
>>>> -isystem /nix/store/s27xhxkbq4qxadhzpn5vh5kkff
>>>> nfvizy-gcc-6.3.0-i686-w64-mingw32/mingw/include
>>>> -B/nix/store/s27xhxkbq4qxadhzpn5vh5kkffnfvizy-gcc-6.3.0-i686-w64-mingw
>>>> 32/i686-w64-mingw32/bin/
>>>> -B/nix/store/s27xhxkbq4qxadhzpn5vh5kkffnfvizy-gcc-6.3.0-
>>>> i686-w64-mingw32/i686-w64-mingw32/lib
>>>> / -isystem /nix/store/s27xhxkbq4qxadhzpn5vh5kkffnfvizy-gcc-6.3.0-i686-
>>>> w64-mingw32/i686-w64-mingw32/include
>>>> -isystem /n
>>>> ix/store/s27xhxkbq4qxadhzpn5vh5kkffnfvizy-gcc-6.3.0-i686-
>>>> w64-mingw32/i686-w64-mingw32/sys-include
>>>>    -o conftest -g -O
>>>> 2   conftest.c  >&5
>>>> /nix/store/262jyalfa9jz5say3782fcdh2zw4n301-mingw-w64-2017-
>>>> 08-03-i686-w64-mingw32/lib/../lib/libmingw32.a(lib32_libmin
>>>> gw32_a-gccmain.o): In function `_do_global_dtors':
>>>> /tmp/nix-build-mingw-w64-2017-08-03-i686-w64-mingw32.drv-0/b
>>>> uild_crt_and_headers/mingw-w64-crt/../../mingw-w64/mingw-w
>>>> 64-crt/crt/gccmain.c:25: undefined reference to `__MINGW_DTOR_LIST__'
>>>> /tmp/nix-build-mingw-w64-2017-08-03-i686-w64-mingw32.drv-0/b
>>>> uild_crt_and_headers/mingw-w64-crt/../../mingw-w64/mingw-w
>>>> 64-crt/crt/gccmain.c:25: undefined reference to `__MINGW_DTOR_END__'
>>>> /tmp/nix-build-mingw-w64-2017-08-03-i686-w64-mingw32.drv-0/b
>>>> uild_crt_and_headers/mingw-w64-crt/../../mingw-w64/mingw-w
>>>> 64-crt/crt/gccmain.c:25: undefined reference to `__MINGW_DTOR_END__'
>>>> /nix/store/262jyalfa9jz5say3782fcdh2zw4n301-mingw-w64-2017-
>>>> 08-03-i686-w64-mingw32/lib/../lib/libmingw32.a(lib32_libmin
>>>> gw32_a-gccmain.o): In function `_do_global_ctors':
>>>> /tmp/nix-build-mingw-w64-2017-08-03-i686-w64-mingw32.drv-0/b
>>>> uild_crt_and_headers/mingw-w64-crt/../../mingw-w64/mingw-w
>>>> 64-crt/crt/gccmain.c:35: undefined reference to `__MINGW_CTOR_END__'
>>>> /tmp/nix-build-mingw-w64-2017-08-03-i686-w64-mingw32.drv-0/b
>>>> uild_crt_and_headers/mingw-w64-crt/../../mingw-w64/mingw-w
>>>> 64-crt/crt/gccmain.c:35: undefined reference to `__MINGW_CTOR_LIST__'
>>>> /tmp/nix-build-mingw-w64-2017-08-03-i686-w64-mingw32.drv-0/b
>>>> uild_crt_and_headers/mingw-w64-crt/../../mingw-w64/mingw-w
>>>> 64-crt/crt/gccmain.c:35: undefined reference to `__MINGW_CTOR_LIST__'
>>>> ~~~~
>>>>
>>>> I'm not sure why those things would be undefined, but the order of
>>>> linking of these libraries does matter and perhaps they are being
>>>> linked in the wrong order.
>>>>
>>>> --David
>>>>
>>>> On Fri, Aug 4, 2017 at 12:50 PM, Martell Malone <martellmal...@gmail.com>
>>>> wrote:
>>>> > Okay lets just solve this.
>>>> > I believe the following should work for both clang and gcc
>>>> > I added a test case at the bottom also.
>>>> >
>>>> > diff --git a/mingw-w64-crt/crt/crtbegin.c b/mingw-w64-crt/crt/crtbegin.c
>>>> > index 39c0d856..1672f7b9 100644
>>>> > --- a/mingw-w64-crt/crt/crtbegin.c
>>>> > +++ b/mingw-w64-crt/crt/crtbegin.c
>>>> > @@ -4,3 +4,5 @@
>>>> >   * No warranty is given; refer to the file DISCLAIMER.PD within this
>>>> > package.
>>>> >   */
>>>> >
>>>> > +__attribute__ (( __section__ (".ctors"), __used__ , aligned(sizeof(void
>>>> > *)))) const void * __MINGW_CTOR_LIST__ = (void *) -1;
>>>> > +__attribute__ (( __section__ (".dtors"), __used__ , aligned(sizeof(void
>>>> > *)))) const void * __MINGW_DTOR_LIST__ = (void *) -1;
>>>> > diff --git a/mingw-w64-crt/crt/crtend.c b/mingw-w64-crt/crt/crtend.c
>>>> > index 39c0d856..d1b6b426 100644
>>>> > --- a/mingw-w64-crt/crt/crtend.c
>>>> > +++ b/mingw-w64-crt/crt/crtend.c
>>>> > @@ -4,3 +4,5 @@
>>>> >   * No warranty is given; refer to the file DISCLAIMER.PD within this
>>>> > package.
>>>> >   */
>>>> >
>>>> > +__attribute__ (( __section__ (".ctors$zzz"), __used__ ,
>>>> > aligned(sizeof(void *)))) const void * __MINGW_CTOR_END__ = (void *) 0;
>>>> > +__attribute__ (( __section__ (".dtors$zzz"), __used__ ,
>>>> > aligned(sizeof(void *)))) const void * __MINGW_DTOR_END__ = (void *) 0;
>>>> > diff --git a/mingw-w64-crt/crt/gccmain.c b/mingw-w64-crt/crt/gccmain.c
>>>> > index fc0e3500..7401e812 100644
>>>> > --- a/mingw-w64-crt/crt/gccmain.c
>>>> > +++ b/mingw-w64-crt/crt/gccmain.c
>>>> > @@ -9,8 +9,10 @@
>>>> >  #include <setjmp.h>
>>>> >
>>>> >  typedef void (*func_ptr) (void);
>>>> > -extern func_ptr __CTOR_LIST__[];
>>>> > -extern func_ptr __DTOR_LIST__[];
>>>> > +extern func_ptr __MINGW_CTOR_LIST__[];
>>>> > +extern func_ptr __MINGW_DTOR_LIST__[];
>>>> > +extern func_ptr __MINGW_CTOR_END__[];
>>>> > +extern func_ptr __MINGW_DTOR_END__[];
>>>> >
>>>> >  void __do_global_dtors (void);
>>>> >  void __do_global_ctors (void);
>>>> > @@ -19,31 +21,21 @@ void __main (void);
>>>> >  void
>>>> >  __do_global_dtors (void)
>>>> >  {
>>>> > -  static func_ptr *p = __DTOR_LIST__ + 1;
>>>> > -
>>>> > -  while (*p)
>>>> > -    {
>>>> > -      (*(p)) ();
>>>> > +  func_ptr *p = __MINGW_DTOR_LIST__ + 1;
>>>> > +  while(p < __MINGW_DTOR_END__) {
>>>> > +    if (*p) (*(p)) ();
>>>> >        p++;
>>>> > -    }
>>>> > +  }
>>>> >  }
>>>> >
>>>> >  void
>>>> >  __do_global_ctors (void)
>>>> >  {
>>>> > -  unsigned long nptrs = (unsigned long) (ptrdiff_t) __CTOR_LIST__[0];
>>>> > -  unsigned long i;
>>>> > -
>>>> > -  if (nptrs == (unsigned long) -1)
>>>> > -    {
>>>> > -      for (nptrs = 0; __CTOR_LIST__[nptrs + 1] != 0; nptrs++);
>>>> > -    }
>>>> > -
>>>> > -  for (i = nptrs; i >= 1; i--)
>>>> > -    {
>>>> > -      __CTOR_LIST__[i] ();
>>>> > -    }
>>>> > -
>>>> > +  func_ptr *p = __MINGW_CTOR_END__ - 1;
>>>> > +  while(p > __MINGW_CTOR_LIST__) {
>>>> > +    if (*p) (*(p)) ();
>>>> > +      p--;
>>>> > +  }
>>>> >    atexit (__do_global_dtors);
>>>> >  }
>>>> >
>>>> > Attached also is a testcase for ctors and dtors
>>>> >
>>>> > #include <stdio.h>
>>>> >
>>>> > void ctorTest(void) __attribute__ ((constructor));
>>>> > void dtorTest(void) __attribute__ ((destructor));
>>>> >
>>>> > void ctorTest(void) {
>>>> > printf ("ctor before main\n");
>>>> > }
>>>> >
>>>> > void dtorTest(void) {
>>>> >     printf ("dtor after main\n");
>>>> > }
>>>> >
>>>> > int main()
>>>> > {
>>>> >     printf ("hello\n");
>>>> >     return 0;
>>>> > }
>>>> >
>>>> > I get the following output with clang.
>>>> >
>>>> > ctor before main
>>>> > hello
>>>> > dtor after main
>>>> >
>>>> > Can someone test this on a gcc toolchain and confirm.
>>>> > I haven't built a mingw-w64 with gcc and binutils in so long.
>>>> >
>>>> > Best,
>>>> > Martell
>>>> >
>>>> > On Fri, Aug 4, 2017 at 7:53 PM, Martin Storsjö <mar...@martin.st> wrote:
>>>> >
>>>> >> On Fri, 4 Aug 2017, Ruben Van Boxem wrote:
>>>> >>
>>>> >> Op 3 aug. 2017 9:26 p.m. schreef "Martell Malone" <
>>>> martellmal...@gmail.com
>>>> >>> >:
>>>> >>>
>>>> >>> I for one would like to be able to use one crt with both Clang and
>>>> GCC. No
>>>> >>> use in duplicating 99% of the code for that one little bit of startup
>>>> code
>>>> >>> that needs to be different. Perhaps ldd or Clang needs to be taught to
>>>> >>> link
>>>> >>> a different startup object, but that should be trivial to accomplish!
>>>> >>>
>>>> >>
>>>> >> Being able to use the same build of mingw with either compiler (or more
>>>> >> practically, linker) would be ideal yeah. In addition to the constructor
>>>> >> handling, there's also the issue that lld fails to link to import
>>>> libraries
>>>> >> created by GNU dlltool.
>>>> >>
>>>> >>
>>>> >> Initial brain dump of what I've discovered on the matter so far:
>>>> >>
>>>> >> MSVC link.exe also used to fail linking to such import libraries (with
>>>> >> slightly different symptoms), prior to MSVC 2012 where it started
>>>> working.
>>>> >> (Not sure if this was an intentional fix from their side or not.)
>>>> >>
>>>> >> With link.exe, the output binary does link to the DLL, but doesn't
>>>> >> actually import the functions. With lld, the output binary doesn't
>>>> actually
>>>> >> end up linking to the DLL at all, iirc.
>>>> >>
>>>> >> In lld, in LinkerDriver::addArchiveBuffer, the "proper" import
>>>> libraries
>>>> >> (from the windows SDK, and the ones produced by llvm-dlltool) get
>>>> >> identified as coff_import_library and get treated differently, while the
>>>> >> GNU dlltool ones just are treated as any normal static library-.
>>>> >>
>>>> >>
>>>> >> // Martin
>>>> >>
>>>> >>
>>>> >> ------------------------------------------------------------
>>>> >> ------------------
>>>> >> Check out the vibrant tech community on one of the world's most
>>>> >> engaging tech sites, Slashdot.org! http://sdm.link/slashdot
>>>> >> _______________________________________________
>>>> >> Mingw-w64-public mailing list
>>>> >> Mingw-w64-public@lists.sourceforge.net
>>>> >> https://lists.sourceforge.net/lists/listinfo/mingw-w64-public
>>>> >>
>>>> > ------------------------------------------------------------
>>>> ------------------
>>>> > Check out the vibrant tech community on one of the world's most
>>>> > engaging tech sites, Slashdot.org! http://sdm.link/slashdot
>>>> > _______________________________________________
>>>> > Mingw-w64-public mailing list
>>>> > Mingw-w64-public@lists.sourceforge.net
>>>> > https://lists.sourceforge.net/lists/listinfo/mingw-w64-public
>>>>
>>>> ------------------------------------------------------------
>>>> ------------------
>>>> Check out the vibrant tech community on one of the world's most
>>>> engaging tech sites, Slashdot.org! http://sdm.link/slashdot
>>>> _______________________________________________
>>>> Mingw-w64-public mailing list
>>>> Mingw-w64-public@lists.sourceforge.net
>>>> https://lists.sourceforge.net/lists/listinfo/mingw-w64-public
>>>>
>>>
>>> ------------------------------------------------------------------------------
>>> Check out the vibrant tech community on one of the world's most
>>> engaging tech sites, Slashdot.org! http://sdm.link/slashdot
>>> _______________________________________________
>>> Mingw-w64-public mailing list
>>> Mingw-w64-public@lists.sourceforge.net
>>> https://lists.sourceforge.net/lists/listinfo/mingw-w64-public
>>>

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Mingw-w64-public mailing list
Mingw-w64-public@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public

Reply via email to