about summary refs log tree commit diff
Commit message (Collapse)AuthorAgeFilesLines
* break down coarse-grained 64-bit-off_t syscall remappingsRich Felker2014-05-301-4/+16
| | | | | | | | | | using the existence of SYS_stat64 as the condition for remapping other related syscalls is no longer valid, since new archs that omit the old syscalls will not have SYS_stat or SYS_stat64, but still potentially need SYS_fstat and others remapped. it would probably be possible to get by with just one or two extra conditionals, but just breaking them all down into separate conditions is robust and not significantly heavier for the preprocessor.
* additional fixes for linux kernel apis with old syscalls removedRich Felker2014-05-302-0/+9
|
* fix sendfile syscall to use 64-bit off_tRich Felker2014-05-301-0/+5
| | | | | | | | | | somehow the remapping of this syscall to the 64-bit version was overlooked. the issue was found, and patch provided, by Stefan Kristiansson. presumably the reason this bug was not caught earlier is that the syscall takes a pointer to off_t rather than a value, so on little-endian systems, everything appears to work as long as the offset value fits in the low 31 bits. on big-endian systems, though, sendfile was presumably completely non-functional.
* support linux kernel apis (new archs) with old syscalls removedRich Felker2014-05-2939-29/+267
| | | | | | | | | | | | | | | | | | | | | | | | such archs are expected to omit definitions of the SYS_* macros for syscalls their kernels lack from arch/$ARCH/bits/syscall.h. the preprocessor is then able to select the an appropriate implementation for affected functions. two basic strategies are used on a case-by-case basis: where the old syscalls correspond to deprecated library-level functions, the deprecated functions have been converted to wrappers for the modern function, and the modern function has fallback code (omitted at the preprocessor level on new archs) to make use of the old syscalls if the new syscall fails with ENOSYS. this also improves functionality on older kernels and eliminates the incentive to program with deprecated library-level functions for the sake of compatibility with older kernels. in other situations where the old syscalls correspond to library-level functions which are not deprecated but merely lack some new features, such as the *at functions, the old syscalls are still used on archs which support them. this may change at some point in the future if or when fallback code is added to the new functions to make them usable (possibly with reduced functionality) on old kernels.
* remove useless synchronization in exit and quick_exitRich Felker2014-05-292-11/+0
| | | | | | | | calling exit more than once invokes undefined behavior. in some cases it's desirable to detect undefined behavior and diagnose it via a predictable crash, but the code here was silently covering up an uncommon case (exit from more than one thread) and turning a much more common case (recursive calls to exit) into a permanent hang.
* fix missing declaration of strcpy in implementation of tmpnamRich Felker2014-05-271-0/+1
|
* overhaul tmpfile, tmpnam, and tempnam functionsRich Felker2014-05-273-55/+48
| | | | | | | these all now use the shared __randname function internally, rather than duplicating logic for producing a random name. incorrect usage of the access syscall (which works with real uid/gid, not effective) has been removed, along with unnecessary heavy dependencies like snprintf.
* fix sys_open macro for archs without the plain open syscallRich Felker2014-05-271-4/+4
|
* fix placement of multiple inclusion guard endif in internal syscall.hRich Felker2014-05-271-2/+2
| | | | | | this was messed up during a recent commit when the socketcall macros were moved to the common internal/syscall.h, and the following commit expanded the problem by adding more new content outside the guard.
* fix type of extended argument array to pselect6 syscallRich Felker2014-05-261-1/+2
| | | | | | | | this only matters on x32 (and perhaps future 32-on-64 abis for other archs); otherwise the type is long anyway. the cast through uintptr_t prevents nonsensical "sign extension" of pointers, and follows the principle that uintptr_t is the canonical integer type to which pointer conversion is safe.
* support kernels with no SYS_open syscall, only SYS_openatRich Felker2014-05-249-10/+26
| | | | | | | | | | open is handled specially because it is used from so many places, in so many variants (2 or 3 arguments, setting errno or not, and cancellable or not). trying to do it as a function would not only increase bloat, but would also risk subtle breakage. this is the first step towards supporting "new" archs where linux lacks "old" syscalls.
* overhaul siginfo_t definition in signal.hRich Felker2014-05-241-23/+28
| | | | | | | | | | | | | | | | | | the main motivation for this change is that, with the previous definition, it was arguably illegal, in standard C, to initialize both si_value and si_pid/si_uid with designated initializers, due to the rule that only one member of a union can have an initializer. whether or not this affected real-world application code, it affected some internal code, and clang was producing warnings (and possibly generating incorrect code). the new definition uses a more complex hierarchy of structs and unions to avoid the need to initialize more than one member of a single union in usage cases that make sense. further work would be needed to eliminate even the ones with no practical applications. at the same time, some fixes are made to the exposed names for nonstandard fields, to match what software using them expects.
* release 1.1.1 v1.1.1Rich Felker2014-05-202-1/+27
|
* trivial formatting fix for the config.mak generated by configureRich Felker2014-05-201-1/+1
|
* fix unhandled cases in strptimeRich Felker2014-05-191-5/+16
| | | | | | | | | | | | | | | | | | | | | %C, %U, %W, and %y handling were completely missing; %C wrongly fell-through to unrelated cases, and the rest returned failure. for now, they all parse numbers in the proper forms and range-check the values, but they do not store the value anywhere. it's not clear to me whether, as "derived" fields, %U and %W should produce any result. they certainly cannot produce a result unless the year and weekday are also converted, but in this case it might be desirable for them to do so. clarification is needed on the intended behavior of strptime in cases like this. %C and %y have well-defined behavior as long as they are used together (and %y is defined by itself but may change in the future). implementing them (including their correct interaction) is left as a later change to be made. finally, strptime now rejects unknown/invalid format characters instead of ignoring them.
* remove unsupported nonstandard sysconf macros and their table entriesRich Felker2014-05-192-120/+0
| | | | | | | | | | | | | | | | | | | | | | some of these may have been from ancient (pre-SUSv2) POSIX versions; more likely, they were from POSIX drafts or glibc interpretations of what ancient versions of POSIX should have added (instead they made they described functionality mandatory and/or dropped it completely). others are purely glibc-isms, many of them ill-thought-out, like providing ways to lookup the min/max values of types at runtime (despite the impossibility of them changing at runtime and the impossibility of representing ULONG_MAX in a return value of type long). since our sysconf implementation does not support or return meaningful values for any of these, it's harmful to have the macros around; applications' build scripts may detect and attempt to use them, only to get -1/EINVAL as a result. if removing them does break some applications, and it's determined that the usage was reasonable, some of these could be added back on an as-needed basis, but they should return actual meaningful values, not junk like they were returning before.
* rework sysconf table to treat zero entries as invalidRich Felker2014-05-191-10/+13
| | | | | | | | | | | | | | | based on patch by Timo Teräs. previously, the value zero was used as a literal zero, meaning that all invalid sysconf "names", which should result in sysconf returning -1, had to be explicitly listed. (in addition, it was not possible for sysconf to set errno to EINVAL, as there was no distinction between -1 as an error and -1 as a valid result.) now, the value 0 is used for invalid/undefined slots in the table and a new switch table entry is used for returning literal zeros. in addition, an off-by-one error in checking against the table size is fixed.
* add configure check for broken gcc 4.9.0 and possibly other versionsRich Felker2014-05-191-5/+37
| | | | | | | | | | | this is gcc bug #61144. the broken compiler is detected, but the user must manually work around it. this is partly to avoid complex logic for adding workaround CFLAGS and attempting to recheck with them, and partly for the sake of letting the user know the compiler is broken (since the workaround will result in less-efficient code production). some refactoring was also needed to move the check for gcc outside of the check for whether to build the compiler wrapper.
* add cp437 and cp850 to available iconv conversionsRich Felker2014-05-132-177/+206
| | | | | | | | | perhaps some additional legacy DOS-era codepages would also be useful to have, but these are the ones for which there has been demand. the size of the diff is due to the fact that legacychars.h is updated in such a way that new characters are inserted into the table in unicode codepoint order; thus other mappings in codepages.h have changed to reflect the new table indices of their characters.
* add configure check for working compilerRich Felker2014-05-121-0/+9
| | | | | | without this, broken choices of CC/CPPFLAGS/CFLAGS don't show up until late in the configure process where they are confusingly reported as a different failure such as incorrect long double type.
* fix strftime %s not to zero pad with default width=2Szabolcs Nagy2014-05-081-0/+1
|
* remove useless __yield alias for sched_yieldRich Felker2014-05-041-4/+1
| | | | | this is no longer used for anything, and reportedly clashed with a builtin on certain compilers.
* fix arm thread-pointer/atomic asm when compiling to thumb codeRich Felker2014-04-302-6/+7
| | | | | | | | | | | armv7/thumb2 provides a way to do atomics in thumb mode, but for armv6 we need a call to arm mode. this commit is based on a patch by Stephen Thomas which fixed the armv7 cases but not the armv6 ones. all of this should be revisited if/when runtime selection of thread pointer access and atomics are added.
* fix missing SO_RCVBUFFORCE and SO_SNDBUFFORCE in mips socket.hRich Felker2014-04-301-1/+2
|
* fix superh nofpu check on old gcc versionsBobby Bingham2014-04-271-1/+1
| | | | | | | | | | | | | As far as gcc3 knows, sh4 is the only processor version that can have an FPU, so it indicates the FPU's presence by defining __SH4__. This is not defined if there is no FPU, even if the processor really is an SH4. Starting with gcc4, there is support for the sh2a processor, which has an FPU but is not an SH4. gcc4 therefore additionally defines __SH_FPU_ANY__ when there is an FPU, but still doesn't define __SH4__ for an FPU-less sh4. Therefore, to support all gcc versions, we must look at both preprocessor symbols.
* perform minimal sanity checks on zoneinfo files loaded via TZ variableRich Felker2014-04-221-0/+5
| | | | | | | | | | | | previously, setting TZ to the pathname of a file which was not a valid zoneinfo file would usually cause programs using local time zone based operations to crash. the new code checks the file size and magic at the beginning of the file, which seems sufficient to prevent accidental misconfiguration from causing crashes. attempting to make fully-robust validation would be futile unless we wanted to drop use of mmap (shared zoneinfo) and instead read it into a local buffer, since such validation would be subject to race conditions with modification of the file.
* do not try to interpret implementation specific strings as tz definitionTimo Teräs2014-04-221-0/+1
|
* make __init_libc static for non-shared libcRich Felker2014-04-211-0/+3
| | | | | | | being static allows it to be inlined in __libc_start_main; inlining should take place at all levels since the function is called exactly once. this further reduces mandatory startup code size for static binaries.
* further micro-optimize startup code for sizeRich Felker2014-04-212-23/+14
| | | | | | there is no reason (and seemingly there never was any) for __init_security to be its own function. it's linked unconditionally so it can just be placed inline in __init_libc.
* micro-optimize some startup code for sizeRich Felker2014-04-212-7/+4
| | | | | | | | | | | moving the call to __init_ssp from __init_security to __init_libc makes __init_security a leaf function, which allows the compiler to make it smaller. __init_libc is already non-leaf, and the additional call makes no difference to the amount of register spillage. in addition, it really made no sense for the call to __init_ssp to be buried inside __init_security rather than parallel with other init functions.
* allow zoneinfo-path-relative filenames with no slashes in TZ variableRich Felker2014-04-211-12/+8
| | | | | | | | | | since the form TZ=name is reserved for POSIX-form time zone strings, TZ=:name needs to be used when the zoneinfo filename is in the top-level zoneinfo directory and therefore does not contain a slash. previously the leading colon was merely dropped, making it impossible to access such zones without a full absolute pathname. changes based on patch by Timo Teräs.
* expose public execvpe interfaceM Farkas-Dyck2014-04-202-0/+4
|
* fix false negatives with periodic needles in strstr, wcsstr, and memmemRich Felker2014-04-183-3/+3
| | | | | | | | in cases where the memorized match range from the right factor exceeded the length of the left factor, it was wrongly treated as a mismatch rather than a match. issue reported by Yves Bastide.
* make socketcall types common as they are same for all architecturesTimo Teräs2014-04-173-40/+23
|
* add options when explicitly invoking dynamic loaderRich Felker2014-04-161-2/+21
| | | | | | | | | so far the options are --library-path and --preload which override the corresponding environment variables, and --list which forces the behavior of ldd even if the invocation name is not ldd. both the two-arg form and the one-arg form using an equals sign are supported. based loosely on a patch proposed by Rune.
* release 1.1.0 v1.1.0Rich Felker2014-04-162-1/+29
|
* add working vdso clock_gettime support, including static linkingRich Felker2014-04-163-5/+108
| | | | | | | | | | | | | | | | the vdso symbol lookup code is based on the original 2011 patch by Nicholas J. Kain, with some streamlining, pointer arithmetic fixes, and one symbol version matching fix. on the consumer side (clock_gettime), per-arch macros for the particular symbol name and version to lookup are added in syscall_arch.h, and no vdso code is pulled in on archs which do not define these macros. at this time, vdso is enabled only on x86_64. the vdso support at the dynamic linker level is no longer useful to libc, but is left in place for the sake of debuggers (which may need the vdso in the link map to find its functions) and possibly use with dlsym.
* fix deadlock race in pthread_onceRich Felker2014-04-151-2/+1
| | | | | | | | | | | | at the end of successful pthread_once, there was a race window during which another thread calling pthread_once would momentarily change the state back from 2 (finished) to 1 (in-progress). in this case, the status was immediately changed back, but with no wake call, meaning that waiters which arrived during this short window could block forever. there are two possible fixes. one would be adding the wake to the code path where it was missing. but it's better just to avoid reverting the status at all, by using compare-and-swap instead of swap.
* fix RLIMIT_ constants for mipsSzabolcs Nagy2014-04-159-2/+10
| | | | | | | The mips arch is special in that it uses different RLIMIT_ numbers than other archs, so allow bits/resource.h to override the default RLIMIT_ numbers (empty on all archs except mips). Reported by orc.
* add _SC_PHYS_PAGES and _SC_AVPHYS_PAGES extentions to sysconfRich Felker2014-04-151-2/+17
|
* add namespace-protected name for sysinfo functionRich Felker2014-04-153-7/+9
| | | | | | | | | | | it will be needed to implement some things in sysconf, and the syscall can't easily be used directly because the x32 syscall uses the wrong structure layout. the l (uncreative, for "linux") prefix is used since the symbol name __sysinfo is already taken for AT_SYSINFO from the aux vector. the way the x32 override of this function works is also changed to be simpler and avoid the useless jump instruction.
* in sysconf, use getrlimit function rather than raw syscall for rlimitsRich Felker2014-04-151-3/+3
| | | | | | the syscall is deprecated (replaced by prlimit64) and does not work correctly on x32. this change mildly increases size, but is likely needed anyway for newer archs that might omit deprecated syscalls.
* avoid linear-time if/else special cases in sysconfRich Felker2014-04-151-20/+35
| | | | | | | the previous handling of cases that could not fit in the 16-bit table or which required non-constant results was extremely ugly and could not scale. the new code remaps these keys into a contiguous range that's efficient for a switch statement.
* fix fallback code for old kernels in clock_gettimeRich Felker2014-04-141-1/+1
|
* use dmb barrier instruction for atomics on arm v7Rich Felker2014-04-141-2/+9
| | | | | | | aside from potentially offering better performance, this change is needed since the old coprocessor-based approach to barriers is deprecated in arm v7, and some compilers/assemblers issue errors when using the deprecated instruction for v7 targets.
* use hidden visibility rather than protected for syscall internalsRich Felker2014-04-121-1/+1
| | | | | | | | | | | | | | | the use of visibility at all is purely an optimization to avoid the need for the caller to load the GOT register or similar to prepare for a call via the PLT. there is no reason for these symbols to be externally visible, so hidden works just as well as protected, and using protected visibility is undesirable due to toolchain bugs and the lack of testing it receives. in particular, GCC's microblaze target is known to generate symbolic relocations in the GOT for functions with protected visibility. this in turn results in a dynamic linker which crashes under any nontrivial usage that requires making a syscall before symbolic relocations are processed.
* math: fix aliasing violation in long double wrappersSzabolcs Nagy2014-04-112-2/+10
| | | | | | | | | modfl and sincosl were passing long double* instead of double* to the wrapped double precision functions (on archs where long double and double have the same size). This is fixed now by using temporaries (this is not optimized to a single branch so the generated code is a bit bigger). Found by Morten Welinder.
* fix search past the end of haystack in memmemTimo Teräs2014-04-091-0/+1
| | | | | | | | to optimize the search, memchr is used to find the first occurrence of the first character of the needle in the haystack before switching to a search for the full needle. however, the number of characters skipped by this first step were not subtracted from the haystack length, causing memmem to search past the end of the haystack.
* fix printf rounding with %g for some corner case midpointsRich Felker2014-04-071-1/+1
| | | | | | | | | | the subsequent rounding code assumes the end pointer (z) accurately reflects the end of significance in the decimal expansion, but for certain large integers, spurious trailing zero slots were left behind when applying the binary exponent. issue reported by Morten Welinder; the analysis of the cause was performed by nsz, who also proposed this change.
* fix arm atomic asm register constraintRich Felker2014-04-071-1/+1
| | | | | | the "m" constraint could give a memory reference with an offset that's not compatible with ldrex/strex, so the arm-specific "Q" constraint is needed instead.