aboutsummaryrefslogtreecommitdiff
path: root/libexec/rtld-elf/i386
diff options
context:
space:
mode:
authorDimitry Andric <dim@FreeBSD.org>2011-01-04 20:51:28 +0000
committerDimitry Andric <dim@FreeBSD.org>2011-01-04 20:51:28 +0000
commite1724647283748daff0b5dae2338c301bf88e1ee (patch)
treec2e889dfe60be3e3786f90f9d27b561552cedc86 /libexec/rtld-elf/i386
parent7606ddab281e7159937ee8b1e4027540e6279bff (diff)
downloadsrc-e1724647283748daff0b5dae2338c301bf88e1ee.tar.gz
src-e1724647283748daff0b5dae2338c301bf88e1ee.zip
On amd64 and i386, tell the compiler to refrain from generating SSE,
3DNow, MMX and floating point instructions in rtld-elf. Otherwise, _rtld_bind() (and whatever it calls) could possibly clobber function arguments that are passed in SSE/3DNow/MMX/FP registers, usually floating point values. This can happen, for example, when clang generates SSE code for memset() or memcpy() calls. One symptom of this is sshd dying early on amd64 with "PRNG not seeded", which is ultimately caused by libcrypto.so.6 calling RAND_add() with a double parameter. That parameter is passed via %xmm0, which gets wiped out by an SSE memset() in _rtld_bind(). Reviewed by: kib, kan
Notes
Notes: svn path=/head/; revision=216977
Diffstat (limited to 'libexec/rtld-elf/i386')
-rw-r--r--libexec/rtld-elf/i386/Makefile.inc1
1 files changed, 1 insertions, 0 deletions
diff --git a/libexec/rtld-elf/i386/Makefile.inc b/libexec/rtld-elf/i386/Makefile.inc
index 4ecf82fbab8e..7d6861183064 100644
--- a/libexec/rtld-elf/i386/Makefile.inc
+++ b/libexec/rtld-elf/i386/Makefile.inc
@@ -1,5 +1,6 @@
# $FreeBSD$
+CFLAGS+= -mno-sse -mno-sse2 -mno-sse3 -mno-mmx -mno-3dnow -msoft-float
# Uncomment this to build the dynamic linker as an executable instead
# of a shared library:
#LDSCRIPT= ${.CURDIR}/${MACHINE_CPUARCH}/elf_rtld.x