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