xref: /aosp_15_r20/external/perfetto/src/profiling/symbolizer/elf.h (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
1*6dbdd20aSAndroid Build Coastguard Worker /*
2*6dbdd20aSAndroid Build Coastguard Worker  * Copyright (C) 2021 The Android Open Source Project
3*6dbdd20aSAndroid Build Coastguard Worker  *
4*6dbdd20aSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*6dbdd20aSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*6dbdd20aSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*6dbdd20aSAndroid Build Coastguard Worker  *
8*6dbdd20aSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*6dbdd20aSAndroid Build Coastguard Worker  *
10*6dbdd20aSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*6dbdd20aSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*6dbdd20aSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*6dbdd20aSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*6dbdd20aSAndroid Build Coastguard Worker  * limitations under the License.
15*6dbdd20aSAndroid Build Coastguard Worker  */
16*6dbdd20aSAndroid Build Coastguard Worker 
17*6dbdd20aSAndroid Build Coastguard Worker #ifndef SRC_PROFILING_SYMBOLIZER_ELF_H_
18*6dbdd20aSAndroid Build Coastguard Worker #define SRC_PROFILING_SYMBOLIZER_ELF_H_
19*6dbdd20aSAndroid Build Coastguard Worker 
20*6dbdd20aSAndroid Build Coastguard Worker #include <stddef.h>
21*6dbdd20aSAndroid Build Coastguard Worker #include <cinttypes>
22*6dbdd20aSAndroid Build Coastguard Worker 
23*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/base/build_config.h"
24*6dbdd20aSAndroid Build Coastguard Worker 
25*6dbdd20aSAndroid Build Coastguard Worker // We cannot just include elf.h, as that only exists on Linux, and we want to
26*6dbdd20aSAndroid Build Coastguard Worker // allow symbolization on other platforms as well. As we only need a small
27*6dbdd20aSAndroid Build Coastguard Worker // subset, it is easiest to define the constants and structs ourselves.
28*6dbdd20aSAndroid Build Coastguard Worker 
29*6dbdd20aSAndroid Build Coastguard Worker namespace perfetto {
30*6dbdd20aSAndroid Build Coastguard Worker namespace profiling {
31*6dbdd20aSAndroid Build Coastguard Worker 
32*6dbdd20aSAndroid Build Coastguard Worker constexpr auto PT_LOAD = 1;
33*6dbdd20aSAndroid Build Coastguard Worker constexpr auto PF_X = 1;
34*6dbdd20aSAndroid Build Coastguard Worker constexpr auto SHT_NOTE = 7;
35*6dbdd20aSAndroid Build Coastguard Worker constexpr auto NT_GNU_BUILD_ID = 3;
36*6dbdd20aSAndroid Build Coastguard Worker constexpr auto ELFCLASS32 = 1;
37*6dbdd20aSAndroid Build Coastguard Worker constexpr auto ELFCLASS64 = 2;
38*6dbdd20aSAndroid Build Coastguard Worker constexpr auto ELFMAG0 = 0x7f;
39*6dbdd20aSAndroid Build Coastguard Worker constexpr auto ELFMAG1 = 'E';
40*6dbdd20aSAndroid Build Coastguard Worker constexpr auto ELFMAG2 = 'L';
41*6dbdd20aSAndroid Build Coastguard Worker constexpr auto ELFMAG3 = 'F';
42*6dbdd20aSAndroid Build Coastguard Worker constexpr auto ELFDATA2LSB = 1;
43*6dbdd20aSAndroid Build Coastguard Worker constexpr auto EV_CURRENT = 1;
44*6dbdd20aSAndroid Build Coastguard Worker constexpr auto EI_MAG0 = 0;
45*6dbdd20aSAndroid Build Coastguard Worker constexpr auto EI_MAG1 = 1;
46*6dbdd20aSAndroid Build Coastguard Worker constexpr auto EI_MAG2 = 2;
47*6dbdd20aSAndroid Build Coastguard Worker constexpr auto EI_MAG3 = 3;
48*6dbdd20aSAndroid Build Coastguard Worker constexpr auto EI_CLASS = 4;
49*6dbdd20aSAndroid Build Coastguard Worker constexpr auto EI_DATA = 5;
50*6dbdd20aSAndroid Build Coastguard Worker constexpr auto EI_VERSION = 6;
51*6dbdd20aSAndroid Build Coastguard Worker 
52*6dbdd20aSAndroid Build Coastguard Worker struct Elf32 {
53*6dbdd20aSAndroid Build Coastguard Worker   using Addr = uint32_t;
54*6dbdd20aSAndroid Build Coastguard Worker   using Half = uint16_t;
55*6dbdd20aSAndroid Build Coastguard Worker   using Off = uint32_t;
56*6dbdd20aSAndroid Build Coastguard Worker   using Sword = int32_t;
57*6dbdd20aSAndroid Build Coastguard Worker   using Word = uint32_t;
58*6dbdd20aSAndroid Build Coastguard Worker   struct Ehdr {
59*6dbdd20aSAndroid Build Coastguard Worker     unsigned char e_ident[16];
60*6dbdd20aSAndroid Build Coastguard Worker     Half e_type;
61*6dbdd20aSAndroid Build Coastguard Worker     Half e_machine;
62*6dbdd20aSAndroid Build Coastguard Worker     Word e_version;
63*6dbdd20aSAndroid Build Coastguard Worker     Addr e_entry;
64*6dbdd20aSAndroid Build Coastguard Worker     Off e_phoff;
65*6dbdd20aSAndroid Build Coastguard Worker     Off e_shoff;
66*6dbdd20aSAndroid Build Coastguard Worker     Word e_flags;
67*6dbdd20aSAndroid Build Coastguard Worker     Half e_ehsize;
68*6dbdd20aSAndroid Build Coastguard Worker     Half e_phentsize;
69*6dbdd20aSAndroid Build Coastguard Worker     Half e_phnum;
70*6dbdd20aSAndroid Build Coastguard Worker     Half e_shentsize;
71*6dbdd20aSAndroid Build Coastguard Worker     Half e_shnum;
72*6dbdd20aSAndroid Build Coastguard Worker     Half e_shstrndx;
73*6dbdd20aSAndroid Build Coastguard Worker   };
74*6dbdd20aSAndroid Build Coastguard Worker   struct Shdr {
75*6dbdd20aSAndroid Build Coastguard Worker     Word sh_name;
76*6dbdd20aSAndroid Build Coastguard Worker     Word sh_type;
77*6dbdd20aSAndroid Build Coastguard Worker     Word sh_flags;
78*6dbdd20aSAndroid Build Coastguard Worker     Addr sh_addr;
79*6dbdd20aSAndroid Build Coastguard Worker     Off sh_offset;
80*6dbdd20aSAndroid Build Coastguard Worker     Word sh_size;
81*6dbdd20aSAndroid Build Coastguard Worker     Word sh_link;
82*6dbdd20aSAndroid Build Coastguard Worker     Word sh_info;
83*6dbdd20aSAndroid Build Coastguard Worker     Word sh_addralign;
84*6dbdd20aSAndroid Build Coastguard Worker     Word sh_entsize;
85*6dbdd20aSAndroid Build Coastguard Worker   };
86*6dbdd20aSAndroid Build Coastguard Worker   struct Nhdr {
87*6dbdd20aSAndroid Build Coastguard Worker     Word n_namesz;
88*6dbdd20aSAndroid Build Coastguard Worker     Word n_descsz;
89*6dbdd20aSAndroid Build Coastguard Worker     Word n_type;
90*6dbdd20aSAndroid Build Coastguard Worker   };
91*6dbdd20aSAndroid Build Coastguard Worker   struct Phdr {
92*6dbdd20aSAndroid Build Coastguard Worker     uint32_t p_type;
93*6dbdd20aSAndroid Build Coastguard Worker     Off p_offset;
94*6dbdd20aSAndroid Build Coastguard Worker     Addr p_vaddr;
95*6dbdd20aSAndroid Build Coastguard Worker     Addr p_paddr;
96*6dbdd20aSAndroid Build Coastguard Worker     uint32_t p_filesz;
97*6dbdd20aSAndroid Build Coastguard Worker     uint32_t p_memsz;
98*6dbdd20aSAndroid Build Coastguard Worker     uint32_t p_flags;
99*6dbdd20aSAndroid Build Coastguard Worker     uint32_t p_align;
100*6dbdd20aSAndroid Build Coastguard Worker   };
101*6dbdd20aSAndroid Build Coastguard Worker };
102*6dbdd20aSAndroid Build Coastguard Worker 
103*6dbdd20aSAndroid Build Coastguard Worker struct Elf64 {
104*6dbdd20aSAndroid Build Coastguard Worker   using Addr = uint64_t;
105*6dbdd20aSAndroid Build Coastguard Worker   using Half = uint16_t;
106*6dbdd20aSAndroid Build Coastguard Worker   using SHalf = int16_t;
107*6dbdd20aSAndroid Build Coastguard Worker   using Off = uint64_t;
108*6dbdd20aSAndroid Build Coastguard Worker   using Sword = int32_t;
109*6dbdd20aSAndroid Build Coastguard Worker   using Word = uint32_t;
110*6dbdd20aSAndroid Build Coastguard Worker   using Xword = uint64_t;
111*6dbdd20aSAndroid Build Coastguard Worker   using Sxword = int64_t;
112*6dbdd20aSAndroid Build Coastguard Worker   struct Ehdr {
113*6dbdd20aSAndroid Build Coastguard Worker     unsigned char e_ident[16];
114*6dbdd20aSAndroid Build Coastguard Worker     Half e_type;
115*6dbdd20aSAndroid Build Coastguard Worker     Half e_machine;
116*6dbdd20aSAndroid Build Coastguard Worker     Word e_version;
117*6dbdd20aSAndroid Build Coastguard Worker     Addr e_entry;
118*6dbdd20aSAndroid Build Coastguard Worker     Off e_phoff;
119*6dbdd20aSAndroid Build Coastguard Worker     Off e_shoff;
120*6dbdd20aSAndroid Build Coastguard Worker     Word e_flags;
121*6dbdd20aSAndroid Build Coastguard Worker     Half e_ehsize;
122*6dbdd20aSAndroid Build Coastguard Worker     Half e_phentsize;
123*6dbdd20aSAndroid Build Coastguard Worker     Half e_phnum;
124*6dbdd20aSAndroid Build Coastguard Worker     Half e_shentsize;
125*6dbdd20aSAndroid Build Coastguard Worker     Half e_shnum;
126*6dbdd20aSAndroid Build Coastguard Worker     Half e_shstrndx;
127*6dbdd20aSAndroid Build Coastguard Worker   };
128*6dbdd20aSAndroid Build Coastguard Worker   struct Shdr {
129*6dbdd20aSAndroid Build Coastguard Worker     Word sh_name;
130*6dbdd20aSAndroid Build Coastguard Worker     Word sh_type;
131*6dbdd20aSAndroid Build Coastguard Worker     Xword sh_flags;
132*6dbdd20aSAndroid Build Coastguard Worker     Addr sh_addr;
133*6dbdd20aSAndroid Build Coastguard Worker     Off sh_offset;
134*6dbdd20aSAndroid Build Coastguard Worker     Xword sh_size;
135*6dbdd20aSAndroid Build Coastguard Worker     Word sh_link;
136*6dbdd20aSAndroid Build Coastguard Worker     Word sh_info;
137*6dbdd20aSAndroid Build Coastguard Worker     Xword sh_addralign;
138*6dbdd20aSAndroid Build Coastguard Worker     Xword sh_entsize;
139*6dbdd20aSAndroid Build Coastguard Worker   };
140*6dbdd20aSAndroid Build Coastguard Worker   struct Nhdr {
141*6dbdd20aSAndroid Build Coastguard Worker     Word n_namesz;
142*6dbdd20aSAndroid Build Coastguard Worker     Word n_descsz;
143*6dbdd20aSAndroid Build Coastguard Worker     Word n_type;
144*6dbdd20aSAndroid Build Coastguard Worker   };
145*6dbdd20aSAndroid Build Coastguard Worker   struct Phdr {
146*6dbdd20aSAndroid Build Coastguard Worker     uint32_t p_type;
147*6dbdd20aSAndroid Build Coastguard Worker     uint32_t p_flags;
148*6dbdd20aSAndroid Build Coastguard Worker     Off p_offset;
149*6dbdd20aSAndroid Build Coastguard Worker     Addr p_vaddr;
150*6dbdd20aSAndroid Build Coastguard Worker     Addr p_paddr;
151*6dbdd20aSAndroid Build Coastguard Worker     uint64_t p_filesz;
152*6dbdd20aSAndroid Build Coastguard Worker     uint64_t p_memsz;
153*6dbdd20aSAndroid Build Coastguard Worker     uint64_t p_align;
154*6dbdd20aSAndroid Build Coastguard Worker   };
155*6dbdd20aSAndroid Build Coastguard Worker };
156*6dbdd20aSAndroid Build Coastguard Worker 
157*6dbdd20aSAndroid Build Coastguard Worker template <typename E>
GetShdr(void * mem,const typename E::Ehdr * ehdr,size_t i)158*6dbdd20aSAndroid Build Coastguard Worker typename E::Shdr* GetShdr(void* mem, const typename E::Ehdr* ehdr, size_t i) {
159*6dbdd20aSAndroid Build Coastguard Worker   return reinterpret_cast<typename E::Shdr*>(
160*6dbdd20aSAndroid Build Coastguard Worker       static_cast<char*>(mem) + ehdr->e_shoff + i * sizeof(typename E::Shdr));
161*6dbdd20aSAndroid Build Coastguard Worker }
162*6dbdd20aSAndroid Build Coastguard Worker 
163*6dbdd20aSAndroid Build Coastguard Worker template <typename E>
GetPhdr(void * mem,const typename E::Ehdr * ehdr,size_t i)164*6dbdd20aSAndroid Build Coastguard Worker typename E::Phdr* GetPhdr(void* mem, const typename E::Ehdr* ehdr, size_t i) {
165*6dbdd20aSAndroid Build Coastguard Worker   return reinterpret_cast<typename E::Phdr*>(
166*6dbdd20aSAndroid Build Coastguard Worker       static_cast<char*>(mem) + ehdr->e_phoff + i * sizeof(typename E::Phdr));
167*6dbdd20aSAndroid Build Coastguard Worker }
168*6dbdd20aSAndroid Build Coastguard Worker 
169*6dbdd20aSAndroid Build Coastguard Worker }  // namespace profiling
170*6dbdd20aSAndroid Build Coastguard Worker }  // namespace perfetto
171*6dbdd20aSAndroid Build Coastguard Worker 
172*6dbdd20aSAndroid Build Coastguard Worker #endif  // SRC_PROFILING_SYMBOLIZER_ELF_H_
173