public inbox for elfutils@sourceware.org
 help / color / mirror / Atom feed
* [PATCH] backends: add checks for _GLOBAL_OFFSET_TABLE_ on loongarch
@ 2023-04-01  3:18 Youling Tang
  2023-04-04 15:45 ` Hengqi Chen
  2023-04-06 22:52 ` Mark Wielaard
  0 siblings, 2 replies; 4+ messages in thread
From: Youling Tang @ 2023-04-01  3:18 UTC (permalink / raw)
  To: elfutils-devel; +Cc: Hengqi Chen, Liwei Ge

Add handling of _GLOBAL_OFFSET_TABLE_.

Before applying the patch:
$ ./src/elflint --gnu-ld ./src/elflint
section [35] '.symtab': _GLOBAL_OFFSET_TABLE_ symbol value 0x68548
does not match .got.plt section address 0x68238

After applying the patch:
$ ./src/elflint --gnu-ld ./src/elflint
No errors

Signed-off-by: Liwei Ge <geliwei@openanolis.org>
Signed-off-by: Youling Tang <tangyouling@loongson.cn>
---
 backends/ChangeLog          |  4 ++++
 backends/loongarch_init.c   |  1 +
 backends/loongarch_symbol.c | 35 +++++++++++++++++++++++++++++++++++
 3 files changed, 40 insertions(+)

diff --git a/backends/ChangeLog b/backends/ChangeLog
index 81f08314..41071953 100644
--- a/backends/ChangeLog
+++ b/backends/ChangeLog
@@ -1,3 +1,7 @@
+2023-04-01  Youling Tang <tangyouling@loongson.cn>
+	* loongarch_init.c (loongarch_init): Hook check_special_symbol.
+	* loongarch_symbol.c (loongarch_check_special_symbol): New function.
+
 2023-02-07  Mark Wielaard  <mark@klomp.org>
 
 	* libebl_CPU.h (dwarf_peeled_die_type): Explicitly handle
diff --git a/backends/loongarch_init.c b/backends/loongarch_init.c
index 59d8cc3d..b641b07f 100644
--- a/backends/loongarch_init.c
+++ b/backends/loongarch_init.c
@@ -46,6 +46,7 @@ loongarch_init (Elf *elf __attribute__ ((unused)),
   loongarch_init_reloc (eh);
   HOOK (eh, reloc_simple_type);
   HOOK (eh, machine_flag_check);
+  HOOK (eh, check_special_symbol);
 
   return eh;
 }
diff --git a/backends/loongarch_symbol.c b/backends/loongarch_symbol.c
index 43306ab8..5ce55bad 100644
--- a/backends/loongarch_symbol.c
+++ b/backends/loongarch_symbol.c
@@ -79,3 +79,38 @@ loongarch_machine_flag_check (GElf_Word flags)
   return ((flags &~ (EF_LARCH_ABI_MODIFIER_MASK
 		     | EF_LARCH_OBJABI_V1)) == 0);
 }
+
+/* Check whether given symbol's st_value and st_size are OK despite failing
+   normal checks.  */
+bool
+loongarch_check_special_symbol (Elf *elf, const GElf_Sym *sym,
+			    const char *name, const GElf_Shdr *destshdr)
+{
+  if (name != NULL
+      && strcmp (name, "_GLOBAL_OFFSET_TABLE_") == 0)
+    {
+      size_t shstrndx;
+      if (elf_getshdrstrndx (elf, &shstrndx) != 0)
+	return false;
+      const char *sname = elf_strptr (elf, shstrndx, destshdr->sh_name);
+      if (sname != NULL
+	  && (strcmp (sname, ".got") == 0 || strcmp (sname, ".got.plt") == 0))
+	{
+	  Elf_Scn *scn = NULL;
+	  while ((scn = elf_nextscn (elf, scn)) != NULL)
+	    {
+	      GElf_Shdr shdr_mem;
+	      GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
+	      if (shdr != NULL)
+		{
+		  sname = elf_strptr (elf, shstrndx, shdr->sh_name);
+		  if (sname != NULL && strcmp (sname, ".got") == 0)
+		    return (sym->st_value >= shdr->sh_addr
+			    && sym->st_value < shdr->sh_addr + shdr->sh_size);
+		}
+	    }
+	}
+    }
+
+  return false;
+}
-- 
2.37.1


^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2023-04-06 22:52 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-04-01  3:18 [PATCH] backends: add checks for _GLOBAL_OFFSET_TABLE_ on loongarch Youling Tang
2023-04-04 15:45 ` Hengqi Chen
2023-04-06  1:59   ` Youling Tang
2023-04-06 22:52 ` Mark Wielaard

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).