Messages in this thread | | | Subject | Re: [PATCH v1 5/6] objtool: Add skipped member in struct reloc | From | Tiezhu Yang <> | Date | Thu, 3 Aug 2023 19:36:24 +0800 |
| |
On 07/25/2023 07:59 PM, Peter Zijlstra wrote: > On Tue, Jul 25, 2023 at 04:15:09PM +0800, Tiezhu Yang wrote: >> There exist multiple relocation types in one location, such as a pair of >> R_LARCH_ADD32 and R_LARCH_SUB32 in section .rela.discard.unreachable and >> .rela.discard.reachable on LoongArch. >> >> Here is an example: >> >> $ readelf -rW init/main.o >> >> Relocation section '.rela.discard.unreachable' at offset 0x3e20 contains 2 entries: >> Offset Info Type Symbol's Value Symbol's Name + Addend >> 0000000000000000 0000000a00000032 R_LARCH_ADD32 0000000000000000 .init.text + 230 >> 0000000000000000 0000001a00000037 R_LARCH_SUB32 0000000000000000 L0^A + 0 >> > > Please explain; why is this? > > How does: > > #define __annotate_unreachable(c) ({ \ > asm volatile(__stringify_label(c) ":\n\t" \ > ".pushsection .discard.unreachable\n\t" \ > ".long " __stringify_label(c) "b - .\n\t" \ > ".popsection\n\t" : : "i" (c)); \ > }) > #define annotate_unreachable() __annotate_unreachable(__COUNTER__) > > Manage to generate this.. >
Sorry for the late reply, let me try to explain it.
R_LARCH_ADD32 relocation type is 32-bit label addition, R_LARCH_SUB32 relocation type is 32-bit label subtraction, they are intended for local labels, the label difference will be calculated as a constant before linking, preserve a pair of R_LARCH_ADD32 and R_LARCH_SUB32 to fix the label difference.
Here is a simple example: ------------------------------- .L0 // do something .L1
.data .word .L0 - .L1 -------------------------------
NewDiff = 0 R_LARCH_ADD32: NewDiff = NewDiff + .L0_Addr R_LARCH_SUB32: NewDiff = NewDiff - .L1_Addr
I discussed offline with the engineers who are familiar with gnu assembler of LoongArch, maybe it can modify the gnu assembler to use R_LARCH_32_PCREL to replace a pair of R_LARCH_ADD32 and R_LARCH_SUB32, then I will test it again and drop this change if possible.
Here is LoongArch ELF Relocations spec: https://github.com/loongson/la-abi-specs/blob/release/laelf.adoc
R_LARCH_ADD32 32-bit in-place addition *(int32_t *) PC += S + A
R_LARCH_SUB32 32-bit in-place subtraction *(int32_t *) PC -= S + A
R_LARCH_32_PCREL 32-bit PC relative (*(uint32_t *) PC) = (S+A-PC) [31 ... 0]
Thanks very much for your review comments, it is helpful to make progress in the right direction.
Thanks, Tiezhu
| |