Skip to contentSkip to conversation

gcc: Enable __cxa_atexit for final GCC

PATCH New Alexey Brodkin 5 participants 5 messages Nov 16, 2018 – Feb 24, 2019

lore
Share & tools
lore
#0 lore raw

PATCH v2 1/1 gcc: Enable __cxa_atexit for final GCC

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

Cc Nicolas Cavallari <[email protected]>
Cc Thomas Petazzoni <[email protected]>
Cc Mark Corbin <[email protected]>
Cc Romain Naour <[email protected]>
Cc Peter Korsgaard <[email protected]>
Cc Bernd Kuhls <[email protected]>
Cc Claudiu Zissulescu <[email protected]>
Cc Cupertino Miranda <[email protected]>
Cc Vineet Gupta <[email protected]>

---

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(-)
package/gcc/gcc.mk +1 -1
index e47435677e..5901624ea5 100644
@@ -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 \
Signature · 1 line
2.16.2
#1 lore raw

PATCH v2 1/1 gcc: Enable __cxa_atexit for final GCC

Hello,

Quoted 3 lines · Alexey Brodkin

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

Signature · 3 lines
Thomas Petazzoni, CTO, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com
#2 lore raw

PATCH v2 1/1 gcc: Enable __cxa_atexit for final GCC

Hi Peter,

Quoted 11 lines · Thomas Petazzoni

Hello,

Quoted 3 lines · Alexey Brodkin

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 at lists.freedesktop.org/msg212440.html

#3 lore raw

PATCH v2 1/1 gcc: Enable __cxa_atexit for final GCC

Hello *,

Quoted 12 lines · Fabio Estevam

Hi Peter,

Quoted 8 lines · Thomas Petazzoni

Hello,

Quoted 3 lines · Alexey Brodkin

This is what GCC manual says [1]:
-------------------------->8---------------------- --enable-__cxa_atexit

Quoted 5 lines
Quoted 3 lines

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

Quoted 3 lines

The lack of this patch causes is causing issues on Mesa:
https://www.mail-archive.com/mesa-dev at 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

Quoted 4 lines

_______________________________________________
buildroot mailing list
buildroot at busybox.net
http://lists.busybox.net/mailman/listinfo/buildroot

#4 lore raw

PATCH v2 1/1 gcc: Enable __cxa_atexit for final GCC

In reply to Fabio Estevam
Quoted 13 lines
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line

"Fabio" == Fabio Estevam <[email protected]> writes:

Hi Peter,

Quoted 8 lines · Thomas Petazzoni

Hello,

Quoted 3 lines · Alexey Brodkin

This is what GCC manual says [1]:
-------------------------->8---------------------- --enable-__cxa_atexit

Quoted 8 lines
Quoted 3 lines

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 at lists.freedesktop.org/msg212440.html

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

Signature · 1 line
Bye, Peter Korsgaard