Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 18 Oct 2024 20:21:40 GMT
From:      Ka Ho Ng <khng@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: 43628a31e3a2 - main - libkldelf: add elf_lookup_symbol function
Message-ID:  <202410182021.49IKLe0C074894@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch main has been updated by khng:

URL: https://cgit.FreeBSD.org/src/commit/?id=43628a31e3a22e1ea9e2936bdcb07ecbd72aaa5f

commit 43628a31e3a22e1ea9e2936bdcb07ecbd72aaa5f
Author:     Ka Ho Ng <khng@FreeBSD.org>
AuthorDate: 2024-10-08 04:24:37 +0000
Commit:     Ka Ho Ng <khng@FreeBSD.org>
CommitDate: 2024-10-18 20:21:44 +0000

    libkldelf: add elf_lookup_symbol function
    
    The elf_lookup_symbol function looks up the symbol with a given symbol
    name. A pointer to the GElf_Sym of the symbol is returned if the symbol
    exists in the opened ELF file.
    
    Sponsored by:   Juniper Networks, Inc.
    Reviewed by:    markj
    Differential Revision:  https://reviews.freebsd.org/D46764
---
 lib/libkldelf/ef.c     |  1 +
 lib/libkldelf/ef_obj.c |  1 +
 lib/libkldelf/elf.c    |  6 ++++++
 lib/libkldelf/kldelf.h | 13 +++++++++++++
 4 files changed, 21 insertions(+)

diff --git a/lib/libkldelf/ef.c b/lib/libkldelf/ef.c
index 052798ee31e4..dcd87fe2bf83 100644
--- a/lib/libkldelf/ef.c
+++ b/lib/libkldelf/ef.c
@@ -89,6 +89,7 @@ static struct elf_file_ops ef_file_ops = {
 	.seg_read_string	= ef_seg_read_string,
 	.symaddr		= ef_symaddr,
 	.lookup_set		= ef_lookup_set,
+	.lookup_symbol		= ef_lookup_symbol,
 };
 
 static void
diff --git a/lib/libkldelf/ef_obj.c b/lib/libkldelf/ef_obj.c
index e09bd036b71e..32a7c17127ed 100644
--- a/lib/libkldelf/ef_obj.c
+++ b/lib/libkldelf/ef_obj.c
@@ -109,6 +109,7 @@ static struct elf_file_ops ef_obj_file_ops = {
 	.seg_read_string	= ef_obj_seg_read_string,
 	.symaddr		= ef_obj_symaddr,
 	.lookup_set		= ef_obj_lookup_set,
+	.lookup_symbol		= ef_obj_lookup_symbol,
 };
 
 static GElf_Off
diff --git a/lib/libkldelf/elf.c b/lib/libkldelf/elf.c
index da319ffc6c98..8af02622de13 100644
--- a/lib/libkldelf/elf.c
+++ b/lib/libkldelf/elf.c
@@ -686,3 +686,9 @@ elf_reloc(struct elf_file *efile, const void *reldata, Elf_Type reltype,
 	return (efile->ef_reloc(efile, reldata, reltype, relbase, dataoff, len,
 	    dest));
 }
+
+int
+elf_lookup_symbol(struct elf_file *efile, const char *name, GElf_Sym **sym)
+{
+	return (EF_LOOKUP_SYMBOL(efile, name, sym));
+}
diff --git a/lib/libkldelf/kldelf.h b/lib/libkldelf/kldelf.h
index e0a8cc627ff2..71de31a94291 100644
--- a/lib/libkldelf/kldelf.h
+++ b/lib/libkldelf/kldelf.h
@@ -48,6 +48,8 @@
     (ef)->ef_ops->symaddr((ef)->ef_ef, symidx)
 #define EF_LOOKUP_SET(ef, name, startp, stopp, countp) \
     (ef)->ef_ops->lookup_set((ef)->ef_ef, name, startp, stopp, countp)
+#define EF_LOOKUP_SYMBOL(ef, name, sym) \
+    (ef)->ef_ops->lookup_symbol((ef)->ef_ef, name, sym)
 
 /* XXX, should have a different name. */
 typedef struct ef_file *elf_file_t;
@@ -67,6 +69,7 @@ struct elf_file_ops {
 	GElf_Addr (*symaddr)(elf_file_t ef, GElf_Size symidx);
 	int (*lookup_set)(elf_file_t ef, const char *name, GElf_Addr *startp,
 	    GElf_Addr *stopp, long *countp);
+	int (*lookup_symbol)(elf_file_t ef, const char *name, GElf_Sym **sym);
 };
 
 typedef int (elf_reloc_t)(struct elf_file *ef, const void *reldata,
@@ -310,6 +313,16 @@ int	elf_read_mod_pnp_match_info(struct elf_file *efile, GElf_Addr addr,
 int	elf_reloc(struct elf_file *ef, const void *reldata, Elf_Type reltype,
     GElf_Addr relbase, GElf_Addr dataoff, size_t len, void *dest);
 
+/*
+ * Find the symbol with the specified symbol name 'name' within the given
+ * 'efile'. 0 is returned when such a symbol is found, otherwise ENOENT is
+ * returned.
+ *
+ * XXX: This only return the first symbol being found when traversing symtab.
+ */
+int	elf_lookup_symbol(struct elf_file *efile, const char *name,
+    GElf_Sym **sym);
+
 __END_DECLS
 
 #endif /* _KLDELF_H_*/



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202410182021.49IKLe0C074894>