For maximum paranoia we run ld.so through the normal set
of tests for all of the shared libraries. This includes
running ld.so through check-localplt, check-textrel, and
check-execstack. While none of these should trigger any
failures given the way ld.so is built, it might possibly
fail if a developer does something wrong. This paranoia
was triggered by a discussion over the use of __strcpy
vs. strcpy [1] and if the symbol could leak and use the
libc.so version.
The check-localplt test fails right away because localplt.data
needs updating for all arches. By default we add 6 new symbols:
__tls_get_addr, __libc_memalign, malloc, calloc, realloc and
free. Other machines like i386, power, and s390 require some
different symbol sets e.g. ___tls_get_addr vs. __tls_get_addr
for i386.
Verified for i386
Verified for x86_64
Verified for ppc32
Verified for ppc64
Verified for ppc64le
Verified for arm
Verified for aarch64
Verified for s390
Verified for s390x
Guessed for alpha
Guessed for ia64
Guessed for m68k
Guessed for microblaze
Guessed for sparc32
Guessed for sparc64
Defaults for sh
Defaults for mips
Defaults for hppa
Defaults for tile
Machine manintainers notified to double check the data
used in localplt.data.
[1] https://sourceware.org/ml/libc-alpha/2014-10/msg00548.html
This patch enables syscalls.list entries to specify both compat and
non-compat symbol versions for the same syscall definition, making use
of this for setrlimit / chown / lchown where the inability to specify
such aliases showed up in the course of work on bug 14138.
The change to make-syscalls.sh is minimal: adding a SHARED conditional
on the compat_symbol calls. It remains the case that if a compat
symbol version is specified, the syscall is only built for the shared
library at all if an explicit symbol version is given for a non-compat
symbol (so it's necessary to specify "lchown@@GLIBC_2.0
chown@GLIBC_2.0" rather than just "lchown chown@GLIBC_2.0"). It also
remains the case, as already commented in make-syscalls.sh, that no
SHLIB_COMPAT conditionals are generated, so there would be problems if
the same syscalls.list file, with compat symbols, were used for both
configurations that should have those symbols and configurations for
which they should be conditioned out with SHLIB_COMPAT.
Tested for x86.
* sysdeps/unix/make-syscalls.sh (emit_weak_aliases): Condition
compat_symbol calls on [SHARED].
* sysdeps/unix/sysv/linux/powerpc/lchown.S: Remove file.
* sysdeps/unix/sysv/linux/i386/syscalls.list (oldsetrlimit):
Remove.
(setrlimit): Add setrlimit@GLIBC_2.0 alias.
* sysdeps/unix/sysv/linux/m68k/m680x0/syscalls.list
(oldsetrlimit): Remove.
(setrlimit): Add setrlimit@GLIBC_2.0 alias.
* sysdeps/unix/sysv/linux/powerpc/powerpc32/syscalls.list
(lchown): New syscall entry.
(oldsetrlimit): Remove.
(setrlimit): Add setrlimit@GLIBC_2.0 alias.
* sysdeps/unix/sysv/linux/s390/s390-32/syscalls.list
(oldsetrlimit): Remove.
(setrlimit): Add setrlimit@GLIBC_2.0 alias.
Continuing the move of syscall definitions to syscalls.list, where the
removal of support for old kernel versions has made this possible,
this patch moves various definitions of chown, lchown and fchown.
In most cases the need for special syscalls.list entries (rather than
existing generic ones) is because these architectures use chown32,
lchown32 and fchown32 as syscall names. Some architectures also have
symbol versioning compatibility for older versions of chown having
been equivalent to lchown.
In the case of powerpc, chown.c (providing the chown@@GLIBC_2.1
default version) is replaced by a syscalls.list entry (for powerpc32;
powerpc64 has no need for this because of its more recent minimum
symbol version, so can just use the entry in
sysdeps/unix/syscalls.list), but lchown.S is left as-is because it
provides the compat version of chown as an actual alias for __lchown,
which is not yet supported by syscalls.list. This file can be removed
once such aliases are supported in syscalls.list.
[BZ #14138]
* sysdeps/unix/sysv/linux/arm/fchown.c: Remove file.
* sysdeps/unix/sysv/linux/arm/lchown.c: Likewise.
* sysdeps/unix/sysv/linux/m68k/fchown.c: Likewise.
* sysdeps/unix/sysv/linux/m68k/lchown.c: Likewise.
* sysdeps/unix/sysv/linux/powerpc/chown.c: Likewise.
* sysdeps/unix/sysv/linux/arm/syscalls.list (lchown): Add syscall.
(fchown): Likewise.
* sysdeps/unix/sysv/linux/m68k/syscalls.list (lchown): Likewise.
(fchown): Likewise.
* sysdeps/unix/sysv/linux/powerpc/powerpc32/syscalls.list (chown):
Likewise.
Bug 14138 is followup cleanup after removal of support for old Linux
kernel versions: moving syscalls to syscalls.list where the only
reason for using C definitions was kernel version conditionals that
are no longer present.
This patch deals with the case of setrlimit
(sysdeps/unix/sysv/linux/i386/setrlimit.c, included by various other
architectures). Where needed (where there is also a compat symbol for
setrlimit@GLIBC_2.0), new syscalls.list entries are added. Where not
needed (where there is no such compat symbol and the minimum symbol
version for libc is 2.2 or later), no such entries are added as that
in sysdeps/unix/syscalls.list will suffice. Thus arm and sh need no
such entries, while m68k and powerpc need entries only in a
subdirectory syscalls.list file rather than for all configurations
that previously used setrlimit.c.
(setrlimit@@GLIBC_2.2 and setrlimit@GLIBC_2.0 are now semantically
identical - the new symbol version was about a change of types from
signed to unsigned and the former compatibility code for dealing with
large unsigned arguments on old kernels is no longer needed or
present, having been removed with support for pre-2.4 kernels.
However, making the two versions into aliases doesn't work at present:
the case of having both default and non-default symbol versions on the
same syscalls.list line results in a compat_symbol call in code built
for static libc, which doesn't compile. I don't suppose it would be
hard to generate SHARED conditionals from make-syscalls.sh to fix
this, but in any case this patch doesn't make things any worse, as the
functions weren't aliases before the patch either.)
Tested for x86, and ran ABI tests for ARM as an example of an
architecture where the setrlimit.c file was just removed without
adding syscalls.list entries.
[BZ #14138]
* sysdeps/unix/sysv/linux/arm/setrlimit.c: Remove file.
* sysdeps/unix/sysv/linux/i386/setrlimit.c: Likewise.
* sysdeps/unix/sysv/linux/m68k/setrlimit.c: Likewise.
* sysdeps/unix/sysv/linux/powerpc/setrlimit.c: Likewise.
* sysdeps/unix/sysv/linux/s390/s390-32/setrlimit.c: Likewise.
* sysdeps/unix/sysv/linux/sh/setrlimit.c: Likewise.
* sysdeps/unix/sysv/linux/i386/syscalls.list (setrlimit): Add
syscall entry for GLIBC_2.2 symbol version.
* sysdeps/unix/sysv/linux/m68k/m680x0/syscalls.list (setrlimit):
Likewise.
* sysdeps/unix/sysv/linux/powerpc/powerpc32/syscalls.list
(setrlimit): Likewise.
* sysdeps/unix/sysv/linux/s390/s390-32/syscalls.list (setrlimit):
Likewise.
Continuing the process of making non-ex-ports architectures follow the
preferred sysdeps practices followed by ex-ports architectures - that
is, putting things in architecture-specific sysdeps files rather than
having architecture-specific cases in architecture-independent files -
this patch moves architecture cases out of
sysdeps/unix/sysv/linux/configure.ac into (new or existing) configure
fragments for each architecture. (In the case of the
arch_minimum_kernel setting for x32,
sysdeps/unix/sysv/linux/x86_64/x32/configure already has such a
setting so the setting in sysdeps/unix/sysv/linux/configure.ac was a
duplicate that could just be removed - though I haven't tested for
x32.)
Tested for x86_64 and x86 that the patch causes no changes to the
installed shared libraries or ldd (or any part of the installation
except for the parts that always change because the files contain
timestamps - nscd and static libraries).
* sysdeps/unix/sysv/linux/configure.ac: Remove cases for
individual architectures.
* sysdeps/unix/sysv/linux/configure: Regenerated.
* sysdeps/unix/sysv/linux/i386/configure.ac: New file.
* sysdeps/unix/sysv/linux/i386/configure: New generated file.
* sysdeps/unix/sysv/linux/powerpc/configure.ac
(ldd_rewrite_script): Define variable.
* sysdeps/unix/sysv/linux/powerpc/configure: Regenerated.
* sysdeps/unix/sysv/linux/powerpc/powerpc32/configure.ac: New
file.
* sysdeps/unix/sysv/linux/powerpc/powerpc32/configure: New
generated file.
* sysdeps/unix/sysv/linux/s390/configure.ac: New file.
* sysdeps/unix/sysv/linux/s390/configure: New generated file.
* sysdeps/unix/sysv/linux/sh/configure.ac: New file.
* sysdeps/unix/sysv/linux/sh/configure: New generated file.
* sysdeps/unix/sysv/linux/sparc/configure.ac: New file.
* sysdeps/unix/sysv/linux/sparc/configure: New generated file.
* sysdeps/unix/sysv/linux/x86_64/configure.ac: New file.
* sysdeps/unix/sysv/linux/x86_64/configure: New generated file.
My recent changes that added libm_hidden_proto / libm_hidden_def for
fegetround had the side effect of removing the need for a
localplt.data entry for fegetround for powerpc-nofpu. This patch
removes that entry. Tested powerpc-nofpu.
* sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/nptl/localplt.data:
Don't expect fegetround reference in libm.so.
This patch add static probes for setjmp/longjmp in the way gdb expects,fixing
the gdb.base/longjmp.exp gdb testcases.
It changes the symbol_name and use macros to to avoid change the probe names
and ending up adding more logic on GDB (since with the expected name
GDB work seamlessly).
http://sourceware.org/ml/libc-alpha/2013-08/msg00092.html
Use conditional form of branch and link to avoid destroying the cpu
link stack used to predict blr return addresses.
* sysdeps/unix/sysv/linux/powerpc/powerpc32/makecontext.S: Use
conditional form of branch and link when obtaining pc.
* sysdeps/unix/sysv/linux/powerpc/powerpc64/makecontext.S: Likewise.
http://sourceware.org/ml/libc-alpha/2013-08/msg00091.html
More LE support, correcting word accesses to _dl_hwcap.
* sysdeps/unix/sysv/linux/powerpc/powerpc32/getcontext-common.S: Use
HIWORD/LOWORD.
* sysdeps/unix/sysv/linux/powerpc/powerpc32/setcontext-common.S: Ditto.
* sysdeps/unix/sysv/linux/powerpc/powerpc32/swapcontext-common.S: Ditto.
This patch introduces two new convenience functions to set the default
thread attributes used for creating threads. This allows a programmer
to set the default thread attributes just once in a process and then
run pthread_create without additional attributes.
This feature is specifically for the C++ compiler to offload calling
thread_local object destructors on thread program exit, to glibc.
This is to overcome the possible complication of destructors of
thread_local objects getting called after the DSO in which they're
defined is unloaded by the dynamic linker. The DSO is marked as
'unloadable' if it has a constructed thread_local object and marked as
'unloadable' again when all the constructed thread_local objects
defined in it are destroyed.
In order for the __kernel_get_tbfreq vDSO call to work the
INTERNAL_VSYSCALL_NCS macro needed to be updated to prevent it from
assuming an integer return type (since the timebase frequency is a 64-bit
value) by specifying the type of the return type as a macro parameter. The
macro then specifically declares the return value as a 'register' (or
implied pair) of the denoted type. The compiler is then informed that this
register (or implied pair) is to be used for the return value.