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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
|
#ifndef MDSO_H
#define MDSO_H
#include <stdint.h>
#include <stdio.h>
#include "mdso_api.h"
#ifdef __cplusplus
extern "C" {
#endif
/* pre-alpha */
#ifndef MDSO_APP
#ifndef MDSO_PRE_ALPHA
#error libmdso: pre-alpha: ABI is not final!
#error to use the library, please pass -DMDSO_PRE_ALPHA to the compiler.
#endif
#endif
/* status codes */
#define MDSO_OK 0x00
#define MDSO_USAGE 0x01
#define MDSO_ERROR 0x02
/* driver flags */
#define MDSO_DRIVER_VERBOSITY_NONE 0x0000
#define MDSO_DRIVER_VERBOSITY_ERRORS 0x0001
#define MDSO_DRIVER_VERBOSITY_STATUS 0x0002
#define MDSO_DRIVER_VERBOSITY_USAGE 0x0004
#define MDSO_DRIVER_CLONE_VECTOR 0x0008
#define MDSO_DRIVER_VERSION 0x0010
#define MDSO_DRIVER_DRY_RUN 0x0020
#define MDSO_DRIVER_QUAD_PTR 0x0040
#define MDSO_DRIVER_ANNOTATE_ALWAYS 0x1000
#define MDSO_DRIVER_ANNOTATE_NEVER 0x2000
#define MDSO_DRIVER_ANNOTATE_FULL 0x4000
/* error flags */
#define MDSO_ERROR_TOP_LEVEL 0x0001
#define MDSO_ERROR_NESTED 0x0002
#define MDSO_ERROR_CHILD 0x0004
#define MDSO_ERROR_CUSTOM 0x0008
enum mdso_custom_error {
MDSO_ERR_FLOW_ERROR,
MDSO_ERR_FLEE_ERROR,
MDSO_ERR_NULL_CONTEXT,
MDSO_ERR_NULL_SOURCE,
MDSO_ERR_INVALID_CONTEXT,
MDSO_ERR_INVALID_SOURCE,
MDSO_ERR_SOURCE_SIZE_ZERO,
MDSO_ERR_CAP,
};
struct mdso_source_version {
int major;
int minor;
int revision;
const char * commit;
};
struct mdso_input {
void * addr;
size_t size;
};
struct mdso_error_info {
const struct mdso_driver_ctx * edctx;
const struct mdso_unit_ctx * euctx;
const char * eunit;
int esyscode;
int elibcode;
const char * efunction;
int eline;
unsigned eflags;
void * eany;
};
struct mdso_common_ctx {
uint64_t drvflags;
uint64_t actflags;
uint64_t fmtflags;
uint32_t dsoflags;
const char * libname;
const char * asmbase;
const char * dstdir;
};
struct mdso_driver_ctx {
const char ** units;
const char * program;
const char * module;
const struct mdso_common_ctx * cctx;
struct mdso_error_info ** errv;
void * any;
};
struct mdso_unit_ctx {
const char * const * path;
const struct mdso_input * map;
const struct mdso_common_ctx * cctx;
const char * const * syms;
void * any;
};
/* package info */
mdso_api const struct mdso_source_version * mdso_source_version(void);
/* driver api */
mdso_api int mdso_get_driver_ctx (char ** argv, char ** envp, uint32_t flags, struct mdso_driver_ctx **);
mdso_api int mdso_create_driver_ctx (const struct mdso_common_ctx *, struct mdso_driver_ctx **);
mdso_api void mdso_free_driver_ctx (struct mdso_driver_ctx *);
mdso_api int mdso_get_unit_ctx (const struct mdso_driver_ctx *, const char * path, struct mdso_unit_ctx **);
mdso_api void mdso_free_unit_ctx (struct mdso_unit_ctx *);
mdso_api int mdso_map_input (const struct mdso_driver_ctx *, int fd, const char * path, int prot, struct mdso_input *);
mdso_api int mdso_unmap_input (struct mdso_input *);
/* helper api */
mdso_api FILE*mdso_create_asm_source (const struct mdso_driver_ctx *, const char * asmname);
/* utility api */
mdso_api int mdso_main (int, char **, char **);
mdso_api int mdso_create_implib_sources(const struct mdso_driver_ctx *);
mdso_api int mdso_output_export_symbols(const struct mdso_driver_ctx *, const struct mdso_unit_ctx *, FILE *);
mdso_api int mdso_output_error_record (const struct mdso_driver_ctx *, const struct mdso_error_info *);
mdso_api int mdso_output_error_vector (const struct mdso_driver_ctx *);
/* low-level api */
mdso_api uint32_t mdso_crc32_mbstr (const unsigned char * str, size_t * symlen);
mdso_api uint64_t mdso_crc64_mbstr (const unsigned char * str, size_t * symlen);
mdso_api int mdso_generate_dsometa (const struct mdso_driver_ctx *, FILE * fout);
mdso_api int mdso_generate_symentry(const struct mdso_driver_ctx *, const char * sym, FILE * fout);
mdso_api int mdso_generate_symfn (const struct mdso_driver_ctx *, const char * sym, FILE * fout);
#ifdef __cplusplus
}
#endif
#endif
|