diff --git a/gnu/usr.bin/binutils/ld/Makefile.alpha b/gnu/usr.bin/binutils/ld/Makefile.alpha index 3a23767ba22c..46ef61bfce3a 100644 --- a/gnu/usr.bin/binutils/ld/Makefile.alpha +++ b/gnu/usr.bin/binutils/ld/Makefile.alpha @@ -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 diff --git a/gnu/usr.bin/binutils/ld/Makefile.i386 b/gnu/usr.bin/binutils/ld/Makefile.i386 index 3209fd57b6b0..b3e16c2708b2 100644 --- a/gnu/usr.bin/binutils/ld/Makefile.i386 +++ b/gnu/usr.bin/binutils/ld/Makefile.i386 @@ -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 diff --git a/gnu/usr.bin/binutils/ld/Makefile.ia64 b/gnu/usr.bin/binutils/ld/Makefile.ia64 index 594412fe75d5..5b33455af49b 100644 --- a/gnu/usr.bin/binutils/ld/Makefile.ia64 +++ b/gnu/usr.bin/binutils/ld/Makefile.ia64 @@ -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 diff --git a/gnu/usr.bin/binutils/ld/Makefile.powerpc b/gnu/usr.bin/binutils/ld/Makefile.powerpc index e728098e5f07..6600ad596447 100644 --- a/gnu/usr.bin/binutils/ld/Makefile.powerpc +++ b/gnu/usr.bin/binutils/ld/Makefile.powerpc @@ -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 \ diff --git a/gnu/usr.bin/binutils/ld/Makefile.sparc64 b/gnu/usr.bin/binutils/ld/Makefile.sparc64 index ccee0cb72971..e161812ef447 100644 --- a/gnu/usr.bin/binutils/ld/Makefile.sparc64 +++ b/gnu/usr.bin/binutils/ld/Makefile.sparc64 @@ -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 diff --git a/gnu/usr.bin/binutils/ld/genscripts.sh b/gnu/usr.bin/binutils/ld/genscripts.sh index cb97a7f9eb05..e73097b873f2 100755 --- a/gnu/usr.bin/binutils/ld/genscripts.sh +++ b/gnu/usr.bin/binutils/ld/genscripts.sh @@ -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