tech-toolchain archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

lib/csu and compilers other than GCC



Hi all,
I was recently asked to review some issues in the crtbegin/crtend code.
The code is the old BSD licensed implemention used for example by PCC.
This was latter rewritten and ultimately retired and replaced by the
crtstuff.c derived version from GCC.

The version shipped with PCC can't be used to correctly create programs
that intermix C++ code. The version in lib/csu and GCC's crtstuff.c both
depend quite a bit on compiler internals. This made me consider just
going directly for assembler. Attached is a sample implementation for
i386 and amd64 as well as an overview what is going on for someone
extending it to a new platform.

Would it be reasonable to move to assembler versions for this files?
This could be done per architecture by proper conditionals in
src/lib/csu and the corresponding PCC/GCC directories.

On a related note: Do we want to continue keeping the a.out support
around or can it be moved into the Attic? It would clean up src/lib/csu
quite a bit as only one directory per architecture would remain that
way.

Joerg
The common runtime support contains of two modules, crtbegin and crtend.
crtbegin is linked before all other object files of the program or
dynamic library, crtend after all other object files.  They frame the
lists of constructors, destructors, Java types and exception handling frames.

If done correctly, crtend contains no code and is therefore position
independent.  For compatibility, crtendS.o is still needed.

crtbegin should be position-independent code.  crtbeginT.o doesn't have
to be PIC as it is statically linked.  The overhead is generally not
worth the trouble though.


Section types:
.ctor: writeable
.dtor: writeable
.eh_frame: read-only if platform allows mixing ro and rw
.jcr: writeable
.init: executable
.fini: executable


Non-local symbols:

Weak references:
- _Jv_RegisterClasses,
- __cxa_finalize (crtbeginS.o)
- __deregister_frame_info
- __register_frame_info

Hidden:
- __dso_handle: pointer to self for crtbeginS.o, NULL otherwise.
- __CTOR_LIST_END__


Initialisation (called from .init):

1.  Check that the init code hasn't started already, otherwise bail out.
2.  If __register_frame_info is NULL, skip to 4
3.  Call __register_frame_info with start of .eh_frame as first argument
    and a data object of at least 8 pointers as second argument.
4:  If _Jv_RegisterClasses is NULL, skip to 6
5:  Call _Jv_RegisterClasses with the first pointer of the .jcr section
    as argument.
6:  Iterate from the end of the .ctor section to the start.  Skip the
    terminating NULL and stop when reaching the starting (void *)-1 element.
    Call the pointers as void (*)(void) functions.


Deinitialisation (called from .fini):

1.  Check if the init code has already started, otherwise bail out.
2.  If this is not crtbeginS.o or __cxa_finalize is NULL, skip to 4.
3.  Call __cxa_finalize with a pointer into this DSO as first argument.
4.  Iterate from the start of the .dtor section to the send.  Skip the
    initial (void *)-1 and stop when reaching the terminating NULL element.
    Call the pointers as void (*)(void) functions.
5.  If __deregister_frame_info is NULL, return.
6.  Call __deregister_frame_info with the start of .eh_frame as argument.
/*-
 * Copyright (c) 2010 Joerg Sonnenberger <joerg%NetBSD.org@localhost>
 * 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.
 */

        .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
/*-
 * Copyright (c) 2010 Joerg Sonnenberger <joerg%NetBSD.org@localhost>
 * 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.
 */

        .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
/*-
 * Copyright (c) 2010 Joerg Sonnenberger <joerg%NetBSD.org@localhost>
 * 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.
 */

        .section        .ctors, "aw", @progbits
        .align 8
__CTOR_LIST__:
        .quad -1

        .section        .dtors, "aw", @progbits
        .align 8
__DTOR_LIST__:
        .quad -1

        .section        .eh_frame, "a", @progbits
        .align 8
__EH_FRAME_LIST__:

        .section        .jcr, "aw", @progbits
        .align 8
__JCR_LIST__:

        .section        .data.rel, "aw", @progbits
        .align 8
        .type   __dso_handle, @object
        .size   __dso_handle, 8
        .globl  __dso_handle
        .hidden __dso_handle
__dso_handle:
#ifdef SHARED
        .quad   __dso_handle
#else
        .quad   0
#endif

__dwarf_eh_object:
        .zero   64

__initialized:
        .zero   1
__finished:
        .zero   1

        .text
        .weak   __cxa_finalize
        .weak   __deregister_frame_info
        .weak   __register_frame_info
        .weak   _Jv_RegisterClasses

__do_global_dtors_aux:
        cmpb    $0, __finished(%rip)
        je      1f
        ret
1:
        movb    $1, __finished(%rip)


#ifdef SHARED
        cmpq    $0, __cxa_finalize@GOTPCREL(%rip)
        je      2f
        movq    __dso_handle(%rip), %rax
        call    __cxa_finalize@PLT
2:
#endif

        pushq   %rbx
        leaq    8+__DTOR_LIST__(%rip), %rbx
3:
        movq    (%rbx), %rax
        testq   %rax, %rax
        je      4f
        call    *%rax
        addq    $8, %rbx
        jmp     3b      
4:
        popq    %rbx

        cmpq    $0, __deregister_frame_info@GOTPCREL(%rip)
        je      5f
        leaq    __EH_FRAME_LIST__(%rip), %rdi
        call    __deregister_frame_info@PLT
5:

        ret


__do_global_ctors_aux:
        cmpb    $0, __initialized(%rip)
        je      1f
        ret
1:
        movb    $1, __initialized(%rip)

        cmpq    $0, __register_frame_info@GOTPCREL(%rip)
        je      2f
        leaq    __dwarf_eh_object(%rip), %rsi
        leaq    __EH_FRAME_LIST__(%rip), %rdi
        call    __register_frame_info@PLT

2:
        cmpq    $0, _Jv_RegisterClasses@GOTPCREL(%rip)
        je      3f
        leaq    __JCR_LIST__(%rip), %rdi
        cmpq    $0, (%rdi)
        je      3f
        call    _Jv_RegisterClasses@PLT
3:

        pushq   %rbx
        leaq    -8+__CTOR_LIST_END__(%rip), %rbx
4:
        movq    (%rbx), %rax
        cmpq    $-1, %rax
        je      5f
        call    *%rax
        subq    $8, %rbx
        jmp     4b

5:
        popq    %rbx

        ret

        .section        .init, "ax", @progbits
        call    __do_global_ctors_aux
        .section        .fini, "ax", @progbits
        call    __do_global_dtors_aux
/*-
 * Copyright (c) 2010 Joerg Sonnenberger <joerg%NetBSD.org@localhost>
 * 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.
 */

        .section        .ctors, "aw", @progbits
        .align 8
        .global         __CTOR_LIST_END__
        .hidden         __CTOR_LIST_END__
__CTOR_LIST_END__:
        .quad 0

        .section        .dtors, "aw", @progbits
        .align 8
        .quad 0

        .section        .eh_frame, "a", @progbits
        .align 8
        .quad 0

        .section        .jcr, "aw", @progbits
        .align 8
        .quad 0


Home | Main Index | Thread Index | Old Index