X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gold%2Fgold.cc;h=f02d2aadaf7367efcefd9be67a3e61880dda6185;hb=0ac553107c601cc9c4c340338e0fc7e0ce8375cc;hp=bdfb33d995ccd952b5b99e85d6362fa6ae566b78;hpb=635aa30e3ae9735e362cfd1cda2be9f7b65b32a2;p=deliverable%2Fbinutils-gdb.git diff --git a/gold/gold.cc b/gold/gold.cc index bdfb33d995..f02d2aadaf 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-2020 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); + } } } } @@ -877,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.