1# This shell script emits a C file. -*- C -*- 2# It does some substitutions. 3test -z "${ELFSIZE}" && ELFSIZE=32 4if [ -z "$MACHINE" ]; then 5 OUTPUT_ARCH=${ARCH} 6else 7 OUTPUT_ARCH=${ARCH}:${MACHINE} 8fi 9fragment <<EOF 10/* This file is is generated by a shell script. DO NOT EDIT! */ 11 12/* ${ELFSIZE} bit ELF emulation code for ${EMULATION_NAME} 13 Copyright (C) 1991-2020 Free Software Foundation, Inc. 14 Written by Steve Chamberlain <sac@cygnus.com> 15 ELF support by Ian Lance Taylor <ian@cygnus.com> 16 17 This file is part of the GNU Binutils. 18 19 This program is free software; you can redistribute it and/or modify 20 it under the terms of the GNU General Public License as published by 21 the Free Software Foundation; either version 3 of the License, or 22 (at your option) any later version. 23 24 This program is distributed in the hope that it will be useful, 25 but WITHOUT ANY WARRANTY; without even the implied warranty of 26 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 27 GNU General Public License for more details. 28 29 You should have received a copy of the GNU General Public License 30 along with this program; if not, write to the Free Software 31 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, 32 MA 02110-1301, USA. */ 33 34#define TARGET_IS_${EMULATION_NAME} 35 36#include "sysdep.h" 37#include "bfd.h" 38#include "libiberty.h" 39#include "getopt.h" 40#include "bfdlink.h" 41#include "ctf-api.h" 42#include "ld.h" 43#include "ldmain.h" 44#include "ldmisc.h" 45#include "ldexp.h" 46#include "ldlang.h" 47#include "ldfile.h" 48#include "ldemul.h" 49#include <ldgram.h> 50#include "elf-bfd.h" 51#include "ldelf.h" 52#include "ldelfgen.h" 53 54/* Declare functions used by various EXTRA_EM_FILEs. */ 55static void gld${EMULATION_NAME}_before_parse (void); 56static void gld${EMULATION_NAME}_after_open (void); 57static void gld${EMULATION_NAME}_before_allocation (void); 58static void gld${EMULATION_NAME}_after_allocation (void); 59EOF 60 61# Import any needed special functions and/or overrides. 62# 63source_em ${srcdir}/emultempl/elf-generic.em 64if test -n "$EXTRA_EM_FILE" ; then 65 source_em ${srcdir}/emultempl/${EXTRA_EM_FILE}.em 66fi 67 68# Functions in this file can be overridden by setting the LDEMUL_* shell 69# variables. If the name of the overriding function is the same as is 70# defined in this file, then don't output this file's version. 71# If a different overriding name is given then output the standard function 72# as presumably it is called from the overriding function. 73# 74if test x"$LDEMUL_BEFORE_PARSE" != xgld"$EMULATION_NAME"_before_parse; then 75fragment <<EOF 76 77static void 78gld${EMULATION_NAME}_before_parse (void) 79{ 80 ldfile_set_output_arch ("${OUTPUT_ARCH}", bfd_arch_`echo ${ARCH} | sed -e 's/:.*//'`); 81 input_flags.dynamic = ${DYNAMIC_LINK-TRUE}; 82 config.has_shared = `if test -n "$GENERATE_SHLIB_SCRIPT" ; then echo TRUE ; else echo FALSE ; fi`; 83 config.separate_code = `if test "x${SEPARATE_CODE}" = xyes ; then echo TRUE ; else echo FALSE ; fi`; 84 link_info.check_relocs_after_open_input = TRUE; 85 link_info.relro = DEFAULT_LD_Z_RELRO; 86 link_info.separate_code = DEFAULT_LD_Z_SEPARATE_CODE; 87} 88 89EOF 90fi 91 92fragment <<EOF 93 94/* These variables are used to implement target options */ 95 96static char *audit; /* colon (typically) separated list of libs */ 97static char *depaudit; /* colon (typically) separated list of libs */ 98 99EOF 100 101if test x"$LDEMUL_AFTER_OPEN" != xgld"$EMULATION_NAME"_after_open; then 102 103 IS_LINUX_TARGET=FALSE 104 IS_FREEBSD_TARGET=FALSE 105 case ${target} in 106 *-*-linux-* | *-*-k*bsd*-* | *-*-gnu*) 107 IS_LINUX_TARGET=TRUE ;; 108 *-*-freebsd* | *-*-dragonfly*) 109 IS_FREEBSD_TARGET=TRUE ;; 110 esac 111 IS_LIBPATH=FALSE 112 if test "x${USE_LIBPATH}" = xyes; then 113 IS_LIBPATH=TRUE 114 fi 115 IS_NATIVE=FALSE 116 if test "x${NATIVE}" = xyes; then 117 IS_NATIVE=TRUE 118 fi 119 120fragment <<EOF 121 122/* This is called after all the input files have been opened. */ 123 124static void 125gld${EMULATION_NAME}_after_open (void) 126{ 127 ldelf_after_open ($IS_LIBPATH, $IS_NATIVE, 128 $IS_LINUX_TARGET, $IS_FREEBSD_TARGET, $ELFSIZE, "$prefix"); 129} 130 131EOF 132fi 133 134if test x"$LDEMUL_BEFORE_ALLOCATION" != xgld"$EMULATION_NAME"_before_allocation; then 135 if test x"${ELF_INTERPRETER_NAME}" = x; then 136 ELF_INTERPRETER_NAME=NULL 137 fi 138fragment <<EOF 139 140/* This is called after the sections have been attached to output 141 sections, but before any sizes or addresses have been set. */ 142 143static void 144gld${EMULATION_NAME}_before_allocation (void) 145{ 146 ldelf_before_allocation (audit, depaudit, ${ELF_INTERPRETER_NAME}); 147} 148 149EOF 150fi 151 152if test x"$LDEMUL_AFTER_ALLOCATION" != xgld"$EMULATION_NAME"_after_allocation; then 153fragment <<EOF 154 155static void 156gld${EMULATION_NAME}_after_allocation (void) 157{ 158 int need_layout = bfd_elf_discard_info (link_info.output_bfd, &link_info); 159 160 if (need_layout < 0) 161 einfo (_("%X%P: .eh_frame/.stab edit: %E\n")); 162 else 163 ldelf_map_segments (need_layout); 164} 165EOF 166fi 167 168if test x"$LDEMUL_GET_SCRIPT" != xgld"$EMULATION_NAME"_get_script; then 169fragment <<EOF 170 171static char * 172gld${EMULATION_NAME}_get_script (int *isfile) 173EOF 174 175if test x"$COMPILE_IN" = xyes 176then 177# Scripts compiled in. 178 179# sed commands to quote an ld script as a C string. 180sc="-f stringify.sed" 181 182fragment <<EOF 183{ 184 *isfile = 0; 185 186 if (bfd_link_relocatable (&link_info) && config.build_constructors) 187 return 188EOF 189sed $sc ldscripts/${EMULATION_NAME}.xu >> e${EMULATION_NAME}.c 190echo ' ; else if (bfd_link_relocatable (&link_info)) return' >> e${EMULATION_NAME}.c 191sed $sc ldscripts/${EMULATION_NAME}.xr >> e${EMULATION_NAME}.c 192echo ' ; else if (!config.text_read_only) return' >> e${EMULATION_NAME}.c 193sed $sc ldscripts/${EMULATION_NAME}.xbn >> e${EMULATION_NAME}.c 194if cmp -s ldscripts/${EMULATION_NAME}.x ldscripts/${EMULATION_NAME}.xn; then : ; else 195echo ' ; else if (!config.magic_demand_paged) return' >> e${EMULATION_NAME}.c 196sed $sc ldscripts/${EMULATION_NAME}.xn >> e${EMULATION_NAME}.c 197fi 198if test -n "$GENERATE_PIE_SCRIPT" ; then 199if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then 200echo ' ; else if (bfd_link_pie (&link_info)' >> e${EMULATION_NAME}.c 201echo ' && link_info.combreloc' >> e${EMULATION_NAME}.c 202echo ' && link_info.separate_code' >> e${EMULATION_NAME}.c 203echo ' && (link_info.flags & DF_BIND_NOW)) return' >> e${EMULATION_NAME}.c 204sed $sc ldscripts/${EMULATION_NAME}.xdwe >> e${EMULATION_NAME}.c 205echo ' ; else if (bfd_link_pie (&link_info)' >> e${EMULATION_NAME}.c 206echo ' && link_info.combreloc' >> e${EMULATION_NAME}.c 207echo ' && link_info.relro' >> e${EMULATION_NAME}.c 208echo ' && (link_info.flags & DF_BIND_NOW)) return' >> e${EMULATION_NAME}.c 209sed $sc ldscripts/${EMULATION_NAME}.xdw >> e${EMULATION_NAME}.c 210if test -n "$GENERATE_RELRO_SCRIPT" ; then 211echo ' ; else if (bfd_link_pie (&link_info)' >> e${EMULATION_NAME}.c 212echo ' && link_info.combreloc' >> e${EMULATION_NAME}.c 213echo ' && link_info.separate_code' >> e${EMULATION_NAME}.c 214echo ' && link_info.relro) return' >> e${EMULATION_NAME}.c 215sed $sc ldscripts/${EMULATION_NAME}.xdceo >> e${EMULATION_NAME}.c 216fi 217echo ' ; else if (bfd_link_pie (&link_info)' >> e${EMULATION_NAME}.c 218echo ' && link_info.separate_code' >> e${EMULATION_NAME}.c 219echo ' && link_info.combreloc) return' >> e${EMULATION_NAME}.c 220sed $sc ldscripts/${EMULATION_NAME}.xdce >> e${EMULATION_NAME}.c 221if test -n "$GENERATE_RELRO_SCRIPT" ; then 222echo ' ; else if (bfd_link_pie (&link_info)' >> e${EMULATION_NAME}.c 223echo ' && link_info.combreloc' >> e${EMULATION_NAME}.c 224echo ' && link_info.relro) return' >> e${EMULATION_NAME}.c 225sed $sc ldscripts/${EMULATION_NAME}.xdco >> e${EMULATION_NAME}.c 226fi 227echo ' ; else if (bfd_link_pie (&link_info)' >> e${EMULATION_NAME}.c 228echo ' && link_info.combreloc) return' >> e${EMULATION_NAME}.c 229sed $sc ldscripts/${EMULATION_NAME}.xdc >> e${EMULATION_NAME}.c 230if test -n "$GENERATE_RELRO_SCRIPT" ; then 231echo ' ; else if (bfd_link_pie (&link_info)' >> e${EMULATION_NAME}.c 232echo ' && link_info.separate_code' >> e${EMULATION_NAME}.c 233echo ' && link_info.relro) return' >> e${EMULATION_NAME}.c 234sed $sc ldscripts/${EMULATION_NAME}.xdeo >> e${EMULATION_NAME}.c 235fi 236fi 237echo ' ; else if (bfd_link_pie (&link_info)' >> e${EMULATION_NAME}.c 238echo ' && link_info.separate_code) return' >> e${EMULATION_NAME}.c 239sed $sc ldscripts/${EMULATION_NAME}.xde >> e${EMULATION_NAME}.c 240if test -n "$GENERATE_RELRO_SCRIPT" ; then 241echo ' ; else if (bfd_link_pie (&link_info)' >> e${EMULATION_NAME}.c 242echo ' && link_info.relro) return' >> e${EMULATION_NAME}.c 243sed $sc ldscripts/${EMULATION_NAME}.xdo >> e${EMULATION_NAME}.c 244fi 245echo ' ; else if (bfd_link_pie (&link_info)) return' >> e${EMULATION_NAME}.c 246sed $sc ldscripts/${EMULATION_NAME}.xd >> e${EMULATION_NAME}.c 247fi 248if test -n "$GENERATE_SHLIB_SCRIPT" ; then 249if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then 250echo ' ; else if (bfd_link_dll (&link_info)' >> e${EMULATION_NAME}.c 251echo ' && link_info.combreloc' >> e${EMULATION_NAME}.c 252echo ' && link_info.separate_code' >> e${EMULATION_NAME}.c 253echo ' && (link_info.flags & DF_BIND_NOW)) return' >> e${EMULATION_NAME}.c 254sed $sc ldscripts/${EMULATION_NAME}.xswe >> e${EMULATION_NAME}.c 255echo ' ; else if (bfd_link_dll (&link_info)' >> e${EMULATION_NAME}.c 256echo ' && link_info.combreloc' >> e${EMULATION_NAME}.c 257echo ' && link_info.relro' >> e${EMULATION_NAME}.c 258echo ' && (link_info.flags & DF_BIND_NOW)) return' >> e${EMULATION_NAME}.c 259sed $sc ldscripts/${EMULATION_NAME}.xsw >> e${EMULATION_NAME}.c 260if test -n "$GENERATE_RELRO_SCRIPT" ; then 261echo ' ; else if (bfd_link_dll (&link_info)' >> e${EMULATION_NAME}.c 262echo ' && link_info.combreloc' >> e${EMULATION_NAME}.c 263echo ' && link_info.separate_code' >> e${EMULATION_NAME}.c 264echo ' && link_info.relro) return' >> e${EMULATION_NAME}.c 265sed $sc ldscripts/${EMULATION_NAME}.xsceo >> e${EMULATION_NAME}.c 266fi 267echo ' ; else if (bfd_link_dll (&link_info)' >> e${EMULATION_NAME}.c 268echo ' && link_info.combreloc' >> e${EMULATION_NAME}.c 269echo ' && link_info.separate_code) return' >> e${EMULATION_NAME}.c 270sed $sc ldscripts/${EMULATION_NAME}.xsce >> e${EMULATION_NAME}.c 271if test -n "$GENERATE_RELRO_SCRIPT" ; then 272echo ' ; else if (bfd_link_dll (&link_info)' >> e${EMULATION_NAME}.c 273echo ' && link_info.combreloc' >> e${EMULATION_NAME}.c 274echo ' && link_info.relro) return' >> e${EMULATION_NAME}.c 275sed $sc ldscripts/${EMULATION_NAME}.xsco >> e${EMULATION_NAME}.c 276fi 277echo ' ; else if (bfd_link_dll (&link_info)' >> e${EMULATION_NAME}.c 278echo ' && link_info.combreloc) return' >> e${EMULATION_NAME}.c 279sed $sc ldscripts/${EMULATION_NAME}.xsc >> e${EMULATION_NAME}.c 280if test -n "$GENERATE_RELRO_SCRIPT" ; then 281echo ' ; else if (bfd_link_dll (&link_info)' >> e${EMULATION_NAME}.c 282echo ' && link_info.separate_code' >> e${EMULATION_NAME}.c 283echo ' && link_info.relro) return' >> e${EMULATION_NAME}.c 284sed $sc ldscripts/${EMULATION_NAME}.xseo >> e${EMULATION_NAME}.c 285fi 286fi 287echo ' ; else if (bfd_link_dll (&link_info)' >> e${EMULATION_NAME}.c 288echo ' && link_info.separate_code) return' >> e${EMULATION_NAME}.c 289sed $sc ldscripts/${EMULATION_NAME}.xse >> e${EMULATION_NAME}.c 290if test -n "$GENERATE_RELRO_SCRIPT" ; then 291echo ' ; else if (bfd_link_dll (&link_info)' >> e${EMULATION_NAME}.c 292echo ' && link_info.relro) return' >> e${EMULATION_NAME}.c 293sed $sc ldscripts/${EMULATION_NAME}.xso >> e${EMULATION_NAME}.c 294fi 295echo ' ; else if (bfd_link_dll (&link_info)) return' >> e${EMULATION_NAME}.c 296sed $sc ldscripts/${EMULATION_NAME}.xs >> e${EMULATION_NAME}.c 297fi 298if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then 299echo ' ; else if (link_info.combreloc' >> e${EMULATION_NAME}.c 300echo ' && link_info.separate_code' >> e${EMULATION_NAME}.c 301echo ' && (link_info.flags & DF_BIND_NOW)) return' >> e${EMULATION_NAME}.c 302sed $sc ldscripts/${EMULATION_NAME}.xwe >> e${EMULATION_NAME}.c 303echo ' ; else if (link_info.combreloc' >> e${EMULATION_NAME}.c 304echo ' && link_info.relro' >> e${EMULATION_NAME}.c 305echo ' && (link_info.flags & DF_BIND_NOW)) return' >> e${EMULATION_NAME}.c 306sed $sc ldscripts/${EMULATION_NAME}.xw >> e${EMULATION_NAME}.c 307if test -n "$GENERATE_RELRO_SCRIPT" ; then 308echo ' ; else if (link_info.combreloc' >> e${EMULATION_NAME}.c 309echo ' && link_info.separate_code' >> e${EMULATION_NAME}.c 310echo ' && link_info.relro) return' >> e${EMULATION_NAME}.c 311sed $sc ldscripts/${EMULATION_NAME}.xceo >> e${EMULATION_NAME}.c 312fi 313echo ' ; else if (link_info.combreloc' >> e${EMULATION_NAME}.c 314echo ' && link_info.separate_code) return' >> e${EMULATION_NAME}.c 315sed $sc ldscripts/${EMULATION_NAME}.xce >> e${EMULATION_NAME}.c 316if test -n "$GENERATE_RELRO_SCRIPT" ; then 317echo ' ; else if (link_info.combreloc' >> e${EMULATION_NAME}.c 318echo ' && link_info.relro) return' >> e${EMULATION_NAME}.c 319sed $sc ldscripts/${EMULATION_NAME}.xco >> e${EMULATION_NAME}.c 320fi 321echo ' ; else if (link_info.combreloc) return' >> e${EMULATION_NAME}.c 322sed $sc ldscripts/${EMULATION_NAME}.xc >> e${EMULATION_NAME}.c 323fi 324if test -n "$GENERATE_RELRO_SCRIPT" ; then 325echo ' ; else if (link_info.separate_code' >> e${EMULATION_NAME}.c 326echo ' && link_info.relro) return' >> e${EMULATION_NAME}.c 327sed $sc ldscripts/${EMULATION_NAME}.xeo >> e${EMULATION_NAME}.c 328fi 329echo ' ; else if (link_info.separate_code) return' >> e${EMULATION_NAME}.c 330sed $sc ldscripts/${EMULATION_NAME}.xe >> e${EMULATION_NAME}.c 331if test -n "$GENERATE_RELRO_SCRIPT" ; then 332echo ' ; else if (link_info.relro) return' >> e${EMULATION_NAME}.c 333sed $sc ldscripts/${EMULATION_NAME}.xo >> e${EMULATION_NAME}.c 334fi 335echo ' ; else return' >> e${EMULATION_NAME}.c 336sed $sc ldscripts/${EMULATION_NAME}.x >> e${EMULATION_NAME}.c 337echo '; }' >> e${EMULATION_NAME}.c 338 339else 340# Scripts read from the filesystem. 341 342fragment <<EOF 343{ 344 *isfile = 1; 345 346 if (bfd_link_relocatable (&link_info) && config.build_constructors) 347 return "ldscripts/${EMULATION_NAME}.xu"; 348 else if (bfd_link_relocatable (&link_info)) 349 return "ldscripts/${EMULATION_NAME}.xr"; 350 else if (!config.text_read_only) 351 return "ldscripts/${EMULATION_NAME}.xbn"; 352EOF 353if cmp -s ldscripts/${EMULATION_NAME}.x ldscripts/${EMULATION_NAME}.xn; then : 354else 355fragment <<EOF 356 else if (!config.magic_demand_paged) 357 return "ldscripts/${EMULATION_NAME}.xn"; 358EOF 359fi 360if test -n "$GENERATE_PIE_SCRIPT" ; then 361if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then 362fragment <<EOF 363 else if (bfd_link_pie (&link_info) 364 && link_info.combreloc 365 && link_info.relro 366 && (link_info.flags & DF_BIND_NOW)) 367 { 368 if (link_info.separate_code) 369 return "ldscripts/${EMULATION_NAME}.xdwe"; 370 else 371 return "ldscripts/${EMULATION_NAME}.xdw"; 372 } 373EOF 374if test -n "$GENERATE_RELRO_SCRIPT" ; then 375fragment <<EOF 376 else if (bfd_link_pie (&link_info) 377 && link_info.combreloc 378 && link_info.relro) 379 { 380 if (link_info.separate_code) 381 return "ldscripts/${EMULATION_NAME}.xdceo"; 382 else 383 return "ldscripts/${EMULATION_NAME}.xdco"; 384 } 385EOF 386fi 387fragment <<EOF 388 else if (bfd_link_pie (&link_info) 389 && link_info.combreloc) 390 { 391 if (link_info.separate_code) 392 return "ldscripts/${EMULATION_NAME}.xdce"; 393 else 394 return "ldscripts/${EMULATION_NAME}.xdc"; 395 } 396EOF 397fi 398if test -n "$GENERATE_RELRO_SCRIPT" ; then 399fragment <<EOF 400 else if (bfd_link_pie (&link_info) 401 && link_info.relro) 402 { 403 if (link_info.separate_code) 404 return "ldscripts/${EMULATION_NAME}.xdeo"; 405 else 406 return "ldscripts/${EMULATION_NAME}.xdo"; 407 } 408EOF 409fi 410fragment <<EOF 411 else if (bfd_link_pie (&link_info)) 412 { 413 if (link_info.separate_code) 414 return "ldscripts/${EMULATION_NAME}.xde"; 415 else 416 return "ldscripts/${EMULATION_NAME}.xd"; 417 } 418EOF 419fi 420if test -n "$GENERATE_SHLIB_SCRIPT" ; then 421if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then 422fragment <<EOF 423 else if (bfd_link_dll (&link_info) && link_info.combreloc 424 && link_info.relro && (link_info.flags & DF_BIND_NOW)) 425 { 426 if (link_info.separate_code) 427 return "ldscripts/${EMULATION_NAME}.xswe"; 428 else 429 return "ldscripts/${EMULATION_NAME}.xsw"; 430 } 431EOF 432if test -n "$GENERATE_RELRO_SCRIPT" ; then 433fragment <<EOF 434 else if (bfd_link_dll (&link_info) 435 && link_info.combreloc 436 && link_info.relro) 437 { 438 if (link_info.separate_code) 439 return "ldscripts/${EMULATION_NAME}.xsceo"; 440 else 441 return "ldscripts/${EMULATION_NAME}.xsco"; 442 } 443EOF 444fi 445fragment <<EOF 446 else if (bfd_link_dll (&link_info) && link_info.combreloc) 447 { 448 if (link_info.separate_code) 449 return "ldscripts/${EMULATION_NAME}.xsce"; 450 else 451 return "ldscripts/${EMULATION_NAME}.xsc"; 452 } 453EOF 454fi 455if test -n "$GENERATE_RELRO_SCRIPT" ; then 456fragment <<EOF 457 else if (bfd_link_dll (&link_info) 458 && link_info.relro) 459 { 460 if (link_info.separate_code) 461 return "ldscripts/${EMULATION_NAME}.xseo"; 462 else 463 return "ldscripts/${EMULATION_NAME}.xso"; 464 } 465EOF 466fi 467fragment <<EOF 468 else if (bfd_link_dll (&link_info)) 469 { 470 if (link_info.separate_code) 471 return "ldscripts/${EMULATION_NAME}.xse"; 472 else 473 return "ldscripts/${EMULATION_NAME}.xs"; 474 } 475EOF 476fi 477if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then 478fragment <<EOF 479 else if (link_info.combreloc && link_info.relro 480 && (link_info.flags & DF_BIND_NOW)) 481 { 482 if (link_info.separate_code) 483 return "ldscripts/${EMULATION_NAME}.xwe"; 484 else 485 return "ldscripts/${EMULATION_NAME}.xw"; 486 } 487EOF 488if test -n "$GENERATE_RELRO_SCRIPT" ; then 489fragment <<EOF 490 else if (link_info.combreloc 491 && link_info.relro) 492 { 493 if (link_info.separate_code) 494 return "ldscripts/${EMULATION_NAME}.xceo"; 495 else 496 return "ldscripts/${EMULATION_NAME}.xco"; 497 } 498EOF 499fi 500fragment <<EOF 501 else if (link_info.combreloc) 502 { 503 if (link_info.separate_code) 504 return "ldscripts/${EMULATION_NAME}.xce"; 505 else 506 return "ldscripts/${EMULATION_NAME}.xc"; 507 } 508EOF 509fi 510if test -n "$GENERATE_RELRO_SCRIPT" ; then 511fragment <<EOF 512 else if (link_info.relro) 513 { 514 if (link_info.separate_code) 515 return "ldscripts/${EMULATION_NAME}.xeo"; 516 else 517 return "ldscripts/${EMULATION_NAME}.xo"; 518 } 519EOF 520fi 521fragment <<EOF 522 else 523 { 524 if (link_info.separate_code) 525 return "ldscripts/${EMULATION_NAME}.xe"; 526 else 527 return "ldscripts/${EMULATION_NAME}.x"; 528 } 529} 530 531EOF 532fi 533fi 534 535if test -n "$PARSE_AND_LIST_PROLOGUE" ; then 536fragment <<EOF 537 $PARSE_AND_LIST_PROLOGUE 538EOF 539fi 540 541fragment <<EOF 542 543enum elf_options 544{ 545 OPTION_DISABLE_NEW_DTAGS = 400, 546 OPTION_ENABLE_NEW_DTAGS, 547 OPTION_GROUP, 548 OPTION_EH_FRAME_HDR, 549 OPTION_NO_EH_FRAME_HDR, 550 OPTION_EXCLUDE_LIBS, 551 OPTION_HASH_STYLE, 552 OPTION_BUILD_ID, 553 OPTION_AUDIT, 554 OPTION_COMPRESS_DEBUG 555}; 556 557static void 558gld${EMULATION_NAME}_add_options 559 (int ns, char **shortopts, int nl, struct option **longopts, 560 int nrl ATTRIBUTE_UNUSED, struct option **really_longopts ATTRIBUTE_UNUSED) 561{ 562EOF 563if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then 564fragment <<EOF 565 static const char xtra_short[] = "${PARSE_AND_LIST_SHORTOPTS}z:P:"; 566EOF 567else 568fragment <<EOF 569 static const char xtra_short[] = "${PARSE_AND_LIST_SHORTOPTS}z:"; 570EOF 571fi 572fragment <<EOF 573 static const struct option xtra_long[] = { 574EOF 575if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then 576fragment <<EOF 577 {"audit", required_argument, NULL, OPTION_AUDIT}, 578 {"Bgroup", no_argument, NULL, OPTION_GROUP}, 579EOF 580fi 581fragment <<EOF 582 {"build-id", optional_argument, NULL, OPTION_BUILD_ID}, 583 {"compress-debug-sections", required_argument, NULL, OPTION_COMPRESS_DEBUG}, 584EOF 585if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then 586fragment <<EOF 587 {"depaudit", required_argument, NULL, 'P'}, 588 {"disable-new-dtags", no_argument, NULL, OPTION_DISABLE_NEW_DTAGS}, 589 {"enable-new-dtags", no_argument, NULL, OPTION_ENABLE_NEW_DTAGS}, 590 {"eh-frame-hdr", no_argument, NULL, OPTION_EH_FRAME_HDR}, 591 {"no-eh-frame-hdr", no_argument, NULL, OPTION_NO_EH_FRAME_HDR}, 592 {"exclude-libs", required_argument, NULL, OPTION_EXCLUDE_LIBS}, 593 {"hash-style", required_argument, NULL, OPTION_HASH_STYLE}, 594EOF 595fi 596if test -n "$PARSE_AND_LIST_LONGOPTS" ; then 597fragment <<EOF 598 $PARSE_AND_LIST_LONGOPTS 599EOF 600fi 601fragment <<EOF 602 {NULL, no_argument, NULL, 0} 603 }; 604 605 *shortopts = (char *) xrealloc (*shortopts, ns + sizeof (xtra_short)); 606 memcpy (*shortopts + ns, &xtra_short, sizeof (xtra_short)); 607 *longopts = (struct option *) 608 xrealloc (*longopts, nl * sizeof (struct option) + sizeof (xtra_long)); 609 memcpy (*longopts + nl, &xtra_long, sizeof (xtra_long)); 610} 611 612#define DEFAULT_BUILD_ID_STYLE "sha1" 613 614static bfd_boolean 615gld${EMULATION_NAME}_handle_option (int optc) 616{ 617 switch (optc) 618 { 619 default: 620 return FALSE; 621 622 case OPTION_BUILD_ID: 623 if (ldelf_emit_note_gnu_build_id != NULL) 624 { 625 free ((char *) ldelf_emit_note_gnu_build_id); 626 ldelf_emit_note_gnu_build_id = NULL; 627 } 628 if (optarg == NULL) 629 optarg = DEFAULT_BUILD_ID_STYLE; 630 if (strcmp (optarg, "none")) 631 ldelf_emit_note_gnu_build_id = xstrdup (optarg); 632 break; 633 634 case OPTION_COMPRESS_DEBUG: 635 if (strcasecmp (optarg, "none") == 0) 636 link_info.compress_debug = COMPRESS_DEBUG_NONE; 637 else if (strcasecmp (optarg, "zlib") == 0) 638 link_info.compress_debug = COMPRESS_DEBUG_GABI_ZLIB; 639 else if (strcasecmp (optarg, "zlib-gnu") == 0) 640 link_info.compress_debug = COMPRESS_DEBUG_GNU_ZLIB; 641 else if (strcasecmp (optarg, "zlib-gabi") == 0) 642 link_info.compress_debug = COMPRESS_DEBUG_GABI_ZLIB; 643 else 644 einfo (_("%F%P: invalid --compress-debug-sections option: \`%s'\n"), 645 optarg); 646 break; 647EOF 648 649if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then 650fragment <<EOF 651 case OPTION_AUDIT: 652 ldelf_append_to_separated_string (&audit, optarg); 653 break; 654 655 case 'P': 656 ldelf_append_to_separated_string (&depaudit, optarg); 657 break; 658 659 case OPTION_DISABLE_NEW_DTAGS: 660 link_info.new_dtags = FALSE; 661 break; 662 663 case OPTION_ENABLE_NEW_DTAGS: 664 link_info.new_dtags = TRUE; 665 break; 666 667 case OPTION_EH_FRAME_HDR: 668 link_info.eh_frame_hdr_type = DWARF2_EH_HDR; 669 break; 670 671 case OPTION_NO_EH_FRAME_HDR: 672 link_info.eh_frame_hdr_type = 0; 673 break; 674 675 case OPTION_GROUP: 676 link_info.flags_1 |= (bfd_vma) DF_1_GROUP; 677 /* Groups must be self-contained. */ 678 link_info.unresolved_syms_in_objects = RM_GENERATE_ERROR; 679 link_info.unresolved_syms_in_shared_libs = RM_GENERATE_ERROR; 680 break; 681 682 case OPTION_EXCLUDE_LIBS: 683 add_excluded_libs (optarg); 684 break; 685 686 case OPTION_HASH_STYLE: 687 link_info.emit_hash = FALSE; 688 link_info.emit_gnu_hash = FALSE; 689 if (strcmp (optarg, "sysv") == 0) 690 link_info.emit_hash = TRUE; 691 else if (strcmp (optarg, "gnu") == 0) 692 link_info.emit_gnu_hash = TRUE; 693 else if (strcmp (optarg, "both") == 0) 694 { 695 link_info.emit_hash = TRUE; 696 link_info.emit_gnu_hash = TRUE; 697 } 698 else 699 einfo (_("%F%P: invalid hash style \`%s'\n"), optarg); 700 break; 701 702EOF 703fi 704fragment <<EOF 705 case 'z': 706 if (strcmp (optarg, "defs") == 0) 707 link_info.unresolved_syms_in_objects = RM_GENERATE_ERROR; 708 else if (strcmp (optarg, "undefs") == 0) 709 link_info.unresolved_syms_in_objects = RM_IGNORE; 710 else if (strcmp (optarg, "muldefs") == 0) 711 link_info.allow_multiple_definition = TRUE; 712 else if (CONST_STRNEQ (optarg, "max-page-size=")) 713 { 714 char *end; 715 716 config.maxpagesize = strtoul (optarg + 14, &end, 0); 717 if (*end || (config.maxpagesize & (config.maxpagesize - 1)) != 0) 718 einfo (_("%F%P: invalid maximum page size \`%s'\n"), 719 optarg + 14); 720 } 721 else if (CONST_STRNEQ (optarg, "common-page-size=")) 722 { 723 char *end; 724 config.commonpagesize = strtoul (optarg + 17, &end, 0); 725 if (*end 726 || (config.commonpagesize & (config.commonpagesize - 1)) != 0) 727 einfo (_("%F%P: invalid common page size \`%s'\n"), 728 optarg + 17); 729 } 730 else if (CONST_STRNEQ (optarg, "stack-size=")) 731 { 732 char *end; 733 link_info.stacksize = strtoul (optarg + 11, &end, 0); 734 if (*end || link_info.stacksize < 0) 735 einfo (_("%F%P: invalid stack size \`%s'\n"), optarg + 11); 736 if (!link_info.stacksize) 737 /* Use -1 for explicit no-stack, because zero means 738 'default'. */ 739 link_info.stacksize = -1; 740 } 741 else if (strcmp (optarg, "execstack") == 0) 742 { 743 link_info.execstack = TRUE; 744 link_info.noexecstack = FALSE; 745 } 746 else if (strcmp (optarg, "noexecstack") == 0) 747 { 748 link_info.noexecstack = TRUE; 749 link_info.execstack = FALSE; 750 } 751 else if (strcmp (optarg, "globalaudit") == 0) 752 { 753 link_info.flags_1 |= DF_1_GLOBAUDIT; 754 } 755EOF 756 757if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then 758fragment <<EOF 759 else if (strcmp (optarg, "global") == 0) 760 link_info.flags_1 |= (bfd_vma) DF_1_GLOBAL; 761 else if (strcmp (optarg, "initfirst") == 0) 762 link_info.flags_1 |= (bfd_vma) DF_1_INITFIRST; 763 else if (strcmp (optarg, "interpose") == 0) 764 link_info.flags_1 |= (bfd_vma) DF_1_INTERPOSE; 765 else if (strcmp (optarg, "loadfltr") == 0) 766 link_info.flags_1 |= (bfd_vma) DF_1_LOADFLTR; 767 else if (strcmp (optarg, "nodefaultlib") == 0) 768 link_info.flags_1 |= (bfd_vma) DF_1_NODEFLIB; 769 else if (strcmp (optarg, "nodelete") == 0) 770 link_info.flags_1 |= (bfd_vma) DF_1_NODELETE; 771 else if (strcmp (optarg, "nodlopen") == 0) 772 link_info.flags_1 |= (bfd_vma) DF_1_NOOPEN; 773 else if (strcmp (optarg, "nodump") == 0) 774 link_info.flags_1 |= (bfd_vma) DF_1_NODUMP; 775 else if (strcmp (optarg, "now") == 0) 776 { 777 link_info.flags |= (bfd_vma) DF_BIND_NOW; 778 link_info.flags_1 |= (bfd_vma) DF_1_NOW; 779 } 780 else if (strcmp (optarg, "lazy") == 0) 781 { 782 link_info.flags &= ~(bfd_vma) DF_BIND_NOW; 783 link_info.flags_1 &= ~(bfd_vma) DF_1_NOW; 784 } 785 else if (strcmp (optarg, "origin") == 0) 786 { 787 link_info.flags |= (bfd_vma) DF_ORIGIN; 788 link_info.flags_1 |= (bfd_vma) DF_1_ORIGIN; 789 } 790 else if (strcmp (optarg, "combreloc") == 0) 791 link_info.combreloc = TRUE; 792 else if (strcmp (optarg, "nocombreloc") == 0) 793 link_info.combreloc = FALSE; 794 else if (strcmp (optarg, "nocopyreloc") == 0) 795 link_info.nocopyreloc = TRUE; 796 else if (strcmp (optarg, "relro") == 0) 797 link_info.relro = TRUE; 798 else if (strcmp (optarg, "norelro") == 0) 799 link_info.relro = FALSE; 800 else if (strcmp (optarg, "separate-code") == 0) 801 link_info.separate_code = TRUE; 802 else if (strcmp (optarg, "noseparate-code") == 0) 803 link_info.separate_code = FALSE; 804 else if (strcmp (optarg, "common") == 0) 805 link_info.elf_stt_common = elf_stt_common; 806 else if (strcmp (optarg, "nocommon") == 0) 807 link_info.elf_stt_common = no_elf_stt_common; 808 else if (strcmp (optarg, "text") == 0) 809 link_info.error_textrel = TRUE; 810 else if (strcmp (optarg, "notext") == 0) 811 link_info.error_textrel = FALSE; 812 else if (strcmp (optarg, "textoff") == 0) 813 link_info.error_textrel = FALSE; 814EOF 815fi 816 817if test -n "$PARSE_AND_LIST_ARGS_CASE_Z" ; then 818fragment <<EOF 819 $PARSE_AND_LIST_ARGS_CASE_Z 820EOF 821fi 822 823fragment <<EOF 824 else 825 einfo (_("%P: warning: -z %s ignored\n"), optarg); 826 break; 827EOF 828 829if test -n "$PARSE_AND_LIST_ARGS_CASES" ; then 830fragment <<EOF 831 $PARSE_AND_LIST_ARGS_CASES 832EOF 833fi 834 835fragment <<EOF 836 } 837 838 return TRUE; 839} 840 841EOF 842 843if test x"$LDEMUL_LIST_OPTIONS" != xgld"$EMULATION_NAME"_list_options; then 844gld_list_options="gld${EMULATION_NAME}_list_options" 845if test -n "$PARSE_AND_LIST_OPTIONS"; then 846fragment <<EOF 847 848static void 849gld${EMULATION_NAME}_list_options (FILE * file) 850{ 851EOF 852 853if test -n "$PARSE_AND_LIST_OPTIONS" ; then 854fragment <<EOF 855 $PARSE_AND_LIST_OPTIONS 856EOF 857fi 858 859fragment <<EOF 860} 861EOF 862else 863 gld_list_options="NULL" 864fi 865 866if test -n "$PARSE_AND_LIST_EPILOGUE" ; then 867fragment <<EOF 868 $PARSE_AND_LIST_EPILOGUE 869EOF 870fi 871fi 872 873fragment <<EOF 874 875struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation = 876{ 877 ${LDEMUL_BEFORE_PARSE-gld${EMULATION_NAME}_before_parse}, 878 ${LDEMUL_SYSLIB-syslib_default}, 879 ${LDEMUL_HLL-hll_default}, 880 ${LDEMUL_AFTER_PARSE-ldelf_after_parse}, 881 ${LDEMUL_AFTER_OPEN-gld${EMULATION_NAME}_after_open}, 882 ${LDEMUL_AFTER_CHECK_RELOCS-after_check_relocs_default}, 883 ${LDEMUL_AFTER_ALLOCATION-gld${EMULATION_NAME}_after_allocation}, 884 ${LDEMUL_SET_OUTPUT_ARCH-set_output_arch_default}, 885 ${LDEMUL_CHOOSE_TARGET-ldemul_default_target}, 886 ${LDEMUL_BEFORE_ALLOCATION-gld${EMULATION_NAME}_before_allocation}, 887 ${LDEMUL_GET_SCRIPT-gld${EMULATION_NAME}_get_script}, 888 "${EMULATION_NAME}", 889 "${OUTPUT_FORMAT}", 890 ${LDEMUL_FINISH-finish_default}, 891 ${LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS-NULL}, 892 ${LDEMUL_OPEN_DYNAMIC_ARCHIVE-ldelf_open_dynamic_archive}, 893 ${LDEMUL_PLACE_ORPHAN-ldelf_place_orphan}, 894 ${LDEMUL_SET_SYMBOLS-NULL}, 895 ${LDEMUL_PARSE_ARGS-NULL}, 896 gld${EMULATION_NAME}_add_options, 897 gld${EMULATION_NAME}_handle_option, 898 ${LDEMUL_UNRECOGNIZED_FILE-NULL}, 899 ${LDEMUL_LIST_OPTIONS-${gld_list_options}}, 900 ${LDEMUL_RECOGNIZED_FILE-ldelf_load_symbols}, 901 ${LDEMUL_FIND_POTENTIAL_LIBRARIES-NULL}, 902 ${LDEMUL_NEW_VERS_PATTERN-NULL}, 903 ${LDEMUL_EXTRA_MAP_FILE_TEXT-NULL}, 904 ${LDEMUL_EMIT_CTF_EARLY-NULL}, 905 ${LDEMUL_EXAMINE_STRTAB_FOR_CTF-NULL} 906}; 907EOF 908