Isso funciona com o glibc 2.17, gcc 4.8.0 ou icc 13.1 ou icc 12.1:
icc -std=c99 -nostdlib -shared test.c -o /tmp/test
/* test.c */ #include #include int __attribute__((constructor)) x_init(void) { puts("init() works"); return 0; } int __attribute__((destructor)) x_fini(void) { puts("fini() works"); return 0; }
contra:
#include <dlfcn.h>
int
main(void)
{
void *foo = dlopen("/tmp/test", RTLD_LAZY);
if (dlclose(foo) < 0) {
return 1;
}
return 0;
}
Também testado com glibc 2.10, glibc 2.12. E todos os RTLD_*
flags.
Editar:
Usando um sistema Ubuntu real (gcc (Ubuntu / Linaro 4.7.2-2ubuntu1) 4.7.2), Biblioteca GNU C (Ubuntu EGLIBC 2.15-0ubuntu20), devo dizer que o código acima funciona lá também. Então, talvez, afinal, não é sobre o compilador e / ou glibc.