[PATCH] LoongArch: Adapt R_LARCH_{PCALA,GOT,TLS_IE,TLS_DESC}64_* handling per psABI v2.30
Xi Ruoyao
xry111@xry111.site
Tue Jan 16 06:48:43 GMT 2024
On Tue, 2024-01-16 at 14:38 +0800, mengqinggang wrote:
>
> 在 2024/1/15 下午8:44, Xi Ruoyao 写道:
> > In LoongArch psABI v2.30, an offset (-8 for LO20 and -12 for HI12)
> > should be applied on PC for these reloc types to avoid wrong relocation
> > when the instruction sequence crosses a page boundary.
> >
> > The lld linker has already adapted the change. Make it for the bfd
> > linker too.
> >
> > Link: https://github.com/loongson/la-abi-specs/releases/v2.30
> > Link: https://github.com/loongson-community/discussions/issues/17
> > Link: https://github.com/llvm/llvm-project/pull/73387
> > Signed-off-by: Xi Ruoyao <xry111@xry111.site>
> > ---
> > bfd/elfnn-loongarch.c | 29 +++++++++++--------
> > .../ld-loongarch-elf/ld-loongarch-elf.exp | 1 +
> > ld/testsuite/ld-loongarch-elf/pcala64.d | 15 ++++++++++
> > ld/testsuite/ld-loongarch-elf/pcala64.s | 8 +++++
> > 4 files changed, 41 insertions(+), 12 deletions(-)
> > create mode 100644 ld/testsuite/ld-loongarch-elf/pcala64.d
> > create mode 100644 ld/testsuite/ld-loongarch-elf/pcala64.s
> >
> > diff --git a/bfd/elfnn-loongarch.c b/bfd/elfnn-loongarch.c
> > index 3858a3179fd..e4f4da7a0dc 100644
> > --- a/bfd/elfnn-loongarch.c
> > +++ b/bfd/elfnn-loongarch.c
> > @@ -3544,14 +3544,16 @@ loongarch_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
> > }
> > break;
> >
> > - case R_LARCH_PCALA64_LO20:
> > case R_LARCH_PCALA64_HI12:
> > + pc -= 4;
> > + /* Fall through. */
> > + case R_LARCH_PCALA64_LO20:
> > if (h && h->plt.offset != MINUS_ONE)
> > relocation = sec_addr (plt) + h->plt.offset;
> > else
> > relocation += rel->r_addend;
> >
> > - RELOCATE_CALC_PC64_HI32 (relocation, pc);
> > + RELOCATE_CALC_PC64_HI32 (relocation, pc - 8);
>
>
> The 'pc - 8' triggered an error because the pc parameter is not enclosed
> in parentheses in macro definition.
>
> /home/mengqinggang/toolchains/src/binutils-gdb/bfd/elfnn-loongarch.c:3546:51:
> error: suggest parentheses around '-' in operand of '&'
> [-Werror=parentheses]
> 3546 | RELOCATE_CALC_PC64_HI32 (relocation, pc - 8);
> | ~~~^~~
> /home/mengqinggang/toolchains/src/binutils-gdb/bfd/elfnn-loongarch.c:2532:22:
> note: in definition of macro 'RELOCATE_CALC_PC64_HI32'
> 2532 | - (pc & ~(bfd_vma)0xfff); \
> | ^~
Interesting, why didn't I see this error... And in this case it happens
to work because - has a higher precedence. But I'll add parentheses in
V2 anyway.
/* snip */
> > diff --git a/ld/testsuite/ld-loongarch-elf/pcala64.d b/ld/testsuite/ld-loongarch-elf/pcala64.d
> > new file mode 100644
> > index 00000000000..6b1411577db
> > --- /dev/null
> > +++ b/ld/testsuite/ld-loongarch-elf/pcala64.d
> > @@ -0,0 +1,15 @@
> > +#ld: -Ttext=0x180000ff8 -Tdata=0x1000000000 -shared
>
>
> The test need to be disabled on loongarch*-elf target because -shared
> option is not supported on loongarch*-elf target.
>
> It can be disabled by adding a line "#skip: loongarch*-elf" after
> "#objdump -d".
I'll just remove the -shared option. I changed the function name to
"_start" so it should work without -shared, but I forgot to actually
remove -shared.
--
Xi Ruoyao <xry111@xry111.site>
School of Aerospace Science and Technology, Xidian University
More information about the Binutils
mailing list