summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFangrui Song <maskray@google.com>2020-01-13 23:35:57 -0800
committerFangrui Song <maskray@google.com>2020-01-13 23:36:06 -0800
commit0136f226c4e46258ea73fcb994f6559cec4a9aa2 (patch)
tree044ec0640c0ac35cbc12a0f3ee297e4c76a10fcc
parent671544c25b1215433bc22d475db7eaef51096ea5 (diff)
downloadbcm5719-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.cpp3
-rw-r--r--llvm/test/MC/ELF/target-in-same-section.s8
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
OpenPOWER on IntegriCloud