chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

解構(gòu)內(nèi)核源碼eBPF樣例編譯過程

Linux閱碼場 ? 來源:阿里靈杰 ? 作者:阿里靈杰 ? 2023-04-17 14:05 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

1?

他山之石

了解和掌握純c語言的ebpf編譯和使用,有助于我們加深對(duì)于eBPF技術(shù)原理的進(jìn)一步掌握,也有助于開發(fā)符合自己業(yè)務(wù)需求的高性能的ebpf程序。 目前常見和主流的純c語言的ebpf編譯使用方法,主要是兩種。一種是內(nèi)核源碼中原生提供的編譯方式。另外一種是libbpf-bootstrap項(xiàng)目中提供的skeleton編譯方式。libbpf-bootstrap方式和社區(qū)5.x以上內(nèi)核結(jié)合的比較好,以后再做介紹,今天我們選擇基于4.18內(nèi)核的基于內(nèi)核源碼的原生編譯方式做介紹。

我們今天將參考這篇文章內(nèi)容,對(duì)基于內(nèi)核源碼方式的純c語言的ebpf編譯方式做進(jìn)一步分析。

2?

獲取內(nèi)核源碼

目前主流的服務(wù)器的操作系統(tǒng)環(huán)境還是以8u + 4.18內(nèi)核為主。因此,本文以4.18版本內(nèi)核為主要分析對(duì)象。我們提供如下操作系統(tǒng)環(huán)境的獲取建議:

2.1 獲取操作系統(tǒng)環(huán)境

如果你自己有centos8u兼容環(huán)境操作系統(tǒng),則可以使用已有的環(huán)境。如果沒有,可以通過阿里云官網(wǎng)購買阿里云主機(jī),選擇選擇centos8或者anolis8操作系統(tǒng)環(huán)境。

$  cat /etc/centos-release
CentOS Linux release 8.5.2111
$  uname -r
4.18.0-348.7.1.el8_5.x86_64

2.2 獲取開源的內(nèi)核源碼

可以使用wget,從aliyun官網(wǎng)鏡像,獲取開源的4.18內(nèi)核源碼。

$  cd /tmp/
$  wget https://mirrors.aliyun.com/linux-kernel/v4.x/linux-4.18.tar.gz
$  tar -zxvf linux-4.18.tar.gz
$  cd linux-4.18
下載內(nèi)核源碼一定要確保內(nèi)核版本與操作系統(tǒng)的一致。原因是ebpf會(huì)用到VERSION、PATCHLEVEL和SUBLEVEL這3個(gè)宏的值與內(nèi)核做內(nèi)核版本校驗(yàn)。如果版本傳的不對(duì),ebpf校驗(yàn)會(huì)失敗。
$  cat Makefile  | grep -P '^VERSION|^PATCHLEVEL|^SUBLEVEL'   
VERSION = 4
PATCHLEVEL = 18
SUBLEVEL = 0

3?

初始化基礎(chǔ)環(huán)境

需要安裝ebpf編譯時(shí)依賴的llvm和clang等rpm包。此外內(nèi)核編譯還需要依賴openssl-devel等rpm包。

$  sudo yum install bison flex openssl-devel
$  sudo yum install clang llvm elfutils-libelf-devel

具體每個(gè)實(shí)驗(yàn)機(jī)器的環(huán)境可能略有差別,需要根據(jù)自己的情況做細(xì)節(jié)調(diào)整。

4?

編譯內(nèi)核源碼中ebpf程序樣例

4.1 編譯環(huán)境初始化

狄老師的文章中這里執(zhí)行的是make scripts,在內(nèi)核源碼編譯時(shí)此步驟前通常還需要執(zhí)行make prepare。而make init正好包含這兩步make prepare && make scripts。因此,我們將命令按照如下方式優(yōu)化,基本能夠一遍跑過:

$  cd /tmp/linux-4.18
$  make oldconfig && make init  # make oldconfig && make prepare && make scripts
$  make headers_install

4.2 編譯內(nèi)核源碼樣例

終于執(zhí)行到了內(nèi)核源碼中提供的ebpf程序樣例的編譯。

