1132718Skan#!/bin/sh 2169689Skan# genscripts.sh - generate the ld-emulation-target specific files 3132718Skan# 4132718Skan# Usage: genscripts.sh srcdir libdir host target target_alias \ 5132718Skan# default_emulation native_lib_dirs this_emulation 6132718Skan# 7132718Skan# Sample usage: 8132718Skan# genscripts.sh /djm/ld-devo/devo/ld /usr/local/lib sparc-sun-sunos4.1.3 \ 9132718Skan# sparc-sun-sunos4.1.3 sparc-sun-sunos4.1.3 sun4 "" sun3 sparc-sun-sunos4.1.3 10132718Skan# produces sun3.x sun3.xbn sun3.xn sun3.xr sun3.xu em_sun3.c 11132718Skan# 12132718Skan# $FreeBSD: releng/11.0/gnu/usr.bin/binutils/ld/genscripts.sh 289410 2015-10-16 05:54:41Z bdrewery $ 13132718Skan# 14132718Skan# This is a cut-down version of the GNU script. Instead of jumping through 15132718Skan# hoops for all possible combinations of paths, just use the libdir 16132718Skan# argument in place of LIB_PATH. 17132718Skan# 18169689Skan# The exec_prefix, target_alias, use_sysroot, NATIVE_LIB_DIRS, TOOL_LIB, CUSTOMIZER_SCRIPT 19169689Skan# arguments are not used in this version. 20132718Skan# 21132718Skan 22132718Skansrcdir=$1 23132718Skanlibdir=$2 24132718Skanexec_prefix=$3 25132718Skanhost=$4 26132718Skantarget=$5 27169689Skantarget_alias=$6 28132718SkanEMULATION_LIBPATH=$7 29132718SkanNATIVE_LIB_DIRS=$8 30132718Skanuse_sysroot=$9 31132718Skanshift 9 32132718SkanEMULATION_NAME=$1 33132718SkanTOOL_LIB=$2 34132718SkanCUSTOMIZER_SCRIPT=$3 35132718Skan 36132718Skan# Create the 'CUSTOMIZER_SCRIPT' knob to better sync this script with 37132718Skan# FSF BU ver 2.15 which allows for a more generic emulparams processing. 38132718Skan# To reduce the diff, I also include the ${EMULATION_NAME} parameter in uses 39132718Skan# of 'CUSTOMIZER_SCRIPT'. 40132718Skan 41132718Skan# XXX: arm hack : until those file are merged back into the FSF repo, just 42132718Skan# use the version in this directory. 43132718Skanif !(test -f ${CUSTOMIZER_SCRIPT}"";) then 44132718SkanCUSTOMIZER_SCRIPT="${srcdir}/emulparams/${EMULATION_NAME}.sh" 45132718Skanfi 46132718Skan 47132718Skan# Include the emulation-specific parameters: 48132718Skan. ${CUSTOMIZER_SCRIPT} ${EMULATION_NAME} 49132718Skan 50132718Skanif test -d ldscripts; then 51132718Skan true 52132718Skanelse 53132718Skan mkdir -p ldscripts 54132718Skanfi 55132718Skan 56132718Skan# Set some flags for the emultempl scripts. USE_LIBPATH will 57132718Skan# be set for any libpath-using emulation; NATIVE will be set for a 58132718Skan# emulation to enable 'LD_LIBRARY_PATH=/foo:/bar ld -lfooz' 59132718Skan if [ "x${host}" = "x${target}" ] ; then 60132718Skan NATIVE=yes 61132718Skan fi 62132718Skan USE_LIBPATH=yes 63132718Skan 64132718Skan# Set the library search path, for libraries named by -lfoo. 65132718Skan# If LIB_PATH is defined (e.g., by Makefile) and non-empty, it is used. 66132718Skan# Otherwise, the default is set here. 67132718Skan# 68132718Skan# The format is the usual list of colon-separated directories. 69132718Skan# To force a logically empty LIB_PATH, do LIBPATH=":". 70132718Skan 71132718SkanLIB_SEARCH_DIRS=`echo ${libdir} | sed -e 's/:/ /g' -e 's/\([^ ][^ ]*\)/SEARCH_DIR(\1);/g'` 72132718Skan 73132718Skan# Generate 5 or 6 script files from a master script template in 74132718Skan# ${srcdir}/scripttempl/${SCRIPT_NAME}.sh. Which one of the 5 or 6 75132718Skan# script files is actually used depends on command line options given 76132718Skan# to ld. (SCRIPT_NAME was set in the emulparams_file.) 77132718Skan# 78132718Skan# A .x script file is the default script. 79132718Skan# A .xr script is for linking without relocation (-r flag). 80132718Skan# A .xu script is like .xr, but *do* create constructors (-Ur flag). 81132718Skan# A .xn script is for linking with -n flag (mix text and data on same page). 82132718Skan# A .xbn script is for linking with -N flag (mix text and data on same page). 83169689Skan# A .xs script is for generating a shared library with the --shared 84132718Skan# flag; it is only generated if $GENERATE_SHLIB_SCRIPT is set by the 85169689Skan# emulation parameters. 86132718Skan# A .xc script is for linking with -z combreloc; it is only generated if 87169689Skan# $GENERATE_COMBRELOC_SCRIPT is set by the emulation parameters or 88169689Skan# $SCRIPT_NAME is "elf". 89169689Skan# A .xsc script is for linking with --shared -z combreloc; it is generated 90169689Skan# if $GENERATE_COMBRELOC_SCRIPT is set by the emulation parameters or 91169689Skan# $SCRIPT_NAME is "elf" and $GENERATE_SHLIB_SCRIPT is set by the emulation 92169689Skan# parameters too. 93169689Skan 94169689Skanif [ "x$SCRIPT_NAME" = "xelf" ]; then 95169689Skan GENERATE_COMBRELOC_SCRIPT=yes 96169689Skanfi 97169689Skan 98169689SkanSEGMENT_SIZE=${SEGMENT_SIZE-${MAXPAGESIZE-${TARGET_PAGE_SIZE}}} 99169689Skan 100169689Skan# Determine DATA_ALIGNMENT for the 5 variants, using 101169689Skan# values specified in the emulparams/<script_to_run>.sh file or default. 102169689Skan 103169689SkanDATA_ALIGNMENT_="${DATA_ALIGNMENT_-${DATA_ALIGNMENT-ALIGN(${SEGMENT_SIZE})}}" 104169689SkanDATA_ALIGNMENT_n="${DATA_ALIGNMENT_n-${DATA_ALIGNMENT_}}" 105169689SkanDATA_ALIGNMENT_N="${DATA_ALIGNMENT_N-${DATA_ALIGNMENT-.}}" 106169689SkanDATA_ALIGNMENT_r="${DATA_ALIGNMENT_r-${DATA_ALIGNMENT-}}" 107169689SkanDATA_ALIGNMENT_u="${DATA_ALIGNMENT_u-${DATA_ALIGNMENT_r}}" 108169689Skan 109169689SkanLD_FLAG=r 110169689SkanDATA_ALIGNMENT=${DATA_ALIGNMENT_r} 111169689SkanDEFAULT_DATA_ALIGNMENT="ALIGN(${SEGMENT_SIZE})" 112169689Skan( echo "/* Script for ld -r: link without relocation */" 113169689Skan . ${CUSTOMIZER_SCRIPT} ${EMULATION_NAME} 114169689Skan . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc 115169689Skan) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xr 116169689Skan 117169689SkanLD_FLAG=u 118169689SkanDATA_ALIGNMENT=${DATA_ALIGNMENT_u} 119169689SkanCONSTRUCTING=" " 120169689Skan( echo "/* Script for ld -Ur: link w/out relocation, do create constructors */" 121169689Skan . ${CUSTOMIZER_SCRIPT} ${EMULATION_NAME} 122169689Skan . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc 123169689Skan) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xu 124169689Skan 125169689SkanLD_FLAG= 126169689SkanDATA_ALIGNMENT=${DATA_ALIGNMENT_} 127169689SkanRELOCATING=" " 128169689Skan( echo "/* Default linker script, for normal executables */" 129169689Skan . ${CUSTOMIZER_SCRIPT} ${EMULATION_NAME} 130169689Skan . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc 131169689Skan) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.x 132169689Skan 133169689SkanLD_FLAG=n 134169689SkanDATA_ALIGNMENT=${DATA_ALIGNMENT_n} 135169689SkanTEXT_START_ADDR=${NONPAGED_TEXT_START_ADDR-${TEXT_START_ADDR}} 136169689Skan( echo "/* Script for -n: mix text and data on same page */" 137169689Skan . ${CUSTOMIZER_SCRIPT} ${EMULATION_NAME} 138132718Skan . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc 139132718Skan) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xn 140132718Skan 141132718SkanLD_FLAG=N 142132718SkanDATA_ALIGNMENT=${DATA_ALIGNMENT_N} 143132718Skan( echo "/* Script for -N: mix text and data on same page; don't align data */" 144132718Skan . ${CUSTOMIZER_SCRIPT} ${EMULATION_NAME} 145132718Skan . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc 146132718Skan) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xbn 147132718Skan 148132718Skanif test -n "$GENERATE_COMBRELOC_SCRIPT"; then 149132718Skan DATA_ALIGNMENT=${DATA_ALIGNMENT_c-${DATA_ALIGNMENT_}} 150132718Skan LD_FLAG=c 151132718Skan COMBRELOC=ldscripts/${EMULATION_NAME}.xc.tmp 152132718Skan ( echo "/* Script for -z combreloc: combine and sort reloc sections */" 153132718Skan . ${CUSTOMIZER_SCRIPT} ${EMULATION_NAME} 154132718Skan . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc 155132718Skan ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xc 156132718Skan rm -f ${COMBRELOC} 157132718Skan LD_FLAG=w 158132718Skan RELRO_NOW=" " 159132718Skan COMBRELOC=ldscripts/${EMULATION_NAME}.xw.tmp 160132718Skan ( echo "/* Script for -z combreloc -z now -z relro: combine and sort reloc sections */" 161132718Skan . ${CUSTOMIZER_SCRIPT} ${EMULATION_NAME} 162132718Skan . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc 163132718Skan ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xw 164169689Skan rm -f ${COMBRELOC} 165169689Skan COMBRELOC= 166132718Skan unset RELRO_NOW 167132718Skanfi 168132718Skan 169169689Skanif test -n "$GENERATE_SHLIB_SCRIPT"; then 170169689Skan LD_FLAG=shared 171169689Skan DATA_ALIGNMENT=${DATA_ALIGNMENT_s-${DATA_ALIGNMENT_}} 172169689Skan CREATE_SHLIB=" " 173169689Skan # Note that TEXT_START_ADDR is set to NONPAGED_TEXT_START_ADDR. 174132718Skan ( 175169689Skan echo "/* Script for ld --shared: link shared library */" 176169689Skan . ${CUSTOMIZER_SCRIPT} ${EMULATION_NAME} 177132718Skan . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc 178169689Skan ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xs 179132718Skan if test -n "$GENERATE_COMBRELOC_SCRIPT"; then 180132718Skan LD_FLAG=cshared 181169689Skan DATA_ALIGNMENT=${DATA_ALIGNMENT_sc-${DATA_ALIGNMENT}} 182169689Skan COMBRELOC=ldscripts/${EMULATION_NAME}.xsc.tmp 183132718Skan ( echo "/* Script for --shared -z combreloc: shared library, combine & sort relocs */" 184169689Skan . ${CUSTOMIZER_SCRIPT} ${EMULATION_NAME} 185132718Skan . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc 186132718Skan ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xsc 187169689Skan rm -f ${COMBRELOC} 188169689Skan LD_FLAG=wshared 189169689Skan RELRO_NOW=" " 190132718Skan COMBRELOC=ldscripts/${EMULATION_NAME}.xsw.tmp 191132718Skan ( echo "/* Script for --shared -z combreloc -z now -z relro: shared library, combine & sort relocs */" 192132718Skan . ${CUSTOMIZER_SCRIPT} ${EMULATION_NAME} 193132718Skan . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc 194169689Skan ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xsw 195132718Skan rm -f ${COMBRELOC} 196169689Skan COMBRELOC= 197169689Skan unset RELRO_NOW 198132718Skan fi 199169689Skan unset CREATE_SHLIB 200132718Skanfi 201169689Skan 202169689Skanif test -n "$GENERATE_PIE_SCRIPT"; then 203169689Skan LD_FLAG=pie 204132718Skan DATA_ALIGNMENT=${DATA_ALIGNMENT_s-${DATA_ALIGNMENT_}} 205169689Skan CREATE_PIE=" " 206169689Skan # Note that TEXT_START_ADDR is set to NONPAGED_TEXT_START_ADDR. 207169689Skan ( 208169689Skan echo "/* Script for ld -pie: link position independent executable */" 209169689Skan . ${CUSTOMIZER_SCRIPT} ${EMULATION_NAME} 210169689Skan . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc 211169689Skan ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xd 212169689Skan if test -n "$GENERATE_COMBRELOC_SCRIPT"; then 213169689Skan LD_FLAG=cpie 214169689Skan DATA_ALIGNMENT=${DATA_ALIGNMENT_sc-${DATA_ALIGNMENT}} 215169689Skan COMBRELOC=ldscripts/${EMULATION_NAME}.xdc.tmp 216169689Skan ( echo "/* Script for -pie -z combreloc: position independent executable, combine & sort relocs */" 217169689Skan . ${CUSTOMIZER_SCRIPT} ${EMULATION_NAME} 218169689Skan . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc 219169689Skan ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xdc 220169689Skan rm -f ${COMBRELOC} 221169689Skan LD_FLAG=wpie 222169689Skan RELRO_NOW=" " 223169689Skan COMBRELOC=ldscripts/${EMULATION_NAME}.xdw.tmp 224169689Skan ( echo "/* Script for -pie -z combreloc -z now -z relro: position independent executable, combine & sort relocs */" 225169689Skan . ${CUSTOMIZER_SCRIPT} ${EMULATION_NAME} 226169689Skan . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc 227169689Skan ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xdw 228169689Skan rm -f ${COMBRELOC} 229169689Skan COMBRELOC= 230169689Skan unset RELRO_NOW 231169689Skan fi 232169689Skan unset CREATE_PIE 233169689Skanfi 234169689Skan 235169689Skancase " $EMULATION_LIBPATH " in 236169689Skan *" ${EMULATION_NAME} "*) COMPILE_IN=true;; 237169689Skanesac 238169689Skan 239169689Skan# Generate e${EMULATION_NAME}.c. 240169689Skan. ${srcdir}/emultempl/${TEMPLATE_NAME-generic}.em 241132718Skan