1# This shell script emits a C file. -*- C -*- 2# It does some substitutions. 3if [ -z "$MACHINE" ]; then 4 OUTPUT_ARCH=${ARCH} 5else 6 OUTPUT_ARCH=${ARCH}:${MACHINE} 7fi 8fragment <<EOF 9/* This file is is generated by a shell script. DO NOT EDIT! */ 10 11/* AIX emulation code for ${EMULATION_NAME} 12 Copyright 1991, 1993, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 13 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2012 14 Free Software Foundation, Inc. 15 Written by Steve Chamberlain <sac@cygnus.com> 16 AIX support by Ian Lance Taylor <ian@cygnus.com> 17 AIX 64 bit support by Tom Rix <trix@redhat.com> 18 19 This file is part of the GNU Binutils. 20 21 This program is free software; you can redistribute it and/or modify 22 it under the terms of the GNU General Public License as published by 23 the Free Software Foundation; either version 3 of the License, or 24 (at your option) any later version. 25 26 This program is distributed in the hope that it will be useful, 27 but WITHOUT ANY WARRANTY; without even the implied warranty of 28 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 29 GNU General Public License for more details. 30 31 You should have received a copy of the GNU General Public License 32 along with this program; if not, write to the Free Software 33 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, 34 MA 02110-1301, USA. */ 35 36#define TARGET_IS_${EMULATION_NAME} 37 38#include "sysdep.h" 39#include "bfd.h" 40#include "libiberty.h" 41#include "safe-ctype.h" 42#include "getopt.h" 43#include "obstack.h" 44#include "bfdlink.h" 45 46#include "ld.h" 47#include "ldmain.h" 48#include "ldmisc.h" 49#include "ldexp.h" 50#include "ldlang.h" 51#include "ldfile.h" 52#include "ldemul.h" 53#include "ldctor.h" 54#include <ldgram.h> 55 56#include "coff/internal.h" 57#include "coff/xcoff.h" 58#include "libcoff.h" 59#include "libxcoff.h" 60 61static void gld${EMULATION_NAME}_read_file (const char *, bfd_boolean); 62static void gld${EMULATION_NAME}_free (void *); 63static void gld${EMULATION_NAME}_find_relocs (lang_statement_union_type *); 64static void gld${EMULATION_NAME}_find_exp_assignment (etree_type *); 65 66 67/* The file alignment required for each section. */ 68static unsigned long file_align; 69 70/* The maximum size the stack is permitted to grow. This is stored in 71 the a.out header. */ 72static unsigned long maxstack; 73 74/* The maximum data size. This is stored in the a.out header. */ 75static unsigned long maxdata; 76 77/* Whether to perform garbage collection. */ 78static int gc = 1; 79 80/* The module type to use. */ 81static unsigned short modtype = ('1' << 8) | 'L'; 82 83/* Whether the .text section must be read-only (i.e., no relocs 84 permitted). */ 85static int textro; 86 87/* A mask of XCOFF_EXPALL and XCOFF_EXPFULL flags, as set by their 88 associated -b and -bno options. */ 89static unsigned int auto_export_flags; 90 91/* A mask of auto_export_flags bits that were explicitly set on the 92 command line. */ 93static unsigned int explicit_auto_export_flags; 94 95/* Whether to implement Unix like linker semantics. */ 96static int unix_ld; 97 98/* Structure used to hold import file list. */ 99 100struct filelist 101{ 102 struct filelist *next; 103 const char *name; 104}; 105 106/* List of import files. */ 107static struct filelist *import_files; 108 109/* List of export symbols read from the export files. */ 110 111struct export_symbol_list 112{ 113 struct export_symbol_list *next; 114 const char *name; 115}; 116 117static struct export_symbol_list *export_symbols; 118 119/* Maintains the 32 or 64 bit mode state of import file */ 120static unsigned int symbol_mode = 0x04; 121 122/* Which symbol modes are valid */ 123static unsigned int symbol_mode_mask = 0x0d; 124 125/* Whether this is a 64 bit link */ 126static int is_64bit = 0; 127 128/* Which syscalls from import file are valid */ 129static unsigned int syscall_mask = 0x77; 130 131/* fake file for -binitfini support */ 132static lang_input_statement_type *initfini_file; 133 134/* Whether to do run time linking 135 -brtl enables, -bnortl and -bnortllib disable. */ 136static int rtld; 137 138/* Explicit command line library path, -blibpath */ 139static char *command_line_blibpath = NULL; 140 141/* This routine is called before anything else is done. */ 142 143static void 144gld${EMULATION_NAME}_before_parse (void) 145{ 146 ldfile_set_output_arch ("${OUTPUT_ARCH}", bfd_arch_`echo ${ARCH} | sed -e 's/:.*//'`); 147 148 input_flags.dynamic = TRUE; 149 config.has_shared = TRUE; 150 151 /* The link_info.[init|fini]_functions are initialized in ld/lexsup.c. 152 Override them here so we can use the link_info.init_function as a 153 state flag that lets the backend know that -binitfini has been done. */ 154 155 link_info.init_function = NULL; 156 link_info.fini_function = NULL; 157} 158 159/* Handle AIX specific options. */ 160 161enum 162 { 163 OPTION_IGNORE = 300, 164 OPTION_AUTOIMP, 165 OPTION_ERNOTOK, 166 OPTION_EROK, 167 OPTION_EXPALL, 168 OPTION_EXPFULL, 169 OPTION_EXPORT, 170 OPTION_IMPORT, 171 OPTION_INITFINI, 172 OPTION_LOADMAP, 173 OPTION_MAXDATA, 174 OPTION_MAXSTACK, 175 OPTION_MODTYPE, 176 OPTION_NOAUTOIMP, 177 OPTION_NOEXPALL, 178 OPTION_NOEXPFULL, 179 OPTION_NOSTRCMPCT, 180 OPTION_PD, 181 OPTION_PT, 182 OPTION_STRCMPCT, 183 OPTION_UNIX, 184 OPTION_32, 185 OPTION_64, 186 OPTION_LIBPATH, 187 OPTION_NOLIBPATH, 188 }; 189 190static void 191gld${EMULATION_NAME}_add_options 192 (int ns, char **shortopts, int nl, struct option **longopts, 193 int nrl ATTRIBUTE_UNUSED, struct option **really_longopts ATTRIBUTE_UNUSED) 194{ 195 static const char xtra_short[] = "D:H:KT:z"; 196 static const struct option xtra_long[] = { 197 /* -binitfini has special handling in the linker backend. The native linker 198 uses the arguemnts to generate a table of init and fini functions for 199 the executable. The important use for this option is to support aix 4.2+ 200 c++ constructors and destructors. This is tied into gcc via collect2.c. 201 202 The function table is accessed by the runtime linker/loader by checking if 203 the first symbol in the loader symbol table is __rtinit. The gnu linker 204 generates this symbol and makes it the first loader symbol. */ 205 206 {"basis", no_argument, NULL, OPTION_IGNORE}, 207 {"bautoimp", no_argument, NULL, OPTION_AUTOIMP}, 208 {"bcomprld", no_argument, NULL, OPTION_IGNORE}, 209 {"bcrld", no_argument, NULL, OPTION_IGNORE}, 210 {"bcror31", no_argument, NULL, OPTION_IGNORE}, 211 {"bD", required_argument, NULL, OPTION_MAXDATA}, 212 {"bE", required_argument, NULL, OPTION_EXPORT}, 213 {"bernotok", no_argument, NULL, OPTION_ERNOTOK}, 214 {"berok", no_argument, NULL, OPTION_EROK}, 215 {"berrmsg", no_argument, NULL, OPTION_IGNORE}, 216 {"bexpall", no_argument, NULL, OPTION_EXPALL}, 217 {"bexpfull", no_argument, NULL, OPTION_EXPFULL}, 218 {"bexport", required_argument, NULL, OPTION_EXPORT}, 219 {"bbigtoc", no_argument, NULL, OPTION_IGNORE}, 220 {"bf", no_argument, NULL, OPTION_ERNOTOK}, 221 {"bgc", no_argument, &gc, 1}, 222 {"bh", required_argument, NULL, OPTION_IGNORE}, 223 {"bhalt", required_argument, NULL, OPTION_IGNORE}, 224 {"bI", required_argument, NULL, OPTION_IMPORT}, 225 {"bimport", required_argument, NULL, OPTION_IMPORT}, 226 {"binitfini", required_argument, NULL, OPTION_INITFINI}, 227 {"bl", required_argument, NULL, OPTION_LOADMAP}, 228 {"bloadmap", required_argument, NULL, OPTION_LOADMAP}, 229 {"bmaxdata", required_argument, NULL, OPTION_MAXDATA}, 230 {"bmaxstack", required_argument, NULL, OPTION_MAXSTACK}, 231 {"bM", required_argument, NULL, OPTION_MODTYPE}, 232 {"bmodtype", required_argument, NULL, OPTION_MODTYPE}, 233 {"bnoautoimp", no_argument, NULL, OPTION_NOAUTOIMP}, 234 {"bnoexpall", no_argument, NULL, OPTION_NOEXPALL}, 235 {"bnoexpfull", no_argument, NULL, OPTION_NOEXPFULL}, 236 {"bnodelcsect", no_argument, NULL, OPTION_IGNORE}, 237 {"bnoentry", no_argument, NULL, OPTION_IGNORE}, 238 {"bnogc", no_argument, &gc, 0}, 239 {"bnso", no_argument, NULL, OPTION_NOAUTOIMP}, 240 {"bnostrcmpct", no_argument, NULL, OPTION_NOSTRCMPCT}, 241 {"bnotextro", no_argument, &textro, 0}, 242 {"bnro", no_argument, &textro, 0}, 243 {"bpD", required_argument, NULL, OPTION_PD}, 244 {"bpT", required_argument, NULL, OPTION_PT}, 245 {"bro", no_argument, &textro, 1}, 246 {"brtl", no_argument, &rtld, 1}, 247 {"bnortl", no_argument, &rtld, 0}, 248 {"bnortllib", no_argument, &rtld, 0}, 249 {"bS", required_argument, NULL, OPTION_MAXSTACK}, 250 {"bso", no_argument, NULL, OPTION_AUTOIMP}, 251 {"bstrcmpct", no_argument, NULL, OPTION_STRCMPCT}, 252 {"btextro", no_argument, &textro, 1}, 253 {"b32", no_argument, NULL, OPTION_32}, 254 {"b64", no_argument, NULL, OPTION_64}, 255 {"static", no_argument, NULL, OPTION_NOAUTOIMP}, 256 {"unix", no_argument, NULL, OPTION_UNIX}, 257 {"blibpath", required_argument, NULL, OPTION_LIBPATH}, 258 {"bnolibpath", required_argument, NULL, OPTION_NOLIBPATH}, 259 {NULL, no_argument, NULL, 0} 260 }; 261 262 /* Options supported by the AIX linker which we do not support: 263 -S, -v, -Z, -bbindcmds, -bbinder, -bbindopts, -bcalls, -bcaps, 264 -bcror15, -bdebugopt, -bdbg, -bdelcsect, -bex?, -bfilelist, -bfl, 265 -bgcbypass, -bglink, -binsert, -bi, -bloadmap, -bl, -bmap, -bnl, 266 -bnobind, -bnocomprld, -bnocrld, -bnoerrmsg, -bnoglink, 267 -bnoloadmap, -bnl, -bnoobjreorder, -bnoquiet, -bnoreorder, 268 -bnotypchk, -bnox, -bquiet, -bR, -brename, -breorder, -btypchk, 269 -bx, -bX, -bxref. */ 270 271 *shortopts = (char *) xrealloc (*shortopts, ns + sizeof (xtra_short)); 272 memcpy (*shortopts + ns, &xtra_short, sizeof (xtra_short)); 273 *longopts = xrealloc (*longopts, 274 nl * sizeof (struct option) + sizeof (xtra_long)); 275 memcpy (*longopts + nl, &xtra_long, sizeof (xtra_long)); 276} 277 278static bfd_boolean 279gld${EMULATION_NAME}_parse_args (int argc, char **argv) 280{ 281 int indx; 282 283 /* If the current option starts with -b, change the first : to an =. 284 The AIX linker uses : to separate the option from the argument; 285 changing it to = lets us treat it as a getopt option. */ 286 indx = optind; 287 if (indx == 0) 288 indx = 1; 289 290 if (indx < argc && CONST_STRNEQ (argv[indx], "-b")) 291 { 292 char *s; 293 294 for (s = argv[indx]; *s != '\0'; s++) 295 { 296 if (*s == ':') 297 { 298 *s = '='; 299 break; 300 } 301 } 302 } 303 return FALSE; 304} 305 306/* Helper for option '-f', which specify a list of input files. 307 Contrary to the native linker, we don't support shell patterns 308 (simply because glob isn't always available). */ 309 310static void 311read_file_list (const char *filename) 312{ 313 FILE *f; 314 /* An upper bound on the number of characters in the file. */ 315 long pos; 316 /* File in memory. */ 317 char *buffer; 318 size_t len; 319 char *b; 320 char *e; 321 322 f = fopen (filename, FOPEN_RT); 323 if (f == NULL) 324 { 325 einfo ("%F%P: cannot open %s\n", filename); 326 return; 327 } 328 if (fseek (f, 0L, SEEK_END) == -1) 329 goto error; 330 pos = ftell (f); 331 if (pos == -1) 332 goto error; 333 if (fseek (f, 0L, SEEK_SET) == -1) 334 goto error; 335 336 buffer = (char *) xmalloc (pos + 1); 337 len = fread (buffer, sizeof (char), pos, f); 338 if (len != (size_t) pos && ferror (f)) 339 goto error; 340 /* Add a NUL terminator. */ 341 buffer[len] = '\0'; 342 fclose (f); 343 344 /* Parse files. */ 345 b = buffer; 346 while (1) 347 { 348 /* Skip empty lines. */ 349 while (*b == '\n' || *b == '\r') 350 b++; 351 352 /* Stop if end of buffer. */ 353 if (b == buffer + len) 354 break; 355 356 /* Eat any byte until end of line. */ 357 for (e = b; *e != '\0'; e++) 358 if (*e == '\n' || *e == '\r') 359 break; 360 361 /* Replace end of line by nul. */ 362 if (*e != '\0') 363 *e++ = '\0'; 364 365 if (b != e) 366 lang_add_input_file (b, lang_input_file_is_search_file_enum, NULL); 367 b = e; 368 } 369 return; 370 371 error: 372 einfo ("%F%P: cannot read %s\n", optarg); 373 fclose (f); 374} 375 376static bfd_boolean 377gld${EMULATION_NAME}_handle_option (int optc) 378{ 379 bfd_signed_vma val; 380 const char *end; 381 382 switch (optc) 383 { 384 default: 385 return FALSE; 386 387 case 0: 388 /* Long option which just sets a flag. */ 389 break; 390 391 case 'f': 392 /* This overrides --auxiliary. This option specifies a file containing 393 a list of input files. */ 394 read_file_list (optarg); 395 break; 396 397 case 'D': 398 val = bfd_scan_vma (optarg, &end, 0); 399 if (*end != '\0') 400 einfo ("%P: warning: ignoring invalid -D number %s\n", optarg); 401 else if (val != -1) 402 lang_section_start (".data", exp_intop (val), NULL); 403 break; 404 405 case 'H': 406 val = bfd_scan_vma (optarg, &end, 0); 407 if (*end != '\0' || (val & (val - 1)) != 0) 408 einfo ("%P: warning: ignoring invalid -H number %s\n", optarg); 409 else 410 file_align = val; 411 break; 412 413 case 'K': 414 case 'z': 415 /* FIXME: This should use the page size for the target system. */ 416 file_align = 4096; 417 break; 418 419 case 'T': 420 /* On AIX this is the same as GNU ld -Ttext. When we see -T 421 number, we assume the AIX option is intended. Otherwise, we 422 assume the usual GNU ld -T option is intended. We can't just 423 ignore the AIX option, because gcc passes it to the linker. */ 424 val = bfd_scan_vma (optarg, &end, 0); 425 if (*end != '\0') 426 return FALSE; 427 lang_section_start (".text", exp_intop (val), NULL); 428 break; 429 430 case OPTION_IGNORE: 431 break; 432 433 case OPTION_INITFINI: 434 { 435 /* 436 * The aix linker init fini has the format : 437 * 438 * -binitfini:[ Initial][:Termination][:Priority] 439 * 440 * it allows the Termination and Priority to be optional. 441 * 442 * Since we support only one init/fini pair, we ignore the Priority. 443 * 444 * Define the special symbol __rtinit. 445 * 446 * strtok does not correctly handle the case of -binitfini::fini: so 447 * do it by hand 448 */ 449 char *t, *i, *f; 450 451 i = t = optarg; 452 while (*t && ':' != *t) 453 t++; 454 if (*t) 455 *t++ = 0; 456 457 if (0 != strlen (i)) 458 link_info.init_function = i; 459 460 f = t; 461 while (*t && ':' != *t) 462 t++; 463 *t = 0; 464 465 if (0 != strlen (f)) 466 link_info.fini_function = f; 467 } 468 break; 469 470 case OPTION_AUTOIMP: 471 link_info.static_link = FALSE; 472 break; 473 474 case OPTION_ERNOTOK: 475 link_info.unresolved_syms_in_objects = RM_GENERATE_ERROR; 476 link_info.unresolved_syms_in_shared_libs = RM_GENERATE_ERROR; 477 break; 478 479 case OPTION_EROK: 480 link_info.unresolved_syms_in_objects = RM_IGNORE; 481 link_info.unresolved_syms_in_shared_libs = RM_IGNORE; 482 break; 483 484 case OPTION_EXPALL: 485 auto_export_flags |= XCOFF_EXPALL; 486 explicit_auto_export_flags |= XCOFF_EXPALL; 487 break; 488 489 case OPTION_EXPFULL: 490 auto_export_flags |= XCOFF_EXPFULL; 491 explicit_auto_export_flags |= XCOFF_EXPFULL; 492 break; 493 494 case OPTION_EXPORT: 495 gld${EMULATION_NAME}_read_file (optarg, FALSE); 496 break; 497 498 case OPTION_IMPORT: 499 { 500 struct filelist *n; 501 struct filelist **flpp; 502 503 n = (struct filelist *) xmalloc (sizeof (struct filelist)); 504 n->next = NULL; 505 n->name = optarg; 506 flpp = &import_files; 507 while (*flpp != NULL) 508 flpp = &(*flpp)->next; 509 *flpp = n; 510 } 511 break; 512 513 case OPTION_LOADMAP: 514 config.map_filename = optarg; 515 break; 516 517 case OPTION_MAXDATA: 518 val = bfd_scan_vma (optarg, &end, 0); 519 if (*end != '\0') 520 einfo ("%P: warning: ignoring invalid -bmaxdata number %s\n", optarg); 521 else 522 maxdata = val; 523 break; 524 525 case OPTION_MAXSTACK: 526 val = bfd_scan_vma (optarg, &end, 0); 527 if (*end != '\0') 528 einfo ("%P: warning: ignoring invalid -bmaxstack number %s\n", 529 optarg); 530 else 531 maxstack = val; 532 break; 533 534 case OPTION_MODTYPE: 535 if (*optarg == 'S') 536 { 537 link_info.shared = TRUE; 538 ++optarg; 539 } 540 if (*optarg == '\0' || optarg[1] == '\0') 541 einfo ("%P: warning: ignoring invalid module type %s\n", optarg); 542 else 543 modtype = (*optarg << 8) | optarg[1]; 544 break; 545 546 case OPTION_NOAUTOIMP: 547 link_info.static_link = TRUE; 548 break; 549 550 case OPTION_NOEXPALL: 551 auto_export_flags &= ~XCOFF_EXPALL; 552 explicit_auto_export_flags |= XCOFF_EXPALL; 553 break; 554 555 case OPTION_NOEXPFULL: 556 auto_export_flags &= ~XCOFF_EXPFULL; 557 explicit_auto_export_flags |= XCOFF_EXPFULL; 558 break; 559 560 case OPTION_NOSTRCMPCT: 561 link_info.traditional_format = TRUE; 562 break; 563 564 case OPTION_PD: 565 /* This sets the page that the .data section is supposed to 566 start on. The offset within the page should still be the 567 offset within the file, so we need to build an appropriate 568 expression. */ 569 val = bfd_scan_vma (optarg, &end, 0); 570 if (*end != '\0') 571 einfo ("%P: warning: ignoring invalid -pD number %s\n", optarg); 572 else 573 { 574 etree_type *t; 575 576 t = exp_binop ('+', 577 exp_intop (val), 578 exp_binop ('&', 579 exp_nameop (NAME, "."), 580 exp_intop (0xfff))); 581 t = exp_binop ('&', 582 exp_binop ('+', t, exp_intop (31)), 583 exp_intop (~(bfd_vma) 31)); 584 lang_section_start (".data", t, NULL); 585 } 586 break; 587 588 case OPTION_PT: 589 /* This set the page that the .text section is supposed to start 590 on. The offset within the page should still be the offset 591 within the file. */ 592 val = bfd_scan_vma (optarg, &end, 0); 593 if (*end != '\0') 594 einfo ("%P: warning: ignoring invalid -pT number %s\n", optarg); 595 else 596 { 597 etree_type *t; 598 599 t = exp_binop ('+', 600 exp_intop (val), 601 exp_nameop (SIZEOF_HEADERS, NULL)); 602 t = exp_binop ('&', 603 exp_binop ('+', t, exp_intop (31)), 604 exp_intop (~(bfd_vma) 31)); 605 lang_section_start (".text", t, NULL); 606 } 607 break; 608 609 case OPTION_STRCMPCT: 610 link_info.traditional_format = FALSE; 611 break; 612 613 case OPTION_UNIX: 614 unix_ld = TRUE; 615 break; 616 617 case OPTION_32: 618 is_64bit = 0; 619 syscall_mask = 0x77; 620 symbol_mode_mask = 0x0d; 621 break; 622 623 case OPTION_64: 624 is_64bit = 1; 625 syscall_mask = 0xcc; 626 symbol_mode_mask = 0x0e; 627 break; 628 629 case OPTION_LIBPATH: 630 command_line_blibpath = optarg; 631 break; 632 633 case OPTION_NOLIBPATH: 634 command_line_blibpath = NULL; 635 break; 636 637 } 638 639 return TRUE; 640} 641 642/* This is called when an input file can not be recognized as a BFD 643 object or an archive. If the file starts with #!, we must treat it 644 as an import file. This is for AIX compatibility. */ 645 646static bfd_boolean 647gld${EMULATION_NAME}_unrecognized_file (lang_input_statement_type *entry) 648{ 649 FILE *e; 650 bfd_boolean ret; 651 652 e = fopen (entry->filename, FOPEN_RT); 653 if (e == NULL) 654 return FALSE; 655 656 ret = FALSE; 657 658 if (getc (e) == '#' && getc (e) == '!') 659 { 660 struct filelist *n; 661 struct filelist **flpp; 662 663 n = (struct filelist *) xmalloc (sizeof (struct filelist)); 664 n->next = NULL; 665 n->name = entry->filename; 666 flpp = &import_files; 667 while (*flpp != NULL) 668 flpp = &(*flpp)->next; 669 *flpp = n; 670 671 ret = TRUE; 672 entry->flags.loaded = TRUE; 673 } 674 675 fclose (e); 676 677 return ret; 678} 679 680/* This is called after the input files have been opened. */ 681 682static void 683gld${EMULATION_NAME}_after_open (void) 684{ 685 bfd_boolean r; 686 struct set_info *p; 687 688 after_open_default (); 689 690 /* Call ldctor_build_sets, after pretending that this is a 691 relocatable link. We do this because AIX requires relocation 692 entries for all references to symbols, even in a final 693 executable. Of course, we only want to do this if we are 694 producing an XCOFF output file. */ 695 r = link_info.relocatable; 696 if (strstr (bfd_get_target (link_info.output_bfd), "xcoff") != NULL) 697 link_info.relocatable = TRUE; 698 ldctor_build_sets (); 699 link_info.relocatable = r; 700 701 /* For each set, record the size, so that the XCOFF backend can 702 output the correct csect length. */ 703 for (p = sets; p != (struct set_info *) NULL; p = p->next) 704 { 705 bfd_size_type size; 706 707 /* If the symbol is defined, we may have been invoked from 708 collect, and the sets may already have been built, so we do 709 not do anything. */ 710 if (p->h->type == bfd_link_hash_defined 711 || p->h->type == bfd_link_hash_defweak) 712 continue; 713 714 if (p->reloc != BFD_RELOC_CTOR) 715 { 716 /* Handle this if we need to. */ 717 abort (); 718 } 719 720 size = (p->count + 2) * 4; 721 if (!bfd_xcoff_link_record_set (link_info.output_bfd, &link_info, 722 p->h, size)) 723 einfo ("%F%P: bfd_xcoff_link_record_set failed: %E\n"); 724 } 725} 726 727/* This is called after the sections have been attached to output 728 sections, but before any sizes or addresses have been set. */ 729 730static void 731gld${EMULATION_NAME}_before_allocation (void) 732{ 733 struct filelist *fl; 734 struct export_symbol_list *el; 735 char *libpath; 736 asection *special_sections[XCOFF_NUMBER_OF_SPECIAL_SECTIONS]; 737 static const char *const must_keep_sections[] = { 738 ".text", 739 ".data", 740 ".bss" 741 }; 742 unsigned int i, flags; 743 744 /* Handle the import and export files, if any. */ 745 for (fl = import_files; fl != NULL; fl = fl->next) 746 gld${EMULATION_NAME}_read_file (fl->name, TRUE); 747 for (el = export_symbols; el != NULL; el = el->next) 748 { 749 struct bfd_link_hash_entry *h; 750 751 h = bfd_link_hash_lookup (link_info.hash, el->name, FALSE, FALSE, FALSE); 752 if (h == NULL) 753 einfo ("%P%F: bfd_link_hash_lookup of export symbol failed: %E\n"); 754 if (!bfd_xcoff_export_symbol (link_info.output_bfd, &link_info, h)) 755 einfo ("%P%F: bfd_xcoff_export_symbol failed: %E\n"); 756 } 757 758 /* Track down all relocations called for by the linker script (these 759 are typically constructor/destructor entries created by 760 CONSTRUCTORS) and let the backend know it will need to create 761 .loader relocs for them. */ 762 lang_for_each_statement (gld${EMULATION_NAME}_find_relocs); 763 764 /* Precedence of LIBPATH 765 -blibpath: native support always first 766 -rpath: gnu extension 767 -L build from command line -L's */ 768 if (command_line_blibpath != NULL) 769 libpath = command_line_blibpath; 770 else if (command_line.rpath != NULL) 771 libpath = command_line.rpath; 772 else if (search_head == NULL) 773 libpath = (char *) ""; 774 else 775 { 776 size_t len; 777 search_dirs_type *search; 778 779 /* PR ld/4023: Strip sysroot prefix from any paths 780 being inserted into the output binary's DT_RPATH. */ 781 if (ld_sysroot != NULL 782 && * ld_sysroot != 0) 783 { 784 const char * name = search_head->name; 785 size_t ld_sysroot_len = strlen (ld_sysroot); 786 787 if (strncmp (name, ld_sysroot, ld_sysroot_len) == 0) 788 name += ld_sysroot_len; 789 790 len = strlen (name); 791 libpath = xmalloc (len + 1); 792 strcpy (libpath, name); 793 794 for (search = search_head->next; search != NULL; search = search->next) 795 { 796 size_t nlen; 797 798 name = search->name; 799 if (strncmp (name, ld_sysroot, ld_sysroot_len) == 0) 800 name += ld_sysroot_len; 801 802 nlen = strlen (name); 803 libpath = xrealloc (libpath, len + nlen + 2); 804 libpath[len] = ':'; 805 strcpy (libpath + len + 1, name); 806 len += nlen + 1; 807 } 808 } 809 else 810 { 811 len = strlen (search_head->name); 812 libpath = xmalloc (len + 1); 813 strcpy (libpath, search_head->name); 814 815 for (search = search_head->next; search != NULL; search = search->next) 816 { 817 size_t nlen; 818 819 nlen = strlen (search->name); 820 libpath = xrealloc (libpath, len + nlen + 2); 821 libpath[len] = ':'; 822 strcpy (libpath + len + 1, search->name); 823 len += nlen + 1; 824 } 825 } 826 } 827 828 /* Default to -bexpfull for SVR4-like semantics. */ 829 flags = (unix_ld ? XCOFF_EXPFULL : 0); 830 flags &= ~explicit_auto_export_flags; 831 flags |= auto_export_flags; 832 833 /* Let the XCOFF backend set up the .loader section. */ 834 if (!bfd_xcoff_size_dynamic_sections 835 (link_info.output_bfd, &link_info, libpath, entry_symbol.name, file_align, 836 maxstack, maxdata, gc && !unix_ld ? TRUE : FALSE, 837 modtype, textro ? TRUE : FALSE, flags, special_sections, 838 rtld ? TRUE : FALSE)) 839 einfo ("%P%F: failed to set dynamic section sizes: %E\n"); 840 841 /* Look through the special sections, and put them in the right 842 place in the link ordering. This is especially magic. */ 843 for (i = 0; i < XCOFF_NUMBER_OF_SPECIAL_SECTIONS; i++) 844 { 845 asection *sec; 846 lang_output_section_statement_type *os; 847 lang_statement_union_type **pls; 848 lang_input_section_type *is; 849 const char *oname; 850 bfd_boolean start; 851 852 sec = special_sections[i]; 853 if (sec == NULL) 854 continue; 855 856 /* Remove this section from the list of the output section. 857 This assumes we know what the script looks like. */ 858 is = NULL; 859 os = lang_output_section_find (sec->output_section->name); 860 if (os == NULL) 861 einfo ("%P%F: can't find output section %s\n", 862 sec->output_section->name); 863 864 for (pls = &os->children.head; *pls != NULL; pls = &(*pls)->header.next) 865 { 866 if ((*pls)->header.type == lang_input_section_enum 867 && (*pls)->input_section.section == sec) 868 { 869 is = (lang_input_section_type *) * pls; 870 *pls = (*pls)->header.next; 871 break; 872 } 873 874 if ((*pls)->header.type == lang_wild_statement_enum) 875 { 876 lang_statement_union_type **pwls; 877 878 for (pwls = &(*pls)->wild_statement.children.head; 879 *pwls != NULL; pwls = &(*pwls)->header.next) 880 { 881 882 if ((*pwls)->header.type == lang_input_section_enum 883 && (*pwls)->input_section.section == sec) 884 { 885 is = (lang_input_section_type *) * pwls; 886 *pwls = (*pwls)->header.next; 887 break; 888 } 889 } 890 891 if (is != NULL) 892 break; 893 } 894 } 895 896 if (is == NULL) 897 { 898 einfo ("%P%F: can't find %s in output section\n", 899 bfd_get_section_name (sec->owner, sec)); 900 } 901 902 /* Now figure out where the section should go. */ 903 switch (i) 904 { 905 906 default: /* to avoid warnings */ 907 case XCOFF_SPECIAL_SECTION_TEXT: 908 /* _text */ 909 oname = ".text"; 910 start = TRUE; 911 break; 912 913 case XCOFF_SPECIAL_SECTION_ETEXT: 914 /* _etext */ 915 oname = ".text"; 916 start = FALSE; 917 break; 918 919 case XCOFF_SPECIAL_SECTION_DATA: 920 /* _data */ 921 oname = ".data"; 922 start = TRUE; 923 break; 924 925 case XCOFF_SPECIAL_SECTION_EDATA: 926 /* _edata */ 927 oname = ".data"; 928 start = FALSE; 929 break; 930 931 case XCOFF_SPECIAL_SECTION_END: 932 case XCOFF_SPECIAL_SECTION_END2: 933 /* _end and end */ 934 oname = ".bss"; 935 start = FALSE; 936 break; 937 } 938 939 os = lang_output_section_find (oname); 940 941 if (start) 942 { 943 is->header.next = os->children.head; 944 os->children.head = (lang_statement_union_type *) is; 945 } 946 else 947 { 948 is->header.next = NULL; 949 lang_statement_append (&os->children, 950 (lang_statement_union_type *) is, 951 &is->header.next); 952 } 953 } 954 955 /* Executables and shared objects must always have .text, .data 956 and .bss output sections, so that the header can refer to them. 957 The kernel refuses to load objects that have missing sections. */ 958 if (!link_info.relocatable) 959 for (i = 0; i < ARRAY_SIZE (must_keep_sections); i++) 960 { 961 asection *sec; 962 963 sec = bfd_get_section_by_name (link_info.output_bfd, 964 must_keep_sections[i]); 965 if (sec == NULL) 966 einfo ("%P: can't find required output section %s\n", must_keep_sections[i]); 967 else 968 sec->flags |= SEC_KEEP; 969 } 970 971 before_allocation_default (); 972} 973 974static char * 975gld${EMULATION_NAME}_choose_target (int argc, char **argv) 976{ 977 int i, j, jmax; 978 static char *from_outside; 979 static char *from_inside; 980 static char *argv_to_target[][2] = { 981 {NULL, "${OUTPUT_FORMAT}"}, 982 {"-b32", "${OUTPUT_FORMAT_32BIT}"}, 983 {"-b64", "${OUTPUT_FORMAT_64BIT}"}, 984 }; 985 986 jmax = 3; 987 988 from_outside = getenv (TARGET_ENVIRON); 989 if (from_outside != (char *) NULL) 990 return from_outside; 991 992 /* Set to default. */ 993 from_inside = argv_to_target[0][1]; 994 for (i = 1; i < argc; i++) 995 { 996 for (j = 1; j < jmax; j++) 997 { 998 if (0 == strcmp (argv[i], argv_to_target[j][0])) 999 from_inside = argv_to_target[j][1]; 1000 } 1001 } 1002 1003 return from_inside; 1004} 1005 1006/* Returns 1007 1 : state changed 1008 0 : no change */ 1009static int 1010change_symbol_mode (char *input) 1011{ 1012 char *symbol_mode_string[] = { 1013 "# 32", /* 0x01 */ 1014 "# 64", /* 0x02 */ 1015 "# no32", /* 0x04 */ 1016 "# no64", /* 0x08 */ 1017 NULL, 1018 }; 1019 1020 unsigned int bit; 1021 char *string; 1022 1023 for (bit = 0;; bit++) 1024 { 1025 string = symbol_mode_string[bit]; 1026 if (string == NULL) 1027 return 0; 1028 1029 if (0 == strcmp (input, string)) 1030 { 1031 symbol_mode = (1 << bit); 1032 return 1; 1033 } 1034 } 1035 /* should not be here */ 1036 return 0; 1037} 1038 1039/* Returns 1040 1 : yes 1041 0 : ignore 1042 -1 : error, try something else */ 1043static int 1044is_syscall (char *input, unsigned int *flag) 1045{ 1046 unsigned int bit; 1047 char *string; 1048 1049 struct sc { 1050 char *syscall_string; 1051 unsigned int flag; 1052 } s [] = { 1053 { "svc" /* 0x01 */, XCOFF_SYSCALL32 }, 1054 { "svc32" /* 0x02 */, XCOFF_SYSCALL32 }, 1055 { "svc3264" /* 0x04 */, XCOFF_SYSCALL32 | XCOFF_SYSCALL64 }, 1056 { "svc64" /* 0x08 */, XCOFF_SYSCALL64 }, 1057 { "syscall" /* 0x10 */, XCOFF_SYSCALL32 }, 1058 { "syscall32" /* 0x20 */, XCOFF_SYSCALL32 }, 1059 { "syscall3264" /* 0x40 */, XCOFF_SYSCALL32 | XCOFF_SYSCALL64 }, 1060 { "syscall64" /* 0x80 */, XCOFF_SYSCALL64 }, 1061 { NULL, 0 }, 1062 }; 1063 1064 *flag = 0; 1065 1066 for (bit = 0;; bit++) 1067 { 1068 string = s[bit].syscall_string; 1069 if (string == NULL) 1070 return -1; 1071 1072 if (0 == strcmp (input, string)) 1073 { 1074 if (1 << bit & syscall_mask) 1075 { 1076 *flag = s[bit].flag; 1077 return 1; 1078 } 1079 else 1080 { 1081 return 0; 1082 } 1083 } 1084 } 1085 /* should not be here */ 1086 return -1; 1087} 1088 1089/* Read an import or export file. For an import file, this is called 1090 by the before_allocation emulation routine. For an export file, 1091 this is called by the handle_option emulation routine. */ 1092 1093static void 1094gld${EMULATION_NAME}_read_file (const char *filename, bfd_boolean import) 1095{ 1096 struct obstack *o; 1097 FILE *f; 1098 int lineno; 1099 int c; 1100 bfd_boolean keep; 1101 const char *imppath; 1102 const char *impfile; 1103 const char *impmember; 1104 1105 o = (struct obstack *) xmalloc (sizeof (struct obstack)); 1106 obstack_specify_allocation (o, 0, 0, xmalloc, gld${EMULATION_NAME}_free); 1107 1108 f = fopen (filename, FOPEN_RT); 1109 if (f == NULL) 1110 { 1111 bfd_set_error (bfd_error_system_call); 1112 einfo ("%F%s: %E\n", filename); 1113 } 1114 1115 keep = FALSE; 1116 1117 imppath = NULL; 1118 impfile = NULL; 1119 impmember = NULL; 1120 1121 lineno = 0; 1122 1123 /* Default to 32 and 64 bit mode 1124 symbols at top of /lib/syscalls.exp do not have a mode modifier and they 1125 are not repeated, assume 64 bit routines also want to use them. 1126 See the routine change_symbol_mode for more information. */ 1127 1128 symbol_mode = 0x04; 1129 1130 while ((c = getc (f)) != EOF) 1131 { 1132 char *s; 1133 char *symname; 1134 unsigned int syscall_flag = 0; 1135 bfd_vma address; 1136 struct bfd_link_hash_entry *h; 1137 1138 if (c != '\n') 1139 { 1140 obstack_1grow (o, c); 1141 continue; 1142 } 1143 1144 obstack_1grow (o, '\0'); 1145 ++lineno; 1146 1147 s = (char *) obstack_base (o); 1148 while (ISSPACE (*s)) 1149 ++s; 1150 if (*s == '\0' 1151 || *s == '*' 1152 || change_symbol_mode (s) 1153 || (*s == '#' && s[1] == ' ') 1154 || (!import && *s == '#' && s[1] == '!')) 1155 { 1156 obstack_free (o, obstack_base (o)); 1157 continue; 1158 } 1159 1160 if (*s == '#' && s[1] == '!') 1161 { 1162 s += 2; 1163 while (ISSPACE (*s)) 1164 ++s; 1165 if (*s == '\0') 1166 { 1167 imppath = NULL; 1168 impfile = NULL; 1169 impmember = NULL; 1170 obstack_free (o, obstack_base (o)); 1171 } 1172 else if (*s == '(') 1173 einfo ("%F%s%d: #! ([member]) is not supported in import files\n", 1174 filename, lineno); 1175 else 1176 { 1177 char cs; 1178 char *start; 1179 1180 (void) obstack_finish (o); 1181 keep = TRUE; 1182 start = s; 1183 while (!ISSPACE (*s) && *s != '(' && *s != '\0') 1184 ++s; 1185 cs = *s; 1186 *s = '\0'; 1187 if (!bfd_xcoff_split_import_path (link_info.output_bfd, 1188 start, &imppath, &impfile)) 1189 einfo ("%F%P: Could not parse import path: %E\n"); 1190 while (ISSPACE (cs)) 1191 { 1192 ++s; 1193 cs = *s; 1194 } 1195 if (cs != '(') 1196 { 1197 impmember = ""; 1198 if (cs != '\0') 1199 einfo ("%s:%d: warning: syntax error in import file\n", 1200 filename, lineno); 1201 } 1202 else 1203 { 1204 ++s; 1205 impmember = s; 1206 while (*s != ')' && *s != '\0') 1207 ++s; 1208 if (*s == ')') 1209 *s = '\0'; 1210 else 1211 einfo ("%s:%d: warning: syntax error in import file\n", 1212 filename, lineno); 1213 } 1214 } 1215 1216 continue; 1217 } 1218 1219 if (symbol_mode & symbol_mode_mask) 1220 { 1221 /* This is a symbol to be imported or exported. */ 1222 symname = s; 1223 syscall_flag = 0; 1224 address = (bfd_vma) -1; 1225 1226 while (!ISSPACE (*s) && *s != '\0') 1227 ++s; 1228 if (*s != '\0') 1229 { 1230 char *se; 1231 1232 *s++ = '\0'; 1233 1234 while (ISSPACE (*s)) 1235 ++s; 1236 1237 se = s; 1238 while (!ISSPACE (*se) && *se != '\0') 1239 ++se; 1240 if (*se != '\0') 1241 { 1242 *se++ = '\0'; 1243 while (ISSPACE (*se)) 1244 ++se; 1245 if (*se != '\0') 1246 einfo ("%s%d: warning: syntax error in import/export file\n", 1247 filename, lineno); 1248 } 1249 1250 if (s != se) 1251 { 1252 int status; 1253 const char *end; 1254 1255 status = is_syscall (s, &syscall_flag); 1256 1257 if (0 > status) 1258 { 1259 /* not a system call, check for address */ 1260 address = bfd_scan_vma (s, &end, 0); 1261 if (*end != '\0') 1262 { 1263 einfo ("%s:%d: warning: syntax error in import/export file\n", 1264 filename, lineno); 1265 1266 } 1267 } 1268 } 1269 } 1270 1271 if (!import) 1272 { 1273 struct export_symbol_list *n; 1274 1275 ldlang_add_undef (symname, TRUE); 1276 n = ((struct export_symbol_list *) 1277 xmalloc (sizeof (struct export_symbol_list))); 1278 n->next = export_symbols; 1279 n->name = xstrdup (symname); 1280 export_symbols = n; 1281 } 1282 else 1283 { 1284 h = bfd_link_hash_lookup (link_info.hash, symname, FALSE, FALSE, 1285 TRUE); 1286 if (h == NULL || h->type == bfd_link_hash_new) 1287 { 1288 /* We can just ignore attempts to import an unreferenced 1289 symbol. */ 1290 } 1291 else 1292 { 1293 if (!bfd_xcoff_import_symbol (link_info.output_bfd, 1294 &link_info, h, 1295 address, imppath, impfile, 1296 impmember, syscall_flag)) 1297 einfo ("%X%s:%d: failed to import symbol %s: %E\n", 1298 filename, lineno, symname); 1299 } 1300 } 1301 } 1302 obstack_free (o, obstack_base (o)); 1303 } 1304 1305 if (obstack_object_size (o) > 0) 1306 { 1307 einfo ("%s:%d: warning: ignoring unterminated last line\n", 1308 filename, lineno); 1309 obstack_free (o, obstack_base (o)); 1310 } 1311 1312 if (!keep) 1313 { 1314 obstack_free (o, NULL); 1315 free (o); 1316 } 1317} 1318 1319/* This routine saves us from worrying about declaring free. */ 1320 1321static void 1322gld${EMULATION_NAME}_free (void *p) 1323{ 1324 free (p); 1325} 1326 1327/* This is called by the before_allocation routine via 1328 lang_for_each_statement. It looks for relocations and assignments 1329 to symbols. */ 1330 1331static void 1332gld${EMULATION_NAME}_find_relocs (lang_statement_union_type *s) 1333{ 1334 if (s->header.type == lang_reloc_statement_enum) 1335 { 1336 lang_reloc_statement_type *rs; 1337 1338 rs = &s->reloc_statement; 1339 if (rs->name == NULL) 1340 einfo ("%F%P: only relocations against symbols are permitted\n"); 1341 if (!bfd_xcoff_link_count_reloc (link_info.output_bfd, &link_info, 1342 rs->name)) 1343 einfo ("%F%P: bfd_xcoff_link_count_reloc failed: %E\n"); 1344 } 1345 1346 if (s->header.type == lang_assignment_statement_enum) 1347 gld${EMULATION_NAME}_find_exp_assignment (s->assignment_statement.exp); 1348} 1349 1350/* Look through an expression for an assignment statement. */ 1351 1352static void 1353gld${EMULATION_NAME}_find_exp_assignment (etree_type *exp) 1354{ 1355 struct bfd_link_hash_entry *h; 1356 1357 switch (exp->type.node_class) 1358 { 1359 case etree_provide: 1360 h = bfd_link_hash_lookup (link_info.hash, exp->assign.dst, 1361 FALSE, FALSE, FALSE); 1362 if (h == NULL) 1363 break; 1364 /* Fall through. */ 1365 case etree_assign: 1366 if (strcmp (exp->assign.dst, ".") != 0) 1367 { 1368 if (!bfd_xcoff_record_link_assignment (link_info.output_bfd, 1369 &link_info, 1370 exp->assign.dst)) 1371 einfo ("%P%F: failed to record assignment to %s: %E\n", 1372 exp->assign.dst); 1373 } 1374 gld${EMULATION_NAME}_find_exp_assignment (exp->assign.src); 1375 break; 1376 1377 case etree_binary: 1378 gld${EMULATION_NAME}_find_exp_assignment (exp->binary.lhs); 1379 gld${EMULATION_NAME}_find_exp_assignment (exp->binary.rhs); 1380 break; 1381 1382 case etree_trinary: 1383 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.cond); 1384 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.lhs); 1385 gld${EMULATION_NAME}_find_exp_assignment (exp->trinary.rhs); 1386 break; 1387 1388 case etree_unary: 1389 gld${EMULATION_NAME}_find_exp_assignment (exp->unary.child); 1390 break; 1391 1392 default: 1393 break; 1394 } 1395} 1396 1397static char * 1398gld${EMULATION_NAME}_get_script (int *isfile) 1399EOF 1400 1401if test -n "$COMPILE_IN" 1402then 1403# Scripts compiled in. 1404 1405# sed commands to quote an ld script as a C string. 1406sc="-f ${srcdir}/emultempl/ostring.sed" 1407 1408fragment <<EOF 1409{ 1410 *isfile = 0; 1411 1412 if (link_info.relocatable && config.build_constructors) 1413 return 1414EOF 1415sed $sc ldscripts/${EMULATION_NAME}.xu >> e${EMULATION_NAME}.c 1416echo ' ; else if (link_info.relocatable) return' >> e${EMULATION_NAME}.c 1417sed $sc ldscripts/${EMULATION_NAME}.xr >> e${EMULATION_NAME}.c 1418echo ' ; else if (!config.text_read_only) return' >> e${EMULATION_NAME}.c 1419sed $sc ldscripts/${EMULATION_NAME}.xbn >> e${EMULATION_NAME}.c 1420echo ' ; else if (!config.magic_demand_paged) return' >> e${EMULATION_NAME}.c 1421sed $sc ldscripts/${EMULATION_NAME}.xn >> e${EMULATION_NAME}.c 1422echo ' ; else return' >> e${EMULATION_NAME}.c 1423sed $sc ldscripts/${EMULATION_NAME}.x >> e${EMULATION_NAME}.c 1424echo '; }' >> e${EMULATION_NAME}.c 1425 1426else 1427# Scripts read from the filesystem. 1428 1429fragment <<EOF 1430{ 1431 *isfile = 1; 1432 1433 if (link_info.relocatable && config.build_constructors) 1434 return "ldscripts/${EMULATION_NAME}.xu"; 1435 else if (link_info.relocatable) 1436 return "ldscripts/${EMULATION_NAME}.xr"; 1437 else if (!config.text_read_only) 1438 return "ldscripts/${EMULATION_NAME}.xbn"; 1439 else if (!config.magic_demand_paged) 1440 return "ldscripts/${EMULATION_NAME}.xn"; 1441 else 1442 return "ldscripts/${EMULATION_NAME}.x"; 1443} 1444EOF 1445 1446fi 1447 1448fragment <<EOF 1449 1450static void 1451gld${EMULATION_NAME}_create_output_section_statements (void) 1452{ 1453 /* __rtinit */ 1454 if ((bfd_get_flavour (link_info.output_bfd) == bfd_target_xcoff_flavour) 1455 && (link_info.init_function != NULL 1456 || link_info.fini_function != NULL 1457 || rtld)) 1458 { 1459 initfini_file = lang_add_input_file ("initfini", 1460 lang_input_file_is_file_enum, 1461 NULL); 1462 1463 initfini_file->the_bfd = bfd_create ("initfini", link_info.output_bfd); 1464 if (initfini_file->the_bfd == NULL 1465 || ! bfd_set_arch_mach (initfini_file->the_bfd, 1466 bfd_get_arch (link_info.output_bfd), 1467 bfd_get_mach (link_info.output_bfd))) 1468 { 1469 einfo ("%X%P: can not create BFD %E\n"); 1470 return; 1471 } 1472 1473 /* Call backend to fill in the rest */ 1474 if (! bfd_xcoff_link_generate_rtinit (initfini_file->the_bfd, 1475 link_info.init_function, 1476 link_info.fini_function, 1477 rtld)) 1478 { 1479 einfo ("%X%P: can not create BFD %E\n"); 1480 return; 1481 } 1482 1483 /* __rtld defined in /lib/librtl.a */ 1484 if (rtld) 1485 lang_add_input_file ("rtl", lang_input_file_is_l_enum, NULL); 1486 } 1487} 1488 1489static void 1490gld${EMULATION_NAME}_set_output_arch (void) 1491{ 1492 bfd_set_arch_mach (link_info.output_bfd, 1493 bfd_xcoff_architecture (link_info.output_bfd), 1494 bfd_xcoff_machine (link_info.output_bfd)); 1495 1496 ldfile_output_architecture = bfd_get_arch (link_info.output_bfd); 1497 ldfile_output_machine = bfd_get_mach (link_info.output_bfd); 1498 ldfile_output_machine_name = bfd_printable_name (link_info.output_bfd); 1499} 1500 1501static bfd_boolean 1502gld${EMULATION_NAME}_open_dynamic_archive (const char *arch, 1503 search_dirs_type *search, 1504 lang_input_statement_type *entry) 1505{ 1506 char *path; 1507 1508 if (!entry->flags.maybe_archive) 1509 return FALSE; 1510 1511 path = concat (search->name, "/lib", entry->filename, arch, ".a", NULL); 1512 if (!ldfile_try_open_bfd (path, entry)) 1513 { 1514 free (path); 1515 return FALSE; 1516 } 1517 /* Don't include the searched directory in the import path. */ 1518 bfd_xcoff_set_archive_import_path (&link_info, entry->the_bfd, 1519 path + strlen (search->name) + 1); 1520 entry->filename = path; 1521 return TRUE; 1522} 1523 1524struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation = { 1525 gld${EMULATION_NAME}_before_parse, 1526 syslib_default, 1527 hll_default, 1528 after_parse_default, 1529 gld${EMULATION_NAME}_after_open, 1530 after_allocation_default, 1531 gld${EMULATION_NAME}_set_output_arch, 1532 gld${EMULATION_NAME}_choose_target, 1533 gld${EMULATION_NAME}_before_allocation, 1534 gld${EMULATION_NAME}_get_script, 1535 "${EMULATION_NAME}", 1536 "${OUTPUT_FORMAT}", 1537 finish_default, 1538 gld${EMULATION_NAME}_create_output_section_statements, 1539 gld${EMULATION_NAME}_open_dynamic_archive, 1540 0, /* place_orphan */ 1541 0, /* set_symbols */ 1542 gld${EMULATION_NAME}_parse_args, 1543 gld${EMULATION_NAME}_add_options, 1544 gld${EMULATION_NAME}_handle_option, 1545 gld${EMULATION_NAME}_unrecognized_file, 1546 NULL, /* list_options */ 1547 NULL, /* recognized_file */ 1548 NULL, /* find potential_libraries */ 1549 NULL /* new_vers_pattern */ 1550}; 1551EOF 1552