$  make M=samples/bpf

4.3 執(zhí)行樣例程序

我們可以通過對(duì)樣例程序的執(zhí)行,對(duì)編譯效果進(jìn)行驗(yàn)證。結(jié)果顯示執(zhí)行成功,狄老師文章中的步驟驗(yàn)證通過,有點(diǎn)小激動(dòng)。

$  sudo ./samples/bpf/trace_output
recv 1766352 events per sec

5?

內(nèi)核源碼的ebpf編譯關(guān)鍵過程提取

接下去就是本文最重點(diǎn)的部分,對(duì)ebpf編譯過程的分析。我們主要分分析headers_install和對(duì)samples/bpf目錄的make這2個(gè)步驟。

5.1 頭文件安裝 make headers_install

重新獲取一個(gè)干凈的內(nèi)核源碼,再次執(zhí)行上面的編譯步驟。這次我們對(duì)編譯過程增加一些觀察步驟。

$  cd  /tmp/
$  rm -fr /tmp/linux-4.18
$  tar -zxvf linux-4.18.tar.gz 
$  cd /tmp/linux-4.18
$  make oldconfig && make init
$  ls usr/include/
ls: cannot access usr/include/: No such file or directory      # 此時(shí)include目錄不存在
$  make headers_install
$  ls usr/include/ -R  | grep -v -P ':$' | grep -v -P '^$' | wc -l
931                                                      #  此時(shí)include目錄下有931個(gè)文件
$  diff -rs usr/include/ /usr/include/|grep -P '^Files .+ and .+ are identical$'|wc -l
677
這說明內(nèi)核源碼目錄下,headers_install步驟生成的usr/include/目錄下功能900多個(gè)文件,其中大多數(shù)(677個(gè))文件都能在操作系統(tǒng)環(huán)境的/usr/include/下找到完全一摸一樣的同名文件,并且內(nèi)容也完全相同。
$  rpm -ql kernel-headers | wc -l
964  
$  rpm -ql kernel-headers | head 
/usr/include/asm
/usr/include/asm-generic
/usr/include/asm-generic/bpf_perf_event.h
而操作系統(tǒng)環(huán)境的/usr/include/目錄正好是kernel-headers包的安裝目錄。所以編譯過程中headers_install步驟就是在內(nèi)核源碼目錄生成了kernel-headers包作用一樣的內(nèi)容。

5.2 eBPF樣例編譯 make M=samples/bpf

ebpf樣例的編譯過程,我們做一下改進(jìn),通過SHELL選項(xiàng)打開shell的調(diào)試選項(xiàng)。具體命令如下:

$  make M=samples/bpf --debug=v,m SHELL="bash -x" > make.log 2>&1
通過分析make.log,再結(jié)合其他一些黑科技,可以大概找出內(nèi)核源碼樣例中trace_output命令的編譯脈絡(luò)。其中用戶態(tài)編譯脈絡(luò)如下。為了表述上更加突出主題,此處只顯示編譯命令的關(guān)鍵信息,下一節(jié)會(huì)給出完整編譯命令。
$  gcc -g -fPIC -c -o libbpf.o libbpf.c
$  gcc -g -fPIC -c -o bpf.o bpf.c
$  gcc -g -fPIC -c -o btf.o btf.c
$  gcc -g -fPIC -c -o nlattr.o nlattr.c
$  ld -r -o libbpf-in.o libbpf.o bpf.o nlattr.o btf.o
$  ar rcs libbpf.a libbpf-in.o
$  gcc -O2 -std=gnu89 -c -o bpf_load.o bpf_load.c
$  gcc -O2 -std=gnu89 -c -o trace_output_user.o trace_output_user.c
$  gcc -O2 -std=gnu89 -c -o trace_helpers.o trace_helpers.c
$  gcc -o trace_output bpf_load.o trace_output_user.o trace_helpers.o libbpf.a -lelf -lrt
其中內(nèi)核態(tài)編譯脈絡(luò)如下:
$  clang -O2 -emit-llvm -c trace_output_kern.c -o - 
$  llc -march=bpf -filetype=obj -o trace_output_kern.o
其中前一行最后的橫線 - 表示 這里是輸出給shell管道,所以這兩行實(shí)際是可以通過shell管道拼接成一個(gè)命令來執(zhí)行的。

