aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Earnshaw <rearnsha@arm.com>2001-12-13 14:24:03 +0000
committerRichard Earnshaw <rearnsha@gcc.gnu.org>2001-12-13 14:24:03 +0000
commit414e05cffba6eda254f91ea66e1edb04b55852a2 (patch)
treed02bbfaf0f7f2c12f79276ee2bd6883b939f8502
parent3a79cccbde4a5af128debfc5f281d7a96946e10e (diff)
downloadgcc-414e05cffba6eda254f91ea66e1edb04b55852a2.zip
gcc-414e05cffba6eda254f91ea66e1edb04b55852a2.tar.gz
gcc-414e05cffba6eda254f91ea66e1edb04b55852a2.tar.bz2
* collect2.c (COLLECT_SHARED_INIT_FUNC)
(COLLECT_SHARD_FINI_FUNC): Define default values. (write_c_file_stat): Use them to call construtor and destructor functions in shared libraries. * doc/tm.texi (COLLECT_SHARED_INIT_FUNC) (COLLECT_SHARD_FINI_FUNC): Document them. * config/netbsd.h (COLLECT_SHARED_INIT_FUNC) (COLLECT_SHARD_FINI_FUNC): Define. * config/netbsd.h (LINK_SPEC): Don't pull in estart if creating a shared library. Pass -shared through to the linker. * config/arm/netbsd.h (LINK_SPEC): Likewise. * config/arm/t-netbsd (TARGET_LIBGCC2_CFLAGS): Add -fpic. (SHLIB_EXT, SHLIB_NAME, SHLIB_SONAME, SHLIB_OBJS, SHLIB_LINK) (SHLIB_INSTALL): Define. From-SVN: r47975
-rw-r--r--gcc/ChangeLog19
-rw-r--r--gcc/collect2.c13
-rw-r--r--gcc/config/arm/netbsd.h4
-rw-r--r--gcc/config/arm/t-netbsd19
-rw-r--r--gcc/config/netbsd.h19
-rw-r--r--gcc/doc/tm.texi18
6 files changed, 85 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 3861aad..664087a 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,24 @@
2001-12-13 Richard Earnshaw <rearnsha@arm.com>
+ * collect2.c (COLLECT_SHARED_INIT_FUNC)
+ (COLLECT_SHARD_FINI_FUNC): Define default values.
+ (write_c_file_stat): Use them to call construtor and destructor
+ functions in shared libraries.
+ * doc/tm.texi (COLLECT_SHARED_INIT_FUNC)
+ (COLLECT_SHARD_FINI_FUNC): Document them.
+ * config/netbsd.h (COLLECT_SHARED_INIT_FUNC)
+ (COLLECT_SHARD_FINI_FUNC): Define.
+
+ * config/netbsd.h (LINK_SPEC): Don't pull in estart if creating a
+ shared library. Pass -shared through to the linker.
+ * config/arm/netbsd.h (LINK_SPEC): Likewise.
+
+ * config/arm/t-netbsd (TARGET_LIBGCC2_CFLAGS): Add -fpic.
+ (SHLIB_EXT, SHLIB_NAME, SHLIB_SONAME, SHLIB_OBJS, SHLIB_LINK)
+ (SHLIB_INSTALL): Define.
+
+2001-12-13 Richard Earnshaw <rearnsha@arm.com>
+
* arm.c (legitimize_pic_address): Handle LABEL_REFs in substantially
the same way as we handle SYMBOL_REFS.
diff --git a/gcc/collect2.c b/gcc/collect2.c
index 19009e3..4dd08f0 100644
--- a/gcc/collect2.c
+++ b/gcc/collect2.c
@@ -154,6 +154,15 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
/* This must match tree.h. */
#define DEFAULT_INIT_PRIORITY 65535
+#ifndef COLLECT_SHARED_INIT_FUNC
+#define COLLECT_SHARED_INIT_FUNC(STREAM, FUNC) \
+ fprintf ((STREAM), "void _GLOBAL__DI() {\n\t%s();\n}\n", (FUNC))
+#endif
+#ifndef COLLECT_SHARED_FINI_FUNC
+#define COLLECT_SHARED_FINI_FUNC(STREAM, FUNC) \
+ fprintf ((STREAM), "void _GLOBAL__DD() {\n\t%s();\n}\n", (FUNC))
+#endif
+
#if defined (LDD_SUFFIX) || SUNOS4_SHARED_LIBRARIES
#define SCAN_LIBRARIES
#endif
@@ -1944,8 +1953,8 @@ write_c_file_stat (stream, name)
if (shared_obj)
{
- fprintf (stream, "void _GLOBAL__DI() {\n\t%s();\n}\n", initname);
- fprintf (stream, "void _GLOBAL__DD() {\n\t%s();\n}\n", fininame);
+ COLLECT_SHARED_INIT_FUNC(stream, initname);
+ COLLECT_SHARED_FINI_FUNC(stream, fininame);
}
}
diff --git a/gcc/config/arm/netbsd.h b/gcc/config/arm/netbsd.h
index 9684fdb..74f32e8 100644
--- a/gcc/config/arm/netbsd.h
+++ b/gcc/config/arm/netbsd.h
@@ -67,8 +67,8 @@ Boston, MA 02111-1307, USA. */
/* Pass -X to the linker so that it will strip symbols starting with 'L' */
#undef LINK_SPEC
#define LINK_SPEC "\
--X %{!nostdlib:%{!r*:%{!e*:-e start}}} -dc -dp %{R*} \
-%{static:-Bstatic} %{assert*} \
+-X %{!shared:%{!nostdlib:%{!r*:%{!e*:-e start}}} -dc -dp %{R*} \
+%{static:-Bstatic}} %{shared} %{assert*} \
"
#undef SIZE_TYPE
diff --git a/gcc/config/arm/t-netbsd b/gcc/config/arm/t-netbsd
index 6c59cc9..511b015 100644
--- a/gcc/config/arm/t-netbsd
+++ b/gcc/config/arm/t-netbsd
@@ -1,8 +1,25 @@
# Just for these, we omit the frame pointer since it makes such a big
# difference. It is then pointless adding debugging.
-TARGET_LIBGCC2_CFLAGS = -fomit-frame-pointer
+TARGET_LIBGCC2_CFLAGS = -fomit-frame-pointer -fpic
LIBGCC2_DEBUG_CFLAGS = -g0
+# Build a shared libgcc library.
+SHLIB_EXT = .so
+SHLIB_NAME = @shlib_base_name@.so
+SHLIB_SONAME = @shlib_base_name@.so.1
+SHLIB_OBJS = @shlib_objs@
+
+SHLIB_LINK = $(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) -shared -nodefaultlibs \
+ -Wl,-soname,$(SHLIB_SONAME) \
+ -o $(SHLIB_NAME) @multilib_flags@ $(SHLIB_OBJS) -lc && \
+ rm -f $(SHLIB_SONAME) && \
+ $(LN_S) $(SHLIB_NAME) $(SHLIB_SONAME)
+# $(slibdir) double quoted to protect it from expansion while building
+# libgcc.mk. We want this delayed until actual install time.
+SHLIB_INSTALL = $(INSTALL_DATA) $(SHLIB_NAME) $$(slibdir)/$(SHLIB_SONAME); \
+ rm -f $$(slibdir)/$(SHLIB_NAME); \
+ $(LN_S) $(SHLIB_SONAME) $$(slibdir)/$(SHLIB_NAME)
+
# Don't build enquire
ENQUIRE=
diff --git a/gcc/config/netbsd.h b/gcc/config/netbsd.h
index b76e747..35e671b 100644
--- a/gcc/config/netbsd.h
+++ b/gcc/config/netbsd.h
@@ -54,11 +54,26 @@
#define LIB_SPEC "%{!p:%{!pg:-lc}}%{p:-lc_p}%{pg:-lc_p}"
/* Provide a LINK_SPEC appropriate for NetBSD. Here we provide support
- for the special GCC options -static, -assert, and -nostdlib. */
+ for the special GCC options -shared, -static, -assert, and -nostdlib. */
#undef LINK_SPEC
#define LINK_SPEC \
- "%{!nostdlib:%{!r*:%{!e*:-e start}}} -dc -dp %{R*} %{static:-Bstatic} %{assert*}"
+ "%{!shared:%{!nostdlib:%{!r*:%{!e*:-e start}}} -dc -dp %{R*} %{static:-Bstatic}} %{shared} %{assert*}"
+
+/* When building shared libraries, the initialization and finalization
+ functions for the library are .init and .fini respectively. */
+
+#define COLLECT_SHARED_INIT_FUNC(STREAM,FUNC) \
+ do { \
+ fprintf ((STREAM), "void __init() __asm__ (\".init\");"); \
+ fprintf ((STREAM), "void __init() {\n\t%s();\n}\n", (FUNC)); \
+ } while (0);
+
+#define COLLECT_SHARED_FINI_FUNC(STREAM,FUNC) \
+ do { \
+ fprintf ((STREAM), "void __fini() __asm__ (\".fini\");"); \
+ fprintf ((STREAM), "void __fini() {\n\t%s();\n}\n", (FUNC)); \
+ } while (0);
/* This defines which switch letters take arguments. */
#undef SWITCH_TAKES_ARG
diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi
index 5e97e91..55d38ff 100644
--- a/gcc/doc/tm.texi
+++ b/gcc/doc/tm.texi
@@ -6638,6 +6638,24 @@ the following symbol is an initialization routine.
If defined, a C string constant for a switch that tells the linker that
the following symbol is a finalization routine.
+@item COLLECT_SHARED_INIT_FUNC (@var{stream}, @var{func})
+If defined, a C statement that will write a function that can be
+automatically called when a shared library is loaded. The function
+should call @var{func}, which takes no arguments. If not defined, and
+the object format requires an explicit initialization function, then a
+function called @var{_GLOBAL__DI} will be generated.
+
+This function and the following one are used by collect2 when linking a
+shared library that needs constructors or destructors, or has DWARF2
+exception tables embedded in the code.
+
+@item COLLECT_SHARED_FINI_FUNC (@var{stream}, @var{func})
+If defined, a C statement that will write a function that can be
+automatically called when a shared library is unloaded. The function
+should call @var{func}, which takes no arguments. If not defined, and
+the object format requires an explicit finalization function, then a
+function called @var{_GLOBAL__DD} will be generated.
+
@item INVOKE__main
@findex INVOKE__main
If defined, @code{main} will call @code{__main} despite the presence of