[PATCH v2 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          | 94 +++++++++++++++++++++++++
7 files changed, 207 insertions(+), 13 deletions(-)
[PATCH v2 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.

Tested by building the kernel with Binutils & GCC master branch,
running the kernel with 35 in-tree modules loaded, and loading one
module with 20 GOT loads (both old SOP_PUSH_GPREL and new
GOT_PC_HI20/GOT_PC_LO12 relocations tested, and loaded addresses
verified by comparing with /proc/kallsyms).

Link: https://github.com/loongson/LoongArch-Documentation/pull/57
Link: https://gcc.gnu.org/r13-1834
Link: https://sourceware.org/git/?p=binutils-gdb.git;a=commit;h=f09482a

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 (4):
  LoongArch: Add section of GOT for kernel module
  LoongArch: Support R_LARCH_SOP_PUSH_GPREL relocation type in kernel
    module
  LoongArch: Stop using undocumented assembler options
  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          | 94 +++++++++++++++++++++++++
 7 files changed, 207 insertions(+), 13 deletions(-)

-- 
2.37.0
Re: [PATCH v2 0/4] LoongArch: Support new relocation types
Posted by Huacai Chen 3 years, 8 months ago
Hi, Arnd,


On Thu, Jul 28, 2022 at 7:49 PM Xi Ruoyao <xry111@xry111.site> 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.
>
> Tested by building the kernel with Binutils & GCC master branch,
> running the kernel with 35 in-tree modules loaded, and loading one
> module with 20 GOT loads (both old SOP_PUSH_GPREL and new
> GOT_PC_HI20/GOT_PC_LO12 relocations tested, and loaded addresses
> verified by comparing with /proc/kallsyms).
>
> Link: https://github.com/loongson/LoongArch-Documentation/pull/57
> Link: https://gcc.gnu.org/r13-1834
> Link: https://sourceware.org/git/?p=binutils-gdb.git;a=commit;h=f09482a
Could you update the cross-compilers here [1] to make this series be
possible upstream in the 5.20 cycle? Or we can only do that until new
binutils/gcc be released?

[1] https://mirrors.edge.kernel.org/pub/tools/crosstool/

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 (4):
>   LoongArch: Add section of GOT for kernel module
>   LoongArch: Support R_LARCH_SOP_PUSH_GPREL relocation type in kernel
>     module
>   LoongArch: Stop using undocumented assembler options
>   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          | 94 +++++++++++++++++++++++++
>  7 files changed, 207 insertions(+), 13 deletions(-)
>
> --
> 2.37.0
>
Re: [PATCH v2 0/4] LoongArch: Support new relocation types
Posted by Xi Ruoyao 3 years, 8 months ago
On Thu, 2022-07-28 at 20:33 +0800, Huacai Chen wrote:
> Hi, Arnd,

/* snip */

> Could you update the cross-compilers here [1] to make this series be
> possible upstream in the 5.20 cycle? Or we can only do that until new
> binutils/gcc be released?

Hi Huacai and Arnd,

The old toolchain will use

    R_LARCH_PUSH_PCREL _GLOBAL_OFFSET_TABLE_
    R_LARCH_PUSH_GPREL symbol
    R_LARCH_ADD

to perform a PC-relative addressing for a GOT entry, and the new
toolchain will use R_LARCH_GOT_PC_{HI20,LO12}.  Both way are supported
by this series.

I've tested the V3 patch (V2 + suggestions from Youling, I'll sent it
later after rewording the third patch) with both my system toolchain (no
new reloc support) and a toolchain built from binutils & gcc master. 
Both of the build works fine.

So a toolchain update seems not immediately required.
-- 
Xi Ruoyao <xry111@xry111.site>
School of Aerospace Science and Technology, Xidian University