aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans Boehm <Hans_Boehm@hp.com>2003-03-04 22:18:08 +0000
committerHans Boehm <hboehm@gcc.gnu.org>2003-03-04 22:18:08 +0000
commitc62b90642287de048ac1735adeb210e3b78ff874 (patch)
tree1d91feb234953cb7730e29e49af3ec28ecb7a656
parent65ebbf81604b9234703aaa0bbe332e8d5301945c (diff)
downloadgcc-c62b90642287de048ac1735adeb210e3b78ff874.zip
gcc-c62b90642287de048ac1735adeb210e3b78ff874.tar.gz
gcc-c62b90642287de048ac1735adeb210e3b78ff874.tar.bz2
gcconfig.h (GC_data_start): declare when needed.
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. From-SVN: r63809
-rw-r--r--boehm-gc/ChangeLog10
-rw-r--r--boehm-gc/dyn_load.c14
-rw-r--r--boehm-gc/include/private/gc_priv.h8
-rw-r--r--boehm-gc/include/private/gcconfig.h4
-rw-r--r--boehm-gc/misc.c2
5 files changed, 30 insertions, 8 deletions
diff --git a/boehm-gc/ChangeLog b/boehm-gc/ChangeLog
index a33943e..c653979 100644
--- a/boehm-gc/ChangeLog
+++ b/boehm-gc/ChangeLog
@@ -1,3 +1,13 @@
+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.
+
2003-03-03 Hans Boehm <Hans.Boehm@hp.com>
* mark_rts.c (GC_cond_register_dynamic_libraries): add.
(GC_push_roots): explicitly mark free list headers, register
diff --git a/boehm-gc/dyn_load.c b/boehm-gc/dyn_load.c
index f7b88f0..71ad5fb 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;
diff --git a/boehm-gc/include/private/gc_priv.h b/boehm-gc/include/private/gc_priv.h
index dac604f..b09c484 100644
--- a/boehm-gc/include/private/gc_priv.h
+++ b/boehm-gc/include/private/gc_priv.h
@@ -44,10 +44,6 @@
# include "../gc_mark.h"
# endif
-# ifndef GCCONFIG_H
-# include "gcconfig.h"
-# endif
-
typedef GC_word word;
typedef GC_signed_word signed_word;
@@ -60,6 +56,10 @@ typedef char * ptr_t; /* A generic pointer to which we can add */
/* Preferably identical to caddr_t, if it */
/* exists. */
+# ifndef GCCONFIG_H
+# include "gcconfig.h"
+# endif
+
# ifndef HEADERS_H
# include "gc_hdrs.h"
# endif
diff --git a/boehm-gc/include/private/gcconfig.h b/boehm-gc/include/private/gcconfig.h
index af0d2e4..51d9de0 100644
--- a/boehm-gc/include/private/gcconfig.h
+++ b/boehm-gc/include/private/gcconfig.h
@@ -1810,6 +1810,10 @@
/* platforms as well, though it should be avoided in win32. */
# endif /* LINUX */
+# if defined(SEARCH_FOR_DATA_START) && defined(GC_PRIVATE_H)
+ extern ptr_t GC_data_start;
+# endif
+
# ifndef CLEAR_DOUBLE
# define CLEAR_DOUBLE(x) \
((word*)x)[0] = 0; \
diff --git a/boehm-gc/misc.c b/boehm-gc/misc.c
index 891cdc7..8f83ff3a 100644
--- a/boehm-gc/misc.c
+++ b/boehm-gc/misc.c
@@ -580,7 +580,7 @@ void GC_init_inner()
GC_init_win32();
# endif
# if defined(SEARCH_FOR_DATA_START)
- if (GC_REGISTER_MAIN_STATIC_DATA()) GC_init_linux_data_start();
+ GC_init_linux_data_start();
# endif
# if (defined(NETBSD) || defined(OPENBSD)) && defined(__ELF__)
GC_init_netbsd_elf();