Index: lld/trunk/ELF/Driver.cpp =================================================================== --- lld/trunk/ELF/Driver.cpp +++ lld/trunk/ELF/Driver.cpp @@ -343,14 +343,15 @@ Config->Rela = ELFT::Is64Bits; - if (!Config->Shared && !Config->Relocatable) { + if (Config->Entry.empty() && !Config->Shared && !Config->Relocatable && + Config->EMachine != EM_AMDGPU) // Add entry symbol. // // There is no entry symbol for AMDGPU binaries, so skip adding one to avoid // having and undefined symbol. - if (Config->Entry.empty() && Config->EMachine != EM_AMDGPU) - Config->Entry = (Config->EMachine == EM_MIPS) ? "__start" : "_start"; + Config->Entry = Config->EMachine == EM_MIPS ? "__start" : "_start"; + if (!Config->Relocatable) // In the assembly for 32 bit x86 the _GLOBAL_OFFSET_TABLE_ symbol // is magical and is used to produce a R_386_GOTPC relocation. // The R_386_GOTPC relocation value doesn't actually depend on the @@ -364,7 +365,6 @@ // Given that the symbol is effectively unused, we just create a dummy // hidden one to avoid the undefined symbol error. Symtab.addIgnored("_GLOBAL_OFFSET_TABLE_"); - } if (!Config->Entry.empty()) { // Set either EntryAddr (if S is a number) or EntrySym (otherwise). Index: lld/trunk/test/ELF/global_offset_table_shared.s =================================================================== --- lld/trunk/test/ELF/global_offset_table_shared.s +++ lld/trunk/test/ELF/global_offset_table_shared.s @@ -0,0 +1,6 @@ +// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t +// RUN: ld.lld -shared %t -o %t2 +// RUN: llvm-readobj -t %t2 | Filecheck %s +.long _GLOBAL_OFFSET_TABLE_ + +// CHECK-NOT: Name: _GLOBAL_OFFSET_TABLE_