6?

手工編譯內(nèi)核源碼中的eBPF樣例分析

通過上一節(jié)對(duì)關(guān)鍵步驟make M=samples/bpf的實(shí)踐,我們已經(jīng)可以編譯出內(nèi)核源碼中提供的ebpf樣例。但這還不夠我們充分地理解這個(gè)編譯過程,我們將這編譯過程繼續(xù)拆解一下,拆解成可以一步步執(zhí)行的那種,為了方便大家理解,我將這個(gè)過程分解為 A-H 6大手工步驟,里面還會(huì)包含一些細(xì)分的小步驟:

$  cd  /tmp/
$  rm -fr /tmp/linux-4.18
$  tar -zxvf linux-4.18.tar.gz 
$  cd /tmp/linux-4.18
$  make oldconfig && make init
$  make headers_install
$  cd tools/lib/bpf/

6.1 手工步驟A過程解析

手工步驟A1:

$  # gcc -g -fPIC -c -o libbpf.o libbpf.c
$  gcc -g -DHAVE_LIBELF_MMAP_SUPPORT -DCOMPAT_NEED_REALLOCARRAY -fPIC -I. -I/tmp/linux-4.18/tools/include -I/tmp/linux-4.18/tools/arch/x86/include/uapi -I/tmp/linux-4.18/tools/include/uapi -I/tmp/linux-4.18/tools/perf -D"BUILD_STR(s)=#s" -c -o libbpf.o libbpf.c
手工步驟A2:
$ # gcc -g -fPIC -c -o bpf.o bpf.c
$  gcc -g -DHAVE_LIBELF_MMAP_SUPPORT -DCOMPAT_NEED_REALLOCARRAY -fPIC -I. -I/tmp/linux-4.18/tools/include -I/tmp/linux-4.18/tools/arch/x86/include/uapi -I/tmp/linux-4.18/tools/include/uapi -I/tmp/linux-4.18/tools/perf -D"BUILD_STR(s)=#s" -c -o bpf.o bpf.c
手工步驟A3:
$ # gcc -g -fPIC -c -o btf.o btf.c
$  gcc -g -DHAVE_LIBELF_MMAP_SUPPORT -DCOMPAT_NEED_REALLOCARRAY -fPIC -I. -I/tmp/linux-4.18/tools/include -I/tmp/linux-4.18/tools/arch/x86/include/uapi -I/tmp/linux-4.18/tools/include/uapi -I/tmp/linux-4.18/tools/perf -D"BUILD_STR(s)=#s" -c -o btf.o btf.c
手工步驟A4:
$ # gcc -g -fPIC -c -o nlattr.o nlattr.c
$  gcc -g -DHAVE_LIBELF_MMAP_SUPPORT -DCOMPAT_NEED_REALLOCARRAY -fPIC -I. -I/tmp/linux-4.18/tools/include -I/tmp/linux-4.18/tools/arch/x86/include/uapi -I/tmp/linux-4.18/tools/include/uapi -I/tmp/linux-4.18/tools/perf -D"BUILD_STR(s)=#s" -c -o nlattr.o nlattr.c
針對(duì)手工步驟A1到A4的關(guān)鍵編譯選項(xiàng)做一些介紹。

● -fPIC,告訴編譯器輸出位置無關(guān)目標(biāo),為后面生成共享庫埋下伏筆。

● -I. 表示需要包含當(dāng)前目錄下的頭文件。

● -I/tmp/linux-4.18/tools/include -I/tmp/linux-4.18/tools/arch/x86/include/uapi -I/tmp/linux-4.18/tools/include/uapi -I/tmp/linux-4.18/tools/perf,這4個(gè)頭文件,是用戶態(tài)ebpf程序所依賴tool目錄下的頭文件位置。

6.2 手工步驟B過程解析

