[Lldb-commits] [PATCH] D145550: [LLDB][ObjectFileELF] Correct the return type of RelocOffset64 and RelocAddend64

Lu Weining via Phabricator via lldb-commits lldb-commits at lists.llvm.org
Wed Mar 8 01:48:08 PST 2023


SixWeining added a comment.

In D145550#4177291 <https://reviews.llvm.org/D145550#4177291>, @DavidSpickett wrote:

> Seems to me that member functions of `ELFRelocation` should use the typedefs from `lldb/source/Plugins/ObjectFile/ELF/ELFHeader.h` where there is one. `elf_sxword` for example.
>
> If you want to do that in another patch, that's fine. Just in case some test case is relying on the uin64_t -> unsigned down cast unintentionally.

Yes, I agree. Let me do that in another patch. Thanks.



================
Comment at: lldb/test/Shell/ObjectFile/ELF/loongarch64-relocations.yaml:37
         Type:            R_LARCH_64
-        Addend:          0x5678
+        Addend:          0x1122334455667788
 Symbols:
----------------
DavidSpickett wrote:
> I'm not familiar with how these relocation are processed, would it be better to use something with the sign bit set here? Or does it not matter, the value is just copied into .debug_info verbatim anyway.
For this case, it is processed by below code:
```
2596 static void ApplyELF64ABS64Relocation(Symtab *symtab, ELFRelocation &rel,
2597                                       DataExtractor &debug_data,
2598                                       Section *rel_section) {
2599   Symbol *symbol = symtab->FindSymbolByID(ELFRelocation::RelocSymbol64(rel));
2600   if (symbol) {
2601     addr_t value = symbol->GetAddressRef().GetFileAddress();
2602     DataBufferSP &data_buffer_sp = debug_data.GetSharedDataBuffer(); 
2603     // ObjectFileELF creates a WritableDataBuffer in CreateInstance.
2604     WritableDataBuffer *data_buffer =
2605         llvm::cast<WritableDataBuffer>(data_buffer_sp.get());
2606     uint64_t *dst = reinterpret_cast<uint64_t *>(
2607         data_buffer->GetBytes() + rel_section->GetFileOffset() +
2608         ELFRelocation::RelocOffset64(rel));
2609     uint64_t val_offset = value + ELFRelocation::RelocAddend64(rel);
2610     memcpy(dst, &val_offset, sizeof(uint64_t));
2611   }
2612 }
```

Memcpy `S + A` to .debug_info.

I can add another relocation entry with the sign bit set.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D145550/new/

https://reviews.llvm.org/D145550



More information about the lldb-commits mailing list