From 8b69d04fff8366b25e41c71f3aa8f2009f7748a2 Mon Sep 17 00:00:00 2001 From: Ben Gras Date: Mon, 15 Aug 2011 17:25:44 +0000 Subject: [PATCH] csu: add code to call constructors to be used by clang . clang-linked binaries were not calling global constructors, as the code to do so wasn't in csu/ and linked . it does work for gcc as it uses its self-supplied crt{begin,end} code . this commit copies netbsd's crt{begin,end}.S, which contains constructor/destructor calling code, called from .init and .fini sections already accumulated by the linker. the _init function was already called by the C startup code before calling main. . based on work by Antoine Leca --- lib/csu/i386-elf/Makefile | 2 +- lib/csu/i386-elf/crtbegin.S | 174 ++++++++++++++++++++++++++++++++++++ lib/csu/i386-elf/crtend.S | 52 +++++++++++ 3 files changed, 227 insertions(+), 1 deletion(-) create mode 100644 lib/csu/i386-elf/crtbegin.S create mode 100644 lib/csu/i386-elf/crtend.S diff --git a/lib/csu/i386-elf/Makefile b/lib/csu/i386-elf/Makefile index 54a645dc4..54abd0007 100644 --- a/lib/csu/i386-elf/Makefile +++ b/lib/csu/i386-elf/Makefile @@ -1,6 +1,6 @@ .include -SRCS= crti.S crtn.S +SRCS= crti.S crtn.S crtbegin.S crtend.S OBJS= ${SRCS:N*.h:R:S/$/.o/g} gcrt1.o crt1.o Scrt1.o realall: ${OBJS} diff --git a/lib/csu/i386-elf/crtbegin.S b/lib/csu/i386-elf/crtbegin.S new file mode 100644 index 000000000..0f44ed264 --- /dev/null +++ b/lib/csu/i386-elf/crtbegin.S @@ -0,0 +1,174 @@ +/* $NetBSD: crtbegin.S,v 1.1 2010/08/07 18:01:33 joerg Exp $ */ +/*- + * Copyright (c) 2010 Joerg Sonnenberger + * All rights reserved. + * + * 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. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 + * COPYRIGHT HOLDERS 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 + +RCSID("$NetBSD: crtbegin.S,v 1.1 2010/08/07 18:01:33 joerg Exp $") + + .section .ctors, "aw", @progbits + .align 4 +__CTOR_LIST__: + .long -1 + + .section .dtors, "aw", @progbits + .align 4 +__DTOR_LIST__: + .long -1 + + .section .eh_frame, "a", @progbits + .align 4 +__EH_FRAME_LIST__: + + .section .jcr, "aw", @progbits + .align 4 +__JCR_LIST__: + + .section .data.rel, "aw", @progbits + .align 4 + .type __dso_handle, @object + .size __dso_handle, 4 + .globl __dso_handle + .hidden __dso_handle +__dso_handle: +#ifdef SHARED + .long __dso_handle +#else + .long 0 +#endif + +__dwarf_eh_object: + .zero 32 + +__initialized: + .zero 1 +__finished: + .zero 1 + + .text + .weak __cxa_finalize + .weak __deregister_frame_info + .weak __register_frame_info + .weak _Jv_RegisterClasses + +__get_thunk: + movl (%esp), %ebx + ret + +__do_global_dtors_aux: + pushl %ebx + pushl %edi + subl $8, %esp + call __get_thunk + addl $_GLOBAL_OFFSET_TABLE_, %ebx + + cmpb $0, __finished@GOTOFF(%ebx) + jne 4f + movb $1, __finished@GOTOFF(%ebx) + +#ifdef SHARED + cmpl $0, __cxa_finalize@GOT(%ebx) + je 1f + movl __dso_handle@GOTOFF(%ebx), %eax + movl %eax, (%esp) + call __cxa_finalize@PLT +1: +#endif + + leal 4+__DTOR_LIST__@GOTOFF(%ebx), %edi +2: + movl (%edi), %eax + testl %eax, %eax + je 3f + call *%eax + addl $8, %edi + jmp 2b +3: + + cmpl $0, __deregister_frame_info@GOT(%ebx) + je 4f + leal __EH_FRAME_LIST__@GOTOFF(%ebx), %eax + movl %eax, (%esp) + call __deregister_frame_info@PLT +4: + addl $8, %esp + popl %edi + popl %ebx + ret + + +__do_global_ctors_aux: + pushl %ebx + pushl %edi + subl $8, %esp + call __get_thunk + addl $_GLOBAL_OFFSET_TABLE_, %ebx + + cmpb $0, __initialized@GOTOFF(%ebx) + jne 4f + movb $1, __initialized@GOTOFF(%ebx) + + cmpl $0, __register_frame_info@GOT(%ebx) + je 1f + leal __dwarf_eh_object@GOTOFF(%ebx), %edi + movl %edi, 4(%esp) + leal __EH_FRAME_LIST__@GOTOFF(%ebx), %edi + movl %edi, (%esp) + call __register_frame_info@PLT + +1: + cmpl $0, _Jv_RegisterClasses@GOT(%ebx) + je 2f + leal __JCR_LIST__@GOTOFF(%ebx), %edi + movl (%edi), %edi + testl %edi, %edi + je 2f + movl %edi, (%esp) + call _Jv_RegisterClasses@PLT +2: + + leal -4+__CTOR_LIST_END__@GOTOFF(%ebx), %edi +3: + movl (%edi), %eax + cmpl $-1, %eax + je 4f + call *%eax + subl $4, %edi + jmp 3b + +4: + addl $8, %esp + popl %edi + popl %ebx + ret + + .section .init, "ax", @progbits + call __do_global_ctors_aux + .section .fini, "ax", @progbits + call __do_global_dtors_aux diff --git a/lib/csu/i386-elf/crtend.S b/lib/csu/i386-elf/crtend.S new file mode 100644 index 000000000..adef13d07 --- /dev/null +++ b/lib/csu/i386-elf/crtend.S @@ -0,0 +1,52 @@ +/* $NetBSD: crtend.S,v 1.1 2010/08/07 18:01:33 joerg Exp $ */ +/*- + * Copyright (c) 2010 Joerg Sonnenberger + * All rights reserved. + * + * 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. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 + * COPYRIGHT HOLDERS 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 + +RCSID("$NetBSD: crtend.S,v 1.1 2010/08/07 18:01:33 joerg Exp $") + + .section .ctors, "aw", @progbits + .align 4 + .global __CTOR_LIST_END__ + .hidden __CTOR_LIST_END__ +__CTOR_LIST_END__: + .long 0 + + .section .dtors, "aw", @progbits + .align 4 + .long 0 + + .section .eh_frame, "a", @progbits + .align 4 + .long 0 + + .section .jcr, "aw", @progbits + .align 4 + .long 0 -- 2.44.0