$  ld -r -o libbpf-in.o  libbpf.o bpf.o nlattr.o btf.o
手工步驟B是將步驟A中產(chǎn)生4個(gè).o文件進(jìn)行鏈接。

6.3 手工步驟C過程解析

$  ar rcs libbpf.a libbpf-in.o
手工步驟C是從鏈接后的文件中提取靜態(tài)庫文件。

6.4 手工步驟D/E/F過程解析

手工步驟D:

$  # gcc -O2 -std=gnu89 -c -o bpf_load.o bpf_load.c
$  gcc -O2 -fomit-frame-pointer -std=gnu89 -I./usr/include -I./tools/lib/ -I./tools/testing/selftests/bpf/ -I./tools/lib/ -I./tools/include -I./tools/perf -I./usr/include -Wno-unused-variable -c -o samples/bpf/bpf_load.o samples/bpf/bpf_load.c
手工步驟E:
$  # gcc -O2 -std=gnu89 -c -o trace_output_user.o trace_output_user.c
$  gcc -O2 -fomit-frame-pointer -std=gnu89 -I./usr/include -I./tools/lib/ -I./tools/testing/selftests/bpf/ -I./tools/lib/ -I./tools/include -I./tools/perf -I./tools/lib/bpf/ -c -o samples/bpf/trace_output_user.o samples/bpf/trace_output_user.c
手工步驟F:
$  # gcc -O2 -std=gnu89 -c -o trace_helpers.o trace_helpers.c
$  gcc -O2 -fomit-frame-pointer -std=gnu89 -I./usr/include -I./tools/lib/ -I./tools/testing/selftests/bpf/ -I./tools/lib/ -I./tools/include -I./tools/perf -I./tools/lib/bpf/ -c -o samples/bpf/../../tools/testing/selftests/bpf/trace_helpers.o samples/bpf/../../tools/testing/selftests/bpf/trace_helpers.c
針對(duì)手工步驟E的關(guān)鍵編譯選項(xiàng)做一些介紹。手工步驟D和手工步驟F與此類似。

● -O2 和 -std=gnu89 是兩個(gè)核心選項(xiàng)。

● include選項(xiàng),一共有6個(gè),我們將其分為3組。第一組是-I./usr/include ,這表示包含等同于kernel-headers的內(nèi)容。

● 第二組是-I./tools/lib/, -I./tools/include,-I./tools/perf,-I./tools/lib/bpf/

● 第三組是-I./tools/testing/selftests/bpf/。之所以把這一組單獨(dú)獨(dú)立出來,是因?yàn)樗蜆永a處于同樣的路徑。

6.5 手工步驟G過程解析

$  # gcc -o trace_output bpf_load.o trace_output_user.o trace_helpers.o libbpf.a -lelf -lrt
$  gcc -o samples/bpf/trace_output samples/bpf/bpf_load.o samples/bpf/trace_output_user.o samples/bpf/../../tools/testing/selftests/bpf/trace_helpers.o /tmp/linux-4.18/samples/bpf/../../tools/lib/bpf/libbpf.a -lelf -lrt
針對(duì)手工步驟G的關(guān)鍵編譯選項(xiàng)做一些介紹。

● -lelf -lrt鏈接兩個(gè)類庫

● libbpf.a表示以靜態(tài)鏈接庫的方式鏈接libbpf的類庫。 ● 最關(guān)鍵的是,沒有添加-static選項(xiàng),沒有添加-static選項(xiàng),沒有添加-static選項(xiàng),重要的事情說三遍。

6.6 手工步驟H過程解析

$  clang -nostdinc -isystem /usr/lib/gcc/x86_64-redhat-linux/8/include -I./arch/x86/include -I./arch/x86/include/generated -I./include -I./arch/x86/include/uapi -I./arch/x86/include/generated/uapi -I./include/uapi -I./include/generated/uapi -include ./include/linux/kconfig.h -Isamples/bpf -I./tools/testing/selftests/bpf/ -D__KERNEL__ -D__BPF_TRACING__ -D__TARGET_ARCH_x86 -O2 -emit-llvm -c samples/bpf/trace_output_kern.c -o - | llc -march=bpf -filetype=obj -o samples/bpf/trace_output_kern.o
針對(duì)手工步驟H的關(guān)鍵編譯選項(xiàng)做一些介紹。

