From 414e05cffba6eda254f91ea66e1edb04b55852a2 Mon Sep 17 00:00:00 2001 From: Richard Earnshaw Date: Thu, 13 Dec 2001 14:24:03 +0000 Subject: [PATCH] * 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 --- gcc/ChangeLog | 19 +++++++++++++++++++ gcc/collect2.c | 13 +++++++++++-- gcc/config/arm/netbsd.h | 4 ++-- gcc/config/arm/t-netbsd | 19 ++++++++++++++++++- gcc/config/netbsd.h | 19 +++++++++++++++++-- gcc/doc/tm.texi | 18 ++++++++++++++++++ 6 files changed, 85 insertions(+), 7 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3861aadd7f3..664087a4549 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,22 @@ +2001-12-13 Richard Earnshaw + + * 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 * arm.c (legitimize_pic_address): Handle LABEL_REFs in substantially diff --git a/gcc/collect2.c b/gcc/collect2.c index 19009e30180..4dd08f045b1 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 9684fdbada3..74f32e805ea 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 6c59cc9705b..511b0151116 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 b76e747c50c..35e671baacb 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 5e97e914926..55d38ff1dd2 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 -- 2.30.2