Mail Archives: cygwin/2003/03/19/06:24:35
Does Cygwin support initialization and cleanup for libraries loaded
dynamically via dlopen() in a way similar to Linux and Solaris? If
yes, how can I get it to work? I attached a simple test case below,
with comments telling how to compile/link. The output under cygwin
is:
calculating
doubled in library: 2.468000
So it basically works, but neither _init() nor _fini() get
executed. Under Solaris the output is:
initializing
calculating
doubled in library: 2.468000
finishing
(There I link with "ld -Bshareable mylib.o -o libmylib.dll" and "gcc
-Wall -o caller caller.c -ldl".) Solaris declares _init and _fini in
<sys/modctl.h> (actually returning int), which does not exists in my
cygwin installation, but I'm not sure this is enough to conclude that
it's unsupported. I didn't find help in the documentation or
mail-archives. -- Daniel
/* mylib.c
gcc -Wall -c mylib.c
gcc -shared -Wl,--export-all mylib.o -o libmylib.dll
*/
#include <stdio.h>
double dub(double in1) {printf("calculating\n");return 2*in1;}
void _init() {printf("initializing\n");}
void _fini() {printf("finishing\n");}
/* caller.c
gcc -Wall -o caller caller.c
./caller
*/
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>
int main() {
void *handle;
double (*pdub)(double);
char *error;
handle = dlopen("./libmylib.dll",RTLD_LAZY);
if(!handle) {fprintf(stderr,"%s\n",dlerror()); exit(1);}
pdub =dlsym(handle,"dub");
if((error = dlerror())!=NULL) {fprintf(stderr,"%s\n",error); exit(1);}
printf("doubled in library: %f\n",(*pdub)(1.234));
dlclose(handle);
return 0;
}
--
Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
Bug reporting: http://cygwin.com/bugs.html
Documentation: http://cygwin.com/docs.html
FAQ: http://cygwin.com/faq/
- Raw text -