LIEF: Library to Instrument Executable Formats Version 1.0.0
Loading...
Searching...
No Matches
ChainedPointerAnalysis.hpp
Go to the documentation of this file.
1/* Copyright 2017 - 2026 R. Thomas
2 * Copyright 2017 - 2026 Quarkslab
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16#ifndef LIEF_MACHO_CHAINED_PTR_ANALYSIS_H
17#define LIEF_MACHO_CHAINED_PTR_ANALYSIS_H
18#include <memory>
19#include <ostream>
20#include <functional>
21#include <cstring>
22
24#include "LIEF/errors.hpp"
25#include "LIEF/visibility.h"
26
27namespace LIEF {
28class BinaryStream;
29namespace MachO {
31 public:
32 // DYLD_CHAINED_PTR_FORMAT::PTR_ARM64E
34 // clang-format off
35 uint64_t target : 43,
36 high8 : 8,
37 next : 11,
38 bind : 1,
39 auth : 1;
40 // clang-format on
41
42 friend LIEF_API std::ostream&
43 operator<<(std::ostream& os,
45
46 uint64_t unpack_target() const {
47 return uint64_t(high8) | target;
48 }
49 };
50
51 // DYLD_CHAINED_PTR_FORMAT::PTR_ARM64E
53 // clang-format off
54 uint64_t ordinal : 16,
55 zero : 16,
56 addend : 19,
57 next : 11,
58 bind : 1,
59 auth : 1;
60 // clang-format on
61
62 friend LIEF_API std::ostream&
63 operator<<(std::ostream& os, const dyld_chained_ptr_arm64e_bind_t& chain);
64 };
65
66 // DYLD_CHAINED_PTR_FORMAT::PTR_ARM64E
68 // clang-format off
69 uint64_t target : 32,
72 key : 2,
73 next : 11,
74 bind : 1,
75 auth : 1;
76 // clang-format on
77
78 friend LIEF_API std::ostream&
79 operator<<(std::ostream& os,
81 };
82
83 // DYLD_CHAINED_PTR_FORMAT::PTR_ARM64E
85 // clang-format off
86 uint64_t ordinal : 16,
87 zero : 16,
90 key : 2,
91 next : 11,
92 bind : 1,
93 auth : 1;
94 // clang-format on
95
96 friend LIEF_API std::ostream&
97 operator<<(std::ostream& os,
99 };
100
101 // DYLD_CHAINED_PTR_FORMAT::PTR_64 & DYLD_CHAINED_PTR_FORMAT::PTR_64_OFFSET
103 // clang-format off
104 uint64_t target : 36,
105 high8 : 8,
107 next : 12,
108 bind : 1;
109 // clang-format on
110
111 friend LIEF_API std::ostream&
112 operator<<(std::ostream& os, const dyld_chained_ptr_64_rebase_t& chain);
113
114 uint64_t unpack_target() const {
115 return uint64_t(high8) | target;
116 }
117 };
118
119 // DYLD_CHAINED_PTR_FORMAT::PTR_ARM64E_USERLAND24
121 // clang-format off
122 uint64_t ordinal : 24,
123 zero : 8,
124 addend : 19,
125 next : 11,
126 bind : 1,
127 auth : 1;
128 // clang-format on
129
130 friend LIEF_API std::ostream&
131 operator<<(std::ostream& os,
133 };
134
135 // DYLD_CHAINED_PTR_FORMAT::PTR_ARM64E_USERLAND24
137 // clang-format off
138 uint64_t ordinal : 24,
139 zero : 8,
142 key : 2,
143 next : 11,
144 bind : 1,
145 auth : 1;
146 // clang-format on
147
148 friend LIEF_API std::ostream&
149 operator<<(std::ostream& os,
151 };
152
153 // DYLD_CHAINED_PTR_FORMAT::PTR_64
155 // clang-format off
156 uint64_t ordinal : 24,
159 next : 12,
160 bind : 1;
161 // clang-format on
162
163 friend LIEF_API std::ostream&
164 operator<<(std::ostream& os, const dyld_chained_ptr_64_bind_t& chain);
165 };
166
167 // DYLD_CHAINED_PTR_FORMAT::PTR_64_KERNEL_CACHE
169 // clang-format off
170 uint64_t target : 30,
174 key : 2,
175 next : 12,
177 // clang-format on
178
179 friend LIEF_API std::ostream&
180 operator<<(std::ostream& os,
182 };
183
184 // DYLD_CHAINED_PTR_FORMAT::PTR_32
186 // clang-format off
187 uint32_t target : 26,
188 next : 5,
189 bind : 1;
190 // clang-format on
191
192 friend LIEF_API std::ostream&
193 operator<<(std::ostream& os, const dyld_chained_ptr_32_rebase_t& chain);
194 };
195
196 // DYLD_CHAINED_PTR_FORMAT::PTR_32
198 // clang-format off
199 uint32_t ordinal : 20,
201 next : 5,
202 bind : 1;
203 // clang-format on
204
205 friend LIEF_API std::ostream&
206 operator<<(std::ostream& os, const dyld_chained_ptr_32_bind_t& chain);
207 };
208
209 // DYLD_CHAINED_PTR_FORMAT::PTR_32_CACHE
211 // clang-format off
212 uint32_t target : 30,
213 next : 2;
214 // clang-format on
215
216 friend LIEF_API std::ostream&
217 operator<<(std::ostream& os,
219 };
220
221 // DYLD_CHAINED_PTR_FORMAT::PTR_32_FIRMWARE
223 // clang-format off
224 uint32_t target : 26,
225 next : 6;
226 // clang-format on
227
228 friend LIEF_API std::ostream&
229 operator<<(std::ostream& os,
231 };
232
233 // DYLD_CHAINED_PTR_ARM64E_SEGMENTED
235 // clang-format off
236 uint32_t target_seg_offset : 28,
238 uint32_t padding : 19,
239 next : 12,
240 auth : 1;
241 // clang-format on
242
243 friend LIEF_API std::ostream&
244 operator<<(std::ostream& os,
246 };
247
248 // DYLD_CHAINED_PTR_ARM64E_SEGMENTED
250 // clang-format off
251 uint32_t target_seg_offset : 28,
253 uint32_t diversity : 16,
255 key : 2,
256 next : 12,
257 auth : 1;
258 // clang-format on
259
260 friend LIEF_API std::ostream&
261 operator<<(std::ostream& os,
263 };
264
265
266 enum class PTR_TYPE : uint64_t {
268 DYLD_CHAINED_PTR_ARM64E_REBASE,
269 DYLD_CHAINED_PTR_ARM64E_BIND,
270 DYLD_CHAINED_PTR_ARM64E_AUTH_REBASE,
271 DYLD_CHAINED_PTR_ARM64E_AUTH_BIND,
272 DYLD_CHAINED_PTR_64_REBASE,
273 DYLD_CHAINED_PTR_ARM64E_BIND24,
274 DYLD_CHAINED_PTR_ARM64E_AUTH_BIND24,
275 DYLD_CHAINED_PTR_64_BIND,
276 DYLD_CHAINED_PTR_64_KERNEL_CACHE_REBASE,
277 DYLD_CHAINED_PTR_32_REBASE,
278 DYLD_CHAINED_PTR_32_BIND,
279 DYLD_CHAINED_PTR_32_CACHE_REBASE,
280 DYLD_CHAINED_PTR_32_FIRMWARE_REBASE,
281 DYLD_CHAINED_PTR_ARM64E_SEGMENTED_REBASE,
282 DYLD_CHAINED_PTR_ARM64E_AUTH_SEGMENTED_REBASE,
283 };
284
285 static std::unique_ptr<ChainedPointerAnalysis> from_value(uint64_t value,
286 size_t size) {
287 return std::unique_ptr<ChainedPointerAnalysis>(
289 );
290 }
291
314
336
338 value_(value),
339 size_(size) {}
340
343
345 ChainedPointerAnalysis& operator=(ChainedPointerAnalysis&&) noexcept = default;
346
348
349 uint64_t value() const {
350 return value_;
351 }
352
353 size_t size() const {
354 return size_;
355 }
356
359 std::memcpy(&result, &value_, sizeof(result));
360 return result;
361 }
362
365 std::memcpy(&result, &value_, sizeof(result));
366 return result;
367 }
368
369 const dyld_chained_ptr_arm64e_auth_rebase_t
372 std::memcpy(&result, &value_, sizeof(result));
373 return result;
374 }
375
376 const dyld_chained_ptr_arm64e_auth_bind_t
379 std::memcpy(&result, &value_, sizeof(result));
380 return result;
381 }
382
385 std::memcpy(&result, &value_, sizeof(result));
386 return result;
387 }
388
391 std::memcpy(&result, &value_, sizeof(result));
392 return result;
393 }
394
395 const dyld_chained_ptr_arm64e_auth_bind24_t
398 std::memcpy(&result, &value_, sizeof(result));
399 return result;
400 }
401
404 std::memcpy(&result, &value_, sizeof(result));
405 return result;
406 }
407
408 const dyld_chained_ptr_64_kernel_cache_rebase_t
411 std::memcpy(&result, &value_, sizeof(result));
412 return result;
413 }
414
417 std::memcpy(&result, &value_, sizeof(result));
418 return result;
419 }
420
423 std::memcpy(&result, &value_, sizeof(result));
424 return result;
425 }
426
427 const dyld_chained_ptr_32_cache_rebase_t
430 std::memcpy(&result, &value_, sizeof(result));
431 return result;
432 }
433
434 const dyld_chained_ptr_32_firmware_rebase_t
437 std::memcpy(&result, &value_, sizeof(result));
438 return result;
439 }
440
441 const dyld_chained_ptr_arm64e_segmented_rebase_t
444 std::memcpy(&result, &value_, sizeof(result));
445 return result;
446 }
447
448 const dyld_chained_ptr_arm64e_auth_segmented_rebase_t
454
490
491 static_assert(sizeof(union_pointer_t) == 16, "Wrong sizeof");
492
494
495 static uint64_t walk_chain(
497 const std::function<int(uint64_t, const union_pointer_t& ptr)>& callback
498 );
499
500 private:
501 uint64_t value_ = 0;
502 size_t size_ = 0;
503};
504}
505}
506#endif
Class that is used to a read stream of data from different sources.
Definition BinaryStream.hpp:35
PTR_TYPE
Definition ChainedPointerAnalysis.hpp:266
@ UNKNOWN
Definition ChainedPointerAnalysis.hpp:267
union_pointer_t get_as(DYLD_CHAINED_PTR_FORMAT fmt) const
ChainedPointerAnalysis(uint64_t value, size_t size)
Definition ChainedPointerAnalysis.hpp:337
const dyld_chained_ptr_arm64e_segmented_rebase_t dyld_chained_ptr_arm64e_segmented_rebase() const
Definition ChainedPointerAnalysis.hpp:442
const dyld_chained_ptr_32_bind_t dyld_chained_ptr_32_bind() const
Definition ChainedPointerAnalysis.hpp:421
const dyld_chained_ptr_64_bind_t dyld_chained_ptr_64_bind() const
Definition ChainedPointerAnalysis.hpp:402
const dyld_chained_ptr_64_rebase_t dyld_chained_ptr_64_rebase() const
Definition ChainedPointerAnalysis.hpp:383
size_t size() const
Definition ChainedPointerAnalysis.hpp:353
const dyld_chained_ptr_arm64e_rebase_t dyld_chained_ptr_arm64e_rebase() const
Definition ChainedPointerAnalysis.hpp:357
const dyld_chained_ptr_arm64e_auth_rebase_t dyld_chained_ptr_arm64e_auth_rebase() const
Definition ChainedPointerAnalysis.hpp:370
const dyld_chained_ptr_64_kernel_cache_rebase_t dyld_chained_ptr_64_kernel_cache_rebase() const
Definition ChainedPointerAnalysis.hpp:409
ChainedPointerAnalysis & operator=(const ChainedPointerAnalysis &)=default
const dyld_chained_ptr_arm64e_bind24_t dyld_chained_ptr_arm64e_bind24() const
Definition ChainedPointerAnalysis.hpp:389
const dyld_chained_ptr_32_rebase_t dyld_chained_ptr_32_rebase() const
Definition ChainedPointerAnalysis.hpp:415
static size_t stride(DYLD_CHAINED_PTR_FORMAT fmt)
Definition ChainedPointerAnalysis.hpp:292
const dyld_chained_ptr_arm64e_auth_segmented_rebase_t dyld_chained_ptr_arm64e_auth_segmented_rebase() const
Definition ChainedPointerAnalysis.hpp:449
const dyld_chained_ptr_32_firmware_rebase_t dyld_chained_ptr_32_firmware_rebase() const
Definition ChainedPointerAnalysis.hpp:435
const dyld_chained_ptr_arm64e_bind_t dyld_chained_ptr_arm64e_bind() const
Definition ChainedPointerAnalysis.hpp:363
const dyld_chained_ptr_arm64e_auth_bind_t dyld_chained_ptr_arm64e_auth_bind() const
Definition ChainedPointerAnalysis.hpp:377
ChainedPointerAnalysis(ChainedPointerAnalysis &&) noexcept=default
static std::unique_ptr< ChainedPointerAnalysis > from_value(uint64_t value, size_t size)
Definition ChainedPointerAnalysis.hpp:285
const dyld_chained_ptr_32_cache_rebase_t dyld_chained_ptr_32_cache_rebase() const
Definition ChainedPointerAnalysis.hpp:428
static size_t ptr_size(DYLD_CHAINED_PTR_FORMAT fmt)
Definition ChainedPointerAnalysis.hpp:315
ChainedPointerAnalysis(const ChainedPointerAnalysis &)=default
const dyld_chained_ptr_arm64e_auth_bind24_t dyld_chained_ptr_arm64e_auth_bind24() const
Definition ChainedPointerAnalysis.hpp:396
uint64_t value() const
Definition ChainedPointerAnalysis.hpp:349
static uint64_t walk_chain(BinaryStream &stream, DYLD_CHAINED_PTR_FORMAT format, const std::function< int(uint64_t, const union_pointer_t &ptr)> &callback)
Wrapper that contains an Object (T) or an error.
Definition errors.hpp:79
Namespace related to the LIEF's Mach-O module.
Definition Abstract/Header.hpp:36
@ UNKNOWN
Definition MachO/enums.hpp:24
DYLD_CHAINED_PTR_FORMAT
Definition DyldChainedFormat.hpp:34
@ PTR_32
Definition DyldChainedFormat.hpp:40
@ PTR_32_FIRMWARE
Definition DyldChainedFormat.hpp:42
@ PTR_ARM64E_SHARED_CACHE
Definition DyldChainedFormat.hpp:59
@ PTR_ARM64E_USERLAND24
Definition DyldChainedFormat.hpp:57
@ PTR_32_CACHE
Definition DyldChainedFormat.hpp:41
@ PTR_64_KERNEL_CACHE
Definition DyldChainedFormat.hpp:49
@ PTR_ARM64E_KERNEL
Definition DyldChainedFormat.hpp:48
@ PTR_ARM64E_FIRMWARE
Definition DyldChainedFormat.hpp:53
@ PTR_X86_64_KERNEL_CACHE
Definition DyldChainedFormat.hpp:55
@ NONE
Definition DyldChainedFormat.hpp:35
@ PTR_ARM64E
Definition DyldChainedFormat.hpp:37
@ PTR_64
Definition DyldChainedFormat.hpp:39
@ PTR_64_OFFSET
Definition DyldChainedFormat.hpp:44
@ PTR_ARM64E_SEGMENTED
Definition DyldChainedFormat.hpp:61
@ PTR_ARM64E_USERLAND
Definition DyldChainedFormat.hpp:51
LIEF namespace.
Definition Abstract/Binary.hpp:41
uint32_t next
Definition ChainedPointerAnalysis.hpp:201
uint32_t ordinal
Definition ChainedPointerAnalysis.hpp:199
friend std::ostream & operator<<(std::ostream &os, const dyld_chained_ptr_32_bind_t &chain)
uint32_t addend
Definition ChainedPointerAnalysis.hpp:200
uint32_t bind
Definition ChainedPointerAnalysis.hpp:202
friend std::ostream & operator<<(std::ostream &os, const dyld_chained_ptr_32_cache_rebase_t &chain)
uint32_t next
Definition ChainedPointerAnalysis.hpp:213
uint32_t target
Definition ChainedPointerAnalysis.hpp:212
uint32_t target
Definition ChainedPointerAnalysis.hpp:224
friend std::ostream & operator<<(std::ostream &os, const dyld_chained_ptr_32_firmware_rebase_t &chain)
uint32_t next
Definition ChainedPointerAnalysis.hpp:225
friend std::ostream & operator<<(std::ostream &os, const dyld_chained_ptr_32_rebase_t &chain)
uint32_t bind
Definition ChainedPointerAnalysis.hpp:189
uint32_t target
Definition ChainedPointerAnalysis.hpp:187
uint32_t next
Definition ChainedPointerAnalysis.hpp:188
uint64_t addend
Definition ChainedPointerAnalysis.hpp:157
uint64_t ordinal
Definition ChainedPointerAnalysis.hpp:156
uint64_t reserved
Definition ChainedPointerAnalysis.hpp:158
friend std::ostream & operator<<(std::ostream &os, const dyld_chained_ptr_64_bind_t &chain)
uint64_t next
Definition ChainedPointerAnalysis.hpp:159
uint64_t bind
Definition ChainedPointerAnalysis.hpp:160
friend std::ostream & operator<<(std::ostream &os, const dyld_chained_ptr_64_kernel_cache_rebase_t &chain)
uint64_t cache_level
Definition ChainedPointerAnalysis.hpp:171
friend std::ostream & operator<<(std::ostream &os, const dyld_chained_ptr_64_rebase_t &chain)
uint64_t unpack_target() const
Definition ChainedPointerAnalysis.hpp:114
uint64_t reserved
Definition ChainedPointerAnalysis.hpp:106
uint64_t target
Definition ChainedPointerAnalysis.hpp:104
uint64_t high8
Definition ChainedPointerAnalysis.hpp:105
uint64_t next
Definition ChainedPointerAnalysis.hpp:107
uint64_t bind
Definition ChainedPointerAnalysis.hpp:108
uint64_t auth
Definition ChainedPointerAnalysis.hpp:145
uint64_t bind
Definition ChainedPointerAnalysis.hpp:144
uint64_t zero
Definition ChainedPointerAnalysis.hpp:139
friend std::ostream & operator<<(std::ostream &os, const dyld_chained_ptr_arm64e_auth_bind24_t &chain)
uint64_t ordinal
Definition ChainedPointerAnalysis.hpp:138
uint64_t diversity
Definition ChainedPointerAnalysis.hpp:140
uint64_t addr_div
Definition ChainedPointerAnalysis.hpp:141
uint64_t key
Definition ChainedPointerAnalysis.hpp:142
uint64_t next
Definition ChainedPointerAnalysis.hpp:143
uint64_t key
Definition ChainedPointerAnalysis.hpp:90
uint64_t auth
Definition ChainedPointerAnalysis.hpp:93
uint64_t addr_div
Definition ChainedPointerAnalysis.hpp:89
uint64_t zero
Definition ChainedPointerAnalysis.hpp:87
uint64_t diversity
Definition ChainedPointerAnalysis.hpp:88
friend std::ostream & operator<<(std::ostream &os, const dyld_chained_ptr_arm64e_auth_bind_t &chain)
uint64_t next
Definition ChainedPointerAnalysis.hpp:91
uint64_t ordinal
Definition ChainedPointerAnalysis.hpp:86
uint64_t bind
Definition ChainedPointerAnalysis.hpp:92
uint64_t diversity
Definition ChainedPointerAnalysis.hpp:70
friend std::ostream & operator<<(std::ostream &os, const dyld_chained_ptr_arm64e_auth_rebase_t &chain)
uint64_t addr_div
Definition ChainedPointerAnalysis.hpp:71
uint64_t target
Definition ChainedPointerAnalysis.hpp:69
friend std::ostream & operator<<(std::ostream &os, const dyld_chained_ptr_arm64e_auth_segmented_rebase_t &chain)
uint64_t auth
Definition ChainedPointerAnalysis.hpp:127
uint64_t next
Definition ChainedPointerAnalysis.hpp:125
uint64_t zero
Definition ChainedPointerAnalysis.hpp:123
uint64_t ordinal
Definition ChainedPointerAnalysis.hpp:122
uint64_t addend
Definition ChainedPointerAnalysis.hpp:124
friend std::ostream & operator<<(std::ostream &os, const dyld_chained_ptr_arm64e_bind24_t &chain)
uint64_t bind
Definition ChainedPointerAnalysis.hpp:126
uint64_t bind
Definition ChainedPointerAnalysis.hpp:58
uint64_t ordinal
Definition ChainedPointerAnalysis.hpp:54
friend std::ostream & operator<<(std::ostream &os, const dyld_chained_ptr_arm64e_bind_t &chain)
uint64_t next
Definition ChainedPointerAnalysis.hpp:57
uint64_t zero
Definition ChainedPointerAnalysis.hpp:55
uint64_t auth
Definition ChainedPointerAnalysis.hpp:59
uint64_t addend
Definition ChainedPointerAnalysis.hpp:56
friend std::ostream & operator<<(std::ostream &os, const dyld_chained_ptr_arm64e_rebase_t &chain)
uint64_t next
Definition ChainedPointerAnalysis.hpp:37
uint64_t target
Definition ChainedPointerAnalysis.hpp:35
uint64_t bind
Definition ChainedPointerAnalysis.hpp:38
uint64_t auth
Definition ChainedPointerAnalysis.hpp:39
uint64_t unpack_target() const
Definition ChainedPointerAnalysis.hpp:46
uint64_t high8
Definition ChainedPointerAnalysis.hpp:36
friend std::ostream & operator<<(std::ostream &os, const dyld_chained_ptr_arm64e_segmented_rebase_t &chain)
uint32_t target_seg_offset
Definition ChainedPointerAnalysis.hpp:236
uint32_t target_seg_index
Definition ChainedPointerAnalysis.hpp:237
Definition ChainedPointerAnalysis.hpp:455
dyld_chained_ptr_arm64e_bind24_t arm64e_bind24
Definition ChainedPointerAnalysis.hpp:463
dyld_chained_ptr_64_bind_t ptr_64_bind
Definition ChainedPointerAnalysis.hpp:465
dyld_chained_ptr_32_bind_t ptr_32_bind
Definition ChainedPointerAnalysis.hpp:468
dyld_chained_ptr_32_firmware_rebase_t ptr_32_firmware_rebase
Definition ChainedPointerAnalysis.hpp:470
dyld_chained_ptr_arm64e_auth_rebase_t arm64e_auth_rebase
Definition ChainedPointerAnalysis.hpp:460
PTR_TYPE type
Definition ChainedPointerAnalysis.hpp:456
dyld_chained_ptr_arm64e_rebase_t arm64e_rebase
Definition ChainedPointerAnalysis.hpp:458
uint64_t raw
Definition ChainedPointerAnalysis.hpp:475
dyld_chained_ptr_arm64e_segmented_rebase_t ptr_arm64e_segmented_rebase
Definition ChainedPointerAnalysis.hpp:472
dyld_chained_ptr_arm64e_auth_bind_t arm64e_auth_bind
Definition ChainedPointerAnalysis.hpp:461
dyld_chained_ptr_arm64e_auth_bind24_t arm64e_auth_bind24
Definition ChainedPointerAnalysis.hpp:464
dyld_chained_ptr_64_kernel_cache_rebase_t ptr_64_kernel_cache_rebase
Definition ChainedPointerAnalysis.hpp:466
dyld_chained_ptr_arm64e_bind_t arm64e_bind
Definition ChainedPointerAnalysis.hpp:459
dyld_chained_ptr_arm64e_auth_segmented_rebase_t ptr_arm64e_auth_segmented_rebase
Definition ChainedPointerAnalysis.hpp:474
dyld_chained_ptr_32_rebase_t ptr_32_rebase
Definition ChainedPointerAnalysis.hpp:467
dyld_chained_ptr_64_rebase_t ptr_64_rebase
Definition ChainedPointerAnalysis.hpp:462
friend std::ostream & operator<<(std::ostream &os, const union_pointer_t &ptr)
bool is_bind() const
Definition ChainedPointerAnalysis.hpp:482
dyld_chained_ptr_32_cache_rebase_t ptr_32_cache_rebase
Definition ChainedPointerAnalysis.hpp:469
#define LIEF_API
Definition visibility.h:45