aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKa Ho Ng <khng@FreeBSD.org>2024-10-08 04:24:07 +0000
committerKa Ho Ng <khng@FreeBSD.org>2024-10-08 04:24:07 +0000
commit0a2cfd653e86ac41c4e6e32a449d133c0ee6d677 (patch)
tree500d6a02aeb037c735bfe39fecb5cac9763d012b
parent6c711019f289320f38eda47dcb55b188342a4476 (diff)
downloadsrc-0a2cfd653e86ac41c4e6e32a449d133c0ee6d677.tar.gz
src-0a2cfd653e86ac41c4e6e32a449d133c0ee6d677.zip
libkldelf: add a private library for kernel/kld-related ELF parsing
The libkldelf library was originally a part of kldxref(8). It exposed ELF parsing helpers specialized in parsing KLDs and the kernel executable. The library can be used to read metadata such as linker_set, mod_depend, mod_version and PNP match info, and raw data from the ELF. To promote the reuse of the facilities the ELF parsing code is separated from kldxref(8) into a new private library. kldxref(8) is modified to link against the libkldelf library. Sponsored by: Juniper Networks, Inc. Reviewed by: markj Differential Revision: https://reviews.freebsd.org/D46719
-rw-r--r--Makefile.inc111
-rw-r--r--lib/Makefile1
-rw-r--r--lib/libkldelf/Makefile21
-rw-r--r--lib/libkldelf/Makefile.depend16
-rw-r--r--lib/libkldelf/ef.c (renamed from usr.sbin/kldxref/ef.c)2
-rw-r--r--lib/libkldelf/ef_aarch64.c (renamed from usr.sbin/kldxref/ef_aarch64.c)2
-rw-r--r--lib/libkldelf/ef_amd64.c (renamed from usr.sbin/kldxref/ef_amd64.c)2
-rw-r--r--lib/libkldelf/ef_arm.c (renamed from usr.sbin/kldxref/ef_arm.c)2
-rw-r--r--lib/libkldelf/ef_i386.c (renamed from usr.sbin/kldxref/ef_i386.c)2
-rw-r--r--lib/libkldelf/ef_mips.c (renamed from usr.sbin/kldxref/ef_mips.c)2
-rw-r--r--lib/libkldelf/ef_obj.c (renamed from usr.sbin/kldxref/ef_obj.c)2
-rw-r--r--lib/libkldelf/ef_powerpc.c (renamed from usr.sbin/kldxref/ef_powerpc.c)2
-rw-r--r--lib/libkldelf/ef_riscv.c (renamed from usr.sbin/kldxref/ef_riscv.c)2
-rw-r--r--lib/libkldelf/elf.c (renamed from usr.sbin/kldxref/elf.c)2
-rw-r--r--lib/libkldelf/kldelf.h (renamed from usr.sbin/kldxref/ef.h)6
-rw-r--r--share/mk/src.libnames.mk2
-rw-r--r--usr.sbin/kldxref/Makefile13
-rw-r--r--usr.sbin/kldxref/kldxref.c2
18 files changed, 67 insertions, 25 deletions
diff --git a/Makefile.inc1 b/Makefile.inc1
index 557bbc825625..118e864b69b8 100644
--- a/Makefile.inc1
+++ b/Makefile.inc1
@@ -2509,8 +2509,12 @@ ${_bt}-lib/libdwarf: ${_bt_m4_depend}
_bt_libelf_depend=${_bt}-lib/libelf
.endif
+_libkldelf= lib/libkldelf
+${_bt}-lib/libkldelf: ${_bt_libelf_depend}
+_bt_libkldelf_depend=${_bt}-lib/libkldelf
+
_kldxref= usr.sbin/kldxref
-${_bt}-usr.sbin/kldxref: ${_bt_libelf_depend}
+${_bt}-usr.sbin/kldxref: ${_bt_libelf_depend} ${_bt_libkldelf_depend}
# flua is required to regenerate syscall files. It first appeared during the
# 13.0-CURRENT cycle, thus needs to be built on -older releases and stable
@@ -2773,6 +2777,7 @@ bootstrap-tools: ${_bt}-links .PHONY
${_cat} \
${_kbdcontrol} \
${_elftoolchain_libs} \
+ ${_libkldelf} \
${_kldxref} \
lib/libopenbsd \
usr.bin/mandoc \
@@ -3216,7 +3221,8 @@ _prebuild_libs= ${_kerberos5_lib_libasn1} \
lib/libfigpar \
${_lib_libgssapi} \
lib/libjail \
- lib/libkiconv lib/libkvm lib/liblzma lib/libmd lib/libnv \
+ lib/libkiconv lib/libkldelf lib/libkvm \
+ lib/liblzma lib/libmd lib/libnv \
lib/libzstd \
${_lib_casper} \
lib/ncurses/tinfo \
@@ -3251,6 +3257,7 @@ _prebuild_libs+= lib/libregex
.endif
lib/libgeom__L: lib/libexpat__L lib/libsbuf__L
+lib/libkldelf__L: lib/libelf__L
lib/libkvm__L: lib/libelf__L
.if ${MK_RADIUS_SUPPORT} != "no"
diff --git a/lib/Makefile b/lib/Makefile
index 221eac74ee26..e4a4aa95a1ef 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -66,6 +66,7 @@ SUBDIR= ${SUBDIR_BOOTSTRAP} \
libiscsiutil \
libjail \
libkiconv \
+ libkldelf \
libkvm \
liblua \
liblzma \
diff --git a/lib/libkldelf/Makefile b/lib/libkldelf/Makefile
new file mode 100644
index 000000000000..0d1716f17fca
--- /dev/null
+++ b/lib/libkldelf/Makefile
@@ -0,0 +1,21 @@
+.include <bsd.own.mk>
+
+PACKAGE= runtime
+LIB= kldelf
+PRIVATELIB= yes
+
+SRCS= ef.c \
+ ef_obj.c \
+ elf.c \
+ ef_aarch64.c \
+ ef_arm.c \
+ ef_amd64.c \
+ ef_i386.c \
+ ef_mips.c \
+ ef_powerpc.c \
+ ef_riscv.c
+WARNS?= 2
+
+LIBADD= elf
+
+.include <bsd.lib.mk>
diff --git a/lib/libkldelf/Makefile.depend b/lib/libkldelf/Makefile.depend
new file mode 100644
index 000000000000..b0aa274151ad
--- /dev/null
+++ b/lib/libkldelf/Makefile.depend
@@ -0,0 +1,16 @@
+# Autogenerated - do NOT edit!
+
+DIRDEPS = \
+ include \
+ include/xlocale \
+ lib/${CSU_DIR} \
+ lib/libc \
+ lib/libcompiler_rt \
+ lib/libelf \
+
+
+.include <dirdeps.mk>
+
+.if ${DEP_RELDIR} == ${_DEP_RELDIR}
+# local dependencies - needed for -jN in clean tree
+.endif
diff --git a/usr.sbin/kldxref/ef.c b/lib/libkldelf/ef.c
index 975626e46046..052798ee31e4 100644
--- a/usr.sbin/kldxref/ef.c
+++ b/lib/libkldelf/ef.c
@@ -41,7 +41,7 @@
#include <stdlib.h>
#include <string.h>
-#include "ef.h"
+#include "kldelf.h"
#define MAXSEGS 16
struct ef_file {
diff --git a/usr.sbin/kldxref/ef_aarch64.c b/lib/libkldelf/ef_aarch64.c
index b61de3b032ab..d2db29f22891 100644
--- a/usr.sbin/kldxref/ef_aarch64.c
+++ b/lib/libkldelf/ef_aarch64.c
@@ -31,7 +31,7 @@
#include <errno.h>
#include <gelf.h>
-#include "ef.h"
+#include "kldelf.h"
/*
* Apply relocations to the values obtained from the file. `relbase' is the
diff --git a/usr.sbin/kldxref/ef_amd64.c b/lib/libkldelf/ef_amd64.c
index fde032dcabc2..7295835f75b3 100644
--- a/usr.sbin/kldxref/ef_amd64.c
+++ b/lib/libkldelf/ef_amd64.c
@@ -33,7 +33,7 @@
#include <errno.h>
#include <gelf.h>
-#include "ef.h"
+#include "kldelf.h"
/*
* Apply relocations to the values obtained from the file. `relbase' is the
diff --git a/usr.sbin/kldxref/ef_arm.c b/lib/libkldelf/ef_arm.c
index cc5e265f821e..657294dc9fb0 100644
--- a/usr.sbin/kldxref/ef_arm.c
+++ b/lib/libkldelf/ef_arm.c
@@ -34,7 +34,7 @@
#include <errno.h>
#include <gelf.h>
-#include "ef.h"
+#include "kldelf.h"
/*
* Apply relocations to the values obtained from the file. `relbase' is the
diff --git a/usr.sbin/kldxref/ef_i386.c b/lib/libkldelf/ef_i386.c
index 962ed2bc0664..ae571e2d50f2 100644
--- a/usr.sbin/kldxref/ef_i386.c
+++ b/lib/libkldelf/ef_i386.c
@@ -33,7 +33,7 @@
#include <errno.h>
#include <gelf.h>
-#include "ef.h"
+#include "kldelf.h"
/*
* Apply relocations to the values obtained from the file. `relbase' is the
diff --git a/usr.sbin/kldxref/ef_mips.c b/lib/libkldelf/ef_mips.c
index e4aeedb5c08b..99790e11a9c3 100644
--- a/usr.sbin/kldxref/ef_mips.c
+++ b/lib/libkldelf/ef_mips.c
@@ -36,7 +36,7 @@
#include <errno.h>
#include <gelf.h>
-#include "ef.h"
+#include "kldelf.h"
/*
* Apply relocations to the values obtained from the file. `relbase' is the
diff --git a/usr.sbin/kldxref/ef_obj.c b/lib/libkldelf/ef_obj.c
index ac83137cd394..e09bd036b71e 100644
--- a/usr.sbin/kldxref/ef_obj.c
+++ b/lib/libkldelf/ef_obj.c
@@ -43,7 +43,7 @@
#include <stdlib.h>
#include <string.h>
-#include "ef.h"
+#include "kldelf.h"
typedef struct {
GElf_Addr addr;
diff --git a/usr.sbin/kldxref/ef_powerpc.c b/lib/libkldelf/ef_powerpc.c
index f72cc1d85e20..33f09c0d69ef 100644
--- a/usr.sbin/kldxref/ef_powerpc.c
+++ b/lib/libkldelf/ef_powerpc.c
@@ -33,7 +33,7 @@
#include <errno.h>
#include <gelf.h>
-#include "ef.h"
+#include "kldelf.h"
/*
* Apply relocations to the values obtained from the file. `relbase' is the
diff --git a/usr.sbin/kldxref/ef_riscv.c b/lib/libkldelf/ef_riscv.c
index 46b9b66bee58..bda04bb2c39a 100644
--- a/usr.sbin/kldxref/ef_riscv.c
+++ b/lib/libkldelf/ef_riscv.c
@@ -36,7 +36,7 @@
#include <errno.h>
#include <gelf.h>
-#include "ef.h"
+#include "kldelf.h"
/*
* Apply relocations to the values obtained from the file. `relbase' is the
diff --git a/usr.sbin/kldxref/elf.c b/lib/libkldelf/elf.c
index f98c39b69c0b..da319ffc6c98 100644
--- a/usr.sbin/kldxref/elf.c
+++ b/lib/libkldelf/elf.c
@@ -44,7 +44,7 @@
#include <string.h>
#include <unistd.h>
-#include "ef.h"
+#include "kldelf.h"
SET_DECLARE(elf_reloc, struct elf_reloc_data);
diff --git a/usr.sbin/kldxref/ef.h b/lib/libkldelf/kldelf.h
index 9d3dc1b1b435..e0a8cc627ff2 100644
--- a/usr.sbin/kldxref/ef.h
+++ b/lib/libkldelf/kldelf.h
@@ -32,8 +32,8 @@
* SUCH DAMAGE.
*/
-#ifndef _EF_H_
-#define _EF_H_
+#ifndef _KLDELF_H_
+#define _KLDELF_H_
#include <sys/linker_set.h>
#include <stdbool.h>
@@ -312,4 +312,4 @@ int elf_reloc(struct elf_file *ef, const void *reldata, Elf_Type reltype,
__END_DECLS
-#endif /* _EF_H_*/
+#endif /* _KLDELF_H_*/
diff --git a/share/mk/src.libnames.mk b/share/mk/src.libnames.mk
index 1e0a04e83fe3..092e1b444beb 100644
--- a/share/mk/src.libnames.mk
+++ b/share/mk/src.libnames.mk
@@ -27,6 +27,7 @@ _PRIVATELIBS= \
gtest_main \
heimipcc \
heimipcs \
+ kldelf \
ldns \
sqlite3 \
ssh \
@@ -312,6 +313,7 @@ _DP_bsnmp= crypto
.endif
_DP_geom= bsdxml sbuf
_DP_cam= sbuf
+_DP_kldelf= elf
_DP_kvm= elf
_DP_casper= nv
_DP_cap_dns= nv
diff --git a/usr.sbin/kldxref/Makefile b/usr.sbin/kldxref/Makefile
index fc9b0b4215fc..c41517a78904 100644
--- a/usr.sbin/kldxref/Makefile
+++ b/usr.sbin/kldxref/Makefile
@@ -1,17 +1,12 @@
PACKAGE= runtime
PROG= kldxref
MAN= kldxref.8
-SRCS= kldxref.c ef.c ef_obj.c elf.c
-SRCS+= ef_aarch64.c \
- ef_arm.c \
- ef_amd64.c \
- ef_i386.c \
- ef_mips.c \
- ef_powerpc.c \
- ef_riscv.c
+SRCS= kldxref.c
+
+CFLAGS+=-I${SRCTOP}/lib/libkldelf
WARNS?= 2
-LIBADD= elf
+LIBADD= elf kldelf
.include <bsd.prog.mk>
diff --git a/usr.sbin/kldxref/kldxref.c b/usr.sbin/kldxref/kldxref.c
index 6bb0469a9ff5..eed754e1e730 100644
--- a/usr.sbin/kldxref/kldxref.c
+++ b/usr.sbin/kldxref/kldxref.c
@@ -51,7 +51,7 @@
#include <string.h>
#include <unistd.h>
-#include "ef.h"
+#include <kldelf.h>
#define MAXRECSIZE (64 << 10) /* 64k */
#define check(val) if ((error = (val)) != 0) break