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

AltStyle によって変換されたページ (->オリジナル) /