[PATCH v6 0/6] LoongArch: Support toolchain with new relocation types

Xi Ruoyao posted 6 patches 3 years, 7 months ago
There is a newer version of this series
arch/loongarch/Kconfig                  |   3 +
arch/loongarch/Makefile                 |  22 +++++-
arch/loongarch/include/asm/elf.h        |  37 +++++++++
arch/loongarch/include/asm/module.h     |  23 ++++++
arch/loongarch/include/asm/module.lds.h |   1 +
arch/loongarch/include/asm/percpu.h     |   8 ++
arch/loongarch/kernel/head.S            |  10 +--
arch/loongarch/kernel/module-sections.c |  56 ++++++++++++-
arch/loongarch/kernel/module.c          | 101 +++++++++++++++++++++++-
9 files changed, 250 insertions(+), 11 deletions(-)
[PATCH v6 0/6] LoongArch: Support toolchain with new relocation types
Posted by Xi Ruoyao 3 years, 7 months ago
The version 2.00 of LoongArch ELF ABI specification introduced new
relocation types, and the development tree of Binutils and GCC has
started to use them.  If the kernel is built with the latest snapshot of
Binutils or GCC, it will fail to load the modules because of unrecognized
relocation types in modules.

Add support for GOT and new relocation types for the module loader, so
the kernel (with modules) can be built with the "normal" code model and
function properly.

This series does not break the compatibility with old toolchain using
stack-based relocation types, so with the patches applied the kernel can
be be built with both old and new toolchains.  But, the combination of
"new" Binutils and "old" GCC is not supported.

Tested by building the kernel with the following combinations:

- GCC 12 and Binutils 2.39
- GCC trunk and Binutils trunk

and running the builds with 35 in-tree modules loaded, and loading one
module with 20 GOT loads and a per-CPU variable (loaded addresses
verified by comparing with /proc/kallsyms).

Changes from v5 to v6:

- Restore version number.
- Rename CONFIG_CC_HAS_EXPLICIT_RELOCS to CONFIG_AS_HAS_EXPLICIT_RELOCS.
  It now only checks assembler.
- No longer support "old GCC with new Binutils", so R_LARCH_ABS* is
  dropped.
  - "Old GCC with old Binutils" is still supported until Arnd ack.
    longer support it.
  - "New GCC with old Binutils" is still supported as it does not
    require additional code.
- Remove "cc-option" around "-mexplicit-relocs".  For unsupported
  "old GCC with new Binutils" combination, forcing -mexplicit-relocs
  makes assembling fail, instead of silently producing unloadable
  modules.
- Move the error report for "lacking model attribute" into Makefile.
- Squash the two patches for R_LARCH_B26 and R_LARCH_PCALA* into one.

Changes from v4 to v5 ("v5" missed in the subject):

- Change subject.
- Introduce CONFIG_CC_HAS_EXPLICIT_RELOCS.
- Retain -Wa,-mla-* options for old toolchains
  (!CONFIG_CC_HAS_EXPLICIT_RELOCS).
- Use __attribute__((model("extreme"))) in PER_CPU_ATTRIBUTES, to fix
  a breakage with per-CPU variables defined in modules.
- Handle R_LARCH_PCALA64_{HI12,LO12} for extreme model.
- Handle R_LARCH_ABS* for "old GCC with new Binutils".
- Separate the last patch into more small patches.
- Avoid BUG_ON() for the handling of GOT.

Changes from v3 to v4:

- No code change.  Reword the commit message of the 3rd patch again
  based on suggestion from Huacai.

Changes from v2 to v3:

- Use `union loongarch_instruction` instead of explicit bit shifts
  applying the relocation.  Suggested by Youling.
- For R_LARCH_B26, move the alignment check before the range check to be
  consistent with stack pop relocations.  Suggested by Youling.
- Reword the commit message of the 3rd patch.  Suggested by Huacai.

Changes from v1 to v2:

- Fix a stupid programming error (confusion between the number of PLT
  entries and the number of GOT entries).  (Bug spotted by Youling).
- Synthesize the _GLOBAL_OFFSET_TABLE_ symbol with module.lds, instead
  of faking it at runtime.  The 3rd patch from V1 is now merged into
  the 1st patch because it would be a one-line change.  (Suggested by
  Jinyang).
