.\" Man page generated from reStructuredText .\" by the Docutils 0.23 manpage writer. . . .nr rst2man-indent-level 0 . .de1 rstReportMargin \\$1 \\n[an-margin] level \\n[rst2man-indent-level] level margin: \\n[rst2man-indent\\n[rst2man-indent-level]] - \\n[rst2man-indent0] \\n[rst2man-indent1] \\n[rst2man-indent2] .. .de1 INDENT .\" .rstReportMargin pre: . RS \\$1 . nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin] . nr rst2man-indent-level +1 .\" .rstReportMargin post: .. .de UNINDENT . RE .\" indent \\n[an-margin] .\" old: \\n[rst2man-indent\\n[rst2man-indent-level]] .nr rst2man-indent-level -1 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]] .in \\n[rst2man-indent\\n[rst2man-indent-level]]u .. .TH "bpftool-gen" "8" "" "" .SH "نام (NAME)" bpftool-gen \- ابزاری برای تولید هدرهای C اسکلت کد BPF .SH "خلاصه دستور (SYNOPSIS)" .sp \fBbpftool\fP [\fIOPTIONS\fP] \fBgen\fP \fICOMMAND\fP .sp \fIOPTIONS\fP := { { \fB\-j\fP | \fB\-\-json\fP } [{ \fB\-p\fP | \fB\-\-pretty\fP }] | { \fB\-d\fP | \fB\-\-debug\fP } | { \fB\-L\fP | \fB\-\-use\-loader\fP } | [ { \fB\-S\fP | \fB\-\-sign\fP } {\fB\-k\fP } \fB\-i\fP ] } .sp \fICOMMAND\fP := { \fBobject\fP | \fBskeleton\fP | \fBhelp\fP } .SH "دستورات GEN (GEN COMMANDS)" .nf \fBbpftool\fP \fBgen object\fP \fIOUTPUT_FILE\fP \fIINPUT_FILE\fP [\fIINPUT_FILE\fP\&...] \fBbpftool\fP \fBgen skeleton\fP \fIFILE\fP [\fBname\fP \fIOBJECT_NAME\fP] \fBbpftool\fP \fBgen subskeleton\fP \fIFILE\fP [\fBname\fP \fIOBJECT_NAME\fP] \fBbpftool\fP \fBgen min_core_btf\fP \fIINPUT\fP \fIOUTPUT\fP \fIOBJECT\fP [\fIOBJECT\fP\&...] \fBbpftool\fP \fBgen help\fP .fi .sp .SH "توضیحات (DESCRIPTION)" .INDENT 0.0 .TP .B bpftool gen object \fIOUTPUT_FILE\fP \fIINPUT_FILE\fP [\fIINPUT_FILE\fP\&...] پیوند ایستا (ترکیب) یک یا چند \fIINPUT_FILE\fP در قالب یک پرونده نهایی \fIOUTPUT_FILE\fP واحد. تمام پرونده‌های درگیر، پرونده‌های شیء BPF ELF هستند. .sp قوانین پیوند ایستای BPF عمدتاً مشابه پرونده‌های شیء فضای کاربری است، اما علاوه بر ترکیب بخش‌های داده و دستورالعمل، داده‌های \&.BTF و \&.BTF.ext (در صورت وجود در هر یک از پرونده‌های ورودی) با یکدیگر ترکیب می‌شوند. داده‌های \&.BTF یکتاسازی (deduplicate) می‌شوند، بنابراین تمام انواع داده مشترک در میان \fIINPUT_FILE\fPها فقط یک بار در اطلاعات نهایی BTF نمایش داده خواهند شد. .sp پیوند ایستای BPF امکان تقسیم کد منبع BPF را به پرونده‌های کامپایل‌شده جداگانه فراهم می‌کند که سپس در یک پرونده شیء واحد BPF پیوند داده می‌شوند؛ این پرونده می‌تواند برای تولید اسکلت BPF (با دستور \fBgen skeleton\fP) استفاده شود یا مستقیماً به \fBlibbpf\fP (با استفاده از خانواده رابط‌های برنامه‌نویسی \fBbpf_object__open()\fP) منتقل گردد. .TP .B bpftool gen skeleton \fIFILE\fP تولید پرونده هدر C اسکلت BPF برای \fIFILE\fP داده‌شده. .sp اسکلت BPF یک رابط جایگزین برای رابط‌های برنامه‌نویسی موجود در libbpf به‌منظور کار با اشیاء BPF است. کد اسکلت به‌منظور کوتاه کردن و ساده‌سازی چشمگیر کدهای بارگذاری و کار با برنامه‌های BPF از سمت فضای کاربری در نظر گرفته شده است. کد تولیدشده متناسب با پرونده شیء ورودی BPF (\fIFILE\fP) تنظیم می‌شود و ساختار آن را با فهرست کردن نقشه‌ها، برنامه‌ها، متغیرها و موارد موجود بازتاب می‌دهد. اسکلت نیاز به جستجوی مؤلفه‌های یادشده با نام را از بین می‌برد. در عوض، در صورت موفقیت‌آمیز بودن نمونه‌سازی اسکلت، آن‌ها در ساختار اسکلت به‌صورت انواع معتبر libbpf (مانند اشاره‌گر \fBstruct bpf_map\fP) مقداردهی می‌شوند و می‌توانند به رابط‌های برنامه‌نویسی عمومی و موجود libbpf پاس داده شوند. .sp علاوه بر دسترسی ساده و مطمئن به نقشه‌ها و برنامه‌ها، اسکلت فضایی برای ذخیره‌سازی پیوندهای BPF (\fBstruct bpf_link\fP) برای هر برنامه BPF درون شیء BPF فراهم می‌کند. در صورت درخواست، برنامه‌های BPF پشتیبانی‌شده به‌صورت خودکار متصل (attach) می‌شوند و پیوندهای BPF حاصل، برای استفاده‌های بعدی کاربر در فیلدهای از پیش تخصیص‌یافته در ساختار اسکلت ذخیره می‌گردند. برای برنامه‌های BPF که توسط libbpf به‌طور خودکار متصل نمی‌شوند، کاربر می‌تواند آن‌ها را به‌صورت دستی متصل کند، اما پیوند BPF حاصل را در فیلد پیوند مربوط به هر برنامه ذخیره نماید. تمام این پیوندهای برپاشده به‌طور خودکار هنگام نابودی اسکلت BPF از بین می‌روند. این امر نیاز کاربران به مدیریت دستی پیوندها و اتکا به پشتیبانی libbpf برای جداسازی برنامه‌ها و آزادسازی منابع را برطرف می‌کند. .sp یکی دیگر از قابلیت‌های ارائه‌شده توسط اسکلت BPF، رابطی برای متغیرهای سراسری از تمام انواع پشتیبانی‌شده است: متغیرهای تغییرپذیر، فقط‌خواندنی و همچنین متغیرهای خارجی (extern). این رابط امکان مقداردهی اولیه متغیرها را پیش از بارگذاری و اعتبارسنجی شیء BPF توسط هسته فراهم می‌کند. برای متغیرهای غیر فقط‌خواندنی، می‌توان از همان رابط برای دریافت مقادیر متغیرهای سراسری در سمت فضای کاربری استفاده کرد، حتی اگر توسط کد BPF تغییر یافته باشند. .sp در حین تولید اسکلت، محتوای پرونده شیء منبع BPF (\fIFILE\fP) درون کد تولیدشده جاسازی می‌شود و بنابراین نیازی به نگهداری پرونده شیء در کنار برنامه نیست. این ویژگی تطابق یک‌به‌یک اسکلت و پرونده شیء BPF و هماهنگ ماندن همیشگی آن‌ها را تضمین می‌کند. کد تولیدشده تحت مجوزهای دوگانه LGPL\-2.1 و BSD\-2\-Clause منتشر می‌شود. .sp یکی از اهداف طراحی و ضمانت‌های اسکلت این است که رابط‌های آن با رابط‌های برنامه‌نویسی عمومی libbpf تعامل‌پذیر باشند. کاربر همواره باید بتواند از رابط برنامه‌نویسی اسکلت برای ایجاد و بارگذاری شیء BPF استفاده کند و پس از آن از رابط‌های برنامه‌نویسی libbpf برای ادامه کار با نقشه‌ها، برنامه‌ها و موارد مشخص دیگر بهره ببرد. .sp به‌عنوان بخشی از اسکلت، چند تابع سفارشی تولید می‌شود. نام هر یک از آن‌ها با نام شیء پیشوند می‌خورد. نام شیء می‌تواند از نام پرونده شیء استخراج شود؛ به‌عنوان مثال اگر نام پرونده شیء BPF برابر \fBexample.o\fP باشد، نام شیء BPF برابر با \fBexample\fP خواهد بود. همچنین نام شیء می‌تواند با پارامتر \fBname\fP \fIOBJECT_NAME\fP به‌طور صریح مشخص گردد. توابع سفارشی زیر فراهم می‌شوند (با فرض اینکه \fBexample\fP نام شیء باشد): .INDENT 7.0 .IP \(bu 2 \fBexample__open\fP و \fBexample__open_opts\fP\&. این توابع برای نمونه‌سازی اسکلت استفاده می‌شوند. این مورد با رابط برنامه‌نویسی \fBbpf_object__open\fP() در libbpf مطابقت دارد. گونه \fB_opts\fP گزینه‌های اضافی \fBbpf_object_open_opts\fP را می‌پذیرد. .IP \(bu 2 \fBexample__load\fP\&. این تابع نقشه‌ها را ایجاد می‌کند، برنامه‌های BPF را بارگذاری و اعتبارسنجی می‌نماید و نقشه‌های داده‌های سراسری را مقداردهی اولیه می‌کند. این مورد با رابط برنامه‌نویسی \fBbpf_object__load\fP() در libbpf مطابقت دارد. .IP \(bu 2 \fBexample__open_and_load\fP فراخوانی‌های \fBexample__open\fP و \fBexample__load\fP را در قالب یک عملیات متداول ترکیب می‌کند. .IP \(bu 2 \fBexample__attach\fP و \fBexample__detach\fP\&. این جفت تابع به ترتیب امکان متصل کردن (attach) و جدا کردن (detach) شیء BPF از قبل بارگذاری‌شده را فراهم می‌کنند. فقط برنامه‌های BPF از انواع پشتیبانی‌شده توسط libbpf برای اتصال خودکار، به‌صورت خودکار متصل شده و پیوندهای BPF متناظر آن‌ها نمونه‌سازی می‌شوند. برای سایر برنامه‌های BPF، کاربر می‌تواند به‌صورت دستی یک پیوند BPF ایجاد کند و آن را به فیلدهای متناظر در ساختار اسکلت اختصاص دهد. تابع \fBexample__detach\fP هم پیوندهای ایجادشده به‌صورت خودکار و هم پیوندهایی که کاربر دستی مقداردهی کرده است را جدا می‌سازد. .IP \(bu 2 \fBexample__destroy\fP\&. جداسازی و تخلیه برنامه‌های BPF و آزادسازی تمام منابع استفاده‌شده توسط اسکلت و شیء BPF. .UNINDENT .sp اگر شیء BPF دارای متغیرهای سراسری باشد، ساختارهای متناظری با چینش حافظه منطبق بر چینش بخش داده‌های سراسری ایجاد خواهد شد. بخش‌های داده/ساختارهای پشتیبانی‌شده در حال حاضر عبارتند از: ساختارها/بخش‌های داده \fI\&.data\fP، \fI\&.bss\fP، \fI\&.rodata\fP و \fI\&.kconfig\fP. این بخش‌های داده/ساختارها در صورتی که پیش از \fBexample__load\fP تنظیم شوند، می‌توانند برای مقداردهی اولیه مقادیر متغیرها استفاده شوند. پس از آن، در صورتی که هسته مقصد از آرایه‌های نگاشت‌شده در حافظه BPF پشتیبانی کند، می‌توان از همان ساختارها برای واکشی و به‌روزرسانی داده‌های (غیر فقط‌خواندنی) از سمت فضای کاربری، با همان سادگی سمت BPF استفاده نمود. .TP .B bpftool gen subskeleton \fIFILE\fP تولید پرونده هدر C زیر‌اسکلت (subskeleton) BPF برای \fIFILE\fP داده‌شده. .sp زیر‌اسکلت‌ها مشابه اسکلت‌ها هستند، با این تفاوت که مالک نقشه‌ها، برنامه‌ها یا متغیرهای سراسری متناظر نیستند. آن‌ها نیازمند این هستند که پرونده شیء استفاده‌شده برای تولیدشان، از قبل از طریق روش‌های دیگر درون یک \fIbpf_object\fP بارگذاری شده باشد. .sp این قابلیت زمانی مفید است که یک کتابخانه درون یک برنامه بزرگ‌تر BPF گنجانده شده باشد. یک زیر‌اسکلت برای کتابخانه به تمام اشیاء و متغیرهای سراسری تعریف‌شده در آن دسترسی خواهد داشت، بدون اینکه نیازی به دانستن درباره برنامه بزرگ‌تر داشته باشد. .sp در نتیجه، تنها دو تابع برای زیر‌اسکلت‌ها تعریف شده است: .INDENT 7.0 .IP \(bu 2 \fBexample__open(bpf_object*)\fP\&. نمونه‌سازی یک زیر‌اسکلت از یک \fBbpf_object\fP که از قبل باز شده (اما لزوماً بارگذاری نشده است). .IP \(bu 2 \fBexample__destroy()\fP\&. آزادسازی فضای حافظه اختصاص‌یافته برای زیر‌اسکلت؛ اما این تابع برنامه‌ها یا نقشه‌های BPF را تخلیه \fIنمی‌کند\fP. .UNINDENT .TP .B bpftool gen min_core_btf \fIINPUT\fP \fIOUTPUT\fP \fIOBJECT\fP [\fIOBJECT\fP\&...] تولید یک پرونده کمینه BTF به‌عنوان \fIOUTPUT\fP، مشتق‌شده از پرونده ورودی BTF به نام \fIINPUT\fP، شامل تمام انواع داده مورد نیاز BTF تا بازنشانی‌های (relocations) مربوط به CO\-RE برای یک یا چند شیء eBPF داده‌شده برآورده شوند. .sp هنگامی که هسته‌ها با CONFIG_DEBUG_INFO_BTF کامپایل نشده باشند، libbpf در زمان بارگذاری یک شیء eBPF مجبور است به پرونده‌های خارجی BTF تکیه کند تا بتواند بازنشانی‌های CO\-RE را محاسبه کند. .sp معمولاً یک پرونده خارجی BTF با استفاده از pahole از داده‌های موجود DWARF هسته ساخته می‌شود. این پرونده شامل تمام انواع استفاده‌شده توسط تصویر هسته مربوطه است و به همین دلیل بسیار حجیم است. .sp قابلیت min_core_btf پرونده‌های کوچک‌تر BTF متناسب با یک یا چند شیء eBPF ایجاد می‌کند تا بتوان آن‌ها را همراه با یک برنامه مبتنی بر eBPF CO\-RE توزیع کرد و برنامه را برای نسخه‌های مختلف هسته قابل‌حمل (portable) ساخت. .sp برای اطلاعات بیشتر در مورد نحوه استفاده، مثال‌های زیر را بررسی کنید. .TP .B bpftool gen help چاپ پیام راهنمای کوتاه. .UNINDENT .SH "گزینه‌ها (OPTIONS)" .INDENT 0.0 .TP .B \-h\fP,\fB \-\-help چاپ پیام راهنمای کوتاه (مشابه \fBbpftool help\fP). .TP .B \-V\fP,\fB \-\-version چاپ شماره نسخه bpftool (مشابه \fBbpftool version\fP)، شماره نسخه libbpf مورد استفاده، و ویژگی‌های اختیاری که هنگام کامپایل bpftool گنجانده شده‌اند. ویژگی‌های اختیاری شامل پیوند به LLVM یا libbfd برای فراهم کردن دیس‌اسمبلر برنامه‌های JIT‌شده (\fBbpftool prog dump jited\fP) و استفاده از اسکلت‌های BPF است (برخی ویژگی‌ها مانند \fBbpftool prog profile\fP یا نمایش pidهای مرتبط با اشیاء BPF ممکن است به آن وابسته باشند). .TP .B \-j\fP,\fB \-\-json تولید خروجی در قالب JSON. برای دستوراتی که نمی‌توانند خروجی JSON تولید کنند، این گزینه بی‌تأثیر است. .TP .B \-p\fP,\fB \-\-pretty تولید خروجی JSON خوانا برای انسان. متضمن گزینه \fB\-j\fP است. .TP .B \-d\fP,\fB \-\-debug چاپ تمام گزارش‌ها و لاگ‌های در دسترس، حتی اطلاعات در سطح اشکال‌زدایی (debug). این شامل لاگ‌های libbpf و همچنین اعتبارسنج (verifier) در زمان تلاش برای بارگذاری برنامه‌ها است. .UNINDENT .INDENT 0.0 .TP .B \-L\fP,\fB \-\-use\-loader برای اسکلت‌ها، یک اسکلت «سبک» (light) تولید می‌کند (که با عنوان اسکلت «loader» نیز شناخته می‌شود). یک اسکلت سبک حاوی یک برنامه eBPF بارگذار (loader) است. این اسکلت از بخش عمده زیرساخت‌های libbpf استفاده نمی‌کند و نیازی به libelf ندارد. .TP .B \-S\fP,\fB \-\-sign برای اسکلت‌ها، یک اسکلت امضاشده تولید می‌کند. این گزینه باید همراه با \fB\-k\fP و \fB\-i\fP استفاده شود. استفاده از این فلگ به‌طور ضمنی \fB\-\-use\-loader\fP را فعال می‌کند. .TP .BI \-k \ مسیر پرونده کلید خصوصی در قالب PEM، مورد نیاز برای امضا کردن. .TP .BI \-i \ مسیر پرونده گواهی X.509 در قالب PEM یا DER، مورد نیاز برای امضا کردن. .UNINDENT .SH "مثال‌ها (EXAMPLES)" .sp \fB$ cat example1.bpf.c\fP .INDENT 0.0 .INDENT 3.5 .sp .EX #include #include #include #include const volatile int param1 = 42; bool global_flag = true; struct { int x; } data = {}; SEC(\(dqraw_tp/sys_enter\(dq) int handle_sys_enter(struct pt_regs *ctx) { static long my_static_var; if (global_flag) my_static_var++; else data.x += param1; return 0; } .EE .UNINDENT .UNINDENT .sp \fB$ cat example2.bpf.c\fP .INDENT 0.0 .INDENT 3.5 .sp .EX #include #include #include struct { __uint(type, BPF_MAP_TYPE_HASH); __uint(max_entries, 128); __type(key, int); __type(value, long); } my_map SEC(\(dq.maps\(dq); SEC(\(dqraw_tp/sys_exit\(dq) int handle_sys_exit(struct pt_regs *ctx) { int zero = 0; bpf_map_lookup_elem(&my_map, &zero); return 0; } .EE .UNINDENT .UNINDENT .sp \fB$ cat example3.bpf.c\fP .INDENT 0.0 .INDENT 3.5 .sp .EX #include #include #include /* This header file is provided by the bpf_testmod module. */ #include \(dqbpf_testmod.h\(dq int test_2_result = 0; /* bpf_Testmod.ko calls this function, passing a \(dq4\(dq * and testmod_map\->data. */ SEC(\(dqstruct_ops/test_2\(dq) void BPF_PROG(test_2, int a, int b) { test_2_result = a + b; } SEC(\(dq.struct_ops\(dq) struct bpf_testmod_ops testmod_map = { .test_2 = (void *)test_2, .data = 0x1, }; .EE .UNINDENT .UNINDENT .sp این یک نمونه برنامه BPF با سه برنامه BPF و ترکیبی از نقشه‌ها و متغیرهای سراسری BPF است. کد منبع در سه پرونده کد منبع تقسیم شده است. .sp \fB$ clang \-\-target=bpf \-g example1.bpf.c \-o example1.bpf.o\fP .sp \fB$ clang \-\-target=bpf \-g example2.bpf.c \-o example2.bpf.o\fP .sp \fB$ clang \-\-target=bpf \-g example3.bpf.c \-o example3.bpf.o\fP .sp \fB$ bpftool gen object example.bpf.o example1.bpf.o example2.bpf.o example3.bpf.o\fP .sp این مجموعه دستورات، پرونده‌های \fIexample1.bpf.c\fP، \fIexample2.bpf.c\fP و \fIexample3.bpf.c\fP را به‌صورت جداگانه کامپایل کرده و سپس پرونده‌های شیء مربوطه را در قالب پرونده شیء نهایی BPF ELF به نام \fIexample.bpf.o\fP به‌طور ایستا پیوند می‌دهد. .sp \fB$ bpftool gen skeleton example.bpf.o name example | tee example.skel.h\fP .INDENT 0.0 .INDENT 3.5 .sp .EX /* SPDX\-License\-Identifier: (LGPL\-2.1 OR BSD\-2\-Clause) */ /* THIS FILE IS AUTOGENERATED! */ #ifndef __EXAMPLE_SKEL_H__ #define __EXAMPLE_SKEL_H__ #include #include struct example { struct bpf_object_skeleton *skeleton; struct bpf_object *obj; struct { struct bpf_map *rodata; struct bpf_map *data; struct bpf_map *bss; struct bpf_map *my_map; struct bpf_map *testmod_map; } maps; struct { struct example__testmod_map__bpf_testmod_ops { const struct bpf_program *test_1; const struct bpf_program *test_2; int data; } *testmod_map; } struct_ops; struct { struct bpf_program *handle_sys_enter; struct bpf_program *handle_sys_exit; } progs; struct { struct bpf_link *handle_sys_enter; struct bpf_link *handle_sys_exit; } links; struct example__bss { struct { int x; } data; int test_2_result; } *bss; struct example__data { _Bool global_flag; long int handle_sys_enter_my_static_var; } *data; struct example__rodata { int param1; } *rodata; }; static void example__destroy(struct example *obj); static inline struct example *example__open_opts( const struct bpf_object_open_opts *opts); static inline struct example *example__open(); static inline int example__load(struct example *obj); static inline struct example *example__open_and_load(); static inline int example__attach(struct example *obj); static inline void example__detach(struct example *obj); #endif /* __EXAMPLE_SKEL_H__ */ .EE .UNINDENT .UNINDENT .sp \fB$ cat example.c\fP .INDENT 0.0 .INDENT 3.5 .sp .EX #include \(dqexample.skel.h\(dq int main() { struct example *skel; int err = 0; skel = example__open(); if (!skel) goto cleanup; skel\->rodata\->param1 = 128; /* Change the value through the pointer of shadow type */ skel\->struct_ops.testmod_map\->data = 13; err = example__load(skel); if (err) goto cleanup; /* The result of the function test_2() */ printf(\(dqtest_2_result: %d\en\(dq, skel\->bss\->test_2_result); err = example__attach(skel); if (err) goto cleanup; /* all libbpf APIs are usable */ printf(\(dqmy_map name: %s\en\(dq, bpf_map__name(skel\->maps.my_map)); printf(\(dqsys_enter prog FD: %d\en\(dq, bpf_program__fd(skel\->progs.handle_sys_enter)); /* detach and re\-attach sys_exit program */ bpf_link__destroy(skel\->links.handle_sys_exit); skel\->links.handle_sys_exit = bpf_program__attach(skel\->progs.handle_sys_exit); printf(\(dqmy_static_var: %ld\en\(dq, skel\->bss\->handle_sys_enter_my_static_var); cleanup: example__destroy(skel); return err; } .EE .UNINDENT .UNINDENT .sp \fB# ./example\fP .INDENT 0.0 .INDENT 3.5 .sp .EX test_2_result: 17 my_map name: my_map sys_enter prog FD: 8 my_static_var: 7 .EE .UNINDENT .UNINDENT .sp این یک نسخه خلاصه‌شده از اسکلت تولیدشده برای کد نمونه بالاست. .SS min_core_btf .sp \fB$ bpftool btf dump file 5.4.0\-example.btf format raw\fP .INDENT 0.0 .INDENT 3.5 .sp .EX [1] INT \(aqlong unsigned int\(aq size=8 bits_offset=0 nr_bits=64 encoding=(none) [2] CONST \(aq(anon)\(aq type_id=1 [3] VOLATILE \(aq(anon)\(aq type_id=1 [4] ARRAY \(aq(anon)\(aq type_id=1 index_type_id=21 nr_elems=2 [5] PTR \(aq(anon)\(aq type_id=8 [6] CONST \(aq(anon)\(aq type_id=5 [7] INT \(aqchar\(aq size=1 bits_offset=0 nr_bits=8 encoding=(none) [8] CONST \(aq(anon)\(aq type_id=7 [9] INT \(aqunsigned int\(aq size=4 bits_offset=0 nr_bits=32 encoding=(none) .EE .UNINDENT .UNINDENT .sp \fB$ bpftool btf dump file one.bpf.o format raw\fP .INDENT 0.0 .INDENT 3.5 .sp .EX [1] PTR \(aq(anon)\(aq type_id=2 [2] STRUCT \(aqtrace_event_raw_sys_enter\(aq size=64 vlen=4 \(aqent\(aq type_id=3 bits_offset=0 \(aqid\(aq type_id=7 bits_offset=64 \(aqargs\(aq type_id=9 bits_offset=128 \(aq__data\(aq type_id=12 bits_offset=512 [3] STRUCT \(aqtrace_entry\(aq size=8 vlen=4 \(aqtype\(aq type_id=4 bits_offset=0 \(aqflags\(aq type_id=5 bits_offset=16 \(aqpreempt_count\(aq type_id=5 bits_offset=24 .EE .UNINDENT .UNINDENT .sp \fB$ bpftool gen min_core_btf 5.4.0\-example.btf 5.4.0\-smaller.btf one.bpf.o\fP .sp \fB$ bpftool btf dump file 5.4.0\-smaller.btf format raw\fP .INDENT 0.0 .INDENT 3.5 .sp .EX [1] TYPEDEF \(aqpid_t\(aq type_id=6 [2] STRUCT \(aqtrace_event_raw_sys_enter\(aq size=64 vlen=1 \(aqargs\(aq type_id=4 bits_offset=128 [3] STRUCT \(aqtask_struct\(aq size=9216 vlen=2 \(aqpid\(aq type_id=1 bits_offset=17920 \(aqreal_parent\(aq type_id=7 bits_offset=18048 [4] ARRAY \(aq(anon)\(aq type_id=5 index_type_id=8 nr_elems=6 [5] INT \(aqlong unsigned int\(aq size=8 bits_offset=0 nr_bits=64 encoding=(none) [6] TYPEDEF \(aq__kernel_pid_t\(aq type_id=8 [7] PTR \(aq(anon)\(aq type_id=3 [8] INT \(aqint\(aq size=4 bits_offset=0 nr_bits=32 encoding=SIGNED .EE .UNINDENT .UNINDENT .sp اکنون پرونده «5.4.0\-smaller.btf» می‌تواند توسط libbpf به‌عنوان یک پرونده خارجی BTF هنگام بارگذاری شیء «one.bpf.o» در هسته «5.4.0\-example» استفاده شود. توجه داشته باشید که پرونده BTF تولیدشده اجازه بارگذاری سایر اشیاء eBPF را نمی‌دهد، بلکه فقط مواردی که به min_core_btf داده شده‌اند مجاز خواهند بود. .INDENT 0.0 .INDENT 3.5 .sp .EX LIBBPF_OPTS(bpf_object_open_opts, opts, .btf_custom_path = \(dq5.4.0\-smaller.btf\(dq); struct bpf_object *obj; obj = bpf_object__open_file(\(dqone.bpf.o\(dq, &opts); \&... .EE .UNINDENT .UNINDENT .SH "همچنین ببینید (SEE ALSO)" .sp \fBbpf\fP(2), \fBbpf\-helpers\fP(7), \fBbpftool\fP(8), \fBbpftool\-btf\fP(8), \fBbpftool\-cgroup\fP(8), \fBbpftool\-feature\fP(8), \fBbpftool\-iter\fP(8), \fBbpftool\-link\fP(8), \fBbpftool\-map\fP(8), \fBbpftool\-net\fP(8), \fBbpftool\-perf\fP(8), \fBbpftool\-prog\fP(8), \fBbpftool\-struct_ops\fP(8), \fBbpftool\-token\fP(8) .\" End of generated man page.