|
|
Message-ID: <5479702.eSrS0Tqozu@main.pennware.com>
Date: Thu, 14 Jun 2012 06:01:45 -0500
From: Richard Pennington <rich@...nware.com>
To: musl@...ts.openwall.com
Subject: Timing of destructors?
Hi,
I have a small test program:
#include <stdio.h>
#include <stdlib.h>
void before(void) __attribute__((constructor));
void before(void)
{
printf("before\n");
}
void after(void) __attribute__((destructor));
void after(void)
{
printf("after\n");
}
int main()
{
printf("hello world\n");
}
which doesn't print "after". This is because stdio is cleaned up before
destructors are called in exit.c. Using stdio in destructors can be handy for
debugging (if nothing else). Would it be evil to modify exit.c to look like
this?:
void exit(int code)
{
static int lock;
/* If more than one thread calls exit, hang until _Exit ends it all */
while (a_swap(&lock, 1)) __syscall(SYS_pause);
/* Destructor s**t is kept separate from atexit to avoid bloat */
if (libc.fini) libc.fini();
if (libc.ldso_fini) libc.ldso_fini();
/* Only do atexit & stdio flush if they were actually used */
__funcs_on_exit();
__fflush_on_exit();
_Exit(code);
for(;;);
}
The change is to move the *_on_exit() calls to after the destructors have been
called.
-Rich
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.