All of lore.kernel.org
 help / color / mirror / Atom feed
From: Xi Ruoyao <xry111@xry111.site>
To: loongarch@lists.linux.dev
Cc: linux-kernel@vger.kernel.org, WANG Xuerui <kernel@xen0n.name>,
	Huacai Chen <chenhuacai@kernel.org>
Subject: [PATCH 3/5] LoongArch: Support relocation against _GLOBAL_OFFSET_TABLE_
Date: Thu, 28 Jul 2022 00:28:39 +0800	[thread overview]
Message-ID: <99733532831377ab6585d43ee40bf314a2d4c5a3.camel@xry111.site> (raw)
In-Reply-To: <385f63bcbee8e37c42f479ce9cdc7e7d731d419b.camel@xry111.site>

With the stack-based relocations, the assembler emits three relocations
to push the PC-relative offset of a GOT entry:

    R_LARCH_SOP_PUSH_PCREL _GLOBAL_OFFSET_TABLE_
    R_LARCH_SOP_PUSH_GPREL foo
    R_LARCH_SOP_ADD

"_GLOBAL_OFFSET_TABLE_" does not really exist in the symtab and the BFD
linker handles it with special hack.  Implement a similar hack for
kernel so we will be able to really use R_LARCH_SOP_PUSH_GPREL
relocation.

Signed-off-by: Xi Ruoyao <xry111@xry111.site>
---
 arch/loongarch/kernel/module-sections.c | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)

diff --git a/arch/loongarch/kernel/module-sections.c b/arch/loongarch/kernel/module-sections.c
index 509c0b86b1e9..73976addbf60 100644
--- a/arch/loongarch/kernel/module-sections.c
+++ b/arch/loongarch/kernel/module-sections.c
@@ -89,6 +89,9 @@ int module_frob_arch_sections(Elf_Ehdr *ehdr, Elf_Shdr *sechdrs,
 			      char *secstrings, struct module *mod)
 {
 	unsigned int i, num_plts = 0, num_gots = 0;
+	Elf_Shdr *symtab = NULL;
+	Elf_Sym *symbols;
+	char *strings;
 
 	/*
 	 * Find the empty .plt sections.
@@ -100,6 +103,8 @@ int module_frob_arch_sections(Elf_Ehdr *ehdr, Elf_Shdr *sechdrs,
 			mod->arch.plt_idx.shdr = sechdrs + i;
 		else if (!strcmp(secstrings + sechdrs[i].sh_name, ".got"))
 			mod->arch.got.shdr = sechdrs + i;
+		else if (sechdrs[i].sh_type == SHT_SYMTAB)
+			symtab = sechdrs + i;
 	}
 
 	if (!mod->arch.plt.shdr) {
@@ -115,6 +120,22 @@ int module_frob_arch_sections(Elf_Ehdr *ehdr, Elf_Shdr *sechdrs,
 		return -ENOEXEC;
 	}
 
+	if (!symtab) {
+		pr_err("%s: module symbol table missing\n", mod->name);
+		return -ENOEXEC;
+	}
+
+	symbols = (void *) ehdr + symtab->sh_offset;
+	strings = (void *) ehdr + sechdrs[symtab->sh_link].sh_offset;
+
+	for (i = 0; i < symtab->sh_size / sizeof(Elf_Sym); i++)
+		if (symbols[i].st_shndx == SHN_UNDEF &&
+		    strcmp(strings + symbols[i].st_name,
+			   "_GLOBAL_OFFSET_TABLE_") == 0) {
+			symbols[i].st_shndx = mod->arch.got.shdr - sechdrs;
+			symbols[i].st_value = 0;
+		}
+
 	/* Calculate the maxinum number of entries */
 	for (i = 0; i < ehdr->e_shnum; i++) {
 		int num_rela = sechdrs[i].sh_size / sizeof(Elf_Rela);
-- 
2.37.0



  parent reply	other threads:[~2022-07-27 16:28 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-07-27 16:24 [PATCH 0/5] LoongArch: Support new relocation types Xi Ruoyao
2022-07-27 16:26 ` [PATCH 1/5] LoongArch: Add section of GOT for kernel module Xi Ruoyao
     [not found]   ` <849f514e-f78a-72a2-b94e-6974074b75eb@loongson.cn>
2022-07-28  9:02     ` Xi Ruoyao
2022-07-28  9:21       ` Youling Tang
2022-07-28 10:53         ` Xi Ruoyao
2022-07-27 16:27 ` [PATCH 2/5] LoongArch: Support R_LARCH_SOP_PUSH_GPREL relocation type in " Xi Ruoyao
2022-07-27 16:28 ` Xi Ruoyao [this message]
2022-07-28  1:02   ` [PATCH 3/5] LoongArch: Support relocation against _GLOBAL_OFFSET_TABLE_ Jinyang He
2022-07-28  6:41     ` Xi Ruoyao
2022-07-28  9:14       ` Jinyang He
2022-07-28 10:57         ` Xi Ruoyao
2022-07-28 11:21           ` Jinyang He
2022-07-27 16:29 ` [PATCH 4/5] LoongArch: Stop using undocumented assembler options Xi Ruoyao
2022-07-28  9:46   ` Youling Tang
2022-07-28 10:58     ` Xi Ruoyao
2022-07-27 16:31 ` [PATCH 5/5] LoongArch: Support modules with new relocation types Xi Ruoyao
2022-07-27 16:46 ` [PATCH 0/5] LoongArch: Support " Xi Ruoyao

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=99733532831377ab6585d43ee40bf314a2d4c5a3.camel@xry111.site \
    --to=xry111@xry111.site \
    --cc=chenhuacai@kernel.org \
    --cc=kernel@xen0n.name \
    --cc=linux-kernel@vger.kernel.org \
    --cc=loongarch@lists.linux.dev \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.