summaryrefslogtreecommitdiff
path: root/boehm-gc/dyn_load.c
diff options
context:
space:
mode:
authorhboehm <hboehm@138bc75d-0d04-0410-961f-82ee72b054a4>2003-03-04 22:18:08 +0000
committerhboehm <hboehm@138bc75d-0d04-0410-961f-82ee72b054a4>2003-03-04 22:18:08 +0000
commit83e80d47d1b31102f18d13d6ed0fe0f7887d4d6a (patch)
tree1d91feb234953cb7730e29e49af3ec28ecb7a656 /boehm-gc/dyn_load.c
parentc835a482e12c05467470842000c25c22681aa7bd (diff)
downloadlinaro-gcc-83e80d47d1b31102f18d13d6ed0fe0f7887d4d6a.tar.gz
linaro-gcc-83e80d47d1b31102f18d13d6ed0fe0f7887d4d6a.tar.bz2
linaro-gcc-83e80d47d1b31102f18d13d6ed0fe0f7887d4d6a.zip
2003-03-04 Hans Boehm <Hans.Boehm@hp.com>
* include/private/gcconfig.h (GC_data_start): declare when needed. * include/private/gc_priv.h: Include gcconfig.h after ptr_t declaration. * dyn_load.c (GC_register_dynamic_libraries_dl_iterate_phdr, GC_register_dynlib_callback): Register main data for static executable if dl_iterate_phdr() didn't. * misc.c (GC_init_inner): Call GC_init_linux_data_start() even if we don't expect to register main static data. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@63809 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'boehm-gc/dyn_load.c')
-rw-r--r--boehm-gc/dyn_load.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/boehm-gc/dyn_load.c b/boehm-gc/dyn_load.c
index f7b88f00dab..71ad5fb1d78 100644
--- a/boehm-gc/dyn_load.c
+++ b/boehm-gc/dyn_load.c
@@ -487,6 +487,7 @@ static int GC_register_dynlib_callback(info, size, ptr)
}
}
+ * (int *)ptr = 1; /* Signal that we were called */
return 0;
}
@@ -496,10 +497,17 @@ static int GC_register_dynlib_callback(info, size, ptr)
GC_bool GC_register_dynamic_libraries_dl_iterate_phdr()
{
- int tmp = 0;
-
if (dl_iterate_phdr) {
- dl_iterate_phdr(GC_register_dynlib_callback, &tmp);
+ int did_something = 0;
+ dl_iterate_phdr(GC_register_dynlib_callback, &did_something);
+ if (!did_something) {
+ /* dl_iterate_phdr may forget the static data segment in */
+ /* statically linked executables. */
+ GC_add_roots_inner(DATASTART, (char *)(DATAEND), TRUE);
+# if defined(DATASTART2)
+ GC_add_roots_inner(DATASTART2, (char *)(DATAEND2), TRUE);
+# endif
+ }
return TRUE;
} else {
return FALSE;