forked from Minki/linux
bpfilter: include bpfilter_umh in assembly instead of using objcopy
What we want here is to embed a user-space program into the kernel. Instead of the complex ELF magic, let's simply wrap it in the assembly with the '.incbin' directive. Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com> Signed-off-by: Alexei Starovoitov <ast@kernel.org> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
977c7114eb
commit
8e75887d32
@ -15,20 +15,7 @@ ifeq ($(CONFIG_BPFILTER_UMH), y)
|
||||
HOSTLDFLAGS += -static
|
||||
endif
|
||||
|
||||
# a bit of elf magic to convert bpfilter_umh binary into a binary blob
|
||||
# inside bpfilter_umh.o elf file referenced by
|
||||
# _binary_net_bpfilter_bpfilter_umh_start symbol
|
||||
# which bpfilter_kern.c passes further into umh blob loader at run-time
|
||||
quiet_cmd_copy_umh = GEN $@
|
||||
cmd_copy_umh = echo ':' > $(obj)/.bpfilter_umh.o.cmd; \
|
||||
$(OBJCOPY) -I binary \
|
||||
`LC_ALL=C $(OBJDUMP) -f net/bpfilter/bpfilter_umh \
|
||||
|awk -F' |,' '/file format/{print "-O",$$NF} \
|
||||
/^architecture:/{print "-B",$$2}'` \
|
||||
--rename-section .data=.init.rodata $< $@
|
||||
|
||||
$(obj)/bpfilter_umh.o: $(obj)/bpfilter_umh
|
||||
$(call cmd,copy_umh)
|
||||
$(obj)/bpfilter_umh_blob.o: $(obj)/bpfilter_umh
|
||||
|
||||
obj-$(CONFIG_BPFILTER_UMH) += bpfilter.o
|
||||
bpfilter-objs += bpfilter_kern.o bpfilter_umh.o
|
||||
bpfilter-objs += bpfilter_kern.o bpfilter_umh_blob.o
|
||||
|
@ -10,11 +10,8 @@
|
||||
#include <linux/file.h>
|
||||
#include "msgfmt.h"
|
||||
|
||||
#define UMH_start _binary_net_bpfilter_bpfilter_umh_start
|
||||
#define UMH_end _binary_net_bpfilter_bpfilter_umh_end
|
||||
|
||||
extern char UMH_start;
|
||||
extern char UMH_end;
|
||||
extern char bpfilter_umh_start;
|
||||
extern char bpfilter_umh_end;
|
||||
|
||||
static struct umh_info info;
|
||||
/* since ip_getsockopt() can run in parallel, serialize access to umh */
|
||||
@ -93,7 +90,9 @@ static int __init load_umh(void)
|
||||
int err;
|
||||
|
||||
/* fork usermode process */
|
||||
err = fork_usermode_blob(&UMH_start, &UMH_end - &UMH_start, &info);
|
||||
err = fork_usermode_blob(&bpfilter_umh_start,
|
||||
&bpfilter_umh_end - &bpfilter_umh_start,
|
||||
&info);
|
||||
if (err)
|
||||
return err;
|
||||
pr_info("Loaded bpfilter_umh pid %d\n", info.pid);
|
||||
|
7
net/bpfilter/bpfilter_umh_blob.S
Normal file
7
net/bpfilter/bpfilter_umh_blob.S
Normal file
@ -0,0 +1,7 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
.section .init.rodata, "a"
|
||||
.global bpfilter_umh_start
|
||||
bpfilter_umh_start:
|
||||
.incbin "net/bpfilter/bpfilter_umh"
|
||||
.global bpfilter_umh_end
|
||||
bpfilter_umh_end:
|
Loading…
Reference in New Issue
Block a user