From: Wang Nan <wangnan0@huawei.com>
To: <paulus@samba.org>, <a.p.zijlstra@chello.nl>, <mingo@redhat.com>,
<acme@kernel.org>, <namhyung@kernel.org>, <jolsa@kernel.org>,
<adrian.hunter@intel.com>, <dsahern@gmail.com>,
<ast@plumgrid.com>, <daniel@iogearbox.net>,
<brendan.d.gregg@gmail.com>, <masami.hiramatsu.pt@hitachi.com>
Cc: <linux-kernel@vger.kernel.org>, <lizefan@huawei.com>,
<pi3orama@163.com>, <wangnan0@huawei.com>
Subject: [RFC PATCH v2 05/37] tools lib bpf: introduce 'bpf' library to tools.
Date: Fri, 15 May 2015 07:50:58 +0000 [thread overview]
Message-ID: <1431676290-1230-6-git-send-email-wangnan0@huawei.com> (raw)
In-Reply-To: <1431676290-1230-1-git-send-email-wangnan0@huawei.com>
This is the first patch of libbpf. The goal of libbpf is to create a
standard way for accessing eBPF object files. This patch creates
Makefile and Build for it, allows 'make' to build libbpf.a and
libbpf.so, 'make install' to put them into proper directories.
Most part of Makefile is borrowed from traceevent. Before building,
it checks the existance of libelf in Makefile, and deny to build if
not found. Instead of throw an error if libelf not found, the error
raises in a phony target "elfdep". This design is to ensure
'make clean' still workable even if libelf is not found.
Signed-off-by: Wang Nan <wangnan0@huawei.com>
---
tools/lib/bpf/.gitignore | 2 +
tools/lib/bpf/Build | 1 +
tools/lib/bpf/Makefile | 191 +++++++++++++++++++++++++++++++++++++++++++++++
tools/lib/bpf/libbpf.c | 15 ++++
tools/lib/bpf/libbpf.h | 12 +++
5 files changed, 221 insertions(+)
create mode 100644 tools/lib/bpf/.gitignore
create mode 100644 tools/lib/bpf/Build
create mode 100644 tools/lib/bpf/Makefile
create mode 100644 tools/lib/bpf/libbpf.c
create mode 100644 tools/lib/bpf/libbpf.h
diff --git a/tools/lib/bpf/.gitignore b/tools/lib/bpf/.gitignore
new file mode 100644
index 0000000..812aeed
--- /dev/null
+++ b/tools/lib/bpf/.gitignore
@@ -0,0 +1,2 @@
+libbpf_version.h
+FEATURE-DUMP
diff --git a/tools/lib/bpf/Build b/tools/lib/bpf/Build
new file mode 100644
index 0000000..a316484
--- /dev/null
+++ b/tools/lib/bpf/Build
@@ -0,0 +1 @@
+libbpf-y := libbpf.o
diff --git a/tools/lib/bpf/Makefile b/tools/lib/bpf/Makefile
new file mode 100644
index 0000000..bd5769c
--- /dev/null
+++ b/tools/lib/bpf/Makefile
@@ -0,0 +1,191 @@
+BPF_VERSION = 0
+BPF_PATCHLEVEL = 0
+BPF_EXTRAVERSION = 1
+
+# Version of eBPF elf file
+FILE_VERSION = 1
+
+MAKEFLAGS += --no-print-directory
+
+
+# Makefiles suck: This macro sets a default value of $(2) for the
+# variable named by $(1), unless the variable has been set by
+# environment or command line. This is necessary for CC and AR
+# because make sets default values, so the simpler ?= approach
+# won't work as expected.
+define allow-override
+ $(if $(or $(findstring environment,$(origin $(1))),\
+ $(findstring command line,$(origin $(1)))),,\
+ $(eval $(1) = $(2)))
+endef
+
+# Allow setting CC and AR, or setting CROSS_COMPILE as a prefix.
+$(call allow-override,CC,$(CROSS_COMPILE)gcc)
+$(call allow-override,AR,$(CROSS_COMPILE)ar)
+
+EXT = -std=gnu99
+INSTALL = install
+
+# Use DESTDIR for installing into a different root directory.
+# This is useful for building a package. The program will be
+# installed in this directory as if it was the root directory.
+# Then the build tool can move it later.
+DESTDIR ?=
+DESTDIR_SQ = '$(subst ','\'',$(DESTDIR))'
+
+LP64 := $(shell echo __LP64__ | ${CC} ${CFLAGS} -E -x c - | tail -n 1)
+ifeq ($(LP64), 1)
+ libdir_relative = lib64
+else
+ libdir_relative = lib
+endif
+
+prefix ?= /usr/local
+libdir = $(prefix)/$(libdir_relative)
+man_dir = $(prefix)/share/man
+man_dir_SQ = '$(subst ','\'',$(man_dir))'
+
+export man_dir man_dir_SQ INSTALL
+export DESTDIR DESTDIR_SQ
+
+include ../../scripts/Makefile.include
+
+# copy a bit from Linux kbuild
+
+ifeq ("$(origin V)", "command line")
+ VERBOSE = $(V)
+endif
+ifndef VERBOSE
+ VERBOSE = 0
+endif
+
+ifeq ($(srctree),)
+srctree := $(patsubst %/,%,$(dir $(shell pwd)))
+srctree := $(patsubst %/,%,$(dir $(srctree)))
+srctree := $(patsubst %/,%,$(dir $(srctree)))
+#$(info Determined 'srctree' to be $(srctree))
+endif
+
+FEATURE_DISPLAY = libelf libelf-getphdrnum libelf-mmap
+FEATURE_TESTS = libelf
+include $(srctree)/tools/build/Makefile.feature
+
+ifeq ($(feature-libelf-mmap), 1)
+ override CFLAGS += -DHAVE_LIBELF_MMAP_SUPPORT
+endif
+
+ifeq ($(feature-libelf-getphdrnum), 1)
+ override CFLAGS += -DHAVE_ELF_GETPHDRNUM_SUPPORT
+endif
+
+export prefix libdir src obj
+
+# Shell quotes
+libdir_SQ = $(subst ','\'',$(libdir))
+libdir_relative_SQ = $(subst ','\'',$(libdir_relative))
+plugin_dir_SQ = $(subst ','\'',$(plugin_dir))
+
+LIB_FILE = libbpf.a libbpf.so
+
+VERSION = $(BPF_VERSION)
+PATCHLEVEL = $(BPF_PATCHLEVEL)
+EXTRAVERSION = $(BPF_EXTRAVERSION)
+
+OBJ = $@
+N =
+
+LIBBPF_VERSION = $(BPF_VERSION).$(BPF_PATCHLEVEL).$(BPF_EXTRAVERSION)
+
+INCLUDES = -I. -I $(srctree)/tools/include -I$(srctree)/arch/$(ARCH)/include/uapi -I$(srctree)/include/uapi
+
+# Set compile option CFLAGS
+ifdef EXTRA_CFLAGS
+ CFLAGS := $(EXTRA_CFLAGS)
+else
+ CFLAGS := -g -Wall
+endif
+
+# Append required CFLAGS
+override CFLAGS += -fPIC
+override CFLAGS += $(INCLUDES)
+override CFLAGS += -D_GNU_SOURCE
+
+ifeq ($(VERBOSE),1)
+ Q =
+else
+ Q = @
+endif
+
+# Disable command line variables (CFLAGS) overide from top
+# level Makefile (perf), otherwise build Makefile will get
+# the same command line setup.
+MAKEOVERRIDES=
+
+export srctree OUTPUT CC LD CFLAGS V
+build := -f $(srctree)/tools/build/Makefile.build dir=. obj
+
+BPF_IN := $(OUTPUT)libbpf-in.o
+LIB_FILE := $(addprefix $(OUTPUT),$(LIB_FILE))
+
+CMD_TARGETS = $(LIB_FILE)
+
+TARGETS = $(CMD_TARGETS)
+
+all: $(VERSION_FILES) all_cmd
+
+all_cmd: $(CMD_TARGETS)
+
+$(BPF_IN): force elfdep
+ $(Q)$(MAKE) $(build)=libbpf
+
+$(OUTPUT)libbpf.so: $(BPF_IN)
+ $(QUIET_LINK)$(CC) --shared $^ -o $@
+
+$(OUTPUT)libbpf.a: $(BPF_IN)
+ $(QUIET_LINK)$(RM) $@; $(AR) rcs $@ $^
+
+define update_dir
+ (echo $1 > $@.tmp; \
+ if [ -r $@ ] && cmp -s $@ $@.tmp; then \
+ rm -f $@.tmp; \
+ else \
+ echo ' UPDATE $@'; \
+ mv -f $@.tmp $@; \
+ fi);
+endef
+
+define do_install
+ if [ ! -d '$(DESTDIR_SQ)$2' ]; then \
+ $(INSTALL) -d -m 755 '$(DESTDIR_SQ)$2'; \
+ fi; \
+ $(INSTALL) $1 '$(DESTDIR_SQ)$2'
+endef
+
+install_lib: all_cmd
+ $(call QUIET_INSTALL, $(LIB_FILE)) \
+ $(call do_install,$(LIB_FILE),$(libdir_SQ))
+
+install: install_lib
+
+### Cleaning rules
+
+config-clean:
+ $(call QUIET_CLEAN, config)
+ $(Q)$(MAKE) -C $(srctree)/tools/build/feature/ clean >/dev/null
+
+clean:
+ $(call QUIET_CLEAN, libbpf) $(RM) *.o *~ $(TARGETS) *.a *.so $(VERSION_FILES) .*.d \
+ $(RM) LIBBPF-CFLAGS
+ $(call QUIET_CLEAN, core-gen) $(RM) $(OUTPUT)FEATURE-DUMP
+
+
+
+PHONY += force elfdep
+force:
+
+elfdep:
+ @if [ "$(feature-libelf)" != "1" ]; then echo "No libelf found"; exit -1 ; fi
+
+# Declare the contents of the .PHONY variable as phony. We keep that
+# information in a variable so we can use it in if_changed and friends.
+.PHONY: $(PHONY)
diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c
new file mode 100644
index 0000000..bebe99a
--- /dev/null
+++ b/tools/lib/bpf/libbpf.c
@@ -0,0 +1,15 @@
+/*
+ * common eBPF ELF loading operations.
+ *
+ * Copyright (C) 2015, Wang Nan <wangnan0@huawei.com>
+ * Copyright (C) 2015, Huawei Inc.
+ *
+ * Released under the GPL v2. (and only v2, not any later version)
+ */
+
+#include <stdlib.h>
+#include <unistd.h>
+#include <asm/unistd.h>
+#include <linux/bpf.h>
+
+#include "libbpf.h"
diff --git a/tools/lib/bpf/libbpf.h b/tools/lib/bpf/libbpf.h
new file mode 100644
index 0000000..10845a0
--- /dev/null
+++ b/tools/lib/bpf/libbpf.h
@@ -0,0 +1,12 @@
+/*
+ * Common eBPF object loader operations.
+ *
+ * Copyright (C) 2015, Wang Nan <wangnan0@huawei.com>
+ * Copyright (C) 2015, Huawei Inc.
+ *
+ * Released under the GPL v2. (and only v2, not any later version)
+ */
+#ifndef __BPF_LIBBPF_H
+#define __BPF_LIBBPF_H
+
+#endif
--
1.8.3.4
next prev parent reply other threads:[~2015-05-15 7:53 UTC|newest]
Thread overview: 43+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-05-15 7:50 [RFC PATCH v2 00/37] perf tools: introduce 'perf bpf' command to load eBPF programs Wang Nan
2015-05-15 7:50 ` [RFC PATCH v2 01/37] tools perf: set vmlinux_path__nr_entries to 0 in vmlinux_path__exit Wang Nan
2015-05-15 7:50 ` [RFC PATCH v2 02/37] tools lib traceevent: install libtraceevent.a into libdir Wang Nan
2015-05-15 7:50 ` [RFC PATCH v2 03/37] tools build: Allow other override features to check Wang Nan
2015-05-15 7:50 ` [RFC PATCH v2 04/37] tools include: add __aligned_u64 to types.h Wang Nan
2015-05-20 12:23 ` [tip:perf/core] " tip-bot for Wang Nan
2015-05-15 7:50 ` Wang Nan [this message]
2015-05-15 7:50 ` [RFC PATCH v2 06/37] tools lib bpf: allow set printing function Wang Nan
2015-05-15 7:51 ` [RFC PATCH v2 07/37] tools lib bpf: defines basic interface Wang Nan
2015-05-15 7:51 ` [RFC PATCH v2 08/37] tools lib bpf: open eBPF object file and do basic validation Wang Nan
2015-05-15 7:51 ` [RFC PATCH v2 09/37] tools lib bpf: check swap according to EHDR Wang Nan
2015-05-15 7:51 ` [RFC PATCH v2 10/37] tools lib bpf: iterater over elf sections to collect information Wang Nan
2015-05-15 7:51 ` [RFC PATCH v2 11/37] tools lib bpf: collect version and license from ELF Wang Nan
2015-05-15 7:51 ` [RFC PATCH v2 12/37] tools lib bpf: collect map definitions Wang Nan
2015-05-15 7:51 ` [RFC PATCH v2 13/37] tools lib bpf: collect config section in object Wang Nan
2015-05-15 7:51 ` [RFC PATCH v2 14/37] tools lib bpf: collect symbol table in object files Wang Nan
2015-05-15 7:51 ` [RFC PATCH v2 15/37] tools lib bpf: collect bpf programs from " Wang Nan
2015-05-15 7:51 ` [RFC PATCH v2 16/37] tools lib bpf: collect relocation sections from object file Wang Nan
2015-05-15 7:51 ` [RFC PATCH v2 17/37] tools lib bpf: collect relocation instructions for each program Wang Nan
2015-05-15 7:51 ` [RFC PATCH v2 18/37] tools lib bpf: clean elf memory after loading Wang Nan
2015-05-15 7:51 ` [RFC PATCH v2 19/37] tools lib bpf: add bpf.c/h for common bpf operations Wang Nan
2015-05-15 7:51 ` [RFC PATCH v2 20/37] tools lib bpf: create maps needed by object file Wang Nan
2015-05-15 7:51 ` [RFC PATCH v2 21/37] tools lib bpf: relocation programs Wang Nan
2015-05-15 7:51 ` [RFC PATCH v2 22/37] tools lib bpf: introduce bpf_load_program to bpf.c Wang Nan
2015-05-15 7:51 ` [RFC PATCH v2 23/37] tools lib bpf: load bpf programs in object file into kernel Wang Nan
2015-05-15 7:51 ` [RFC PATCH v2 24/37] tools lib bpf: accessors of bpf_program Wang Nan
2015-05-15 7:51 ` [RFC PATCH v2 25/37] tools lib bpf: accessors for struct bpf_object Wang Nan
2015-05-15 7:51 ` [RFC PATCH v2 26/37] tools perf: Add new 'perf bpf' command Wang Nan
2015-05-15 7:51 ` [RFC PATCH v2 27/37] tools perf: make perf depend on libbpf Wang Nan
2015-05-15 7:51 ` [RFC PATCH v2 28/37] tools perf: add 'perf bpf record' subcommand Wang Nan
2015-05-15 7:51 ` [RFC PATCH v2 29/37] tools perf: add bpf-loader and open elf object files Wang Nan
2015-05-15 7:51 ` [RFC PATCH v2 30/37] tools perf: collect all bpf programs Wang Nan
2015-05-15 7:51 ` [RFC PATCH v2 31/37] tools perf: config probe points of eBPF programs during prepartion Wang Nan
2015-05-15 7:51 ` [RFC PATCH v2 32/37] tools perf bpf: probe at kprobe points Wang Nan
2015-05-15 7:51 ` [RFC PATCH v2 33/37] tools perf bpf: load eBPF object into kernel Wang Nan
2015-05-15 7:51 ` [RFC PATCH v2 34/37] tools perf: add a bpf_wrapper global flag Wang Nan
2015-05-15 7:51 ` [RFC PATCH v2 35/37] tools perf: add bpf_fd field to evsel and introduce new event syntax Wang Nan
2015-05-15 7:51 ` [RFC PATCH v2 36/37] tools perf: generate event argv Wang Nan
2015-05-15 7:51 ` [RFC PATCH v2 37/37] tools perf bpf: passes generated arguments to cmd_record Wang Nan
2015-05-15 8:03 ` [RFC PATCH v2 00/37] perf tools: introduce 'perf bpf' command to load eBPF programs Ingo Molnar
2015-05-15 8:40 ` Wangnan (F)
2015-05-15 8:48 ` Ingo Molnar
2015-05-15 9:42 ` Wangnan (F)
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=1431676290-1230-6-git-send-email-wangnan0@huawei.com \
--to=wangnan0@huawei.com \
--cc=a.p.zijlstra@chello.nl \
--cc=acme@kernel.org \
--cc=adrian.hunter@intel.com \
--cc=ast@plumgrid.com \
--cc=brendan.d.gregg@gmail.com \
--cc=daniel@iogearbox.net \
--cc=dsahern@gmail.com \
--cc=jolsa@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=lizefan@huawei.com \
--cc=masami.hiramatsu.pt@hitachi.com \
--cc=mingo@redhat.com \
--cc=namhyung@kernel.org \
--cc=paulus@samba.org \
--cc=pi3orama@163.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®