Hi there!
I'm having an library (libnsfb), this library can have several frontends,
also one that uses SDL... 
The library provides an macro to register an frontend just by writing a
line of code into the frontend source code file. 
Usually this function would be called by the C ctor (before main). 
This is the macro:     
#define NSFB_FRONTEND_DEF(__name, __type, __rtns)                       \
    static void __name##_register_frontend(void)
__attribute__((constructor)); \
    void __name##_register_frontend(void) {                              \
        _nsfb_register_frontend(__type, __rtns, #__name);               \
    printf("0registered frontend: " #__name "\n"); \
    }   
Here's how it is used: 
NSFB_FRONTEND_DEF( sdl, TYPE_SDL, somestruct) ;
Here's my example program that uses the lib:
#include <libnsfb.h>
int main(void)
{
  enum nsfb_frontend_e fetype;
/*sdl_register_frontend();*/
    fetype = nsfb_frontend_from_name("sdl");
    if (fetype == NSFB_FRONTEND_NONE) {
        printf("The %s frontend is not available from libnsfb\n", "sdl");
    }
	return (0); 
}
If I compile / link that - it tell's me that sdl frontend is not
available. 
If I uncomment sdl_register_frontend() the sdl frontend is registered
twice. It seems gcc is only adding it to ctor if it is already
referenced...
This is not an generic problem with the constructor attribute, I tested it
successfully with my own dummy/foobar lib. 
Has anyone an tip on how to force gcc to put this function into the CTOR? 
I tried to remove static / add volatile and -O0 - without success. 
There is an trick to make it compile correctly: use the
-Wl,--whole-archive flag, but Vincent told me to not use this flag ... :)
Anyone knowns an trick?
Greets,
Ole