X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gold%2Fgold.cc;h=a4feea4993bec2c71357a754b3e95ff234ef1ab6;hb=228c8f4be0c428369ec6b68e25696863d1e62ed7;hp=4833aec7628b202a9728f8522a0a9aa2e86312b7;hpb=4b95cf5c0c75d6efc1b2f96af72317aecca079f1;p=deliverable%2Fbinutils-gdb.git diff --git a/gold/gold.cc b/gold/gold.cc index 4833aec762..a4feea4993 100644 --- a/gold/gold.cc +++ b/gold/gold.cc @@ -1,6 +1,6 @@ // gold.cc -- main linker functions -// Copyright (C) 2006-2014 Free Software Foundation, Inc. +// Copyright (C) 2006-2019 Free Software Foundation, Inc. // Written by Ian Lance Taylor . // This file is part of gold. @@ -175,7 +175,7 @@ queue_initial_tasks(const General_options& options, Workqueue* workqueue, Input_objects* input_objects, Symbol_table* symtab, Layout* layout, Mapfile* mapfile) { - if (cmdline.begin() == cmdline.end()) + if (cmdline.number_of_input_files() == 0) { bool is_ok = false; if (options.printed_version()) @@ -492,6 +492,14 @@ queue_middle_tasks(const General_options& options, if (timer != NULL) timer->stamp(0); + // We have to support the case of not seeing any input objects, and + // generate an empty file. Existing builds depend on being able to + // pass an empty archive to the linker and get an empty object file + // out. In order to do this we need to use a default target. + if (input_objects->number_of_input_objects() == 0 + && layout->incremental_base() == NULL) + parameters_force_valid_target(); + // Add any symbols named with -u options to the symbol table. symtab->add_undefined_symbols_from_command_line(layout); @@ -552,6 +560,9 @@ queue_middle_tasks(const General_options& options, plugins->layout_deferred_objects(); } + // Finalize the .eh_frame section. + layout->finalize_eh_frame_section(); + /* If plugins have specified a section order, re-arrange input sections according to a specified section order. If --section-ordering-file is also specified, do not do anything here. */ @@ -586,14 +597,6 @@ queue_middle_tasks(const General_options& options, } } - // We have to support the case of not seeing any input objects, and - // generate an empty file. Existing builds depend on being able to - // pass an empty archive to the linker and get an empty object file - // out. In order to do this we need to use a default target. - if (input_objects->number_of_input_objects() == 0 - && layout->incremental_base() == NULL) - parameters_force_valid_target(); - int thread_count = options.thread_count_middle(); if (thread_count == 0) thread_count = std::max(2, input_objects->number_of_input_objects()); @@ -628,10 +631,16 @@ queue_middle_tasks(const General_options& options, for (++p; p != input_objects->relobj_end(); ++p) { if ((*p)->uses_split_stack() != uses_split_stack) - gold_fatal(_("cannot mix split-stack '%s' and " - "non-split-stack '%s' when using -r"), - (*input_objects->relobj_begin())->name().c_str(), - (*p)->name().c_str()); + { + const char *name1 + = (*input_objects->relobj_begin())->name().c_str(); + const char *name2 = (*p)->name().c_str(); + const char *name_split = uses_split_stack ? name1 : name2; + const char *name_nosplit = uses_split_stack ? name2 : name1; + gold_fatal(_("cannot mix split-stack '%s' and " + "non-split-stack '%s' when using -r"), + name_split, name_nosplit); + } } } } @@ -808,6 +817,8 @@ queue_final_tasks(const General_options& options, if (!any_postprocessing_sections) { input_sections_blocker = new Task_token(true); + // Write_symbols_task, Relocate_tasks. + input_sections_blocker->add_blocker(); input_sections_blocker->add_blockers(input_objects->number_of_relobjs()); } @@ -836,6 +847,7 @@ queue_final_tasks(const General_options& options, // Queue a task to write out the output sections. workqueue->queue(new Write_sections_task(layout, of, output_sections_blocker, + input_sections_blocker, final_blocker)); // Queue a task to write out everything else. @@ -874,14 +886,27 @@ queue_final_tasks(const General_options& options, } // Create tasks for tree-style build ID computation, if necessary. - final_blocker = layout->queue_build_id_tasks(workqueue, final_blocker, of); - - // Queue a task to close the output file. This will be blocked by - // FINAL_BLOCKER. - workqueue->queue(new Task_function(new Close_task_runner(&options, layout, - of), - final_blocker, - "Task_function Close_task_runner")); + if (strcmp(options.build_id(), "tree") == 0) + { + // Queue a task to compute the build id. This will be blocked by + // FINAL_BLOCKER, and will in turn schedule the task to close + // the output file. + workqueue->queue(new Task_function(new Build_id_task_runner(&options, + layout, + of), + final_blocker, + "Task_function Build_id_task_runner")); + } + else + { + // Queue a task to close the output file. This will be blocked by + // FINAL_BLOCKER. + workqueue->queue(new Task_function(new Close_task_runner(&options, layout, + of, NULL, 0), + final_blocker, + "Task_function Close_task_runner")); + } + } } // End namespace gold.