* collect2.c (COLLECT_SHARED_INIT_FUNC)
authorRichard Earnshaw <rearnsha@arm.com>
Thu, 13 Dec 2001 14:24:03 +0000 (14:24 +0000)
committerRichard Earnshaw <rearnsha@gcc.gnu.org>
Thu, 13 Dec 2001 14:24:03 +0000 (14:24 +0000)
(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

gcc/ChangeLog
gcc/collect2.c
gcc/config/arm/netbsd.h
gcc/config/arm/t-netbsd
gcc/config/netbsd.h
gcc/doc/tm.texi

index 3861aadd7f3cc77c31cb62fe0b34c5067a1b7672..664087a4549c590428f250d69dbbd54ef2f10e98 100644 (file)
@@ -1,3 +1,22 @@
+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
index 19009e301809c6b9561cb252dda7a9ef4fcb49cb..4dd08f045b1644b9becb131167e7bd7a14140226 100644 (file)
@@ -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);
     }
 }
 
index 9684fdbada3511b971c62af5e5e033ea65a78199..74f32e805ea0aa9aa1d3fcbea2759aba28347cc5 100644 (file)
@@ -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
index 6c59cc9705bd0054ccc8423f4091aa30a89b780f..511b0151116c7d4826df678c0648cd85df8907fa 100644 (file)
@@ -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=
 
index b76e747c50c8a4889c75212fcc9b93a41504543f..35e671baacb8bcffefb5e8440e60a22652e97e47 100644 (file)
 #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
index 5e97e914926da2e0ed291cf7d1a7764cbabebb27..55d38ff1dd2ff63913734db51846d8e4ad97890c 100644 (file)
@@ -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