* x86_64.cc (Scan::global): Do not create GOT entry for unresolved symbol with --warn-unresolved-symbols. (Relocate::relocate): Check for GOT entry only when the above condition is not true. diff --git a/gold/x86_64.cc b/gold/x86_64.cc index 007af1d..bccb0ab 100644 --- a/gold/x86_64.cc +++ b/gold/x86_64.cc @@ -2931,6 +2931,11 @@ Target_x86_64::Scan::global(Symbol_table* symtab, } else { + // If the symbol is unresolved and we use --warn-unresolved-symbols + // do not create GOT entry and dynamic relocation for it. + if (parameters->options().warn_unresolved_symbols() + && issue_undefined_symbol_error(gsym)) + break; // If this symbol is not fully resolved, we need to add a // dynamic relocation for it. Reloc_section* rela_dyn = target->rela_dyn_section(layout); @@ -3557,8 +3562,14 @@ Target_x86_64::Relocate::relocate( { if (gsym != NULL) { - gold_assert(gsym->has_got_offset(GOT_TYPE_STANDARD)); - got_offset = gsym->got_offset(GOT_TYPE_STANDARD) - target->got_size(); + // We dont create GOT entries for unresolved symbols + // with --warn-unresolved-symbols. + if (!parameters->options().warn_unresolved_symbols() + || !issue_undefined_symbol_error(gsym)) + { + gold_assert(gsym->has_got_offset(GOT_TYPE_STANDARD)); + got_offset = gsym->got_offset(GOT_TYPE_STANDARD) - target->got_size(); + } } else {