summaryrefslogtreecommitdiffhomepage
path: root/include/mdso/mdso.h
blob: 387e7711a9ea1fc24c7cb0015fe6fcc5e0db5698 (plain)
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
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
#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_GENERATE_ASM	0x0100
#define MDSO_DRIVER_GENERATE_OBJECTS	0x0200

#define MDSO_DRIVER_ANNOTATE_ALWAYS	0x1000
#define MDSO_DRIVER_ANNOTATE_NEVER	0x2000
#define MDSO_DRIVER_ANNOTATE_FULL	0x4000

/* symbol characteristics */
#define MDSO_SYMBOL_TYPE_CODE		0x0001
#define MDSO_SYMBOL_TYPE_DATA		0x0002

/* 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_NAME,
	MDSO_ERR_INVALID_DATA,
	MDSO_ERR_INVALID_DSTDIR,
	MDSO_ERR_INVALID_CONTEXT,
	MDSO_ERR_INVALID_SOURCE,
	MDSO_ERR_INVALID_VECTOR,
	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_object {
	void *		addr;
	size_t		size;
	char *		mapstrs;
	uint32_t	mapstrsnum;
	uint32_t	mapstrslen;
	uint32_t	arhdrpos;
	uint32_t	arhdrlen;
};

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 *			implib;
	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;
	const int const *		stype;
	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_archive	(const struct mdso_driver_ctx *, const char * arname);
mdso_api FILE*mdso_create_asm_source	(const struct mdso_driver_ctx *, const char * asmname);
mdso_api FILE*mdso_create_object	(const struct mdso_driver_ctx *, const char * objname);

/* utility api */
mdso_api int  mdso_main			(int, char **, char **);
mdso_api int  mdso_create_implib_archive(const struct mdso_driver_ctx *);
mdso_api int  mdso_create_implib_sources(const struct mdso_driver_ctx *);
mdso_api int  mdso_create_implib_objects(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_asmgen_dsometa	(const struct mdso_driver_ctx *, FILE * fout);
mdso_api int      mdso_asmgen_symentry	(const struct mdso_driver_ctx *, const char * sym, FILE * fout);
mdso_api int      mdso_asmgen_symfn	(const struct mdso_driver_ctx *, const char * sym, FILE * fout);
mdso_api int      mdso_objgen_dsometa	(const struct mdso_driver_ctx *, FILE * fout, struct mdso_object *);
mdso_api int      mdso_objgen_symentry	(const struct mdso_driver_ctx *, const char * sym, FILE * fout, struct mdso_object *);
mdso_api int      mdso_objgen_symfn	(const struct mdso_driver_ctx *, const char * sym, FILE * fout, struct mdso_object *);
mdso_api int      mdso_argen_common	(const struct mdso_driver_ctx *, const char ** symv, const int * stype, FILE * fout, struct mdso_object *);

#ifdef __cplusplus
}
#endif

#endif