Subject: Re: Split crtbegin/crtend into more pieces
To: None <tech-userlevel@netbsd.org>
From: Jason R Thorpe <thorpej@wasabisystems.com>
List: tech-userlevel
Date: 11/21/2002 21:56:15
--rwEMma7ioTxnRzrJ
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
On Thu, Nov 21, 2002 at 06:35:55PM -0800, Jason R Thorpe wrote:
> These changes are mostly mechanical -- code which was already present
> in the various dot_init.h files was copied into crti.S and crtn.S for
> each architecture. Most of the dot_init.h files have been removed,
Actually, I ended up doing something much simpler, that required
a lot less code to change..
Attached is the final patch that I will be checking in.
--
-- Jason R. Thorpe <thorpej@wasabisystems.com>
--rwEMma7ioTxnRzrJ
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename=crtstuff-patch
Index: alpha/dot_init.h
===================================================================
RCS file: /cvsroot/basesrc/lib/csu/alpha/dot_init.h,v
retrieving revision 1.1
diff -c -r1.1 dot_init.h
*** alpha/dot_init.h 2001/05/11 22:44:14 1.1
--- alpha/dot_init.h 2002/11/22 05:45:11
***************
*** 77,79 ****
--- 77,88 ----
#define MD_INIT_SECTION_EPILOGUE MD_SECTION_EPILOGUE(.init)
#define MD_FINI_SECTION_EPILOGUE MD_SECTION_EPILOGUE(.fini)
+
+ /* We assume we need to reload our GP. */
+ #define MD_CALL_STATIC_FUNCTION(section, func) \
+ asm(".section " #section "\n" \
+ " br $29, 1f \n" \
+ "1: ldgp $29, 1f \n" \
+ " unop \n" \
+ " jsr $26, " #func "\n" \
+ " .align 3; .previous");
Index: common_elf/Makefile.inc
===================================================================
RCS file: /cvsroot/basesrc/lib/csu/common_elf/Makefile.inc,v
retrieving revision 1.18
diff -c -r1.18 Makefile.inc
*** common_elf/Makefile.inc 2002/08/19 09:41:27 1.18
--- common_elf/Makefile.inc 2002/11/22 05:45:11
***************
*** 18,24 ****
.PATH: ${.CURDIR}/../common_elf
! OBJS+= crt0.o gcrt0.o crtbegin.o crtend.o
.if ${MKPIC} != "no"
OBJS+= crtbeginS.o crtendS.o
COPTS+= -fPIC
--- 18,24 ----
.PATH: ${.CURDIR}/../common_elf
! OBJS+= crt0.o gcrt0.o crtbegin.o crtend.o crti.o crtn.o
.if ${MKPIC} != "no"
OBJS+= crtbeginS.o crtendS.o
COPTS+= -fPIC
***************
*** 59,64 ****
--- 59,76 ----
crtendS.o: crtend.c
@echo "${COMPILE.c} -DSHARED ${.ALLSRC} -o ${.TARGET}"
@${COMPILE.c} -DSHARED ${.ALLSRC} -o ${.TARGET}.o
+ @${LD} -X -r -o ${.TARGET} ${.TARGET}.o
+ @rm -f ${.TARGET}.o
+
+ crti.o: crti.c
+ @echo "${COMPILE.c} ${.ALLSRC} -o ${.TARGET}"
+ @${COMPILE.c} ${.ALLSRC} -o ${.TARGET}.o
+ @${LD} -X -r -o ${.TARGET} ${.TARGET}.o
+ @rm -f ${.TARGET}.o
+
+ crtn.o: crtn.c
+ @echo "${COMPILE.c} ${.ALLSRC} -o ${.TARGET}"
+ @${COMPILE.c} ${.ALLSRC} -o ${.TARGET}.o
@${LD} -X -r -o ${.TARGET} ${.TARGET}.o
@rm -f ${.TARGET}.o
Index: common_elf/crtbegin.c
===================================================================
RCS file: /cvsroot/basesrc/lib/csu/common_elf/crtbegin.c,v
retrieving revision 1.19
diff -c -r1.19 crtbegin.c
*** common_elf/crtbegin.c 2002/11/11 00:44:43 1.19
--- common_elf/crtbegin.c 2002/11/22 05:45:11
***************
*** 1,7 ****
/* $NetBSD: crtbegin.c,v 1.19 2002/11/11 00:44:43 thorpej Exp $ */
/*-
! * Copyright (c) 1998, 2001 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
--- 1,7 ----
/* $NetBSD: crtbegin.c,v 1.19 2002/11/11 00:44:43 thorpej Exp $ */
/*-
! * Copyright (c) 1998, 2001, 2002 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
***************
*** 94,112 ****
#endif
#endif
! static void __dtors(void);
! static void __ctors(void);
!
! INIT_FALLTHRU_DECL;
! FINI_FALLTHRU_DECL;
!
! extern void _init(void) __attribute__((section(".init")));
! extern void _fini(void) __attribute__((section(".fini")));
! static void __ctors(void) __attribute__((section(".init")));
! static void __dtors(void) __attribute__((section(".fini")));
static void
! __ctors()
{
unsigned long i = (unsigned long) __CTOR_LIST__[0];
void (**p)(void);
--- 94,116 ----
#endif
#endif
! #ifndef MD_CALL_STATIC_FUNCTION
! #if defined(__GNUC__)
! #define MD_CALL_STATIC_FUNCTION(section, func) \
! static void __attribute__((__unused__)) \
! __call_##func(void) \
! { \
! __asm __volatile (".section " #section); \
! func(); \
! __asm __volatile (".previous"); \
! }
! #else
! #error Need MD_CALL_STATIC_FUNCTION
! #endif
! #endif /* ! MD_CALL_STATIC_FUNCTION */
static void
! __ctors(void)
{
unsigned long i = (unsigned long) __CTOR_LIST__[0];
void (**p)(void);
***************
*** 122,128 ****
}
static void
! __dtors()
{
void (**p)(void) = __DTOR_LIST__ + 1;
--- 126,132 ----
}
static void
! __dtors(void)
{
void (**p)(void) = __DTOR_LIST__ + 1;
***************
*** 130,149 ****
(**p++)();
}
! void
! _init()
{
! static int initialized = 0;
#ifdef DWARF2_EH
#if defined(__GNUC__)
static struct dwarf2_eh_object object;
#endif /* __GNUC__ */
#endif /* DWARF2_EH */
- /*
- * Execute code in the .init sections
- */
- INIT_FALLTHRU();
if (!initialized) {
initialized = 1;
--- 134,149 ----
(**p++)();
}
! static void __attribute__((__unused__))
! __do_global_ctors_aux(void)
{
! static int initialized;
#ifdef DWARF2_EH
#if defined(__GNUC__)
static struct dwarf2_eh_object object;
#endif /* __GNUC__ */
#endif /* DWARF2_EH */
if (!initialized) {
initialized = 1;
***************
*** 165,174 ****
__ctors();
}
}
! void
! _fini()
{
#if defined(DSO_HANDLE) && defined(__GNUC__) && defined(SHARED)
/*
--- 165,179 ----
__ctors();
}
}
+ MD_CALL_STATIC_FUNCTION(.init, __do_global_ctors_aux)
! static void __attribute__((__unused__))
! __do_global_dtors_aux(void)
{
+ static int finished;
+
+ if (finished)
+ return;
#if defined(DSO_HANDLE) && defined(__GNUC__) && defined(SHARED)
/*
***************
*** 190,201 ****
#endif /* __GNUC__ */
#endif /* DWARF2_EH */
! /*
! * Execute code in the .fini sections
! */
! FINI_FALLTHRU();
}
!
! MD_INIT_SECTION_PROLOGUE;
!
! MD_FINI_SECTION_PROLOGUE;
--- 195,200 ----
#endif /* __GNUC__ */
#endif /* DWARF2_EH */
! finished = 1;
}
! MD_CALL_STATIC_FUNCTION(.fini, __do_global_dtors_aux)
Index: common_elf/crtend.c
===================================================================
RCS file: /cvsroot/basesrc/lib/csu/common_elf/crtend.c,v
retrieving revision 1.9
diff -c -r1.9 crtend.c
*** common_elf/crtend.c 2001/12/30 23:45:01 1.9
--- common_elf/crtend.c 2002/11/22 05:45:11
***************
*** 20,26 ****
static void *__JCR_END__[1]
__attribute__((__unused__, section(".jcr"))) = { (void *) 0 };
#endif
-
- MD_INIT_SECTION_EPILOGUE;
-
- MD_FINI_SECTION_EPILOGUE;
--- 20,22 ----
Index: common_elf/crti.c
===================================================================
RCS file: crti.c
diff -N crti.c
*** /dev/null Fri Nov 22 07:44:52 2002
--- crti.c Fri Nov 22 07:45:11 2002
***************
*** 0 ****
--- 1,67 ----
+ /* $NetBSD$ */
+
+ /*-
+ * Copyright (c) 1998, 2001, 2002 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Paul Kranenburg, Ross Harvey, and Jason R. Thorpe.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the NetBSD
+ * Foundation, Inc. and its contributors.
+ * 4. Neither the name of The NetBSD Foundation nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+ #include <sys/param.h> /* sysident.h requires `NetBSD' constant */
+ #include <sys/exec.h>
+ #include <sys/exec_elf.h>
+
+ #include "sysident.h"
+ #include "dot_init.h"
+
+ INIT_FALLTHRU_DECL;
+ FINI_FALLTHRU_DECL;
+
+ void _init(void);
+ void _fini(void);
+
+ void
+ _init(void)
+ {
+
+ INIT_FALLTHRU();
+ }
+
+ void
+ _fini(void)
+ {
+
+ FINI_FALLTHRU();
+ }
+
+ MD_INIT_SECTION_PROLOGUE;
+ MD_FINI_SECTION_PROLOGUE;
Index: common_elf/crtn.c
===================================================================
RCS file: crtn.c
diff -N crtn.c
*** /dev/null Fri Nov 22 07:44:52 2002
--- crtn.c Fri Nov 22 07:45:12 2002
***************
*** 0 ****
--- 1,42 ----
+ /* $NetBSD$ */
+
+ /*-
+ * Copyright (c) 1998, 2001, 2002 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Paul Kranenburg, Ross Harvey, and Jason R. Thorpe.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the NetBSD
+ * Foundation, Inc. and its contributors.
+ * 4. Neither the name of The NetBSD Foundation nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+ #include "dot_init.h"
+
+ MD_INIT_SECTION_EPILOGUE;
+ MD_FINI_SECTION_EPILOGUE;
Index: i386_elf/dot_init.h
===================================================================
RCS file: /cvsroot/basesrc/lib/csu/i386_elf/dot_init.h,v
retrieving revision 1.2
diff -c -r1.2 dot_init.h
*** i386_elf/dot_init.h 2002/01/14 12:06:49 1.2
--- i386_elf/dot_init.h 2002/11/22 05:45:12
***************
*** 67,69 ****
--- 67,72 ----
#define MD_INIT_SECTION_EPILOGUE MD_SECTION_EPILOGUE(.init)
#define MD_FINI_SECTION_EPILOGUE MD_SECTION_EPILOGUE(.fini)
+
+ #define MD_CALL_STATIC_FUNCTION(section, func) \
+ asm(".section " #section "; call " #func "; .previous");
Index: sh3_elf/dot_init.h
===================================================================
RCS file: /cvsroot/basesrc/lib/csu/sh3_elf/dot_init.h,v
retrieving revision 1.1
diff -c -r1.1 dot_init.h
*** sh3_elf/dot_init.h 2001/07/23 20:43:31 1.1
--- sh3_elf/dot_init.h 2002/11/22 05:45:12
***************
*** 73,75 ****
--- 73,89 ----
#define MD_INIT_SECTION_EPILOGUE MD_SECTION_EPILOGUE(.init)
#define MD_FINI_SECTION_EPILOGUE MD_SECTION_EPILOGUE(.fini)
+
+ /*
+ * We need to put the function pointer in our own constant
+ * pool (otherwise it might be too far away to reference).
+ */
+ #define MD_CALL_STATIC_FUNCTION(section, func) \
+ asm(".section " #section "\n" \
+ " mov.l 1f, r1 \n" \
+ " mova 2f, r0 \n" \
+ " braf r1 \n" \
+ " lds r0, pr \n" \
+ "0: .p2align 2 \n" \
+ "1: .long " #func " - 0b \n" \
+ "2: .previous");
Index: x86_64/dot_init.h
===================================================================
RCS file: /cvsroot/basesrc/lib/csu/x86_64/dot_init.h,v
retrieving revision 1.1
diff -c -r1.1 dot_init.h
*** x86_64/dot_init.h 2002/06/06 19:18:22 1.1
--- x86_64/dot_init.h 2002/11/22 05:45:12
***************
*** 67,69 ****
--- 67,72 ----
#define MD_INIT_SECTION_EPILOGUE MD_SECTION_EPILOGUE(.init)
#define MD_FINI_SECTION_EPILOGUE MD_SECTION_EPILOGUE(.fini)
+
+ #define MD_CALL_STATIC_FUNCTION(section, func) \
+ asm(".section " #section "; call " #func "; .previous");
--rwEMma7ioTxnRzrJ--