| v1.19: |
| |
| - Support split BTF, where a main BTF file, vmlinux, can be used to find types |
| and then a kernel module, for instance, can have just what is unique to it. |
| |
| For instance, looking for a type in the main vmlinux BTF info: |
| |
| $ pahole wmi_notify_handler |
| pahole: type 'wmi_notify_handler' not found |
| $ |
| |
| If we look at the 'wmi' module BTF info that is in: |
| |
| $ ls -la /sys/kernel/btf/wmi |
| -r--r--r--. 1 root root 2866 Nov 18 13:35 /sys/kernel/btf/wmi |
| $ |
| |
| $ pahole /sys/kernel/btf/wmi -C wmi_notify_handler |
| typedef void (*wmi_notify_handler)(u32, void *); |
| $ |
| |
| '--btf_base=/sys/kernel/btf/vmlinux' was automatically added in this last |
| example, an option that was also introduced in this version where types used in |
| the wmi.ko module but present in vmlinux can be found so that there is no |
| duplicity of types. |
| |
| - Update libbpf to get the split BTF support and use some of its functions to |
| load BTF and speed up DWARF loading and BTF encoding. |
| |
| - Support cross-compiled ELF binaries with different endianness |
| |
| - Support showing typedefs for anonymous types, like structs, unions and enums, |
| see the "Align enumerators" entry below for an example, another: |
| |
| $ pahole rwlock_t |
| typedef struct { |
| arch_rwlock_t raw_lock; /* 0 8 */ |
| |
| /* size: 8, cachelines: 1, members: 1 */ |
| /* last cacheline: 8 bytes */ |
| } rwlock_t; |
| $ |
| |
| - Align enumerators: |
| |
| $ pahole ZSTD_strategy |
| typedef enum { |
| ZSTD_fast = 0, |
| ZSTD_dfast = 1, |
| ZSTD_greedy = 2, |
| ZSTD_lazy = 3, |
| ZSTD_lazy2 = 4, |
| ZSTD_btlazy2 = 5, |
| ZSTD_btopt = 6, |
| ZSTD_btopt2 = 7, |
| } ZSTD_strategy; |
| $ |
| |
| - Workaround bugs in the generation of DWARF records for functions in some gcc |
| versions that were causing breakage in the encoding of BTF: |
| |
| https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97060 "Missing DW_AT_declaration=1 in dwarf data" |
| |
| - Ignore zero-sized ELF symbols instead of erroring out. |
| |
| - Handle union forward declaration properly in the BTF loader. |
| |
| - Introduce --numeric_version for use in scripts and Makefiles: |
| |
| $ pahole --version |
| v1.19 |
| $ pahole --numeric_version |
| 119 |
| $ |
| |
| To avoid things like this in the kernel's scripts/link-vmlinux.sh: |
| |
| pahole_ver=$(${PAHOLE} --version | sed -E 's/v([0-9]+)\.([0-9]+)/\1\2/') |
| |
| - Try sole pfunct argument as a function name, just like pahole with type names: |
| |
| $ pfunct tcp_v4_rcv |
| int tcp_v4_rcv(struct sk_buff * skb); |
| $ |
| |
| - Speed up pfunct using some of the load techniques used in pahole. |
| |
| - Discard CUs after BTF encoding as they're not used anymore, greatly reducing |
| memory usage and speeding up vmlinux BTF encoding. |
| |
| - Revamp how per-CPU variables are encoded in BTF. |
| |
| - Include BTF info for static functions. |
| |
| - Use BTF's string APIs for strings management, greatly improving performance |
| over the tsearch(). |
| |
| - Increase size of DWARF lookup hash table, shaving off about 1 second out of |
| about 20 seconds total for Linux BTF dedup. |
| |
| - Stop BTF encoding when errors are found in some DWARF CU. |
| |
| - Implement --packed, to show just packed structures, for instance, here are |
| the top 5 packed data structures in the Linux kernel: |
| |
| $ pahole --sizes --packed | sort -k2 -nr | head -5 |
| e820_table 64004 0 |
| boot_params 4096 0 |
| efi_variable 2084 0 |
| snd_soc_tplg_pcm 912 0 |
| ntb_info_regs 800 0 |
| $ |
| |
| And here is one of them: |
| |
| $ pahole efi_variable |
| struct efi_variable { |
| efi_char16_t VariableName[512]; /* 0 1024 */ |
| /* --- cacheline 16 boundary (1024 bytes) --- */ |
| efi_guid_t VendorGuid; /* 1024 16 */ |
| long unsigned int DataSize; /* 1040 8 */ |
| __u8 Data[1024]; /* 1048 1024 */ |
| /* --- cacheline 32 boundary (2048 bytes) was 24 bytes ago --- */ |
| efi_status_t Status; /* 2072 8 */ |
| __u32 Attributes; /* 2080 4 */ |
| |
| /* size: 2084, cachelines: 33, members: 6 */ |
| /* last cacheline: 36 bytes */ |
| } __attribute__((__packed__)); |
| $ |
| |
| - Fix bug in distros such as OpenSUSE:15.2 where DW_AT_alignment isn't defined. |
| |
| Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> |