1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
|
#ifndef PE_DRIVER_IMPL_H
#define PE_DRIVER_IMPL_H
#include <stdint.h>
#include <stdio.h>
#include <sys/types.h>
#include <perk/perk.h>
#include <perk/perk_meta.h>
#include "perk_dprintf_impl.h"
#include "argv/argv.h"
#define PERK_OPTV_ELEMENTS 64
extern const struct argv_option pe_default_options[];
extern const struct argv_option pe_perk_options[];
extern const struct argv_option pe_ar_options[];
enum app_tags {
TAG_HELP,
TAG_VERSION,
TAG_CMD,
TAG_PRETTY,
TAG_VERBOSE,
TAG_CATEGORY,
TAG_SECTIONS,
TAG_SYMBOLS,
TAG_STRINGS,
TAG_EXPSYMS,
TAG_IMPLIBS,
TAG_IMPSYMS,
TAG_DSOLIBS,
TAG_DSOSYMS,
TAG_HDRDUMP,
TAG_AR_LIST_MEMBERS,
TAG_AR_PRINT_MEMBERS,
};
struct pe_driver_ctx_impl {
struct pe_common_ctx cctx;
struct pe_driver_ctx ctx;
struct pe_fd_ctx fdctx;
const struct pe_unit_ctx * euctx;
const char * eunit;
struct pe_error_info ** errinfp;
struct pe_error_info ** erricap;
struct pe_error_info * erriptr[64];
struct pe_error_info erribuf[64];
};
struct pe_unit_ctx_impl {
const char * path;
struct pe_raw_image map;
struct pe_image_meta * meta;
struct pe_raw_archive armap;
struct pe_archive_meta * armeta;
struct pe_image_meta ** objmeta;
const struct pe_image_meta**usrobjmeta;
struct pe_unit_ctx uctx;
};
static inline struct pe_driver_ctx_impl * pe_get_driver_ictx(
const struct pe_driver_ctx * dctx)
{
uintptr_t addr;
if (dctx) {
addr = (uintptr_t)dctx - offsetof(struct pe_driver_ctx_impl,ctx);
return (struct pe_driver_ctx_impl *)addr;
}
return 0;
}
static inline void pe_driver_set_ectx(
const struct pe_driver_ctx * dctx,
const struct pe_unit_ctx * uctx,
const char * unit)
{
struct pe_driver_ctx_impl * ictx;
ictx = pe_get_driver_ictx(dctx);
ictx->euctx = uctx;
ictx->eunit = unit;
}
static inline int pe_driver_fdin(const struct pe_driver_ctx * dctx)
{
struct pe_fd_ctx fdctx;
pe_lib_get_driver_fdctx(dctx,&fdctx);
return fdctx.fdin;
}
static inline int pe_driver_fdout(const struct pe_driver_ctx * dctx)
{
struct pe_fd_ctx fdctx;
pe_lib_get_driver_fdctx(dctx,&fdctx);
return fdctx.fdout;
}
static inline int pe_driver_fderr(const struct pe_driver_ctx * dctx)
{
struct pe_fd_ctx fdctx;
pe_lib_get_driver_fdctx(dctx,&fdctx);
return fdctx.fderr;
}
static inline int pe_driver_fdlog(const struct pe_driver_ctx * dctx)
{
struct pe_fd_ctx fdctx;
pe_lib_get_driver_fdctx(dctx,&fdctx);
return fdctx.fdlog;
}
static inline int pe_driver_fdcwd(const struct pe_driver_ctx * dctx)
{
struct pe_fd_ctx fdctx;
pe_lib_get_driver_fdctx(dctx,&fdctx);
return fdctx.fdcwd;
}
static inline int pe_driver_fddst(const struct pe_driver_ctx * dctx)
{
struct pe_fd_ctx fdctx;
pe_lib_get_driver_fdctx(dctx,&fdctx);
return fdctx.fddst;
}
#endif
|