Add the workaround for SunOS x86 ld bug that breaks .init sections.
Without it, programs using .init sections will just segfault. The workaround comes from http://www.openssl.org/~appro/values.c Tested on 5.10, not needed on 5.11.
This commit is contained in:
parent
2aa7ba3669
commit
90c14b2421
2 changed files with 71 additions and 1 deletions
|
@ -1,4 +1,4 @@
|
|||
# $NetBSD: Makefile,v 1.27 2011/10/12 15:48:40 hans Exp $
|
||||
# $NetBSD: Makefile,v 1.28 2011/10/12 16:10:48 hans Exp $
|
||||
|
||||
DISTNAME= gcc-${GCC_VERSION}
|
||||
PKGNAME= gcc44-${GCC_VERSION}
|
||||
|
@ -125,6 +125,12 @@ do-install:
|
|||
(cd ${WRKDIR}/obj && ${SETENV} ${MAKE_ENV} ${GMAKE} install DESTDIR=${DESTDIR} \
|
||||
&& ${TEST} -f ${DESTDIR}${GCC_PREFIX}/bin/cc || ${LN} -f ${DESTDIR}${GCC_PREFIX}/bin/gcc ${DESTDIR}${GCC_PREFIX}/bin/cc)
|
||||
|
||||
.if ${OPSYS} == "SunOS" && ${OS_VERSION} != "5.11" && !empty(MACHINE_ARCH:M*86*)
|
||||
post-install:
|
||||
-${SH} files/values.c ${DESTDIR}${GCC_PREFIX}/bin/gcc -m32
|
||||
-${SH} files/values.c ${DESTDIR}${GCC_PREFIX}/bin/gcc -m64
|
||||
.endif
|
||||
|
||||
GENERATE_PLIST+= \
|
||||
cd ${DESTDIR}${PREFIX} && ${FIND} ${GCC_SUBPREFIX} \( -type f -o -type l \) -print \
|
||||
| ${SORT} ;
|
||||
|
|
64
lang/gcc44/files/values.c
Normal file
64
lang/gcc44/files/values.c
Normal file
|
@ -0,0 +1,64 @@
|
|||
#if 0 /* $NetBSD: values.c,v 1.1 2011/10/12 16:10:48 hans Exp $ */
|
||||
#
|
||||
# This is Solaris x86 specific GCC run-time environment patch, which
|
||||
# makes it possible to reliably deploy .init snippets. Trouble is that
|
||||
# Solaris linker erroneously pads .init segment with zeros [instead of
|
||||
# nops], which is bound to SEGV early upon program start-up. This bug
|
||||
# was recognized by GCC team [it is mentioned in source code], but
|
||||
# workaround apparently and obviously erroneously slipped away in some
|
||||
# newer GCC release. This patch compensates for this mishap by dropping
|
||||
# modified values-X*.o into GCC installation tree. Object modules in
|
||||
# question are normally provided by Sun and linked prior crtbegin.o.
|
||||
# Modified versions are additionally crafted with custom .init segment,
|
||||
# which does some magic:-)
|
||||
# <appro@fy.chalmers.se>
|
||||
set -e
|
||||
gcc=gcc
|
||||
if [[ "x$1" = x*gcc ]]; then
|
||||
gcc=$1; shift
|
||||
fi
|
||||
gcc_dir=`${gcc} "$@" -print-libgcc-file-name`
|
||||
gcc_dir=${gcc_dir%/*} #*/
|
||||
set -x
|
||||
${gcc} "$@" -c -o $gcc_dir/values-Xa.o -DXa $0
|
||||
${gcc} "$@" -c -o $gcc_dir/values-Xc.o -DXc $0
|
||||
${gcc} "$@" -c -o $gcc_dir/values-Xt.o -DXt $0
|
||||
exit
|
||||
#endif
|
||||
|
||||
#include <math.h>
|
||||
|
||||
#if defined(Xa)
|
||||
const enum version _lib_version = ansi_1;
|
||||
#elif defined(Xc)
|
||||
const enum version _lib_version = strict_ansi;
|
||||
#elif defined(Xt)
|
||||
const enum version _lib_version = c_issue_4;
|
||||
#else
|
||||
#error "compile by issuing 'ksh -f values.c [gcc] [-m64]'"
|
||||
#endif
|
||||
|
||||
#if defined(__x86_64__)
|
||||
asm("\n"
|
||||
".section .init\n"
|
||||
".align 1\n"
|
||||
" leaq 1f(%rip),%rax\n"
|
||||
"1: cmpl $0,2f-1b(%rax)\n"
|
||||
" jne 2f\n"
|
||||
" jmp 2f+5\n"
|
||||
" .skip 9\n" /* pad up to 0x1b bytes */
|
||||
"2:\n"
|
||||
);
|
||||
#else
|
||||
asm("\n"
|
||||
".section .init\n"
|
||||
".align 1\n"
|
||||
" call 1f\n"
|
||||
"1: popl %eax\n"
|
||||
" cmpl $0,2f-1b(%eax)\n"
|
||||
" jne 2f\n"
|
||||
" jmp 2f+5\n"
|
||||
" .skip 10\n" /* pad up to 0x1b bytes */
|
||||
"2:\n"
|
||||
);
|
||||
#endif
|
Loading…
Reference in a new issue