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