Index: ELF/OutputSections.cpp =================================================================== --- ELF/OutputSections.cpp +++ ELF/OutputSections.cpp @@ -184,9 +184,13 @@ if (Body && Target->relocNeedsGot(Type, *Body)) { P->r_offset = Out::Got->getEntryAddr(*Body); - if (CanBePreempted) + if (CanBePreempted) { + bool NeedsPlt = Target->relocNeedsPlt(Type, *Body); P->setSymbolAndType(Body->getDynamicSymbolTableIndex(), - Target->getGotReloc(), IsMips64EL); + NeedsPlt ? Target->getPltReloc() + : Target->getGotReloc(), + IsMips64EL); + } } else { if (IsRela) Addend += static_cast(RI).r_addend; Index: ELF/Target.h =================================================================== --- ELF/Target.h +++ ELF/Target.h @@ -25,6 +25,7 @@ uint64_t getVAStart() const { return VAStart; } unsigned getPCRelReloc() const { return PCRelReloc; } unsigned getGotReloc() const { return GotReloc; } + unsigned getPltReloc() const { return PltReloc; } unsigned getGotRefReloc() const { return GotRefReloc; } unsigned getRelativeReloc() const { return RelativeReloc; } unsigned getPltEntrySize() const { return PltEntrySize; } @@ -45,6 +46,7 @@ unsigned PCRelReloc; unsigned GotRefReloc; unsigned GotReloc; + unsigned PltReloc; unsigned RelativeReloc; unsigned PltEntrySize = 8; llvm::StringRef DefaultEntry = "_start"; Index: ELF/Target.cpp =================================================================== --- ELF/Target.cpp +++ ELF/Target.cpp @@ -36,6 +36,7 @@ X86TargetInfo::X86TargetInfo() { PCRelReloc = R_386_PC32; GotReloc = R_386_GLOB_DAT; + PltReloc = R_386_JUMP_SLOT; GotRefReloc = R_386_GOT32; VAStart = 0x10000; } @@ -90,6 +91,7 @@ X86_64TargetInfo::X86_64TargetInfo() { PCRelReloc = R_X86_64_PC32; GotReloc = R_X86_64_GLOB_DAT; + PltReloc = R_X86_64_JUMP_SLOT; GotRefReloc = R_X86_64_PC32; RelativeReloc = R_X86_64_RELATIVE; @@ -201,6 +203,7 @@ PPC64TargetInfo::PPC64TargetInfo() { // PCRelReloc = FIXME // GotReloc = FIXME + // PltReloc = FIXME PltEntrySize = 32; PageSize = 65536; VAStart = 0x10000000; @@ -236,6 +239,7 @@ PPCTargetInfo::PPCTargetInfo() { // PCRelReloc = FIXME // GotReloc = FIXME + // PltReloc = FIXME PageSize = 65536; VAStart = 0x10000000; } @@ -253,6 +257,7 @@ ARMTargetInfo::ARMTargetInfo() { // PCRelReloc = FIXME // GotReloc = FIXME + // PltReloc = FIXME VAStart = 0x8000; } void ARMTargetInfo::writePltEntry(uint8_t *Buf, uint64_t GotEntryAddr, @@ -269,6 +274,7 @@ AArch64TargetInfo::AArch64TargetInfo() { // PCRelReloc = FIXME // GotReloc = FIXME + // PltReloc = FIXME VAStart = 0x400000; } void AArch64TargetInfo::writePltEntry(uint8_t *Buf, uint64_t GotEntryAddr, @@ -348,6 +354,7 @@ MipsTargetInfo::MipsTargetInfo() { // PCRelReloc = FIXME // GotReloc = FIXME + // PltReloc = FIXME DefaultEntry = "__start"; PageSize = 65536; VAStart = 0x400000; Index: test/elf2/plt-i686.s =================================================================== --- test/elf2/plt-i686.s +++ test/elf2/plt-i686.s @@ -21,8 +21,8 @@ // CHECK: Relocations [ // CHECK-NEXT: Section ({{.*}}) .rel.plt { -// CHECK-NEXT: 0x13058 R_386_GLOB_DAT bar 0x0 -// CHECK-NEXT: 0x1305C R_386_GLOB_DAT zed 0x0 +// CHECK-NEXT: 0x13058 R_386_JUMP_SLOT bar 0x0 +// CHECK-NEXT: 0x1305C R_386_JUMP_SLOT zed 0x0 // CHECK-NEXT: } // CHECK-NEXT: ] Index: test/elf2/plt.s =================================================================== --- test/elf2/plt.s +++ test/elf2/plt.s @@ -21,9 +21,9 @@ // CHECK: Relocations [ // CHECK-NEXT: Section ({{.*}}) .rela.plt { -// CHECK-NEXT: 0x30B0 R_X86_64_GLOB_DAT bar 0x0 -// CHECK-NEXT: 0x30B8 R_X86_64_GLOB_DAT zed 0x0 -// CHECK-NEXT: 0x30C0 R_X86_64_GLOB_DAT _start 0x0 +// CHECK-NEXT: 0x30B0 R_X86_64_JUMP_SLOT bar 0x0 +// CHECK-NEXT: 0x30B8 R_X86_64_JUMP_SLOT zed 0x0 +// CHECK-NEXT: 0x30C0 R_X86_64_JUMP_SLOT _start 0x0 // CHECK-NEXT: } // CHECK-NEXT: ]