● -nostdinc -isystem /usr/lib/gcc/x86_64-redhat-linux/8/include,這2個(gè)選項(xiàng)是一組。nostdinc表示屏蔽掉系統(tǒng)默認(rèn)的include環(huán)境,替換成當(dāng)前gcc編譯器自帶的include頭文件環(huán)境。

●-I./arch/x86/include,-I./arch/x86/include/generated,-I./include,-I./arch/x86/include/uapi,-I./arch/x86/include/generated/uapi,-I./include/uapi,-I./include/generated/uapi。這7個(gè)頭文件很關(guān)鍵,是內(nèi)核態(tài)ebpf程序所依賴的絕大多數(shù)頭文件的位置。

● -include ./include/linux/kconfig.h,這個(gè)頭文件也很關(guān)鍵,是讓上面7個(gè)頭文件生效的前提條件。

● -I samples/bpf 和 -I ./tools/testing/selftests/bpf/,這2個(gè)頭文件是和ebpf樣例所處位置相同,單獨(dú)獨(dú)立出來看。

● llc是llvm的連接器。內(nèi)核是將clang的編譯和llc的鏈接獨(dú)立成兩步完成,在llc步驟才指定-march=bpf。 對(duì)編譯結(jié)果進(jìn)行驗(yàn)證,完美驗(yàn)證通過,第二次有點(diǎn)小激動(dòng)。

$  sudo ./samples/bpf/trace_output
recv 1760674 events per sec
關(guān)鍵步驟抽取不是最終目的,根本目的是能讓我們實(shí)現(xiàn)脫離內(nèi)核源碼進(jìn)行獨(dú)立的純C語言編譯。我們將在后續(xù)的文章中進(jìn)一步闡述。

7?

關(guān)于4.9版本內(nèi)核

按照內(nèi)核的原生步驟,對(duì)4.9內(nèi)核進(jìn)行一次編譯,我們會(huì)發(fā)現(xiàn)對(duì)應(yīng)手工步驟E的這一步,編譯代碼有點(diǎn)不一樣,具體代碼如下。

$ gcc -o samples/bpf/trace_output samples/bpf/bpf_load.o samples/bpf/libbpf.o samples/bpf/trace_output_user.o -lelf -lrt 其中沒有了對(duì)libbpf.a靜態(tài)庫的鏈接,但卻多了一個(gè)libbpf.o文件的鏈接。

$  cd /tmp/linux-4.9/
$  find . -name libbpf.c
./samples/bpf/libbpf.c
./tools/lib/bpf/libbpf.c
查詢內(nèi)核源碼,可以發(fā)現(xiàn),在4.9內(nèi)核下,有2個(gè)libbpf.c文件,分別處于./tools/lib/bpf/目錄和./samples/bpf/目錄。而內(nèi)核ebpf樣例暫時(shí)使用的還是老的./samples/bpf/libbpf.c文件。

8?

進(jìn)一步探索

本文為eBPF動(dòng)手實(shí)踐系列的第一篇,我們實(shí)現(xiàn)了基于內(nèi)核源碼框架的一步一步的純C語言編譯

附錄: eBPF手工純C編譯完整命令清單

cd  /tmp/
rm -fr /tmp/linux-4.18
tar -zxvf linux-4.18.tar.gz 
cd /tmp/linux-4.18
make oldconfig && make init
make headers_install
cd tools/lib/bpf/


# 步驟A1
# gcc -g -fPIC -c -o libbpf.o libbpf.c
gcc -g -DHAVE_LIBELF_MMAP_SUPPORT -DCOMPAT_NEED_REALLOCARRAY -fPIC -I. -I/tmp/linux-4.18/tools/include -I/tmp/linux-4.18/tools/arch/x86/include/uapi -I/tmp/linux-4.18/tools/include/uapi -I/tmp/linux-4.18/tools/perf -D"BUILD_STR(s)=#s" -c -o libbpf.o libbpf.c


