1 // gold.cc -- main linker functions 2 3 // Copyright 2006, 2007, 2008, 2009, 2010, 2011, 2012 4 // Free Software Foundation, Inc. 5 // Written by Ian Lance Taylor <iant@google.com>. 6 7 // This file is part of gold. 8 9 // This program is free software; you can redistribute it and/or modify 10 // it under the terms of the GNU General Public License as published by 11 // the Free Software Foundation; either version 3 of the License, or 12 // (at your option) any later version. 13 14 // This program is distributed in the hope that it will be useful, 15 // but WITHOUT ANY WARRANTY; without even the implied warranty of 16 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 // GNU General Public License for more details. 18 19 // You should have received a copy of the GNU General Public License 20 // along with this program; if not, write to the Free Software 21 // Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, 22 // MA 02110-1301, USA. 23 24 #include "gold.h" 25 26 #include <cstdlib> 27 #include <cstdio> 28 #include <cstring> 29 #include <unistd.h> 30 #include <algorithm> 31 #include "libiberty.h" 32 33 #include "options.h" 34 #include "target-select.h" 35 #include "debug.h" 36 #include "workqueue.h" 37 #include "dirsearch.h" 38 #include "readsyms.h" 39 #include "symtab.h" 40 #include "common.h" 41 #include "object.h" 42 #include "layout.h" 43 #include "reloc.h" 44 #include "defstd.h" 45 #include "plugin.h" 46 #include "gc.h" 47 #include "icf.h" 48 #include "incremental.h" 49 #include "timer.h" 50 51 namespace gold 52 { 53 54 class Object; 55 56 const char* program_name; 57 58 static Task* 59 process_incremental_input(Incremental_binary*, unsigned int, Input_objects*, 60 Symbol_table*, Layout*, Dirsearch*, Mapfile*, 61 Task_token*, Task_token*); 62 63 void 64 gold_exit(Exit_status status) 65 { 66 if (parameters != NULL 67 && parameters->options_valid() 68 && parameters->options().has_plugins()) 69 parameters->options().plugins()->cleanup(); 70 if (status != GOLD_OK && parameters != NULL && parameters->options_valid()) 71 unlink_if_ordinary(parameters->options().output_file_name()); 72 exit(status); 73 } 74 75 void 76 gold_nomem() 77 { 78 // We are out of memory, so try hard to print a reasonable message. 79 // Note that we don't try to translate this message, since the 80 // translation process itself will require memory. 81 82 // LEN only exists to avoid a pointless warning when write is 83 // declared with warn_use_result, as when compiling with 84 // -D_USE_FORTIFY on GNU/Linux. Casting to void does not appear to 85 // work, at least not with gcc 4.3.0. 86 87 ssize_t len = write(2, program_name, strlen(program_name)); 88 if (len >= 0) 89 { 90 const char* const s = ": out of memory\n"; 91 len = write(2, s, strlen(s)); 92 } 93 gold_exit(GOLD_ERR); 94 } 95 96 // Handle an unreachable case. 97 98 void 99 do_gold_unreachable(const char* filename, int lineno, const char* function) 100 { 101 fprintf(stderr, _("%s: internal error in %s, at %s:%d\n"), 102 program_name, function, filename, lineno); 103 gold_exit(GOLD_ERR); 104 } 105 106 // This class arranges to run the functions done in the middle of the 107 // link. It is just a closure. 108 109 class Middle_runner : public Task_function_runner 110 { 111 public: 112 Middle_runner(const General_options& options, 113 const Input_objects* input_objects, 114 Symbol_table* symtab, 115 Layout* layout, Mapfile* mapfile) 116 : options_(options), input_objects_(input_objects), symtab_(symtab), 117 layout_(layout), mapfile_(mapfile) 118 { } 119 120 void 121 run(Workqueue*, const Task*); 122 123 private: 124 const General_options& options_; 125 const Input_objects* input_objects_; 126 Symbol_table* symtab_; 127 Layout* layout_; 128 Mapfile* mapfile_; 129 }; 130 131 void 132 Middle_runner::run(Workqueue* workqueue, const Task* task) 133 { 134 queue_middle_tasks(this->options_, task, this->input_objects_, this->symtab_, 135 this->layout_, workqueue, this->mapfile_); 136 } 137 138 // This class arranges the tasks to process the relocs for garbage collection. 139 140 class Gc_runner : public Task_function_runner 141 { 142 public: 143 Gc_runner(const General_options& options, 144 const Input_objects* input_objects, 145 Symbol_table* symtab, 146 Layout* layout, Mapfile* mapfile) 147 : options_(options), input_objects_(input_objects), symtab_(symtab), 148 layout_(layout), mapfile_(mapfile) 149 { } 150 151 void 152 run(Workqueue*, const Task*); 153 154 private: 155 const General_options& options_; 156 const Input_objects* input_objects_; 157 Symbol_table* symtab_; 158 Layout* layout_; 159 Mapfile* mapfile_; 160 }; 161 162 void 163 Gc_runner::run(Workqueue* workqueue, const Task* task) 164 { 165 queue_middle_gc_tasks(this->options_, task, this->input_objects_, 166 this->symtab_, this->layout_, workqueue, 167 this->mapfile_); 168 } 169 170 // Queue up the initial set of tasks for this link job. 171 172 void 173 queue_initial_tasks(const General_options& options, 174 Dirsearch& search_path, 175 const Command_line& cmdline, 176 Workqueue* workqueue, Input_objects* input_objects, 177 Symbol_table* symtab, Layout* layout, Mapfile* mapfile) 178 { 179 if (cmdline.begin() == cmdline.end()) 180 { 181 bool is_ok = false; 182 if (options.printed_version()) 183 is_ok = true; 184 if (options.print_output_format()) 185 { 186 print_output_format(); 187 is_ok = true; 188 } 189 if (is_ok) 190 gold_exit(GOLD_OK); 191 gold_fatal(_("no input files")); 192 } 193 194 int thread_count = options.thread_count_initial(); 195 if (thread_count == 0) 196 thread_count = cmdline.number_of_input_files(); 197 workqueue->set_thread_count(thread_count); 198 199 // For incremental links, the base output file. 200 Incremental_binary* ibase = NULL; 201 202 if (parameters->incremental_update()) 203 { 204 Output_file* of = new Output_file(options.output_file_name()); 205 if (of->open_base_file(options.incremental_base(), true)) 206 { 207 ibase = open_incremental_binary(of); 208 if (ibase != NULL 209 && ibase->check_inputs(cmdline, layout->incremental_inputs())) 210 ibase->init_layout(layout); 211 else 212 { 213 delete ibase; 214 ibase = NULL; 215 of->close(); 216 } 217 } 218 if (ibase == NULL) 219 { 220 if (set_parameters_incremental_full()) 221 gold_info(_("linking with --incremental-full")); 222 else 223 gold_fallback(_("restart link with --incremental-full")); 224 } 225 } 226 227 // Read the input files. We have to add the symbols to the symbol 228 // table in order. We do this by creating a separate blocker for 229 // each input file. We associate the blocker with the following 230 // input file, to give us a convenient place to delete it. 231 Task_token* this_blocker = NULL; 232 if (ibase == NULL) 233 { 234 // Normal link. Queue a Read_symbols task for each input file 235 // on the command line. 236 for (Command_line::const_iterator p = cmdline.begin(); 237 p != cmdline.end(); 238 ++p) 239 { 240 Task_token* next_blocker = new Task_token(true); 241 next_blocker->add_blocker(); 242 workqueue->queue(new Read_symbols(input_objects, symtab, layout, 243 &search_path, 0, mapfile, &*p, NULL, 244 NULL, this_blocker, next_blocker)); 245 this_blocker = next_blocker; 246 } 247 } 248 else 249 { 250 // Incremental update link. Process the list of input files 251 // stored in the base file, and queue a task for each file: 252 // a Read_symbols task for a changed file, and an Add_symbols task 253 // for an unchanged file. We need to mark all the space used by 254 // unchanged files before we can start any tasks running. 255 unsigned int input_file_count = ibase->input_file_count(); 256 std::vector<Task*> tasks; 257 tasks.reserve(input_file_count); 258 for (unsigned int i = 0; i < input_file_count; ++i) 259 { 260 Task_token* next_blocker = new Task_token(true); 261 next_blocker->add_blocker(); 262 Task* t = process_incremental_input(ibase, i, input_objects, symtab, 263 layout, &search_path, mapfile, 264 this_blocker, next_blocker); 265 tasks.push_back(t); 266 this_blocker = next_blocker; 267 } 268 // Now we can queue the tasks. 269 for (unsigned int i = 0; i < tasks.size(); i++) 270 workqueue->queue(tasks[i]); 271 } 272 273 if (options.has_plugins()) 274 { 275 Task_token* next_blocker = new Task_token(true); 276 next_blocker->add_blocker(); 277 workqueue->queue(new Plugin_hook(options, input_objects, symtab, layout, 278 &search_path, mapfile, this_blocker, 279 next_blocker)); 280 this_blocker = next_blocker; 281 } 282 283 if (options.relocatable() 284 && (options.gc_sections() || options.icf_enabled())) 285 gold_error(_("cannot mix -r with --gc-sections or --icf")); 286 287 if (options.gc_sections() || options.icf_enabled()) 288 { 289 workqueue->queue(new Task_function(new Gc_runner(options, 290 input_objects, 291 symtab, 292 layout, 293 mapfile), 294 this_blocker, 295 "Task_function Gc_runner")); 296 } 297 else 298 { 299 workqueue->queue(new Task_function(new Middle_runner(options, 300 input_objects, 301 symtab, 302 layout, 303 mapfile), 304 this_blocker, 305 "Task_function Middle_runner")); 306 } 307 } 308 309 // Process an incremental input file: if it is unchanged from the previous 310 // link, return a task to add its symbols from the base file's incremental 311 // info; if it has changed, return a normal Read_symbols task. We create a 312 // task for every input file, if only to report the file for rebuilding the 313 // incremental info. 314 315 static Task* 316 process_incremental_input(Incremental_binary* ibase, 317 unsigned int input_file_index, 318 Input_objects* input_objects, 319 Symbol_table* symtab, 320 Layout* layout, 321 Dirsearch* search_path, 322 Mapfile* mapfile, 323 Task_token* this_blocker, 324 Task_token* next_blocker) 325 { 326 const Incremental_binary::Input_reader* input_reader = 327 ibase->get_input_reader(input_file_index); 328 Incremental_input_type input_type = input_reader->type(); 329 330 // Get the input argument corresponding to this input file, matching on 331 // the argument serial number. If the input file cannot be matched 332 // to an existing input argument, synthesize a new one. 333 const Input_argument* input_argument = 334 ibase->get_input_argument(input_file_index); 335 if (input_argument == NULL) 336 { 337 Input_file_argument file(input_reader->filename(), 338 Input_file_argument::INPUT_FILE_TYPE_FILE, 339 "", false, parameters->options()); 340 Input_argument* arg = new Input_argument(file); 341 arg->set_script_info(ibase->get_script_info(input_file_index)); 342 input_argument = arg; 343 } 344 345 gold_debug(DEBUG_INCREMENTAL, "Incremental object: %s, type %d", 346 input_reader->filename(), input_type); 347 348 if (input_type == INCREMENTAL_INPUT_SCRIPT) 349 { 350 // Incremental_binary::check_inputs should have cancelled the 351 // incremental update if the script has changed. 352 gold_assert(!ibase->file_has_changed(input_file_index)); 353 return new Check_script(layout, ibase, input_file_index, input_reader, 354 this_blocker, next_blocker); 355 } 356 357 if (input_type == INCREMENTAL_INPUT_ARCHIVE) 358 { 359 Incremental_library* lib = ibase->get_library(input_file_index); 360 gold_assert(lib != NULL); 361 if (lib->filename() == "/group/" 362 || !ibase->file_has_changed(input_file_index)) 363 { 364 // Queue a task to check that no references have been added to any 365 // of the library's unused symbols. 366 return new Check_library(symtab, layout, ibase, input_file_index, 367 input_reader, this_blocker, next_blocker); 368 } 369 else 370 { 371 // Queue a Read_symbols task to process the archive normally. 372 return new Read_symbols(input_objects, symtab, layout, search_path, 373 0, mapfile, input_argument, NULL, NULL, 374 this_blocker, next_blocker); 375 } 376 } 377 378 if (input_type == INCREMENTAL_INPUT_ARCHIVE_MEMBER) 379 { 380 // For archive members, check the timestamp of the containing archive. 381 Incremental_library* lib = ibase->get_library(input_file_index); 382 gold_assert(lib != NULL); 383 // Process members of a --start-lib/--end-lib group as normal objects. 384 if (lib->filename() != "/group/") 385 { 386 if (ibase->file_has_changed(lib->input_file_index())) 387 { 388 return new Read_member(input_objects, symtab, layout, mapfile, 389 input_reader, this_blocker, next_blocker); 390 } 391 else 392 { 393 // The previous contributions from this file will be kept. 394 // Mark the pieces of output sections contributed by this 395 // object. 396 ibase->reserve_layout(input_file_index); 397 Object* obj = make_sized_incremental_object(ibase, 398 input_file_index, 399 input_type, 400 input_reader); 401 return new Add_symbols(input_objects, symtab, layout, 402 search_path, 0, mapfile, input_argument, 403 obj, lib, NULL, this_blocker, 404 next_blocker); 405 } 406 } 407 } 408 409 // Normal object file or shared library. Check if the file has changed 410 // since the last incremental link. 411 if (ibase->file_has_changed(input_file_index)) 412 { 413 return new Read_symbols(input_objects, symtab, layout, search_path, 0, 414 mapfile, input_argument, NULL, NULL, 415 this_blocker, next_blocker); 416 } 417 else 418 { 419 // The previous contributions from this file will be kept. 420 // Mark the pieces of output sections contributed by this object. 421 ibase->reserve_layout(input_file_index); 422 Object* obj = make_sized_incremental_object(ibase, 423 input_file_index, 424 input_type, 425 input_reader); 426 return new Add_symbols(input_objects, symtab, layout, search_path, 0, 427 mapfile, input_argument, obj, NULL, NULL, 428 this_blocker, next_blocker); 429 } 430 } 431 432 // Queue up a set of tasks to be done before queueing the middle set 433 // of tasks. This is only necessary when garbage collection 434 // (--gc-sections) of unused sections is desired. The relocs are read 435 // and processed here early to determine the garbage sections before the 436 // relocs can be scanned in later tasks. 437 438 void 439 queue_middle_gc_tasks(const General_options& options, 440 const Task* , 441 const Input_objects* input_objects, 442 Symbol_table* symtab, 443 Layout* layout, 444 Workqueue* workqueue, 445 Mapfile* mapfile) 446 { 447 // Read_relocs for all the objects must be done and processed to find 448 // unused sections before any scanning of the relocs can take place. 449 Task_token* this_blocker = NULL; 450 for (Input_objects::Relobj_iterator p = input_objects->relobj_begin(); 451 p != input_objects->relobj_end(); 452 ++p) 453 { 454 Task_token* next_blocker = new Task_token(true); 455 next_blocker->add_blocker(); 456 workqueue->queue(new Read_relocs(symtab, layout, *p, this_blocker, 457 next_blocker)); 458 this_blocker = next_blocker; 459 } 460 461 // If we are given only archives in input, we have no regular 462 // objects and THIS_BLOCKER is NULL here. Create a dummy 463 // blocker here so that we can run the middle tasks immediately. 464 if (this_blocker == NULL) 465 { 466 gold_assert(input_objects->number_of_relobjs() == 0); 467 this_blocker = new Task_token(true); 468 } 469 470 workqueue->queue(new Task_function(new Middle_runner(options, 471 input_objects, 472 symtab, 473 layout, 474 mapfile), 475 this_blocker, 476 "Task_function Middle_runner")); 477 } 478 479 // Queue up the middle set of tasks. These are the tasks which run 480 // after all the input objects have been found and all the symbols 481 // have been read, but before we lay out the output file. 482 483 void 484 queue_middle_tasks(const General_options& options, 485 const Task* task, 486 const Input_objects* input_objects, 487 Symbol_table* symtab, 488 Layout* layout, 489 Workqueue* workqueue, 490 Mapfile* mapfile) 491 { 492 Timer* timer = parameters->timer(); 493 if (timer != NULL) 494 timer->stamp(0); 495 496 // Add any symbols named with -u options to the symbol table. 497 symtab->add_undefined_symbols_from_command_line(layout); 498 499 // If garbage collection was chosen, relocs have been read and processed 500 // at this point by pre_middle_tasks. Layout can then be done for all 501 // objects. 502 if (parameters->options().gc_sections()) 503 { 504 // Find the start symbol if any. 505 Symbol* start_sym = symtab->lookup(parameters->entry()); 506 if (start_sym != NULL) 507 { 508 bool is_ordinary; 509 unsigned int shndx = start_sym->shndx(&is_ordinary); 510 if (is_ordinary) 511 { 512 symtab->gc()->worklist().push( 513 Section_id(start_sym->object(), shndx)); 514 } 515 } 516 // Symbols named with -u should not be considered garbage. 517 symtab->gc_mark_undef_symbols(layout); 518 gold_assert(symtab->gc() != NULL); 519 // Do a transitive closure on all references to determine the worklist. 520 symtab->gc()->do_transitive_closure(); 521 } 522 523 // If identical code folding (--icf) is chosen it makes sense to do it 524 // only after garbage collection (--gc-sections) as we do not want to 525 // be folding sections that will be garbage. 526 if (parameters->options().icf_enabled()) 527 { 528 symtab->icf()->find_identical_sections(input_objects, symtab); 529 } 530 531 // Call Object::layout for the second time to determine the 532 // output_sections for all referenced input sections. When 533 // --gc-sections or --icf is turned on, Object::layout is 534 // called twice. It is called the first time when the 535 // symbols are added. 536 if (parameters->options().gc_sections() 537 || parameters->options().icf_enabled()) 538 { 539 for (Input_objects::Relobj_iterator p = input_objects->relobj_begin(); 540 p != input_objects->relobj_end(); 541 ++p) 542 { 543 Task_lock_obj<Object> tlo(task, *p); 544 (*p)->layout(symtab, layout, NULL); 545 } 546 } 547 548 // Layout deferred objects due to plugins. 549 if (parameters->options().has_plugins()) 550 { 551 Plugin_manager* plugins = parameters->options().plugins(); 552 gold_assert(plugins != NULL); 553 plugins->layout_deferred_objects(); 554 } 555 556 /* If plugins have specified a section order, re-arrange input sections 557 according to a specified section order. If --section-ordering-file is 558 also specified, do not do anything here. */ 559 if (parameters->options().has_plugins() 560 && layout->is_section_ordering_specified() 561 && !parameters->options().section_ordering_file ()) 562 { 563 for (Layout::Section_list::const_iterator p 564 = layout->section_list().begin(); 565 p != layout->section_list().end(); 566 ++p) 567 (*p)->update_section_layout(layout->get_section_order_map()); 568 } 569 570 if (parameters->options().gc_sections() 571 || parameters->options().icf_enabled()) 572 { 573 for (Input_objects::Relobj_iterator p = input_objects->relobj_begin(); 574 p != input_objects->relobj_end(); 575 ++p) 576 { 577 // Update the value of output_section stored in rd. 578 Read_relocs_data* rd = (*p)->get_relocs_data(); 579 for (Read_relocs_data::Relocs_list::iterator q = rd->relocs.begin(); 580 q != rd->relocs.end(); 581 ++q) 582 { 583 q->output_section = (*p)->output_section(q->data_shndx); 584 q->needs_special_offset_handling = 585 (*p)->is_output_section_offset_invalid(q->data_shndx); 586 } 587 } 588 } 589 590 // We have to support the case of not seeing any input objects, and 591 // generate an empty file. Existing builds depend on being able to 592 // pass an empty archive to the linker and get an empty object file 593 // out. In order to do this we need to use a default target. 594 if (input_objects->number_of_input_objects() == 0 595 && layout->incremental_base() == NULL) 596 parameters_force_valid_target(); 597 598 int thread_count = options.thread_count_middle(); 599 if (thread_count == 0) 600 thread_count = std::max(2, input_objects->number_of_input_objects()); 601 workqueue->set_thread_count(thread_count); 602 603 // Now we have seen all the input files. 604 const bool doing_static_link = 605 (!input_objects->any_dynamic() 606 && !parameters->options().output_is_position_independent()); 607 set_parameters_doing_static_link(doing_static_link); 608 if (!doing_static_link && options.is_static()) 609 { 610 // We print out just the first .so we see; there may be others. 611 gold_assert(input_objects->dynobj_begin() != input_objects->dynobj_end()); 612 gold_error(_("cannot mix -static with dynamic object %s"), 613 (*input_objects->dynobj_begin())->name().c_str()); 614 } 615 if (!doing_static_link && parameters->options().relocatable()) 616 gold_fatal(_("cannot mix -r with dynamic object %s"), 617 (*input_objects->dynobj_begin())->name().c_str()); 618 if (!doing_static_link 619 && options.oformat_enum() != General_options::OBJECT_FORMAT_ELF) 620 gold_fatal(_("cannot use non-ELF output format with dynamic object %s"), 621 (*input_objects->dynobj_begin())->name().c_str()); 622 623 if (parameters->options().relocatable()) 624 { 625 Input_objects::Relobj_iterator p = input_objects->relobj_begin(); 626 if (p != input_objects->relobj_end()) 627 { 628 bool uses_split_stack = (*p)->uses_split_stack(); 629 for (++p; p != input_objects->relobj_end(); ++p) 630 { 631 if ((*p)->uses_split_stack() != uses_split_stack) 632 gold_fatal(_("cannot mix split-stack '%s' and " 633 "non-split-stack '%s' when using -r"), 634 (*input_objects->relobj_begin())->name().c_str(), 635 (*p)->name().c_str()); 636 } 637 } 638 } 639 640 // For incremental updates, record the existing GOT and PLT entries, 641 // and the COPY relocations. 642 if (parameters->incremental_update()) 643 { 644 Incremental_binary* ibase = layout->incremental_base(); 645 ibase->process_got_plt(symtab, layout); 646 ibase->emit_copy_relocs(symtab); 647 } 648 649 if (is_debugging_enabled(DEBUG_SCRIPT)) 650 layout->script_options()->print(stderr); 651 652 // For each dynamic object, record whether we've seen all the 653 // dynamic objects that it depends upon. 654 input_objects->check_dynamic_dependencies(); 655 656 // See if any of the input definitions violate the One Definition Rule. 657 // TODO: if this is too slow, do this as a task, rather than inline. 658 symtab->detect_odr_violations(task, options.output_file_name()); 659 660 // Do the --no-undefined-version check. 661 if (!parameters->options().undefined_version()) 662 { 663 Script_options* so = layout->script_options(); 664 so->version_script_info()->check_unmatched_names(symtab); 665 } 666 667 // Create any automatic note sections. 668 layout->create_notes(); 669 670 // Create any output sections required by any linker script. 671 layout->create_script_sections(); 672 673 // Define some sections and symbols needed for a dynamic link. This 674 // handles some cases we want to see before we read the relocs. 675 layout->create_initial_dynamic_sections(symtab); 676 677 // Define symbols from any linker scripts. 678 layout->define_script_symbols(symtab); 679 680 // TODO(csilvers): figure out a more principled way to get the target 681 Target* target = const_cast<Target*>(¶meters->target()); 682 683 // Attach sections to segments. 684 layout->attach_sections_to_segments(target); 685 686 if (!parameters->options().relocatable()) 687 { 688 // Predefine standard symbols. 689 define_standard_symbols(symtab, layout); 690 691 // Define __start and __stop symbols for output sections where 692 // appropriate. 693 layout->define_section_symbols(symtab); 694 695 // Define target-specific symbols. 696 target->define_standard_symbols(symtab, layout); 697 } 698 699 // Make sure we have symbols for any required group signatures. 700 layout->define_group_signatures(symtab); 701 702 Task_token* this_blocker = NULL; 703 704 // Allocate common symbols. We use a blocker to run this before the 705 // Scan_relocs tasks, because it writes to the symbol table just as 706 // they do. 707 if (parameters->options().define_common()) 708 { 709 this_blocker = new Task_token(true); 710 this_blocker->add_blocker(); 711 workqueue->queue(new Allocate_commons_task(symtab, layout, mapfile, 712 this_blocker)); 713 } 714 715 // If doing garbage collection, the relocations have already been read. 716 // Otherwise, read and scan the relocations. 717 if (parameters->options().gc_sections() 718 || parameters->options().icf_enabled()) 719 { 720 for (Input_objects::Relobj_iterator p = input_objects->relobj_begin(); 721 p != input_objects->relobj_end(); 722 ++p) 723 { 724 Task_token* next_blocker = new Task_token(true); 725 next_blocker->add_blocker(); 726 workqueue->queue(new Scan_relocs(symtab, layout, *p, 727 (*p)->get_relocs_data(), 728 this_blocker, next_blocker)); 729 this_blocker = next_blocker; 730 } 731 } 732 else 733 { 734 // Read the relocations of the input files. We do this to find 735 // which symbols are used by relocations which require a GOT and/or 736 // a PLT entry, or a COPY reloc. When we implement garbage 737 // collection we will do it here by reading the relocations in a 738 // breadth first search by references. 739 // 740 // We could also read the relocations during the first pass, and 741 // mark symbols at that time. That is how the old GNU linker works. 742 // Doing that is more complex, since we may later decide to discard 743 // some of the sections, and thus change our minds about the types 744 // of references made to the symbols. 745 for (Input_objects::Relobj_iterator p = input_objects->relobj_begin(); 746 p != input_objects->relobj_end(); 747 ++p) 748 { 749 Task_token* next_blocker = new Task_token(true); 750 next_blocker->add_blocker(); 751 workqueue->queue(new Read_relocs(symtab, layout, *p, this_blocker, 752 next_blocker)); 753 this_blocker = next_blocker; 754 } 755 } 756 757 if (this_blocker == NULL) 758 { 759 if (input_objects->number_of_relobjs() == 0) 760 { 761 // If we are given only archives in input, we have no regular 762 // objects and THIS_BLOCKER is NULL here. Create a dummy 763 // blocker here so that we can run the layout task immediately. 764 this_blocker = new Task_token(true); 765 } 766 else 767 { 768 // If we failed to open any input files, it's possible for 769 // THIS_BLOCKER to be NULL here. There's no real point in 770 // continuing if that happens. 771 gold_assert(parameters->errors()->error_count() > 0); 772 gold_exit(GOLD_ERR); 773 } 774 } 775 776 // When all those tasks are complete, we can start laying out the 777 // output file. 778 workqueue->queue(new Task_function(new Layout_task_runner(options, 779 input_objects, 780 symtab, 781 target, 782 layout, 783 mapfile), 784 this_blocker, 785 "Task_function Layout_task_runner")); 786 } 787 788 // Queue up the final set of tasks. This is called at the end of 789 // Layout_task. 790 791 void 792 queue_final_tasks(const General_options& options, 793 const Input_objects* input_objects, 794 const Symbol_table* symtab, 795 Layout* layout, 796 Workqueue* workqueue, 797 Output_file* of) 798 { 799 Timer* timer = parameters->timer(); 800 if (timer != NULL) 801 timer->stamp(1); 802 803 int thread_count = options.thread_count_final(); 804 if (thread_count == 0) 805 thread_count = std::max(2, input_objects->number_of_input_objects()); 806 workqueue->set_thread_count(thread_count); 807 808 bool any_postprocessing_sections = layout->any_postprocessing_sections(); 809 810 // Use a blocker to wait until all the input sections have been 811 // written out. 812 Task_token* input_sections_blocker = NULL; 813 if (!any_postprocessing_sections) 814 { 815 input_sections_blocker = new Task_token(true); 816 input_sections_blocker->add_blockers(input_objects->number_of_relobjs()); 817 } 818 819 // Use a blocker to block any objects which have to wait for the 820 // output sections to complete before they can apply relocations. 821 Task_token* output_sections_blocker = new Task_token(true); 822 output_sections_blocker->add_blocker(); 823 824 // Use a blocker to block the final cleanup task. 825 Task_token* final_blocker = new Task_token(true); 826 // Write_symbols_task, Write_sections_task, Write_data_task, 827 // Relocate_tasks. 828 final_blocker->add_blockers(3); 829 final_blocker->add_blockers(input_objects->number_of_relobjs()); 830 if (!any_postprocessing_sections) 831 final_blocker->add_blocker(); 832 833 // Queue a task to write out the symbol table. 834 workqueue->queue(new Write_symbols_task(layout, 835 symtab, 836 input_objects, 837 layout->sympool(), 838 layout->dynpool(), 839 of, 840 final_blocker)); 841 842 // Queue a task to write out the output sections. 843 workqueue->queue(new Write_sections_task(layout, of, output_sections_blocker, 844 final_blocker)); 845 846 // Queue a task to write out everything else. 847 workqueue->queue(new Write_data_task(layout, symtab, of, final_blocker)); 848 849 // Queue a task for each input object to relocate the sections and 850 // write out the local symbols. 851 for (Input_objects::Relobj_iterator p = input_objects->relobj_begin(); 852 p != input_objects->relobj_end(); 853 ++p) 854 workqueue->queue(new Relocate_task(symtab, layout, *p, of, 855 input_sections_blocker, 856 output_sections_blocker, 857 final_blocker)); 858 859 // Queue a task to write out the output sections which depend on 860 // input sections. If there are any sections which require 861 // postprocessing, then we need to do this last, since it may resize 862 // the output file. 863 if (!any_postprocessing_sections) 864 { 865 Task* t = new Write_after_input_sections_task(layout, of, 866 input_sections_blocker, 867 final_blocker); 868 workqueue->queue(t); 869 } 870 else 871 { 872 Task_token* new_final_blocker = new Task_token(true); 873 new_final_blocker->add_blocker(); 874 Task* t = new Write_after_input_sections_task(layout, of, 875 final_blocker, 876 new_final_blocker); 877 workqueue->queue(t); 878 final_blocker = new_final_blocker; 879 } 880 881 // Queue a task to close the output file. This will be blocked by 882 // FINAL_BLOCKER. 883 workqueue->queue(new Task_function(new Close_task_runner(&options, layout, 884 of), 885 final_blocker, 886 "Task_function Close_task_runner")); 887 } 888 889 } // End namespace gold. 890