diff options
author | Fangrui Song <maskray@google.com> | 2020-01-13 23:35:57 -0800 |
---|---|---|
committer | Fangrui Song <maskray@google.com> | 2020-01-13 23:36:06 -0800 |
commit | 0136f226c4e46258ea73fcb994f6559cec4a9aa2 (patch) | |
tree | 044ec0640c0ac35cbc12a0f3ee297e4c76a10fcc | |
parent | 671544c25b1215433bc22d475db7eaef51096ea5 (diff) | |
download | bcm5719-llvm-0136f226c4e46258ea73fcb994f6559cec4a9aa2.tar.gz bcm5719-llvm-0136f226c4e46258ea73fcb994f6559cec4a9aa2.zip |
[MC] Don't resolve relocations referencing STB_LOCAL STT_GNU_IFUNC
-rw-r--r-- | llvm/lib/MC/ELFObjectWriter.cpp | 3 | ||||
-rw-r--r-- | llvm/test/MC/ELF/target-in-same-section.s | 8 |
2 files changed, 9 insertions, 2 deletions
diff --git a/llvm/lib/MC/ELFObjectWriter.cpp b/llvm/lib/MC/ELFObjectWriter.cpp index b421d0b2bf6..6b4b45eb8ef 100644 --- a/llvm/lib/MC/ELFObjectWriter.cpp +++ b/llvm/lib/MC/ELFObjectWriter.cpp @@ -1514,7 +1514,8 @@ bool ELFObjectWriter::isSymbolRefDifferenceFullyResolvedImpl( const auto &SymA = cast<MCSymbolELF>(SA); if (IsPCRel) { assert(!InSet); - if (SymA.getBinding() != ELF::STB_LOCAL) + if (SymA.getBinding() != ELF::STB_LOCAL || + SymA.getType() == ELF::STT_GNU_IFUNC) return false; } return MCObjectWriter::isSymbolRefDifferenceFullyResolvedImpl(Asm, SymA, FB, diff --git a/llvm/test/MC/ELF/target-in-same-section.s b/llvm/test/MC/ELF/target-in-same-section.s index dbdacaffdb7..8e8e1e7c607 100644 --- a/llvm/test/MC/ELF/target-in-same-section.s +++ b/llvm/test/MC/ELF/target-in-same-section.s @@ -9,6 +9,7 @@ # RELOC-NEXT: 0xA R_X86_64_PLT32 weak 0xFFFFFFFFFFFFFFFC # RELOC-NEXT: 0x19 R_X86_64_PLT32 global 0xFFFFFFFFFFFFFFFC # RELOC-NEXT: 0x1E R_X86_64_PLT32 weak 0xFFFFFFFFFFFFFFFC +# RELOC-NEXT: 0x23 R_X86_64_PLT32 ifunc 0xFFFFFFFFFFFFFFFC # RELOC-NEXT: } # CHECK: 0: jmp @@ -19,14 +20,17 @@ # CHECK-NEXT: 13: callq # CHECK-NEXT: 18: callq # CHECK-NEXT: 1d: callq -# CHECK-NEXT: 22: retq +# CHECK-NEXT: 22: callq +# CHECK-NEXT: 27: retq .globl global .weak weak +.type ifunc,@gnu_indirect_function global: weak: local: .set var,global +ifunc: jmp var jmp local jmp global @@ -36,4 +40,6 @@ local: call local call global call weak + + call ifunc ret |