Support linking with -z combreloc (combine and sort reloc sections) and with

--shared -z combreloc (shared library, combine & sort relocs)

Submitted by:		peter
Bribed by:		peter
Fixes:			IA-64, Kaffe, and QT
Doesn't fix ports by:	kris
Tested on:		make(1) release w/docproj
Desired for:		5.0-DP#1
Approved by:		murray
Seconded by:		jhb
This commit is contained in:
obrien 2002-03-13 18:26:59 +00:00
parent 93a919ffc1
commit 908b6d102f
6 changed files with 77 additions and 18 deletions

View File

@ -13,7 +13,7 @@ _alpha_path= \"/usr/cross/alpha-freebsd/usr/lib\"
EMS+= ld_elf64alpha_emulation
LDSCRIPTS+= elf64alpha.x elf64alpha.xbn elf64alpha.xn elf64alpha.xr \
elf64alpha.xs elf64alpha.xu alpha.x alpha.xbn \
alpha.xn alpha.xr alpha.xu
alpha.xn alpha.xr alpha.xu elf64alpha.xc elf64alpha.xsc
SRCS+= eelf64alpha.c ealpha.c
CLEANFILES+= eelf64alpha.c ealpha.c

View File

@ -12,7 +12,7 @@ _i386_path= \"/usr/cross/i386-freebsd/usr/lib\"
.endif
EMS+= ld_elf_i386_emulation
LDSCRIPTS+= elf_i386.x elf_i386.xbn elf_i386.xn elf_i386.xr \
elf_i386.xs elf_i386.xu
elf_i386.xs elf_i386.xu elf_i386.xc elf_i386.xsc
SRCS+= eelf_i386.c
CLEANFILES+= eelf_i386.c

View File

@ -13,7 +13,7 @@ _ia64_path= \"/usr/cross/ia64-freebsd/usr/lib\"
EMS+= ld_elf64_ia64_emulation
LDSCRIPTS+= elf64_ia64.x elf64_ia64.xbn elf64_ia64.xn elf64_ia64.xr \
elf64_ia64.xs elf64_ia64.xu
elf64_ia64.xs elf64_ia64.xu elf64_ia64.xc elf64_ia64.xsc
SRCS+= eelf64_ia64.c
CLEANFILES+= eelf64_ia64.c

View File

@ -22,31 +22,43 @@ LDSCRIPTS+= elf32ppc.x \
elf32ppc.xr \
elf32ppc.xs \
elf32ppc.xu \
elf32ppc.xc \
elf32ppc.xsc \
ppcmacos.x \
ppcmacos.xbn \
ppcmacos.xn \
ppcmacos.xr \
ppcmacos.xu \
ppcmacos.xc \
ppcmacos.xsc \
ppcnw.x \
ppcnw.xbn \
ppcnw.xn \
ppcnw.xr \
ppcnw.xu \
ppcnw.xc \
ppcnw.xsc \
ppcpe.x \
ppcpe.xbn \
ppcpe.xn \
ppcpe.xr \
ppcpe.xu \
ppcpe.xc \
ppcpe.xsc \
aixrs6.x \
aixrs6.xbn \
aixrs6.xn \
aixrs6.xr \
aixrs6.xu \
aixrs6.xc \
aixrs6.xsc \
rs6000lynx.x \
rs6000lynx.xbn \
rs6000lynx.xn \
rs6000lynx.xr \
rs6000lynx.xu
rs6000lynx.xu \
rs6000lynx.xc \
rs6000lynx.xsc
SRCS+= eelf32ppc.c \
eppcmacos.c \
eppcnw.c \

View File

@ -13,13 +13,13 @@ _sparc_path= \"/usr/cross/sparc-freebsd/usr/lib\"
EMS+= ld_elf64_sparc_emulation
LDSCRIPTS+= elf64_sparc.x elf64_sparc.xbn elf64_sparc.xn elf64_sparc.xr \
elf64_sparc.xs elf64_sparc.xu
elf64_sparc.xs elf64_sparc.xu elf64_sparc.xc elf64_sparc.xsc
SRCS+= eelf64_sparc.c
CLEANFILES+= eelf64_sparc.c
EMS+= ld_elf32_sparc_emulation
LDSCRIPTS+= elf32_sparc.x elf32_sparc.xbn elf32_sparc.xn elf32_sparc.xr \
elf32_sparc.xs elf32_sparc.xu
elf32_sparc.xs elf32_sparc.xu elf32_sparc.xc elf32_sparc.xsc
SRCS+= eelf32_sparc.c
CLEANFILES+= eelf32_sparc.c

View File

