X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=gold%2Fgold.cc;h=bdfb33d995ccd952b5b99e85d6362fa6ae566b78;hb=d4f3a0e91896a0aad797e221ba6876ba7f0cd05c;hp=013702fed878cef0e5d7c30bbb6859c84ea1cf47;hpb=2e702c99c59f581594820852c607394c25bc9bd2;p=platform%2Fupstream%2Fbinutils.git diff --git a/gold/gold.cc b/gold/gold.cc index 013702f..bdfb33d 100644 --- a/gold/gold.cc +++ b/gold/gold.cc @@ -1,7 +1,6 @@ // gold.cc -- main linker functions -// Copyright 2006, 2007, 2008, 2009, 2010, 2011, 2012 -// Free Software Foundation, Inc. +// Copyright (C) 2006-2014 Free Software Foundation, Inc. // Written by Ian Lance Taylor . // This file is part of gold. @@ -502,17 +501,15 @@ queue_middle_tasks(const General_options& options, if (parameters->options().gc_sections()) { // Find the start symbol if any. - Symbol* start_sym = symtab->lookup(parameters->entry()); - if (start_sym != NULL) - { - bool is_ordinary; - unsigned int shndx = start_sym->shndx(&is_ordinary); - if (is_ordinary) - { - symtab->gc()->worklist().push( - Section_id(start_sym->object(), shndx)); - } - } + Symbol* sym = symtab->lookup(parameters->entry()); + if (sym != NULL) + symtab->gc_mark_symbol(sym); + sym = symtab->lookup(parameters->options().init()); + if (sym != NULL && sym->is_defined() && !sym->is_from_dynobj()) + symtab->gc_mark_symbol(sym); + sym = symtab->lookup(parameters->options().fini()); + if (sym != NULL && sym->is_defined() && !sym->is_from_dynobj()) + symtab->gc_mark_symbol(sym); // Symbols named with -u should not be considered garbage. symtab->gc_mark_undef_symbols(layout); gold_assert(symtab->gc() != NULL); @@ -530,11 +527,13 @@ queue_middle_tasks(const General_options& options, // Call Object::layout for the second time to determine the // output_sections for all referenced input sections. When - // --gc-sections or --icf is turned on, Object::layout is - // called twice. It is called the first time when the - // symbols are added. + // --gc-sections or --icf is turned on, or when certain input + // sections have to be mapped to unique segments, Object::layout + // is called twice. It is called the first time when symbols + // are added. if (parameters->options().gc_sections() - || parameters->options().icf_enabled()) + || parameters->options().icf_enabled() + || layout->is_unique_segment_for_sections_specified()) { for (Input_objects::Relobj_iterator p = input_objects->relobj_begin(); p != input_objects->relobj_end(); @@ -545,6 +544,14 @@ queue_middle_tasks(const General_options& options, } } + // Layout deferred objects due to plugins. + if (parameters->options().has_plugins()) + { + Plugin_manager* plugins = parameters->options().plugins(); + gold_assert(plugins != NULL); + plugins->layout_deferred_objects(); + } + /* 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. */ @@ -559,14 +566,6 @@ queue_middle_tasks(const General_options& options, (*p)->update_section_layout(layout->get_section_order_map()); } - // Layout deferred objects due to plugins. - if (parameters->options().has_plugins()) - { - Plugin_manager* plugins = parameters->options().plugins(); - gold_assert(plugins != NULL); - plugins->layout_deferred_objects(); - } - if (parameters->options().gc_sections() || parameters->options().icf_enabled()) { @@ -653,10 +652,6 @@ queue_middle_tasks(const General_options& options, // dynamic objects that it depends upon. input_objects->check_dynamic_dependencies(); - // See if any of the input definitions violate the One Definition Rule. - // TODO: if this is too slow, do this as a task, rather than inline. - symtab->detect_odr_violations(task, options.output_file_name()); - // Do the --no-undefined-version check. if (!parameters->options().undefined_version()) { @@ -813,6 +808,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()); } @@ -841,6 +838,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. @@ -878,6 +876,9 @@ queue_final_tasks(const General_options& options, final_blocker = new_final_blocker; } + // 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,