- Keep reloc_rela_handlers[] ordered by the relocation type ID.
  (Suggested by Youling).
- Remove -fplt along with -Wa,-mla-* options because it's the default.
  (Suggested by Youling).

Xi Ruoyao (6):
  LoongArch: Add CONFIG_AS_HAS_EXPLICIT_RELOCS
  LoongArch: Adjust CFLAGS for CONFIG_AS_HAS_EXPLICIT_RELOCS
  LoongArch: Use model("extreme") attribute for per-CPU variables in
    module if CONFIG_AS_HAS_EXPLICIT_RELOCS
  LoongArch: Define ELF relocation types added in v2.00 ABI
  LoongArch: Support PC-relative relocations in modules
  LoongArch: Support R_LARCH_GOT_PC* in modules

 arch/loongarch/Kconfig                  |   3 +
 arch/loongarch/Makefile                 |  22 +++++-
 arch/loongarch/include/asm/elf.h        |  37 +++++++++
 arch/loongarch/include/asm/module.h     |  23 ++++++
 arch/loongarch/include/asm/module.lds.h |   1 +
 arch/loongarch/include/asm/percpu.h     |   8 ++
 arch/loongarch/kernel/head.S            |  10 +--
 arch/loongarch/kernel/module-sections.c |  56 ++++++++++++-
 arch/loongarch/kernel/module.c          | 101 +++++++++++++++++++++++-
 9 files changed, 250 insertions(+), 11 deletions(-)

-- 
2.37.0
Re: [PATCH v6 0/6] LoongArch: Support toolchain with new relocation types
Posted by Xi Ruoyao 3 years, 7 months ago
On Mon, 2022-08-29 at 21:31 +0800, Xi Ruoyao wrote:

> Changes from v5 to v6:
> 
> - Restore version number.
> - Rename CONFIG_CC_HAS_EXPLICIT_RELOCS to
> CONFIG_AS_HAS_EXPLICIT_RELOCS.
>   It now only checks assembler.
> - No longer support "old GCC with new Binutils", so R_LARCH_ABS* is
>   dropped.
>   - "Old GCC with old Binutils" is still supported until Arnd ack.

>     longer support it.
^^^^
This line should be removed :(.

>   - "New GCC with old Binutils" is still supported as it does not
>     require additional code.
> - Remove "cc-option" around "-mexplicit-relocs".  For unsupported
>   "old GCC with new Binutils" combination, forcing -mexplicit-relocs
>   makes assembling fail, instead of silently producing unloadable
>   modules.
> - Move the error report for "lacking model attribute" into Makefile.
> - Squash the two patches for R_LARCH_B26 and R_LARCH_PCALA* into one.

-- 
Xi Ruoyao <xry111@xry111.site>
School of Aerospace Science and Technology, Xidian University
Re: [PATCH v6 0/6] LoongArch: Support toolchain with new relocation types
Posted by Huacai Chen 3 years, 7 months ago
Hi, Ruoyao,

This version looks good to me, only some small issues. Thank you very much.

Huacai

On Mon, Aug 29, 2022 at 10:57 PM Xi Ruoyao <xry111@xry111.site> wrote:
>
> On Mon, 2022-08-29 at 21:31 +0800, Xi Ruoyao wrote:
>
> > Changes from v5 to v6:
> >
> > - Restore version number.
> > - Rename CONFIG_CC_HAS_EXPLICIT_RELOCS to
> > CONFIG_AS_HAS_EXPLICIT_RELOCS.
> >   It now only checks assembler.
> > - No longer support "old GCC with new Binutils", so R_LARCH_ABS* is
> >   dropped.
> >   - "Old GCC with old Binutils" is still supported until Arnd ack.
>
> >     longer support it.
> ^^^^
> This line should be removed :(.
>
> >   - "New GCC with old Binutils" is still supported as it does not
> >     require additional code.
> > - Remove "cc-option" around "-mexplicit-relocs".  For unsupported
> >   "old GCC with new Binutils" combination, forcing -mexplicit-relocs
> >   makes assembling fail, instead of silently producing unloadable
> >   modules.
> > - Move the error report for "lacking model attribute" into Makefile.
> > - Squash the two patches for R_LARCH_B26 and R_LARCH_PCALA* into one.
>
> --
> Xi Ruoyao <xry111@xry111.site>
> School of Aerospace Science and Technology, Xidian University