# 步驟A2
# gcc -g -fPIC -c -o bpf.o bpf.c
gcc -g -DHAVE_LIBELF_MMAP_SUPPORT -DCOMPAT_NEED_REALLOCARRAY -fPIC -I. -I/tmp/linux-4.18/tools/include -I/tmp/linux-4.18/tools/arch/x86/include/uapi -I/tmp/linux-4.18/tools/include/uapi -I/tmp/linux-4.18/tools/perf -D"BUILD_STR(s)=#s" -c -o bpf.o bpf.c


# 步驟A3
# gcc -g -fPIC -c -o btf.o btf.c
gcc -g -DHAVE_LIBELF_MMAP_SUPPORT -DCOMPAT_NEED_REALLOCARRAY -fPIC -I. -I/tmp/linux-4.18/tools/include -I/tmp/linux-4.18/tools/arch/x86/include/uapi -I/tmp/linux-4.18/tools/include/uapi -I/tmp/linux-4.18/tools/perf -D"BUILD_STR(s)=#s" -c -o btf.o btf.c


# 步驟A4
# gcc -g -fPIC -c -o nlattr.o nlattr.c
gcc -g -DHAVE_LIBELF_MMAP_SUPPORT -DCOMPAT_NEED_REALLOCARRAY -fPIC -I. -I/tmp/linux-4.18/tools/include -I/tmp/linux-4.18/tools/arch/x86/include/uapi -I/tmp/linux-4.18/tools/include/uapi -I/tmp/linux-4.18/tools/perf -D"BUILD_STR(s)=#s" -c -o nlattr.o nlattr.c


# 步驟B
ld -r -o libbpf-in.o  libbpf.o bpf.o nlattr.o btf.o


# 步驟C
ar rcs libbpf.a libbpf-in.o 


cd /tmp/linux-4.18/


# 步驟D
# gcc -O2 -std=gnu89 -c -o bpf_load.o bpf_load.c
gcc -O2 -fomit-frame-pointer -std=gnu89 -I./usr/include -I./tools/lib/ -I./tools/testing/selftests/bpf/ -I./tools/lib/ -I./tools/include -I./tools/perf -I./usr/include -Wno-unused-variable -c -o samples/bpf/bpf_load.o samples/bpf/bpf_load.c


# 步驟E
# gcc -O2 -std=gnu89 -c -o trace_output_user.o trace_output_user.c
gcc -O2 -fomit-frame-pointer -std=gnu89 -I./usr/include -I./tools/lib/ -I./tools/testing/selftests/bpf/ -I./tools/lib/ -I./tools/include -I./tools/perf -I./tools/lib/bpf/ -c -o samples/bpf/trace_output_user.o samples/bpf/trace_output_user.c


# 步驟F
# gcc -O2 -std=gnu89 -c -o trace_helpers.o trace_helpers.c
gcc -O2 -fomit-frame-pointer -std=gnu89 -I./usr/include -I./tools/lib/ -I./tools/testing/selftests/bpf/ -I./tools/lib/ -I./tools/include -I./tools/perf -I./tools/lib/bpf/ -c -o samples/bpf/../../tools/testing/selftests/bpf/trace_helpers.o samples/bpf/../../tools/testing/selftests/bpf/trace_helpers.c


# 步驟G
# gcc -o trace_output bpf_load.o trace_output_user.o trace_helpers.o libbpf.a -lelf -lrt
gcc -o samples/bpf/trace_output samples/bpf/bpf_load.o samples/bpf/trace_output_user.o samples/bpf/../../tools/testing/selftests/bpf/trace_helpers.o /tmp/linux-4.18/samples/bpf/../../tools/lib/bpf/libbpf.a -lelf -lrt


