genscripts.sh revision 130561
1#!/bin/sh 2# genscripts.sh - generate the ld-emulation-target specific files 3# 4# Usage: genscripts_extra.sh \ 5# srcdir \ 6# libdir \ 7# exec_prefix \ 8# host \ 9# target \ 10# target_alias \ 11# default_emulation \ 12# native_lib_dirs \ 13# use_sysroot \ 14# this_emulation \ 15# optional: 16# tool_dir \ 17# customizer_script 18# 19# Sample usage: 20# 21# genscripts_extra.sh \ 22# /sources/ld \ 23# /usr/local/lib \ 24# /usr/local \ 25# sparc-sun-sunos4.1.3 \ 26# sparc-sun-sunos4.1.3 \ 27# sparc-sun-sunos4.1.3 \ 28# sun4 \ 29# "" \ 30# no \ 31# sun3 \ 32# sparc-sun-sunos4.1.3 \ 33# sparc.sh 34# 35# produces the linker scripts: 36# 37# sun3.x [default linker script] 38# sun3.xbn [used when the linker is invoked with "-N"] 39# sun3.xn [used when the linker is invoked with "-n"] 40# sun3.xr [used when the linker is invoked with "-r"] 41# sun3.xu [used when the linker is invoked with "-Ur"] 42# and maybe: 43# sun3.xc [used when the linker is invoked with "-z combreloc"] 44# sun3.xsc [used when the linker is invoked with "--shared"] 45# sun3.xdc [used when the linker is invoked with "-pie"] 46# 47# It also produced the C source file: 48# 49# em_sun3.c 50# 51# which is then compiled into the linker. 52# 53# The linker scripts are created by running the shell script 54# /sources/ld/emulparams/sparc.sh to set the value of ${SCRIPT_NAME} 55# (and any other variables it wants to). ${SCRIPT_NAME} is then 56# invoked with a variable called ${LD_FLAG} to tell it which version 57# of the linker script to create. 58 59 60srcdir=$1 61libdir=$2 62exec_prefix=$3 63host=$4 64target=$5 65target_alias=$6 66EMULATION_LIBPATH=$7 67NATIVE_LIB_DIRS=$8 68use_sysroot=$9 69shift 9 70EMULATION_NAME=$1 71TOOL_LIB=$2 72CUSTOMIZER_SCRIPT=$3 73 74# Can't use ${TOOL_LIB:-$target_alias} here due to an Ultrix shell bug. 75if [ "x${TOOL_LIB}" = "x" ] ; then 76 tool_lib=${exec_prefix}/${target_alias}/lib 77else 78 tool_lib=${exec_prefix}/${TOOL_LIB}/lib 79fi 80 81if [ "x${CUSTOMIZER_SCRIPT}" = "x" ] ; then 82 CUSTOMIZER_SCRIPT=${EMULATION_NAME} 83fi 84CUSTOMIZER_SCRIPT="${srcdir}/emulparams/${CUSTOMIZER_SCRIPT}.sh" 85 86# Include the emulation-specific parameters: 87. ${CUSTOMIZER_SCRIPT} ${EMULATION_NAME} 88 89if test -d ldscripts; then 90 true 91else 92 mkdir ldscripts 93fi 94 95# Set some flags for the emultempl scripts. USE_LIBPATH will 96# be set for any libpath-using emulation; NATIVE will be set for a 97# libpath-using emulation where ${host} = ${target}. NATIVE 98# may already have been set by the emulparams file, but that's OK 99# (it'll just get set to "yes" twice). 100 101case " $EMULATION_LIBPATH " in 102 *" ${EMULATION_NAME} "*) 103 if [ "x${host}" = "x${target}" ] ; then 104 NATIVE=yes 105 USE_LIBPATH=yes 106 elif [ "x${use_sysroot}" = "xyes" ] ; then 107 USE_LIBPATH=yes 108 fi 109 ;; 110esac 111 112# If the emulparams file sets NATIVE, make sure USE_LIBPATH is set also. 113if test "x$NATIVE" = "xyes" ; then 114 USE_LIBPATH=yes 115fi 116 117# Set the library search path, for libraries named by -lfoo. 118# If LIB_PATH is defined (e.g., by Makefile) and non-empty, it is used. 119# Otherwise, the default is set here. 120# 121# The format is the usual list of colon-separated directories. 122# To force a logically empty LIB_PATH, do LIBPATH=":". 123# 124# If we are using a sysroot, prefix library paths with "=" to indicate this. 125# 126# If the emulparams file set LIBPATH_SUFFIX, prepend an extra copy of 127# the library path with the suffix applied. 128 129if [ "x${LIB_PATH}" = "x" ] && [ "x${USE_LIBPATH}" = xyes ] ; then 130 LIB_PATH2= 131 132 libs=${NATIVE_LIB_DIRS} 133 if [ "x${use_sysroot}" != "xyes" ] ; then 134 case " ${libs} " in 135 *" ${libdir} "*) ;; 136 *) libs="${libdir} ${libs}" ;; 137 esac 138 case " ${libs} " in 139 *" ${tool_lib} "*) ;; 140 *) libs="${tool_lib} ${libs}" ;; 141 esac 142 fi 143 144 for lib in ${libs}; do 145 # The "=" is harmless if we aren't using a sysroot, but also needless. 146 if [ "x${use_sysroot}" = "xyes" ] ; then 147 lib="=${lib}" 148 fi 149 addsuffix= 150 case "${LIBPATH_SUFFIX}:${lib}" in 151 :*) ;; 152 *:*${LIBPATH_SUFFIX}) ;; 153 *) addsuffix=yes ;; 154 esac 155 if test -n "$addsuffix"; then 156 case :${LIB_PATH}: in 157 *:${lib}${LIBPATH_SUFFIX}:*) ;; 158 ::) LIB_PATH=${lib}${LIBPATH_SUFFIX} ;; 159 *) LIB_PATH=${LIB_PATH}:${lib}${LIBPATH_SUFFIX} ;; 160 esac 161 case :${LIB_PATH}:${LIB_PATH2}: in 162 *:${lib}:*) ;; 163 *::) LIB_PATH2=${lib} ;; 164 *) LIB_PATH2=${LIB_PATH2}:${lib} ;; 165 esac 166 else 167 case :${LIB_PATH2}: in 168 *:${lib}:*) ;; 169 ::) LIB_PATH2=${lib} ;; 170 *) LIB_PATH2=${LIB_PATH2}:${lib} ;; 171 esac 172 fi 173 done 174 175 case :${LIB_PATH}:${LIB_PATH2}: in 176 *:: | ::*) LIB_PATH=${LIB_PATH}${LIB_PATH2} ;; 177 *) LIB_PATH=${LIB_PATH}:${LIB_PATH2} ;; 178 esac 179fi 180 181# Always search $(tooldir)/lib, aka /usr/local/TARGET/lib, except for 182# sysrooted configurations and when LIBPATH=":". 183if [ "x${use_sysroot}" != "xyes" ] ; then 184 case :${LIB_PATH}: in 185 ::: | *:${tool_lib}:*) ;; 186 ::) LIB_PATH=${tool_lib} ;; 187 *) LIB_PATH=${tool_lib}:${LIB_PATH} ;; 188 esac 189fi 190 191LIB_SEARCH_DIRS=`echo ${LIB_PATH} | sed -e 's/:/ /g' -e 's/\([^ ][^ ]*\)/SEARCH_DIR(\\"\1\\");/g'` 192 193# We need it for testsuite. 194case " $EMULATION_LIBPATH " in 195 *" ${EMULATION_NAME} "*) 196 test -d tmpdir || mkdir tmpdir 197 test -f tmpdir/libpath.exp || \ 198 echo "set libpath \"${LIB_PATH}\"" | sed -e 's/:/ /g' > tmpdir/libpath.exp 199 ;; 200esac 201 202# Generate 5 or 6 script files from a master script template in 203# ${srcdir}/scripttempl/${SCRIPT_NAME}.sh. Which one of the 5 or 6 204# script files is actually used depends on command line options given 205# to ld. (SCRIPT_NAME was set in the emulparams_file.) 206# 207# A .x script file is the default script. 208# A .xr script is for linking without relocation (-r flag). 209# A .xu script is like .xr, but *do* create constructors (-Ur flag). 210# A .xn script is for linking with -n flag (mix text and data on same page). 211# A .xbn script is for linking with -N flag (mix text and data on same page). 212# A .xs script is for generating a shared library with the --shared 213# flag; it is only generated if $GENERATE_SHLIB_SCRIPT is set by the 214# emulation parameters. 215# A .xc script is for linking with -z combreloc; it is only generated if 216# $GENERATE_COMBRELOC_SCRIPT is set by the emulation parameters or 217# $SCRIPT_NAME is "elf". 218# A .xsc script is for linking with --shared -z combreloc; it is generated 219# if $GENERATE_COMBRELOC_SCRIPT is set by the emulation parameters or 220# $SCRIPT_NAME is "elf" and $GENERATE_SHLIB_SCRIPT is set by the emulation 221# parameters too. 222 223if [ "x$SCRIPT_NAME" = "xelf" ]; then 224 GENERATE_COMBRELOC_SCRIPT=yes 225fi 226 227SEGMENT_SIZE=${SEGMENT_SIZE-${MAXPAGESIZE-${TARGET_PAGE_SIZE}}} 228 229# Determine DATA_ALIGNMENT for the 5 variants, using 230# values specified in the emulparams/<script_to_run>.sh file or default. 231 232DATA_ALIGNMENT_="${DATA_ALIGNMENT_-${DATA_ALIGNMENT-ALIGN(${SEGMENT_SIZE})}}" 233DATA_ALIGNMENT_n="${DATA_ALIGNMENT_n-${DATA_ALIGNMENT_}}" 234DATA_ALIGNMENT_N="${DATA_ALIGNMENT_N-${DATA_ALIGNMENT-.}}" 235DATA_ALIGNMENT_r="${DATA_ALIGNMENT_r-${DATA_ALIGNMENT-}}" 236DATA_ALIGNMENT_u="${DATA_ALIGNMENT_u-${DATA_ALIGNMENT_r}}" 237 238LD_FLAG=r 239DATA_ALIGNMENT=${DATA_ALIGNMENT_r} 240DEFAULT_DATA_ALIGNMENT="ALIGN(${SEGMENT_SIZE})" 241( echo "/* Script for ld -r: link without relocation */" 242 . ${CUSTOMIZER_SCRIPT} ${EMULATION_NAME} 243 . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc 244) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xr 245 246LD_FLAG=u 247DATA_ALIGNMENT=${DATA_ALIGNMENT_u} 248CONSTRUCTING=" " 249( echo "/* Script for ld -Ur: link w/out relocation, do create constructors */" 250 . ${CUSTOMIZER_SCRIPT} ${EMULATION_NAME} 251 . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc 252) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xu 253 254LD_FLAG= 255DATA_ALIGNMENT=${DATA_ALIGNMENT_} 256RELOCATING=" " 257( echo "/* Default linker script, for normal executables */" 258 . ${CUSTOMIZER_SCRIPT} ${EMULATION_NAME} 259 . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc 260) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.x 261 262LD_FLAG=n 263DATA_ALIGNMENT=${DATA_ALIGNMENT_n} 264TEXT_START_ADDR=${NONPAGED_TEXT_START_ADDR-${TEXT_START_ADDR}} 265( echo "/* Script for -n: mix text and data on same page */" 266 . ${CUSTOMIZER_SCRIPT} ${EMULATION_NAME} 267 . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc 268) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xn 269 270LD_FLAG=N 271DATA_ALIGNMENT=${DATA_ALIGNMENT_N} 272( echo "/* Script for -N: mix text and data on same page; don't align data */" 273 . ${CUSTOMIZER_SCRIPT} ${EMULATION_NAME} 274 . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc 275) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xbn 276 277if test -n "$GENERATE_COMBRELOC_SCRIPT"; then 278 DATA_ALIGNMENT=${DATA_ALIGNMENT_c-${DATA_ALIGNMENT_}} 279 LD_FLAG=c 280 COMBRELOC=ldscripts/${EMULATION_NAME}.xc.tmp 281 ( echo "/* Script for -z combreloc: combine and sort reloc sections */" 282 . ${CUSTOMIZER_SCRIPT} ${EMULATION_NAME} 283 . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc 284 ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xc 285 rm -f ${COMBRELOC} 286 COMBRELOC= 287fi 288 289if test -n "$GENERATE_SHLIB_SCRIPT"; then 290 LD_FLAG=shared 291 DATA_ALIGNMENT=${DATA_ALIGNMENT_s-${DATA_ALIGNMENT_}} 292 CREATE_SHLIB=" " 293 # Note that TEXT_START_ADDR is set to NONPAGED_TEXT_START_ADDR. 294 ( 295 echo "/* Script for ld --shared: link shared library */" 296 . ${CUSTOMIZER_SCRIPT} ${EMULATION_NAME} 297 . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc 298 ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xs 299 if test -n "$GENERATE_COMBRELOC_SCRIPT"; then 300 LD_FLAG=cshared 301 DATA_ALIGNMENT=${DATA_ALIGNMENT_sc-${DATA_ALIGNMENT}} 302 COMBRELOC=ldscripts/${EMULATION_NAME}.xc.tmp 303 ( echo "/* Script for --shared -z combreloc: shared library, combine & sort relocs */" 304 . ${CUSTOMIZER_SCRIPT} ${EMULATION_NAME} 305 . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc 306 ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xsc 307 rm -f ${COMBRELOC} 308 COMBRELOC= 309 fi 310 unset CREATE_SHLIB 311fi 312 313if test -n "$GENERATE_PIE_SCRIPT"; then 314 LD_FLAG=pie 315 DATA_ALIGNMENT=${DATA_ALIGNMENT_s-${DATA_ALIGNMENT_}} 316 CREATE_PIE=" " 317 # Note that TEXT_START_ADDR is set to NONPAGED_TEXT_START_ADDR. 318 ( 319 echo "/* Script for ld -pie: link position independent executable */" 320 . ${CUSTOMIZER_SCRIPT} ${EMULATION_NAME} 321 . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc 322 ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xd 323 if test -n "$GENERATE_COMBRELOC_SCRIPT"; then 324 LD_FLAG=cpie 325 DATA_ALIGNMENT=${DATA_ALIGNMENT_sc-${DATA_ALIGNMENT}} 326 COMBRELOC=ldscripts/${EMULATION_NAME}.xc.tmp 327 ( echo "/* Script for -pie -z combreloc: position independent executable, combine & sort relocs */" 328 . ${CUSTOMIZER_SCRIPT} ${EMULATION_NAME} 329 . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc 330 ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xdc 331 rm -f ${COMBRELOC} 332 COMBRELOC= 333 fi 334 unset CREATE_PIE 335fi 336 337case " $EMULATION_LIBPATH " in 338 *" ${EMULATION_NAME} "*) COMPILE_IN=true;; 339esac 340 341# Generate e${EMULATION_NAME}.c. 342. ${srcdir}/emultempl/${TEMPLATE_NAME-generic}.em 343