[llvm-commits] [patch][rfc] How to handle static constructors on linux

Rafael Espíndola rafael.espindola at gmail.com
Mon Jun 18 10:49:09 PDT 2012


> The GNU linker has support to merge .ctor's into init_array.  Does the
> gold linker have the same feature?  This seems more like the real fix
> rather than just hacking around the issue.

Recent version have it. I found the bug when using gold 2.21 which
doesn't. What seems to happen is:

* In an old linux system, the linker leaves ctors in .ctors,
crtbeginS.o has a call to __do_global_dtors_aux. The net result is
that _init calls the constructors.
* In an all new linux system, the compiler uses .init_array (or the
linker moves it there) and crtbeginS.o has nothing to do with
constructors.
* If we have a compiler that doesn't use .init_array and gold 2.21 in
a new linux system, we hit the bug.

So this is not as bad as I was expecting (old programs still work),
but it is still a somewhat annoying ABI change to handle. I think we
can add support for this in clang in 3 ways:

1) Require new linkers when using gcc 4.7 libraries.
2) Ship our own versions of crtbeginS.o (and similars).
3) Use .init_array when using gcc 4.7 libraries.

I have most of option 3 implemented. Chandler,  do you still think
that this is a big enough ABI breakage that it should not be
supported?

> Thanks,
> Andrew Pinski

Cheers,
Rafael




More information about the llvm-commits mailing list