[PATCH v3 0/4] LoongArch: Support new relocation types

Xi Ruoyao posted 4 patches 3 years, 8 months ago
There is a newer version of this series
arch/loongarch/Makefile                 |  4 --
arch/loongarch/include/asm/elf.h        | 37 ++++++++++
arch/loongarch/include/asm/module.h     | 23 ++++++
arch/loongarch/include/asm/module.lds.h |  1 +
arch/loongarch/kernel/head.S            | 10 +--
arch/loongarch/kernel/module-sections.c | 51 +++++++++++--
arch/loongarch/kernel/module.c          | 96 +++++++++++++++++++++++++
7 files changed, 209 insertions(+), 13 deletions(-)
[PATCH v3 0/4] LoongArch: Support new relocation types
Posted by Xi Ruoyao 3 years, 8 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.

Tested by building the kernel with both Binutils & GCC master branch and
my system Binutils & GCC (without new relocation type support), running
both the builds with 35 in-tree modules loaded, and loading one module
with 20 GOT loads (loaded addresses verified by comparing with
/proc/kallsyms).

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.

Xi Ruoyao (4):
  LoongArch: Add section of GOT for kernel module
  LoongArch: Support R_LARCH_SOP_PUSH_GPREL relocation type in kernel
    module
  LoongArch: Remove -fplt and -Wa,-mla-* from CFLAGS
  LoongArch: Support modules with new relocation types

 arch/loongarch/Makefile                 |  4 --
 arch/loongarch/include/asm/elf.h        | 37 ++++++++++
 arch/loongarch/include/asm/module.h     | 23 ++++++
 arch/loongarch/include/asm/module.lds.h |  1 +
 arch/loongarch/kernel/head.S            | 10 +--
 arch/loongarch/kernel/module-sections.c | 51 +++++++++++--
 arch/loongarch/kernel/module.c          | 96 +++++++++++++++++++++++++
 7 files changed, 209 insertions(+), 13 deletions(-)

-- 
2.37.0
Re: [PATCH v3 0/4] LoongArch: Support new relocation types
Posted by Youling Tang 3 years, 8 months ago
Hi, Ruoyao

On 07/29/2022 10:07 AM, Xi Ruoyao wrote:
> 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.
>
> Tested by building the kernel with both Binutils & GCC master branch and
> my system Binutils & GCC (without new relocation type support), running
> both the builds with 35 in-tree modules loaded, and loading one module
> with 20 GOT loads (loaded addresses verified by comparing with
> /proc/kallsyms).
>
> 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.

The log of changes from v1 to v2 should be preserved.

Thanks,
Youling
>
> Xi Ruoyao (4):
>   LoongArch: Add section of GOT for kernel module
>   LoongArch: Support R_LARCH_SOP_PUSH_GPREL relocation type in kernel
>     module
>   LoongArch: Remove -fplt and -Wa,-mla-* from CFLAGS
>   LoongArch: Support modules with new relocation types
>
>  arch/loongarch/Makefile                 |  4 --
>  arch/loongarch/include/asm/elf.h        | 37 ++++++++++
>  arch/loongarch/include/asm/module.h     | 23 ++++++
>  arch/loongarch/include/asm/module.lds.h |  1 +
>  arch/loongarch/kernel/head.S            | 10 +--
>  arch/loongarch/kernel/module-sections.c | 51 +++++++++++--
>  arch/loongarch/kernel/module.c          | 96 +++++++++++++++++++++++++
>  7 files changed, 209 insertions(+), 13 deletions(-)
>
Re: [PATCH v3 0/4] LoongArch: Support new relocation types
Posted by Xi Ruoyao 3 years, 8 months ago
On Fri, 2022-07-29 at 10:23 +0800, Youling Tang wrote:
> Hi, Ruoyao
> 
> On 07/29/2022 10:07 AM, Xi Ruoyao wrote:
> > 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.
> > 
> > Tested by building the kernel with both Binutils & GCC master branch and
> > my system Binutils & GCC (without new relocation type support), running
> > both the builds with 35 in-tree modules loaded, and loading one module
> > with 20 GOT loads (loaded addresses verified by comparing with
> > /proc/kallsyms).
> > 
> > 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.
> 
> The log of changes from v1 to v2 should be preserved.
> 
Retroactively, append the 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 <xry111@xry111.site>
School of Aerospace Science and Technology, Xidian University