diff options
author | Yonghong Song <yhs@fb.com> | 2019-08-17 22:12:00 +0000 |
---|---|---|
committer | Yonghong Song <yhs@fb.com> | 2019-08-17 22:12:00 +0000 |
commit | a8dad5c79b64523e4c39d2ee32739f8894d40129 (patch) | |
tree | c87f20156c04bce36e605b855e16d1a874edb97f /llvm/lib/Object/RelocationResolver.cpp | |
parent | 37a928efd9f579126d5290f1ebb830eac053739a (diff) | |
download | bcm5719-llvm-a8dad5c79b64523e4c39d2ee32739f8894d40129.tar.gz bcm5719-llvm-a8dad5c79b64523e4c39d2ee32739f8894d40129.zip |
[BPF] Fix bpf llvm-objdump issues.
Commit https://reviews.llvm.org/D57939 ("[DWARF] Refactor
RelocVisitor and fix computation of SHT_RELA-typed relocation entries)
made a change for relocation resolution when operating
on an object file.
The change unfortunately broke BPF as given SymbolValue (S) and
Addent (A), previously relocation is resolved to
S + A
and after the change, it is resolved to
S
This patch fixed the issue by resolving relocation correctly.
It looks not all relocation resolution reaches here and I did not
trace down exactly when. But I do find if the object file includes
codes in two different ELF sections than default ".text",
the above bug will be triggered.
This patch included a trivial two function source code to
demonstrate this issue. The relocation for .debug_loc is resolved
incorrectly due to this and llvm-objdump cannot display source
annotated assembly.
Differential Revision: https://reviews.llvm.org/D66372
llvm-svn: 369199
Diffstat (limited to 'llvm/lib/Object/RelocationResolver.cpp')
-rw-r--r-- | llvm/lib/Object/RelocationResolver.cpp | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/llvm/lib/Object/RelocationResolver.cpp b/llvm/lib/Object/RelocationResolver.cpp index 8738e2e9f3b..7df4f8d2b90 100644 --- a/llvm/lib/Object/RelocationResolver.cpp +++ b/llvm/lib/Object/RelocationResolver.cpp @@ -90,9 +90,9 @@ static bool supportsBPF(uint64_t Type) { static uint64_t resolveBPF(RelocationRef R, uint64_t S, uint64_t A) { switch (R.getType()) { case ELF::R_BPF_64_32: - return S & 0xFFFFFFFF; + return (S + A) & 0xFFFFFFFF; case ELF::R_BPF_64_64: - return S; + return S + A; default: llvm_unreachable("Invalid relocation type"); } |