[v2] gcc: Enable __cxa_atexit for final GCC
diff mbox series

Message ID 20181116112618.17034-1-abrodkin@synopsys.com
State Accepted
Headers show
Series
  • [v2] gcc: Enable __cxa_atexit for final GCC
Related show

Commit Message

Alexey Brodkin Nov. 16, 2018, 11:26 a.m. UTC
This is what GCC manual says [1]:
-------------------------->8----------------------
--enable-__cxa_atexit

    Define if you want to use __cxa_atexit, rather than atexit,
    to register C++ destructors for local statics and global objects.

    This is essential for fully standards-compliant handling of destructors,
    but requires __cxa_atexit in libc.

    This option is currently only available on systems with GNU libc
    ...
-------------------------->8----------------------

Important disadvantages of a simple atexit() are that [2]:
-------------------------->8----------------------
1999 C Standard only requires that the implementation support 32
registered functions, although most implementations support many more.

More important it does not deal at all with the ability in most implementations
to remove DSOs from a running program image by calling dlclose
prior to program termination.
-------------------------->8----------------------

Also it seems like all libc's we support in Buildroot (Glibc, uClibc and musl)
support __cxa_at_exit() so enable it unconditionally.

FWIW if we look around we'll see:
 1. In OpenEmbedded it is enabled for everything except gcc-cross-initial: [3], [4]
 2. In Crosstool-NG it is enabled by default: [5]
 3. In OpenWrt it is disabled only for uClibc, otherwise enabled: [6]

So I think we should be good with it as well.

[1] https://gcc.gnu.org/install/configure.html
[2] https://itanium-cxx-abi.github.io/cxx-abi/abi.html#dso-dtor-motivation
[3] https://github.com/openembedded/openembedded-core/blob/master/meta/recipes-devtools/gcc/gcc-configure-common.inc#L59
[4] https://github.com/openembedded/openembedded-core/blob/master/meta/recipes-devtools/gcc/gcc-cross-initial.inc#L23
[5] https://github.com/crosstool-ng/crosstool-ng/blob/master/config/cc/gcc.in#L270
[6] https://github.com/openwrt/openwrt/blob/master/toolchain/gcc/common.mk#L170

Signed-off-by: Alexey Brodkin <abrodkin@synopsys.com>
Cc: Nicolas Cavallari <Nicolas.Cavallari@green-communications.fr>
Cc: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
Cc: Mark Corbin <mark.corbin@embecosm.com>
Cc: Romain Naour <romain.naour@gmail.com>
Cc: Peter Korsgaard <peter@korsgaard.com>
Cc: Bernd Kuhls <bernd.kuhls@t-online.de>
Cc: Claudiu Zissulescu <claziss@synopsys.com>
Cc: Cupertino Miranda <cmiranda@synopsys.com>
Cc: Vineet Gupta <vgupta@synopsys.com>
Reviewed-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>
---

Changes v1 -> v2:

 * Added references to other buildsystems in commit message
 * Dropped disable in gcc-initial so we have it enabled always

 package/gcc/gcc.mk | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Thomas Petazzoni Nov. 29, 2018, 9:14 p.m. UTC | #1
Hello,

On Fri, 16 Nov 2018 14:26:18 +0300, Alexey Brodkin wrote:
> This is what GCC manual says [1]:
> -------------------------->8----------------------  
> --enable-__cxa_atexit

I've applied to next, but after dropping the "for final GCC" from the
commit title, since cxa_atexit is now used for both the initial gcc and
the final gcc.

Thanks!

Thomas
Fabio Estevam Jan. 21, 2019, 3:04 p.m. UTC | #2
Hi Peter,

On Thu, Nov 29, 2018 at 7:15 PM Thomas Petazzoni
<thomas.petazzoni@bootlin.com> wrote:
>
> Hello,
>
> On Fri, 16 Nov 2018 14:26:18 +0300, Alexey Brodkin wrote:
> > This is what GCC manual says [1]:
> > -------------------------->8----------------------
> > --enable-__cxa_atexit
>
> I've applied to next, but after dropping the "for final GCC" from the
> commit title, since cxa_atexit is now used for both the initial gcc and
> the final gcc.

Could this one be applied to Buildroot stable?

The lack of this patch causes is causing issues on Mesa:
https://www.mail-archive.com/mesa-dev@lists.freedesktop.org/msg212440.html
Peter Seiderer Jan. 21, 2019, 8:51 p.m. UTC | #3
Hello *,

On Mon, 21 Jan 2019 13:04:46 -0200, Fabio Estevam <festevam@gmail.com> wrote:

> Hi Peter,
> 
> On Thu, Nov 29, 2018 at 7:15 PM Thomas Petazzoni
> <thomas.petazzoni@bootlin.com> wrote:
> >
> > Hello,
> >
> > On Fri, 16 Nov 2018 14:26:18 +0300, Alexey Brodkin wrote:  
> > > This is what GCC manual says [1]:  
> > > -------------------------->8----------------------  
> > > --enable-__cxa_atexit  
> >
> > I've applied to next, but after dropping the "for final GCC" from the
> > commit title, since cxa_atexit is now used for both the initial gcc and
> > the final gcc.  
> 
> Could this one be applied to Buildroot stable?

+1

> 
> The lack of this patch causes is causing issues on Mesa:
> https://www.mail-archive.com/mesa-dev@lists.freedesktop.org/msg212440.html

Did re-run the same buildroot-2018.11/mesa/etnaviv test, could confirm enabling
__cxa_atexit fixes the mesa double-free on exit...

Regards,
Peter
  
> _______________________________________________
> buildroot mailing list
> buildroot@busybox.net
> http://lists.busybox.net/mailman/listinfo/buildroot
Peter Korsgaard Feb. 24, 2019, 9:20 p.m. UTC | #4
>>>>> "Fabio" == Fabio Estevam <festevam@gmail.com> writes:

 > Hi Peter,
 > On Thu, Nov 29, 2018 at 7:15 PM Thomas Petazzoni
 > <thomas.petazzoni@bootlin.com> wrote:
 >> 
 >> Hello,
 >> 
 >> On Fri, 16 Nov 2018 14:26:18 +0300, Alexey Brodkin wrote:
 >> > This is what GCC manual says [1]:
 >> > -------------------------->8----------------------
 >> > --enable-__cxa_atexit
 >> 
 >> I've applied to next, but after dropping the "for final GCC" from the
 >> commit title, since cxa_atexit is now used for both the initial gcc and
 >> the final gcc.

 > Could this one be applied to Buildroot stable?

 > The lack of this patch causes is causing issues on Mesa:
 > https://www.mail-archive.com/mesa-dev@lists.freedesktop.org/msg212440.html

Yes, sorry for the delay - Committed to 2018.02.x and 2018.11.x, thanks.

Patch
diff mbox series

diff --git a/package/gcc/gcc.mk b/package/gcc/gcc.mk
index e47435677e..5901624ea5 100644
--- a/package/gcc/gcc.mk
+++ b/package/gcc/gcc.mk
@@ -87,7 +87,7 @@  HOST_GCC_COMMON_DEPENDENCIES = \
 HOST_GCC_COMMON_CONF_OPTS = \
 	--target=$(GNU_TARGET_NAME) \
 	--with-sysroot=$(STAGING_DIR) \
-	--disable-__cxa_atexit \
+	--enable-__cxa_atexit \
 	--with-gnu-ld \
 	--disable-libssp \
 	--disable-multilib \