Changeset View
Standalone View
lib/csu/common/crtbegin.c
- This file was added.
/*- | |||||
* SPDX-License-Identifier: BSD-1-Clause | |||||
* | |||||
* Copyright 2018 Andrew Turner | |||||
* | |||||
* 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. | |||||
* | |||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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. | |||||
emaste: I think we should avoid having a binary redistribution clause in these components that are… | |||||
Done Inline ActionsWe already include it in many other csu files. andrew: We already include it in many other csu files. | |||||
Not Done Inline ActionsAha, we already have 1-clause BSD in the tree, we ought to use that. SPDX link: https://spdx.org/licenses/BSD-1-Clause.html emaste: Aha, we already have 1-clause BSD in the tree, we ought to use that.
SPDX link: https://spdx. | |||||
* IN NO EVENT SHALL THE AUTHOR 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/cdefs.h> | |||||
__FBSDID("$FreeBSD$"); | |||||
#include <sys/param.h> | |||||
#include "crt.h" | |||||
typedef void (*crt_func)(void); | |||||
/* | |||||
* On some architectures and toolchains we may need to call the .dtors. | |||||
* These are called in the order they are in the ELF file. | |||||
*/ | |||||
#ifdef HAVE_CTORS | |||||
static void __do_global_dtors_aux(void) __used; | |||||
crt_func __CTOR_LIST__[] __section(".ctors") __hidden = { | |||||
(crt_func)-1 | |||||
}; | |||||
crt_func __DTOR_LIST__[] __section(".dtors") __hidden = { | |||||
(crt_func)-1 | |||||
}; | |||||
static void | |||||
__do_global_dtors_aux(void) | |||||
{ | |||||
crt_func fn; | |||||
int n; | |||||
for (n = 1;; n++) { | |||||
fn = __DTOR_LIST__[n]; | |||||
if (fn == (crt_func)0 || fn == (crt_func)-1) | |||||
break; | |||||
fn(); | |||||
} | |||||
} | |||||
asm ( | |||||
".pushsection .fini \n" | |||||
"\t" INIT_CALL_SEQ(__do_global_dtors_aux) "\n" | |||||
".popsection \n" | |||||
); | |||||
#endif | |||||
/* | |||||
* Handler for gcj. These provide a _Jv_RegisterClasses function and fill | |||||
* out the .jcr section. We just need to call this function with a pointer | |||||
* to the appropriate section. | |||||
*/ | |||||
extern void _Jv_RegisterClasses(void *) __weak_symbol; | |||||
static void register_classes(void) __used; | |||||
crt_func __JCR_LIST__[] __section(".jcr") __used __hidden = { }; | |||||
#ifndef CTORS_CONSTRUCTORS | |||||
__attribute__((constructor)) | |||||
#endif | |||||
static void | |||||
register_classes(void) | |||||
{ | |||||
if (_Jv_RegisterClasses != NULL && __JCR_LIST__[0] != 0) | |||||
Not Done Inline ActionsIt is better to use .pushsection there kib: It is better to use .pushsection there | |||||
_Jv_RegisterClasses(__JCR_LIST__); | |||||
} | |||||
Not Done Inline Actions... and .popsection there. That said, why do you put this for amd64 at all ? _NOINIT note is put into the binaries on all arches, meaning that rtld calls init/init_array elements for the dynamic binaries (and crt1 calls them for static), kib: ... and .popsection there.
That said, why do you put this for amd64 at all ? _NOINIT note is… | |||||
Done Inline ActionsI have a test [1] the .ctors & .dtors are run. Without this they aren't. I included this for compatibility with old toolchains that use these sections. andrew: I have a test [1] the `.ctors` & `.dtors` are run. Without this they aren't. I included this… | |||||
Not Done Inline ActionsThere should be \t before instruction/asm pseudo-ops. kib: There should be \t before instruction/asm pseudo-ops. | |||||
/* | |||||
* We can't use constructors when they use the .ctors section as they may be | |||||
* placed before __CTOR_LIST__. | |||||
*/ | |||||
#ifdef CTORS_CONSTRUCTORS | |||||
asm ( | |||||
".pushsection .init \n" | |||||
"\t" INIT_CALL_SEQ(register_classes) "\n" | |||||
".popsection \n" | |||||
); | |||||
#endif |
I think we should avoid having a binary redistribution clause in these components that are linked into every output binary by the toolchain.