You're right Alan, with the above patch, the type name for the pointer is gone, here's generated BTF the same program: [1] PTR '(anon)' type_id=3 [2] INT 'u8' size=1 bits_offset=0 nr_bits=8 encoding=(none) [3] ARRAY '(anon)' type_id=2 index_type_id=4 nr_elems=4 [4] INT '__ARRAY_SIZE_TYPE__' size=4 bits_offset=0 nr_bits=32 encoding=(none) [5] PTR '(anon)' type_id=6 [6] INT 'u32' size=4 bits_offset=0 nr_bits=32 encoding=(none) [7] STRUCT 'map.Map.Def' size=24 vlen=3 'type' type_id=1 bits_offset=0 'key' type_id=5 bits_offset=64 'value' type_id=5 bits_offset=128 [8] VAR 'events' type_id=7, linkage=global [9] PTR '(anon)' type_id=10 [10] ARRAY '(anon)' type_id=2 index_type_id=4 nr_elems=2 [11] PTR '(anon)' type_id=12 [12] ARRAY '(anon)' type_id=2 index_type_id=4 nr_elems=1 [13] STRUCT 'map.Map.Def' size=32 vlen=4 'type' type_id=9 bits_offset=0 'key' type_id=5 bits_offset=64 'value' type_id=5 bits_offset=128 'max_entries' type_id=11 bits_offset=192 [14] VAR 'my_pid' type_id=13, linkage=global [15] FUNC_PROTO '(anon)' ret_type_id=16 vlen=1 '(anon)' type_id=17 [16] INT 'c_int' size=4 bits_offset=0 nr_bits=32 encoding=SIGNED [17] PTR '(anon)' type_id=18 [18] STRUCT 'perf_event.test_perf_event_array__opaque_478' size=0 vlen=0 [19] FUNC 'test_perf_event_array' type_id=15 linkage=global [20] FUNC_PROTO '(anon)' ret_type_id=21 vlen=1 '(anon)' type_id=21 [21] INT 'usize' size=8 bits_offset=0 nr_bits=64 encoding=(none) [22] FUNC 'getauxvalImpl' type_id=20 linkage=global [23] ARRAY '(anon)' type_id=2 index_type_id=4 nr_elems=3 [24] VAR '_license' type_id=23, linkage=global [25] DATASEC '.maps' size=0 vlen=2 type_id=8 offset=0 size=24 (VAR 'events') type_id=14 offset=0 size=32 (VAR 'my_pid') [26] DATASEC 'license' size=0 vlen=1 type_id=24 offset=0 size=4 (VAR '_license')