extern int f1 (void **); extern void f2 (void *); struct s { unsigned char field1; int field2; }; static inline struct s * get_globals (void) { struct s * r; void * rr; if (f1 (&rr)) return 0; r = rr; if (! r) { extern struct s t; r = &t; } r->field1 = 1; return r; } void atexit_common (const void *dso) { struct s *g = get_globals (); if (! g) return; if (g->field1) { g->field2 = 0; f2 (g); } else f2 (g); }