aboutsummaryrefslogtreecommitdiff
path: root/crt (follow)
Commit message (Expand)AuthorAgeFilesLines
* Setup stub unit test infrastructureEuAndreh2024-01-051-0/+8
* Fix the build system.•••The improvements are: - use most of the default "Makefile" for standard packaging; - also use the default ".gitignore" with for the derived assets; - don't impose so many $CFLAGS on the user. GCC still needs to be given the `-ffreestanding` flag explicitly for us to get a good binary; - stop using ad-hoc tools/* scripts, and avoid the code-generation anti-pattern overall on the build. Some of the generated files were checked-in, and some were removed; - remove empty files; - use POSIX make(1) over gmake; - add fuzz targets; - partial "install" and "uninstall" targets; - complete "clean" target. The shortcomings are: - only working on x86_64. More platforms coming soon; - code is still messy: way too many warnings, GNU/BSD specific extensions, inline assembly, and all kinds of unportable code; - still only works with GCC and GCC-like compilers, and completly fails with tcc(1) and cproc(1); - the `deps.mk` file is being maintained manually. As I work on the source files I'll finish automating its generation with `mkdeps.sh`; - still seems to be coupled with Linux; - still is missing tests setup; - still uses `#include <$NAME.h>` instead of the correct `#include "$NAME.h"` form. The generated libgrovel.a did match the previous lib/libc.a 100%. EuAndreh2024-01-052-0/+0
* remove unnecessary and problematic _Noreturn from crt/ldso startup•••after commit a48ccc159a5fa061a18419296100ee48a1cd6cc9 removed the use of _Noreturn on the stage3_func type (which only worked due to it being defined to the "GNU C" attribute in C99 mode), GCC could no longer assume that the ends of __dls2 and __dls2b are unreachable, and produced a warning that a function marked _Noreturn returns. also, since commit 4390383b32250a941ec616e8bff6f568a801b1c0, the _Noreturn declaration for __libc_start_main in crt1/rcrt1 has been not only inconsistent with the definition, but wrong. formally, __libc_start_main does return, via a (hopefully) tail call to a helper function after the barrier. incorrect usage of _Noreturn in the declaration was probably formal UB. the _Noreturn specifiers were not useful in any of these places, so remove them all. now, the only remaining usage of _Noreturn is in public interfaces where _Noreturn is part of their contract. Rich Felker2019-06-252-3/+3
* define and use internal macros for hidden visibility, weak refs•••this cleans up what had become widespread direct inline use of "GNU C" style attributes directly in the source, and lowers the barrier to increased use of hidden visibility, which will be useful to recovering some of the efficiency lost when the protected visibility hack was dropped in commit dc2f368e565c37728b0d620380b849c3a1ddd78f, especially on archs where the PLT ABI is costly. Rich Felker2018-09-052-6/+6
* add s390x portBobby Bingham2016-11-112-0/+26
* add powerpc64 portBobby Bingham2016-05-082-0/+34
* add mips n32 port (ILP32 ABI for mips64)•••based on patch submitted by Jaydeep Patil, with minor changes. Rich Felker2016-04-182-0/+30
* add mips64 port•••patch by Mahesh Bodapati and Jaydeep Patil of Imagination Technologies. Rich Felker2016-03-062-0/+30
* fix regression in SH/FDPIC dynamic linker•••the dynamic linker was found to hang when used as the PT_INTERP, but not when invoked as a command. the mechanism of this failure was not determined, but the cause is clear: commit 5552ce52000855906a5cb4f08f2e456573cca51f removed the SHARED macro, but arch/sh/crt_arch.h is still using it to choose the right form of the crt/ldso entry point code. moving the forced definition from rcrt1.c to dlstart.c restores the old behavior. eventually the logic should be changed to fully remove the SHARED macro or at least rename it to something more reasonable. Rich Felker2016-02-181-1/+0
* move dynamic linker to its own top-level directory, ldso•••this eliminates the last need for the SHARED macro to control how files in the src tree are compiled. the same code is used for both libc.a and libc.so, with additional code for the dynamic linker (from the new ldso tree) being added to libc.so but not libc.a. separate .o and .lo object files still exist for the src tree, but the only difference is that the .lo files are built as PIC. in the future, if/when we add dlopen support for static-linked programs, much of the code in dynlink.c may be moved back into the src tree, but properly factored into separate source files. in that case, the code in the ldso tree will be reduced to just the dynamic linker entry point, self-relocation, and loading of libraries needed by the main application. Rich Felker2016-01-251-1/+1
* explicitly assemble all arm asm sources as UAL•••these files are all accepted as legacy arm syntax when producing arm code, but legacy syntax cannot be used for producing thumb2 with access to the full ISA. even after switching to UAL, some asm source files contain instructions which are not valid in thumb mode, so these will need to be addressed separately. Rich Felker2015-11-102-0/+4
* remove non-working pre-armv4t support from arm asm•••the idea of the three-instruction sequence being removed was to be able to return to thumb code when used on armv4t+ from a thumb caller, but also to be able to run on armv4 without the bx instruction available (in which case the low bit of lr would always be 0). however, without compiler support for generating such a sequence from C code, which does not exist and which there is unlikely to be interest in implementing, there is little point in having it in the asm, and it would likely be easier to add pre-armv4t support via enhanced linker handling of R_ARM_V4BX than at the compiler level. removing this code simplifies adding support for building libc in thumb2-only form (for cortex-m). Rich Felker2015-11-091-4/+0
* fix visibility mismatch in dynamic linker stage 2 function definition•••since commits 2907afb8dbd4c1d34825c3c9bd2b41564baca210 and 6fc30c2493fcfedec89e45088bea87766a1e3286, __dls2 is no longer called via symbol lookup, but instead uses relative addressing that needs to be resolved at link time. on some linker versions, and/or if -Bsymbolic-functions is not used, the linker may leave behind a dynamic relocation, which is not suitable for bootstrapping the dynamic linker, if the reference to __dls2 is marked hidden but the definition is not actually hidden. correcting the definition to use hidden visibility fixes the problem. the static-PIE entry point rcrt1 was likewise affected and is also fixed by this patch. Rich Felker2015-10-151-0/+1
* remove hand-written crt1.s and Scrt1.s files for all archs•••since commit c5e34dabbb47d8e97a4deccbb421e0cd93c0094b, crt1.c has provided a "mostly-C" implementation of the crt1 start file that avoids the need for arch-specific symbol referencing, PIC/PIE-specific code variants, etc. but for archs that had existing hand-written versions, the new code was initially unused, and later only used as the dynamic linker entry point. this commit switches all archs to using the new code. the code being removed was a recurring source of subtle errors, and was still broken at least on arm, where it failed to properly align the stack pointer before calling into C code. Rich Felker2015-10-149-192/+0
* make sh crti/crtn init/fini fragments setup proper stack frame•••for fdpic support is is essential that the got pointer be saved at a known, ABI-dictated offset from the frame pointer, since there is no way to recover it once it's lost. Rich Felker2015-09-122-2/+14
* add rcrt1 start file for fully static-linked PIE•••static-linked PIE files need startup code to relocate themselves, much like the dynamic linker does. rcrt1.c reuses the code in dlstart.c, stage 1 of the dynamic linker, which in turn reuses crt_arch.h, to achieve static PIE with no new code. only relative relocations are supported. existing toolchains that don't yet support static PIE directly can be repurposed by passing "-shared -Wl,-Bstatic -Wl,-Bsymbolic" instead of "-static -pie" and substituting rcrt1.o in place of crt1.o. all libraries being linked must be built as PIC/PIE; TEXTRELs are not supported at this time. Rich Felker2015-05-261-0/+15
* mark mips crt code as code•••otherwise disassemblers treat it as data. Rich Felker2015-05-252-0/+4
* fix name of sh crt asm directoryRich Felker2015-04-272-0/+0
* dynamic linker bootstrap overhaul•••this overhaul further reduces the amount of arch-specific code needed by the dynamic linker and removes a number of assumptions, including: - that symbolic function references inside libc are bound at link time via the linker option -Bsymbolic-functions. - that libc functions used by the dynamic linker do not require access to data symbols. - that static/internal function calls and data accesses can be made without performing any relocations, or that arch-specific startup code handled any such relocations needed. removing these assumptions paves the way for allowing libc.so itself to be built with stack protector (among other things), and is achieved by a three-stage bootstrap process: 1. relative relocations are processed with a flat function. 2. symbolic relocations are processed with no external calls/data. 3. main program and dependency libs are processed with a fully-functional libc/ldso. reduction in arch-specific code is achived through the following: - crt_arch.h, used for generating crt1.o, now provides the entry point for the dynamic linker too. - asm is no longer responsible for skipping the beginning of argv[] when ldso is invoked as a command. - the functionality previously provided by __reloc_self for heavily GOT-dependent RISC archs is now the arch-agnostic stage-1. - arch-specific relocation type codes are mapped directly as macros rather than via an inline translation function/switch statement. Rich Felker2015-04-131-1/+3
* add aarch64 port•••This adds complete aarch64 target support including bigendian subarch. Some of the long double math functions are known to be broken otherwise interfaces should be fully functional, but at this point consider this port experimental. Initial work on this port was done by Sireesh Tripurari and Kevin Bortis. Szabolcs Nagy2015-03-112-0/+20
* add or1k (OpenRISC 1000) architecture port•••With the exception of a fenv implementation, the port is fully featured. The port has been tested in or1ksim, the golden reference functional simulator for OpenRISC 1000. It passes all libc-test tests (except the math tests that requires a fenv implementation). The port assumes an or1k implementation that has support for atomic instructions (l.lwa/l.swa). Although it passes all the libc-test tests, the port is still in an experimental state, and has yet experienced very little 'real-world' use. Stefan Kristiansson2014-07-182-0/+20
* superh portBobby Bingham2014-02-232-0/+22
* import vanilla x86_64 code as x32rofl0r2014-02-232-0/+16
* add function types to arm crt assembly•••without these, calls may be resolved incorrectly if the calling code has been compiled to thumb instead of arm. it's not clear to me at this point whether crt_arch.h is even working if crt1.c is built as thumb; this needs testing. but the _init and _fini issues were known to cause crashes in static-linked apps when libc was built as thumb, and this commit should fix that issue. Rich Felker2013-08-152-0/+3
* new mostly-C crt1 implementation•••the only immediate effect of this commit is enabling PIE support on some archs that did not previously have any Scrt1.s, since the existing asm files for crt1 override this C code. so some of the crt_arch.h files committed are only there for the sake of documenting what their archs "would do" if they used the new C-based crt1. the expectation is that new archs should use this new system rather than using heavy asm for crt1. aside from being easier and less error-prone, it also ensures that PIE support is available immediately (since Scrt1.o is generated from the same C source, using -fPIC) rather than having to be added as an afterthought in the porting process. Rich Felker2013-07-262-0/+17
* remove init/fini array asm from arm crti/crtn files•••this code has been replaced by portable C code that works on all archs. the old asm needs to be removed or ctors/dtors will run twice. Rich Felker2013-07-212-44/+4
* add PIE support for ARMRich Felker2013-07-101-0/+30
* align stack properly for calling global ctors/dtors on x86[_64]•••failure to do so was causing crashes on x86_64 when ctors used SSE, which was first observed when ctors called variadic functions due to the SSE prologue code inserted into every variadic function. Rich Felker2013-06-034-0/+8
* fix regression that made shared libs crash on armRich Felker2013-02-032-0/+4
* add support for ctors/dtors on arm with modern gcc•••a while back, gcc switched from using the old _init/_fini fragments method for calling ctors and dtors on arm to the __init_array and __fini_array method. unfortunately, on glibc this depends on ugly hacks involving making libc.so a linker script and pulling parts of libc into the main program binary. so I cheat a little bit, and just write asm to iterate over the init/fini arrays from the _init/_fini asm. the same approach could be used on any arch it's needed on, but for now arm is the only one. Rich Felker2012-12-072-4/+40
* add missing startfiles for powerpcRich Felker2012-11-232-0/+28
* PPC port cleaned up, static linking works well now.rofl0r2012-11-132-27/+26
* import preliminary ppc work by rdp.Richard Pennington2012-11-131-0/+27
* microblaze port•••based on initial work by rdp, with heavy modifications. some features including threads are untested because qemu app-level emulation seems to be broken and I do not have a proper system image for testing. Rich Felker2012-09-293-0/+38
* crt1 must align stack pointer on mips•••it's naturally aligned when entered with the kernel argv array, but if ld.so has been invoked explicitly to run a program, the stack will not be aligned due to having thrown away argv[0]. Rich Felker2012-08-171-0/+1
* align mips _init/_fini functions•••since .init and .fini are not .text, the toolchain does not seem to align them for code by default. this yields random breakage depending on the object sizes the linker is dealing with. Rich Felker2012-08-051-0/+2
* initial version of mips (o32) port, based on work by Richard Pennington (rdp)•••basically, this version of the code was obtained by starting with rdp's work from his ellcc source tree, adapting it to musl's build system and coding style, auditing the bits headers for discrepencies with kernel definitions or glibc/LSB ABI or large file issues, fixing up incompatibility with the old binutils from aboriginal linux, and adding some new special cases to deal with the oddities of sigaction and pipe syscall interfaces on mips. at present, minimal test programs work, but some interfaces are broken or missing. threaded programs probably will not link. Rich Felker2012-07-113-0/+53
* fix arm crti/crtn code•••lr must be saved because init/fini-section code from the compiler clobbers it. this was not a problem when i tested without gcc's crtbegin/crtend files present, but with them, musl on arm fails to work (infinite loop in _init). Rich Felker2012-06-252-0/+4
* remove some junk from x86_64 start files•••looks like nik copied these "extra arguments" from the i386 code. they're not actually arguments there, just 1-byte instructions to make sure the stack is aligned to 16 bytes after all the other arguments are pushed. since each push is 8 bytes on x86_64, they happened to have no effect here, but their presence is confusing and a minor waste of space. Rich Felker2012-05-022-4/+0
* PIE support for x86_64 (untested)Rich Felker2012-05-021-0/+18
* consistency cleanup: removed redundant size suffixed from i386 asmRich Felker2012-05-022-22/+22
* PIE support for i386Rich Felker2012-05-022-0/+24
* remove attempts to be pie-compatible from i386 crt1.s•••it does not work; after further consideration, a separate Scrt1.s for pie really is essential. it would be nice if the unified approach worked, but the linker fails to generate the correct PLT entries and instead puts textrels in the main program, which don't work because the kernel maps the text read-only. new Scrt1.s will be committed soon in place of this. Rich Felker2012-05-021-6/+3
* add support for init/finit (constructors and destructors)•••this is mainly in hopes of supporting c++ (not yet possible for other reasons) but will also help applications/libraries which use (and more often, abuse) the gcc __attribute__((__constructor__)) feature in "C" code. x86_64 and arm versions of the new startup asm are untested and may have minor problems. Rich Felker2012-02-069-7/+56
* initial commit of the arm port•••this port assumes eabi calling conventions, eabi linux syscall convention, and presence of the kernel helpers at 0xffff0f?0 needed for threads support. otherwise it makes very few assumptions, and the code should work even on armv4 without thumb support, as well as on systems with thumb interworking. the bits headers declare this a little endian system, but as far as i can tell the code should work equally well on big endian. some small details are probably broken; so far, testing has been limited to qemu/aboriginal linux. Rich Felker2011-09-181-0/+13
* cleanup comment cruft in startup codeRich Felker2011-02-211-1/+0
* make startup code PIE-compatibleRich Felker2011-02-211-2/+4
* shave off 2 bytes from crt1.o _startRich Felker2011-02-201-2/+2
* Port musl to x86-64. One giant commit!Nicholas J. Kain2011-02-151-0/+16
* initial check-in, version 0.5.0Rich Felker2011-02-124-0/+17