@ -58,6 +58,17 @@ LIB_SEARCH_DIRS=`echo ${libdir} | tr ':' ' ' | sed -e 's/\([^ ][^ ]*\)/SEARCH_DI
# A .xs script is for generating a shared library with the --shared
# flag; it is only generated if $GENERATE_SHLIB_SCRIPT is set by the
# emulation parameters.
# A .xc script is for linking with -z combreloc; it is only generated if
# $GENERATE_COMBRELOC_SCRIPT is set by the emulation parameters or
# $SCRIPT_NAME is "elf".
# A .xsc script is for linking with --shared -z combreloc; it is generated
# if $GENERATE_COMBRELOC_SCRIPT is set by the emulation parameters or
# $SCRIPT_NAME is "elf" and $GENERATE_SHLIB_SCRIPT is set by the emulation
# parameters too.
if [ "x$SCRIPT_NAME" = "xelf" ]; then
GENERATE_COMBRELOC_SCRIPT=yes
fi
SEGMENT_SIZE=${SEGMENT_SIZE-${TARGET_PAGE_SIZE}}
@ -73,39 +84,75 @@ DATA_ALIGNMENT_u="${DATA_ALIGNMENT_u-${DATA_ALIGNMENT_r}}"
LD_FLAG=r
DATA_ALIGNMENT=${DATA_ALIGNMENT_r}
DEFAULT_DATA_ALIGNMENT="ALIGN(${SEGMENT_SIZE})"
(. ${srcdir}/scripttempl/${SCRIPT_NAME}.sc) | sed -e '/^ *$/d' \
> ldscripts/${EMULATION_NAME}.xr
( echo "/* Script for ld -r: link without relocation */"
. ${srcdir}/emulparams/${EMULATION_NAME}.sh
. ${srcdir}/scripttempl/${SCRIPT_NAME}.sc
) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xr
LD_FLAG=u
DATA_ALIGNMENT=${DATA_ALIGNMENT_u}
CONSTRUCTING=" "
(. ${srcdir}/scripttempl/${SCRIPT_NAME}.sc) | sed -e '/^ *$/d' \
> ldscripts/${EMULATION_NAME}.xu
( echo "/* Script for ld -Ur: link w/out relocation, do create constructors */"
. ${srcdir}/emulparams/${EMULATION_NAME}.sh
. ${srcdir}/scripttempl/${SCRIPT_NAME}.sc
) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xu
LD_FLAG=
DATA_ALIGNMENT=${DATA_ALIGNMENT_}
RELOCATING=" "
(. ${srcdir}/scripttempl/${SCRIPT_NAME}.sc) | sed -e '/^ *$/d' \
> ldscripts/${EMULATION_NAME}.x
( echo "/* Default linker script, for normal executables */"
. ${srcdir}/emulparams/${EMULATION_NAME}.sh
. ${srcdir}/scripttempl/${SCRIPT_NAME}.sc
) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.x
LD_FLAG=n
DATA_ALIGNMENT=${DATA_ALIGNMENT_n}
TEXT_START_ADDR=${NONPAGED_TEXT_START_ADDR-${TEXT_START_ADDR}}
(. ${srcdir}/scripttempl/${SCRIPT_NAME}.sc) | sed -e '/^ *$/d' \
> ldscripts/${EMULATION_NAME}.xn
( echo "/* Script for -n: mix text and data on same page */"
. ${srcdir}/emulparams/${EMULATION_NAME}.sh
. ${srcdir}/scripttempl/${SCRIPT_NAME}.sc
) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xn
LD_FLAG=N
DATA_ALIGNMENT=${DATA_ALIGNMENT_N}
(. ${srcdir}/scripttempl/${SCRIPT_NAME}.sc) | sed -e '/^ *$/d' \
> ldscripts/${EMULATION_NAME}.xbn
( echo "/* Script for -N: mix text and data on same page; don't align data */"
. ${srcdir}/emulparams/${EMULATION_NAME}.sh
. ${srcdir}/scripttempl/${SCRIPT_NAME}.sc
) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xbn
if test -n "$GENERATE_COMBRELOC_SCRIPT"; then
DATA_ALIGNMENT=${DATA_ALIGNMENT_c-${DATA_ALIGNMENT_}}
LD_FLAG=c
COMBRELOC=ldscripts/${EMULATION_NAME}.xc.tmp
( echo "/* Script for -z combreloc: combine and sort reloc sections */"
. ${srcdir}/emulparams/${EMULATION_NAME}.sh
. ${srcdir}/scripttempl/${SCRIPT_NAME}.sc
) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xc
rm -f ${COMBRELOC}
COMBRELOC=
fi
if test -n "$GENERATE_SHLIB_SCRIPT"; then
LD_FLAG=shared
DATA_ALIGNMENT=${DATA_ALIGNMENT_s-${DATA_ALIGNMENT_}}
CREATE_SHLIB=" "
# Note that TEXT_START_ADDR is set to NONPAGED_TEXT_START_ADDR.
(. ${srcdir}/scripttempl/${SCRIPT_NAME}.sc) | sed -e '/^ *$/d' \
> ldscripts/${EMULATION_NAME}.xs
(
echo "/* Script for ld --shared: link shared library */"
. ${srcdir}/emulparams/${EMULATION_NAME}.sh
. ${srcdir}/scripttempl/${SCRIPT_NAME}.sc
) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xs
if test -n "$GENERATE_COMBRELOC_SCRIPT"; then
LD_FLAG=cshared
DATA_ALIGNMENT=${DATA_ALIGNMENT_sc-${DATA_ALIGNMENT}}
COMBRELOC=ldscripts/${EMULATION_NAME}.xc.tmp
( echo "/* Script for --shared -z combreloc: shared library, combine & sort relocs */"
. ${srcdir}/emulparams/${EMULATION_NAME}.sh
. ${srcdir}/scripttempl/${SCRIPT_NAME}.sc
) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xsc
rm -f ${COMBRELOC}
COMBRELOC=
fi
fi
for i in $EMULATION_LIBPATH ; do