if (parameters->options().gc_sections())
{
// Find the start symbol if any.
- Symbol* start_sym = symtab->lookup(parameters->entry());
- if (start_sym != NULL)
- symtab->gc_mark_symbol(start_sym);
+ 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);
// 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())
{
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,