path: root/crt
AgeCommit message (Collapse)AuthorLines
2018-09-05define and use internal macros for hidden visibility, weak refsRich Felker-6/+6
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.
2016-11-11add s390x portBobby Bingham-0/+26
2016-05-08add powerpc64 portBobby Bingham-0/+34
2016-04-18add mips n32 port (ILP32 ABI for mips64)Rich Felker-0/+30
based on patch submitted by Jaydeep Patil, with minor changes.
2016-03-06add mips64 portRich Felker-0/+30
patch by Mahesh Bodapati and Jaydeep Patil of Imagination Technologies.
2016-02-18fix regression in SH/FDPIC dynamic linkerRich Felker-1/+0
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.
2016-01-25move dynamic linker to its own top-level directory, ldsoRich Felker-1/+1
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, with additional code for the dynamic linker (from the new ldso tree) being added to 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.
2015-11-10explicitly assemble all arm asm sources as UALRich Felker-0/+4
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.
2015-11-09remove non-working pre-armv4t support from arm asmRich Felker-4/+0
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).
2015-10-15fix visibility mismatch in dynamic linker stage 2 function definitionRich Felker-0/+1
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.
2015-10-14remove hand-written crt1.s and Scrt1.s files for all archsRich Felker-192/+0
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.
2015-09-12make sh crti/crtn init/fini fragments setup proper stack frameRich Felker-2/+14
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.
2015-05-26add rcrt1 start file for fully static-linked PIERich Felker-0/+15
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.
2015-05-25mark mips crt code as codeRich Felker-0/+4
otherwise disassemblers treat it as data.
2015-04-27fix name of sh crt asm directoryRich Felker-0/+0
2015-04-13dynamic linker bootstrap overhaulRich Felker-1/+3
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 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.
2015-03-11add aarch64 portSzabolcs Nagy-0/+20
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.
2014-07-18add or1k (OpenRISC 1000) architecture portStefan Kristiansson-0/+20
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.
2014-02-23superh portBobby Bingham-0/+22
2014-02-23import vanilla x86_64 code as x32rofl0r-0/+16
2013-08-15add function types to arm crt assemblyRich Felker-0/+3
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.
2013-07-26new mostly-C crt1 implementationRich Felker-0/+17
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.
2013-07-21remove init/fini array asm from arm crti/crtn filesRich Felker-44/+4
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.
2013-07-10add PIE support for ARMRich Felker-0/+30
2013-06-03align stack properly for calling global ctors/dtors on x86[_64]Rich Felker-0/+8
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.
2013-02-03fix regression that made shared libs crash on armRich Felker-0/+4
2012-12-07add support for ctors/dtors on arm with modern gccRich Felker-4/+40
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 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.
2012-11-23add missing startfiles for powerpcRich Felker-0/+28
2012-11-13PPC port cleaned up, static linking works well now.rofl0r-27/+26
2012-11-13import preliminary ppc work by rdp.Richard Pennington-0/+27
2012-09-29microblaze portRich Felker-0/+38
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.
2012-08-17crt1 must align stack pointer on mipsRich Felker-0/+1
it's naturally aligned when entered with the kernel argv array, but if has been invoked explicitly to run a program, the stack will not be aligned due to having thrown away argv[0].
2012-08-05align mips _init/_fini functionsRich Felker-0/+2
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.
2012-07-11initial version of mips (o32) port, based on work by Richard Pennington (rdp)Rich Felker-0/+53
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.
2012-06-25fix arm crti/crtn codeRich Felker-0/+4
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).
2012-05-02remove some junk from x86_64 start filesRich Felker-4/+0
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.
2012-05-02PIE support for x86_64 (untested)Rich Felker-0/+18
2012-05-02consistency cleanup: removed redundant size suffixed from i386 asmRich Felker-22/+22
2012-05-02PIE support for i386Rich Felker-0/+24
2012-05-02remove attempts to be pie-compatible from i386 crt1.sRich Felker-6/+3
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.
2012-02-06add support for init/finit (constructors and destructors)Rich Felker-7/+56
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.
2011-09-18initial commit of the arm portRich Felker-0/+13
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.
2011-02-21cleanup comment cruft in startup codeRich Felker-1/+0
2011-02-21make startup code PIE-compatibleRich Felker-2/+4
2011-02-20shave off 2 bytes from crt1.o _startRich Felker-2/+2
2011-02-15Port musl to x86-64. One giant commit!Nicholas J. Kain-0/+16
2011-02-12initial check-in, version 0.5.0v0.5.0Rich Felker-0/+17