From 51fecd257a3a6aade53e635fe9d174478255f3d9 Mon Sep 17 00:00:00 2001 From: Eric Andersen Date: Fri, 27 Jun 2003 11:45:12 +0000 Subject: Run dlopened ctors and dtors in the correct order --- ldso/libdl/dlib.c | 12 ++++++++---- ldso/libdl/libdl.c | 12 ++++++++---- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/ldso/libdl/dlib.c b/ldso/libdl/dlib.c index 999139538..c2949c981 100644 --- a/ldso/libdl/dlib.c +++ b/ldso/libdl/dlib.c @@ -181,7 +181,7 @@ void *_dlopen(const char *libname, int flag) //tpnt->libtype = loaded_file; dyn_chain = rpnt = (struct dyn_elf *) malloc(sizeof(struct dyn_elf)); - _dl_memset(rpnt, 0, sizeof(*rpnt)); + _dl_memset(rpnt, 0, sizeof(struct dyn_elf)); rpnt->dyn = tpnt; rpnt->flags = flag; if (!tpnt->symbol_scope) @@ -213,7 +213,7 @@ void *_dlopen(const char *libname, int flag) goto oops; rpnt->next = (struct dyn_elf *) malloc(sizeof(struct dyn_elf)); - _dl_memset (rpnt->next, 0, sizeof (*(rpnt->next))); + _dl_memset (rpnt->next, 0, sizeof (struct dyn_elf)); rpnt = rpnt->next; if (!tpnt1->symbol_scope) tpnt1->symbol_scope = dyn_chain; rpnt->dyn = tpnt1; @@ -254,8 +254,12 @@ void *_dlopen(const char *libname, int flag) } #ifdef __PIC__ - for (rpnt = dyn_chain; rpnt; rpnt = rpnt->next) { - tpnt = rpnt->dyn; + /* Find the last library */ + for (tpnt = dyn_chain->dyn; tpnt->next!=NULL; tpnt = tpnt->next) + ; + /* Run the ctors and set up the dtors */ + for (; tpnt != dyn_chain->dyn->prev; tpnt=tpnt->prev) + { /* Apparently crt1 for the application is responsible for handling this. * We only need to run the init/fini for shared libraries */ diff --git a/ldso/libdl/libdl.c b/ldso/libdl/libdl.c index 999139538..c2949c981 100644 --- a/ldso/libdl/libdl.c +++ b/ldso/libdl/libdl.c @@ -181,7 +181,7 @@ void *_dlopen(const char *libname, int flag) //tpnt->libtype = loaded_file; dyn_chain = rpnt = (struct dyn_elf *) malloc(sizeof(struct dyn_elf)); - _dl_memset(rpnt, 0, sizeof(*rpnt)); + _dl_memset(rpnt, 0, sizeof(struct dyn_elf)); rpnt->dyn = tpnt; rpnt->flags = flag; if (!tpnt->symbol_scope) @@ -213,7 +213,7 @@ void *_dlopen(const char *libname, int flag) goto oops; rpnt->next = (struct dyn_elf *) malloc(sizeof(struct dyn_elf)); - _dl_memset (rpnt->next, 0, sizeof (*(rpnt->next))); + _dl_memset (rpnt->next, 0, sizeof (struct dyn_elf)); rpnt = rpnt->next; if (!tpnt1->symbol_scope) tpnt1->symbol_scope = dyn_chain; rpnt->dyn = tpnt1; @@ -254,8 +254,12 @@ void *_dlopen(const char *libname, int flag) } #ifdef __PIC__ - for (rpnt = dyn_chain; rpnt; rpnt = rpnt->next) { - tpnt = rpnt->dyn; + /* Find the last library */ + for (tpnt = dyn_chain->dyn; tpnt->next!=NULL; tpnt = tpnt->next) + ; + /* Run the ctors and set up the dtors */ + for (; tpnt != dyn_chain->dyn->prev; tpnt=tpnt->prev) + { /* Apparently crt1 for the application is responsible for handling this. * We only need to run the init/fini for shared libraries */ -- cgit v1.2.3