0
  0   ;ˆl–ßi~”êh¥8 Eq–®
bÑ¿ÉƒD_ŒuÐb&=Ly[Ï¿ÁÌ `    ;ý7zXZ  i"Þ6 !   t/å£à	ÿ#]  áyU}“½,ŸVtÆS~ÓV†ª‹Ó£Và±ÉçþºZŸ$B»‚™ÏY Ü¸C¡qëdm0É³ƒË¤6Î÷çªkdâ¤ª“Üé²;ÙRæ4>"<(­ÂÐïè½¦*�/Ü ò,Í¶Sí.�ò5	‰TðD¥v\�ÓÀ–\Ñœ[KÐu²œpÃ<qw†Ü�×~é(|°â#›T7>6ãS-¨œF�†ÌVS}—hŽDp;mXÔUÏîÎ}±§AYøB›­Ï¤VEPô{pµÂB$�(x�Þ¿3Ê° NùÂËÜåÇ?L•6d>[â„ñ†˜Í}Æ/SÀõ†6…3¼ 0™Ïúµ¸RÀšõ»ñàM¾ÜkÛ”M€µ˜˜Y@
YÌ…÷¿øðŠzÌ� š,a"�”4–.Kží¡�ÔYM†Ïx(°+ X xÕæ(Ÿ…à“<1‡m¡…Ô²‰ÑóCŽÕ}ò™ü¢ŸsÖ)âäñƒ5Z• —ÜJ0Ž'ñ^ùqWË-CwAsv¸ãïúeùOÌòwoâcš±Ëüéy·!¸Ý›²¹�­Hãm[º^¡ù©:Æ®›¨$UädsNôYq)�ÖÆK¿;÷J1åb	I=,Žc•o$v|u.§—6î[]hã³w�‰U«ûä$:PØÍVIodû]–´×8Á˜«RyeñÝ™Rí²Wt½j‘˜¥úeÄ†	hSà¡„8þ‡=Ð¼ïz!þ˜ÝÊ`ä±s‰×GØ%¼ nVk^|^[øŽ½¨Wù-Nq1#ƒ€_ûT;†u¯¨ÖÔ¸
YAPÈ5ò\3€Â%Ô7ÐÀC9Î"Îä�s¶·kqÏ-�Ã�ÂóçuÖ�¡ä^°M]Î÷±–ìuÅ9Ð9Î`Öü’.õAƒk·òBW4šß½K`óù•&Ã@´ÈÕáé9§Ñ,¹/'hû16î·îjP.½`«¥ÁÁMÀË	$aK�8Ðk…v‚ÝY‡d }´!þË1—)Çåà�»ƒóIÊÏ	È1ùìhìd<JÌæ^ÇJÁÇG-�-amí�û_ÎF¬ùŸsS–AÑ7ªÊ†˜UÇÙ¦o¶äƒ¶�×waüP]¼ò{Žïìsjµ^ÊÍÑ…ÊÒê�uè÷nþ3æŒêÞh¸é\è<Ì£ûY”£[Öð~¹D ãt¢{éÿ²ï%Èœ©”A(Åª>îÔu¿4»apI#œ§0”ZoˆÝú÷
P:Ù£l‡Yw'çªuúnAÿº°ˆ¯°+òù$eAêukw»ªÉµ‚£ìßÅš„Ï©‰Kì åhÌmh5æ4$›•ßìM¯•‚\àn‹Å×Ób~êúŸ-÷n¼Æ»'Et¿T6Æ‚Ù?œc‚]ŽÕRVwã5¿=   JR”ò »€  =Á^u>0‹    YZ     =ˆÄÊ„Ï6Ï_†I|¥�+ÂÍ ?÷     =// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause)

/*
 * resolve_btfids scans ELF object for .BTF_ids section and resolves
 * its symbols with BTF ID values.
 *
 * Each symbol points to 4 bytes data and is expected to have
 * following name syntax:
 *
 * __BTF_ID__<type>__<symbol>[__<id>]
 *
 * type is:
 *
 *   func    - lookup BTF_KIND_FUNC symbol with <symbol> name
 *             and store its ID into the data:
 *
 *             __BTF_ID__func__vfs_close__1:
 *             .zero 4
 *
 *   struct  - lookup BTF_KIND_STRUCT symbol with <symbol> name
 *             and store its ID into the data:
 *
 *             __BTF_ID__struct__sk_buff__1:
 *             .zero 4
 *
 *   union   - lookup BTF_KIND_UNION symbol with <symbol> name
 *             and store its ID into the data:
 *
 *             __BTF_ID__union__thread_union__1:
 *             .zero 4
 *
 *   typedef - lookup BTF_KIND_TYPEDEF symbol with <symbol> name
 *             and store its ID into the data:
 *
 *             __BTF_ID__typedef__pid_t__1:
 *             .zero 4
 *
 *   set     - store symbol size into first 4 bytes and sort following
 *             ID list
 *
 *             __BTF_ID__set__list:
 *             .zero 4
 *             list:
 *             __BTF_ID__func__vfs_getattr__3:
 *             .zero 4
 *             __BTF_ID__func__vfs_fallocate__4:
 *             .zero 4
 *
 *   set8    - store symbol size into first 4 bytes and sort following
 *             ID list
 *
 *             __BTF_ID__set8__list:
 *             .zero 8
 *             list:
 *             __BTF_ID__func__vfs_getattr__3:
 *             .zero 4
 *	       .word (1 << 0) | (1 << 2)
 *             __BTF_ID__func__vfs_fallocate__5:
 *             .zero 4
 *	       .word (1 << 3) | (1 << 1) | (1 << 2)
 */

#define  _GNU_SOURCE
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <libelf.h>
#include <gelf.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <linux/btf_ids.h>
#include <linux/rbtree.h>
#include <linux/zalloc.h>
#include <linux/err.h>
#include <bpf/btf.h>
#include <bpf/libbpf.h>
#include <subcmd/parse-options.h>

#define BTF_IDS_SECTION	".BTF_ids"
#define BTF_ID_PREFIX	"__BTF_ID__"

#define BTF_STRUCT	"struct"
#define BTF_UNION	"union"
#define BTF_TYPEDEF	"typedef"
#define BTF_FUNC	"func"
#define BTF_SET		"set"
#define BTF_SET8	"set8"

#define ADDR_CNT	100

#if __BYTE_ORDER == __LITTLE_ENDIAN
# define ELFDATANATIVE	ELFDATA2LSB
#elif __BYTE_ORDER == __BIG_ENDIAN
# define ELFDATANATIVE	ELFDATA2MSB
#else
# error "Unknown machine endianness!"
#endif

struct btf_id {
	struct rb_node	 rb_node;
	char		*name;
	union {
		int	 id;
		int	 cnt;
	};
	int		 addr_cnt;
	bool		 is_set;
	bool		 is_set8;
	Elf64_Addr	 addr[ADDR_CNT];
};

struct object {
	const char *path;
	const char *btf;
	const char *base_btf_path;

	struct