diff options
author | Richard Earnshaw <rearnsha@arm.com> | 2001-12-13 14:24:03 +0000 |
---|---|---|
committer | Richard Earnshaw <rearnsha@gcc.gnu.org> | 2001-12-13 14:24:03 +0000 |
commit | 414e05cffba6eda254f91ea66e1edb04b55852a2 (patch) | |
tree | d02bbfaf0f7f2c12f79276ee2bd6883b939f8502 /gcc | |
parent | 3a79cccbde4a5af128debfc5f281d7a96946e10e (diff) | |
download | gcc-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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 19 | ||||
-rw-r--r-- | gcc/collect2.c | 13 | ||||
-rw-r--r-- | gcc/config/arm/netbsd.h | 4 | ||||
-rw-r--r-- | gcc/config/arm/t-netbsd | 19 | ||||
-rw-r--r-- | gcc/config/netbsd.h | 19 | ||||
-rw-r--r-- | gcc/doc/tm.texi | 18 |
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 |