# 步驟H
clang -nostdinc -isystem /usr/lib/gcc/x86_64-redhat-linux/8/include -I./arch/x86/include -I./arch/x86/include/generated -I./include -I./arch/x86/include/uapi -I./arch/x86/include/generated/uapi -I./include/uapi -I./include/generated/uapi -include ./include/linux/kconfig.h -Isamples/bpf -I./tools/testing/selftests/bpf/ -D__KERNEL__ -D__BPF_TRACING__ -D__TARGET_ARCH_x86 -O2 -emit-llvm -c samples/bpf/trace_output_kern.c -o - | llc -march=bpf -filetype=obj -o samples/bpf/trace_output_kern.o
/ END /





審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7632

    瀏覽量

    141731
  • 編譯
    +關(guān)注

    關(guān)注

    0

    文章

    679

    瀏覽量

    33986
  • shell編程
    +關(guān)注

    關(guān)注

    0

    文章

    10

    瀏覽量

    5936
  • gcc編譯器
    +關(guān)注

    關(guān)注

    0

    文章

    78

    瀏覽量

    3741

原文標(biāo)題:eBPF動(dòng)手實(shí)踐系列一:解構(gòu)內(nèi)核源碼eBPF樣例編譯過程

文章出處:【微信號(hào):LinuxDev,微信公眾號(hào):Linux閱碼場】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    RTsmart源碼編譯錯(cuò)誤,提醒我缺少文件導(dǎo)致make失敗,為什么?

    最近重新拉取Gitee的源碼,根據(jù)官網(wǎng)文檔來操作的 選擇的硬件配置是k230_rtos_01studio_defconfig 一直到執(zhí)行make,都是和以前一可以實(shí)現(xiàn)的,但是在配置了
    發(fā)表于 06-20 06:25

    【經(jīng)驗(yàn)分享】在Omni3576上編譯Redis-8.0.2源碼,并安裝及性能測試

    本文首先介紹Redis是什么,然后介紹如何在Omni3576上編譯Redis-8.0.2源碼,以及從源碼編譯、安裝Redis,最后介紹如何在Omni3576上運(yùn)行Redis性能測試,并
    的頭像 發(fā)表于 06-05 08:05 ?291次閱讀
    【經(jīng)驗(yàn)分享】在Omni3576上<b class='flag-5'>編譯</b>Redis-8.0.2<b class='flag-5'>源碼</b>,并安裝及性能測試

    Linux內(nèi)核編譯失敗?移動(dòng)硬盤和虛擬機(jī)的那些事兒

    Linux內(nèi)核卻失敗了,這是咋回事?FAT和NTFS文件系統(tǒng)不能支持軟鏈接,在這寫格式的磁盤里編譯內(nèi)核會(huì)失敗,同樣也不能在這樣的磁盤里解壓內(nèi)核源碼
    的頭像 發(fā)表于 04-11 11:36 ?346次閱讀
    Linux<b class='flag-5'>內(nèi)核</b><b class='flag-5'>編譯</b>失???移動(dòng)硬盤和虛擬機(jī)的那些事兒

    KiCad直播活動(dòng)(三):在 Windows上編譯KiCad 手把手教您編譯/構(gòu)建 KiCad 源碼

    Developer Ethan 同學(xué),手把手教您編譯/構(gòu)建 KiCad 源碼: 開發(fā)工具安裝 環(huán)境變量配置 使用 VS2022 構(gòu)建 KiCad 參與直播的小伙伴還有機(jī)會(huì)獲得 KiCon Badge
    的頭像 發(fā)表于 03-24 11:14 ?798次閱讀
    KiCad直播活動(dòng)(三):在 Windows上<b class='flag-5'>編譯</b>KiCad 手把手教您<b class='flag-5'>編譯</b>/構(gòu)建 KiCad <b class='flag-5'>源碼</b>

    求助,關(guān)于STM32MP257編譯內(nèi)核問題求解

    出了linux-6.1.82內(nèi)核源碼,但是當(dāng)我按照官網(wǎng)Getting started->STM32MP257-EV1->Modify, rebuild and reload
    發(fā)表于 03-13 06:24

    技術(shù)分享 | RK3568編譯第三方驅(qū)動(dòng)

    這里就以我司IAC-RK3568-Kit開發(fā)板為,分享如何在當(dāng)前內(nèi)核編譯第三方驅(qū)動(dòng)模塊。我們需要向模塊供應(yīng)商拿到一份適配Linux的驅(qū)動(dòng)源碼,這里主要是要向供應(yīng)
    的頭像 發(fā)表于 03-06 17:25 ?629次閱讀
    技術(shù)分享 | RK3568<b class='flag-5'>編譯</b>第三方驅(qū)動(dòng)

    利用eBPF程序繞過內(nèi)核以加速存儲(chǔ)訪問

    隨著微秒級(jí)NVMe存儲(chǔ)的蓬勃發(fā)展,Linux內(nèi)核存儲(chǔ)棧的開銷幾乎是存儲(chǔ)訪問時(shí)間的兩倍,已經(jīng)成為性能瓶頸。
    的頭像 發(fā)表于 03-01 16:09 ?530次閱讀
    利用<b class='flag-5'>eBPF</b>程序繞過<b class='flag-5'>內(nèi)核</b>以加速存儲(chǔ)訪問

    關(guān)于驅(qū)動(dòng)編譯進(jìn)蜂鳥派內(nèi)核時(shí)候遇到的問題

    內(nèi)核源碼為: 編譯內(nèi)核可以通過,但編譯驅(qū)動(dòng)的時(shí)候無法生成.ko文件
    發(fā)表于 12-30 17:02

    嵌入式學(xué)習(xí)-飛凌嵌入式ElfBoard ELF 1板卡-內(nèi)核編譯之初次編譯

    接下來我們就進(jìn)行內(nèi)核代碼的初次編譯,直接使用我們適配好的Linux內(nèi)核源碼進(jìn)行編譯。為了使編譯
    發(fā)表于 12-18 08:55

    飛凌嵌入式ElfBoard ELF 1板卡-內(nèi)核編譯之初次編譯

    接下來我們就進(jìn)行內(nèi)核代碼的初次編譯,直接使用我們適配好的Linux內(nèi)核源碼進(jìn)行編譯。為了使編譯
    發(fā)表于 12-17 09:34

    嵌入式學(xué)習(xí)-飛凌嵌入式ElfBoard ELF 1板卡-Linux內(nèi)核移植之內(nèi)核簡介

    上進(jìn)行的適配,所以講解均以4.1.15版本內(nèi)核。 (二)可以選擇使用git克隆,也可以選擇下載ZIP壓縮包。 獲取ELF 1開發(fā)板源碼 ELF 1的內(nèi)核
    發(fā)表于 12-16 13:08

    飛凌嵌入式ElfBoard ELF 1板卡-Linux內(nèi)核移植之內(nèi)核簡介

    ,所以講解均以4.1.15版本內(nèi)核。(二)可以選擇使用git克隆,也可以選擇下載ZIP壓縮包。獲取ELF 1開發(fā)板源碼ELF 1的內(nèi)核源碼
    發(fā)表于 12-13 09:03

    每次Vivado編譯的結(jié)果都一

    很多FPGA工程師都有這種困惑,Vivado每次編譯的結(jié)果都一嗎? 在AMD官網(wǎng)上,有這樣一個(gè)帖子: Are Vivado results repeatable for identical
    的頭像 發(fā)表于 11-11 11:23 ?1237次閱讀
    每次Vivado<b class='flag-5'>編譯</b>的結(jié)果都一<b class='flag-5'>樣</b>嗎

    java反編譯能拿到源碼

    Java反編譯是一種將編譯后的Java字節(jié)碼(.class文件)轉(zhuǎn)換回Java源代碼的過程。雖然反編譯可以幫助理解代碼的邏輯和結(jié)構(gòu),但它并不總是能完美地還原原始源代碼。反
    的頭像 發(fā)表于 09-02 11:03 ?1802次閱讀

    linux驅(qū)動(dòng)程序的編譯方法是什么

    Linux驅(qū)動(dòng)程序的編譯方法主要包括兩種: 與內(nèi)核一起編譯編譯成獨(dú)立的內(nèi)核模塊 。以下是對(duì)這兩種方法的介紹: 一、與
    的頭像 發(fā)表于 08-30 14:46 ?1255次閱讀