152939Sjb#!/bin/sh 252939Sjb# genscripts.sh - generate the ld-emulation-target specific files 352939Sjb# 452939Sjb# Usage: genscripts.sh srcdir libdir host target target_alias \ 552939Sjb# default_emulation native_lib_dirs this_emulation 652939Sjb# 752939Sjb# Sample usage: 852939Sjb# genscripts.sh /djm/ld-devo/devo/ld /usr/local/lib sparc-sun-sunos4.1.3 \ 952939Sjb# sparc-sun-sunos4.1.3 sparc-sun-sunos4.1.3 sun4 "" sun3 sparc-sun-sunos4.1.3 1052939Sjb# produces sun3.x sun3.xbn sun3.xn sun3.xr sun3.xu em_sun3.c 1152939Sjb# 1252939Sjb# $FreeBSD$ 1352939Sjb# 1452939Sjb# This is a cut-down version of the GNU script. Instead of jumping through 1552939Sjb# hoops for all possible combinations of paths, just use the libdir 1652939Sjb# argument in place of LIB_PATH. 1752939Sjb# 18130575Sobrien# The exec_prefix, target_alias, use_sysroot, NATIVE_LIB_DIRS, TOOL_LIB, CUSTOMIZER_SCRIPT 19130575Sobrien# arguments are not used in this version. 2052939Sjb# 2152939Sjb 2252939Sjbsrcdir=$1 2352939Sjblibdir=$2 24130575Sobrienexec_prefix=$3 25130575Sobrienhost=$4 26130575Sobrientarget=$5 27130575Sobrientarget_alias=$6 28130575SobrienEMULATION_LIBPATH=$7 29130575SobrienNATIVE_LIB_DIRS=$8 30130575Sobrienuse_sysroot=$9 31130575Sobrienshift 9 32130575SobrienEMULATION_NAME=$1 33130575SobrienTOOL_LIB=$2 34130575SobrienCUSTOMIZER_SCRIPT=$3 3552939Sjb 36130575Sobrien# Create the 'CUSTOMIZER_SCRIPT' knob to better sync this script with 37130575Sobrien# FSF BU ver 2.15 which allows for a more generic emulparams processing. 38130575Sobrien# To reduce the diff, I also include the ${EMULATION_NAME} parameter in uses 39130575Sobrien# of 'CUSTOMIZER_SCRIPT'. 40162301Simp 41162301Simp# XXX: arm hack : until those file are merged back into the FSF repo, just 42162301Simp# use the version in this directory. 43162301Simpif !(test -f ${CUSTOMIZER_SCRIPT}"";) then 44130575SobrienCUSTOMIZER_SCRIPT="${srcdir}/emulparams/${EMULATION_NAME}.sh" 45162301Simpfi 46130575Sobrien 4752939Sjb# Include the emulation-specific parameters: 48130575Sobrien. ${CUSTOMIZER_SCRIPT} ${EMULATION_NAME} 4952939Sjb 5052939Sjbif test -d ldscripts; then 5152939Sjb true 5252939Sjbelse 53204548Simp rm -f ldscripts 5452939Sjb mkdir ldscripts 5552939Sjbfi 5652939Sjb 57130575Sobrien# Set some flags for the emultempl scripts. USE_LIBPATH will 58172243Sobrien# be set for any libpath-using emulation; NATIVE will be set for a 59172243Sobrien# emulation to enable 'LD_LIBRARY_PATH=/foo:/bar ld -lfooz' 60172243Sobrien if [ "x${host}" = "x${target}" ] ; then 61172243Sobrien NATIVE=yes 62172243Sobrien fi 63172243Sobrien USE_LIBPATH=yes 64130575Sobrien 6560777Sobrien# Set the library search path, for libraries named by -lfoo. 6660777Sobrien# If LIB_PATH is defined (e.g., by Makefile) and non-empty, it is used. 6760777Sobrien# Otherwise, the default is set here. 6860777Sobrien# 6960777Sobrien# The format is the usual list of colon-separated directories. 7060777Sobrien# To force a logically empty LIB_PATH, do LIBPATH=":". 7160777Sobrien 72104878SobrienLIB_SEARCH_DIRS=`echo ${libdir} | sed -e 's/:/ /g' -e 's/\([^ ][^ ]*\)/SEARCH_DIR(\1);/g'` 7352939Sjb 7452939Sjb# Generate 5 or 6 script files from a master script template in 7552939Sjb# ${srcdir}/scripttempl/${SCRIPT_NAME}.sh. Which one of the 5 or 6 7652939Sjb# script files is actually used depends on command line options given 7752939Sjb# to ld. (SCRIPT_NAME was set in the emulparams_file.) 7852939Sjb# 7952939Sjb# A .x script file is the default script. 8052939Sjb# A .xr script is for linking without relocation (-r flag). 8152939Sjb# A .xu script is like .xr, but *do* create constructors (-Ur flag). 8252939Sjb# A .xn script is for linking with -n flag (mix text and data on same page). 8352939Sjb# A .xbn script is for linking with -N flag (mix text and data on same page). 8452939Sjb# A .xs script is for generating a shared library with the --shared 8552939Sjb# flag; it is only generated if $GENERATE_SHLIB_SCRIPT is set by the 8652939Sjb# emulation parameters. 8792237Sobrien# A .xc script is for linking with -z combreloc; it is only generated if 8892237Sobrien# $GENERATE_COMBRELOC_SCRIPT is set by the emulation parameters or 8992237Sobrien# $SCRIPT_NAME is "elf". 9092237Sobrien# A .xsc script is for linking with --shared -z combreloc; it is generated 9192237Sobrien# if $GENERATE_COMBRELOC_SCRIPT is set by the emulation parameters or 9292237Sobrien# $SCRIPT_NAME is "elf" and $GENERATE_SHLIB_SCRIPT is set by the emulation 9392237Sobrien# parameters too. 9452939Sjb 9592237Sobrienif [ "x$SCRIPT_NAME" = "xelf" ]; then 9692237Sobrien GENERATE_COMBRELOC_SCRIPT=yes 9792237Sobrienfi 9892237Sobrien 99130575SobrienSEGMENT_SIZE=${SEGMENT_SIZE-${MAXPAGESIZE-${TARGET_PAGE_SIZE}}} 10052939Sjb 10152939Sjb# Determine DATA_ALIGNMENT for the 5 variants, using 102218822Sdim# values specified in the emulparams/<script_to_run>.sh file or default. 10352939Sjb 10452939SjbDATA_ALIGNMENT_="${DATA_ALIGNMENT_-${DATA_ALIGNMENT-ALIGN(${SEGMENT_SIZE})}}" 10552939SjbDATA_ALIGNMENT_n="${DATA_ALIGNMENT_n-${DATA_ALIGNMENT_}}" 10652939SjbDATA_ALIGNMENT_N="${DATA_ALIGNMENT_N-${DATA_ALIGNMENT-.}}" 10752939SjbDATA_ALIGNMENT_r="${DATA_ALIGNMENT_r-${DATA_ALIGNMENT-}}" 10852939SjbDATA_ALIGNMENT_u="${DATA_ALIGNMENT_u-${DATA_ALIGNMENT_r}}" 10952939Sjb 11052939SjbLD_FLAG=r 11152939SjbDATA_ALIGNMENT=${DATA_ALIGNMENT_r} 11252939SjbDEFAULT_DATA_ALIGNMENT="ALIGN(${SEGMENT_SIZE})" 11392237Sobrien( echo "/* Script for ld -r: link without relocation */" 114130575Sobrien . ${CUSTOMIZER_SCRIPT} ${EMULATION_NAME} 11592237Sobrien . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc 11692237Sobrien) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xr 11752939Sjb 11852939SjbLD_FLAG=u 11952939SjbDATA_ALIGNMENT=${DATA_ALIGNMENT_u} 12052939SjbCONSTRUCTING=" " 12192237Sobrien( echo "/* Script for ld -Ur: link w/out relocation, do create constructors */" 122130575Sobrien . ${CUSTOMIZER_SCRIPT} ${EMULATION_NAME} 12392237Sobrien . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc 12492237Sobrien) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xu 12552939Sjb 12652939SjbLD_FLAG= 12752939SjbDATA_ALIGNMENT=${DATA_ALIGNMENT_} 12852939SjbRELOCATING=" " 12992237Sobrien( echo "/* Default linker script, for normal executables */" 130130575Sobrien . ${CUSTOMIZER_SCRIPT} ${EMULATION_NAME} 13192237Sobrien . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc 13292237Sobrien) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.x 13352939Sjb 13452939SjbLD_FLAG=n 13552939SjbDATA_ALIGNMENT=${DATA_ALIGNMENT_n} 13652939SjbTEXT_START_ADDR=${NONPAGED_TEXT_START_ADDR-${TEXT_START_ADDR}} 13792237Sobrien( echo "/* Script for -n: mix text and data on same page */" 138130575Sobrien . ${CUSTOMIZER_SCRIPT} ${EMULATION_NAME} 13992237Sobrien . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc 14092237Sobrien) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xn 14152939Sjb 14252939SjbLD_FLAG=N 14352939SjbDATA_ALIGNMENT=${DATA_ALIGNMENT_N} 14492237Sobrien( echo "/* Script for -N: mix text and data on same page; don't align data */" 145130575Sobrien . ${CUSTOMIZER_SCRIPT} ${EMULATION_NAME} 14692237Sobrien . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc 14792237Sobrien) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xbn 14852939Sjb 14992237Sobrienif test -n "$GENERATE_COMBRELOC_SCRIPT"; then 15092237Sobrien DATA_ALIGNMENT=${DATA_ALIGNMENT_c-${DATA_ALIGNMENT_}} 15192237Sobrien LD_FLAG=c 15292237Sobrien COMBRELOC=ldscripts/${EMULATION_NAME}.xc.tmp 15392237Sobrien ( echo "/* Script for -z combreloc: combine and sort reloc sections */" 154130575Sobrien . ${CUSTOMIZER_SCRIPT} ${EMULATION_NAME} 15592237Sobrien . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc 15692237Sobrien ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xc 15792237Sobrien rm -f ${COMBRELOC} 158218822Sdim LD_FLAG=w 159218822Sdim RELRO_NOW=" " 160218822Sdim COMBRELOC=ldscripts/${EMULATION_NAME}.xw.tmp 161218822Sdim ( echo "/* Script for -z combreloc -z now -z relro: combine and sort reloc sections */" 162218822Sdim . ${CUSTOMIZER_SCRIPT} ${EMULATION_NAME} 163218822Sdim . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc 164218822Sdim ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xw 165218822Sdim rm -f ${COMBRELOC} 16692237Sobrien COMBRELOC= 167218822Sdim unset RELRO_NOW 16892237Sobrienfi 16992237Sobrien 17052939Sjbif test -n "$GENERATE_SHLIB_SCRIPT"; then 17152939Sjb LD_FLAG=shared 17252939Sjb DATA_ALIGNMENT=${DATA_ALIGNMENT_s-${DATA_ALIGNMENT_}} 17352939Sjb CREATE_SHLIB=" " 17452939Sjb # Note that TEXT_START_ADDR is set to NONPAGED_TEXT_START_ADDR. 17592237Sobrien ( 17692237Sobrien echo "/* Script for ld --shared: link shared library */" 177130575Sobrien . ${CUSTOMIZER_SCRIPT} ${EMULATION_NAME} 17892237Sobrien . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc 17992237Sobrien ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xs 18092237Sobrien if test -n "$GENERATE_COMBRELOC_SCRIPT"; then 18192237Sobrien LD_FLAG=cshared 18292237Sobrien DATA_ALIGNMENT=${DATA_ALIGNMENT_sc-${DATA_ALIGNMENT}} 183218822Sdim COMBRELOC=ldscripts/${EMULATION_NAME}.xsc.tmp 18492237Sobrien ( echo "/* Script for --shared -z combreloc: shared library, combine & sort relocs */" 185130575Sobrien . ${CUSTOMIZER_SCRIPT} ${EMULATION_NAME} 18692237Sobrien . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc 18792237Sobrien ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xsc 18892237Sobrien rm -f ${COMBRELOC} 189218822Sdim LD_FLAG=wshared 190218822Sdim RELRO_NOW=" " 191218822Sdim COMBRELOC=ldscripts/${EMULATION_NAME}.xsw.tmp 192218822Sdim ( echo "/* Script for --shared -z combreloc -z now -z relro: shared library, combine & sort relocs */" 193218822Sdim . ${CUSTOMIZER_SCRIPT} ${EMULATION_NAME} 194218822Sdim . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc 195218822Sdim ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xsw 196218822Sdim rm -f ${COMBRELOC} 19792237Sobrien COMBRELOC= 198218822Sdim unset RELRO_NOW 19992237Sobrien fi 200130575Sobrien unset CREATE_SHLIB 20152939Sjbfi 20252939Sjb 203130575Sobrienif test -n "$GENERATE_PIE_SCRIPT"; then 204130575Sobrien LD_FLAG=pie 205130575Sobrien DATA_ALIGNMENT=${DATA_ALIGNMENT_s-${DATA_ALIGNMENT_}} 206130575Sobrien CREATE_PIE=" " 207130575Sobrien # Note that TEXT_START_ADDR is set to NONPAGED_TEXT_START_ADDR. 208130575Sobrien ( 209130575Sobrien echo "/* Script for ld -pie: link position independent executable */" 210130575Sobrien . ${CUSTOMIZER_SCRIPT} ${EMULATION_NAME} 211130575Sobrien . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc 212130575Sobrien ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xd 213130575Sobrien if test -n "$GENERATE_COMBRELOC_SCRIPT"; then 214130575Sobrien LD_FLAG=cpie 215130575Sobrien DATA_ALIGNMENT=${DATA_ALIGNMENT_sc-${DATA_ALIGNMENT}} 216218822Sdim COMBRELOC=ldscripts/${EMULATION_NAME}.xdc.tmp 217130575Sobrien ( echo "/* Script for -pie -z combreloc: position independent executable, combine & sort relocs */" 218130575Sobrien . ${CUSTOMIZER_SCRIPT} ${EMULATION_NAME} 219130575Sobrien . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc 220130575Sobrien ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xdc 221130575Sobrien rm -f ${COMBRELOC} 222218822Sdim LD_FLAG=wpie 223218822Sdim RELRO_NOW=" " 224218822Sdim COMBRELOC=ldscripts/${EMULATION_NAME}.xdw.tmp 225218822Sdim ( echo "/* Script for -pie -z combreloc -z now -z relro: position independent executable, combine & sort relocs */" 226218822Sdim . ${CUSTOMIZER_SCRIPT} ${EMULATION_NAME} 227218822Sdim . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc 228218822Sdim ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xdw 229218822Sdim rm -f ${COMBRELOC} 230130575Sobrien COMBRELOC= 231218822Sdim unset RELRO_NOW 232130575Sobrien fi 233130575Sobrien unset CREATE_PIE 234130575Sobrienfi 235130575Sobrien 236104878Sobriencase " $EMULATION_LIBPATH " in 237104878Sobrien *" ${EMULATION_NAME} "*) COMPILE_IN=true;; 238104878Sobrienesac 239104878Sobrien 24052939Sjb# Generate e${EMULATION_NAME}.c. 24152939Sjb. ${srcdir}/emultempl/${TEMPLATE_NAME-generic}.em 242