summaryrefslogtreecommitdiff
path: root/include/slibtool/slibtool.h
blob: d428e54c7132d962fd4419dc9f79b68a5892ef0a (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
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
#ifndef SLIBTOOL_H
#define SLIBTOOL_H

#include <fcntl.h>
#include <stdint.h>
#include <stddef.h>
#include <stdio.h>
#include <unistd.h>

#include "slibtool_api.h"
#include "slibtool_arbits.h"

#ifdef __cplusplus
extern "C" {
#endif

/* pre-alpha */
#ifndef SLBT_APP
#ifndef SLBT_PRE_ALPHA
#error  libslibtool: pre-alpha: ABI is not final!
#error  to use the library, please pass -DSLBT_PRE_ALPHA to the compiler.
#endif
#endif

/* status codes */
#define SLBT_OK				0x00
#define SLBT_USAGE			0x01
#define SLBT_ERROR			0x02

/* driver flags */
#define SLBT_DRIVER_XFLAG(x)		((uint64_t)(x) << 32)

#define SLBT_DRIVER_VERBOSITY_NONE	0x0000
#define SLBT_DRIVER_VERBOSITY_ERRORS	0x0001
#define SLBT_DRIVER_VERBOSITY_STATUS	0x0002
#define SLBT_DRIVER_VERBOSITY_USAGE	0x0004
#define SLBT_DRIVER_CLONE_VECTOR	0x0008

#define SLBT_DRIVER_VERSION		0x0010
#define SLBT_DRIVER_DRY_RUN		0x0020
#define SLBT_DRIVER_INFO		0x0040
#define SLBT_DRIVER_DEBUG		0x0080
#define SLBT_DRIVER_FEATURES		0x0100
#define SLBT_DRIVER_DEPS		0x0200
#define SLBT_DRIVER_SILENT		0x0400
#define SLBT_DRIVER_VERBOSE		0x0800
#define SLBT_DRIVER_PRO_PIC		0x1000
#define SLBT_DRIVER_ANTI_PIC		0x2000
#define SLBT_DRIVER_SHARED		0x4000
#define SLBT_DRIVER_STATIC		0x8000

#define SLBT_DRIVER_HEURISTICS		0x010000
#define SLBT_DRIVER_STRICT		0x020000
#define SLBT_DRIVER_NO_UNDEFINED	0x040000
#define SLBT_DRIVER_MODULE		0x080000
#define SLBT_DRIVER_AVOID_VERSION	0x100000
#define SLBT_DRIVER_IMAGE_ELF		0x200000
#define SLBT_DRIVER_IMAGE_PE		0x400000
#define SLBT_DRIVER_IMAGE_MACHO		0x800000

#define SLBT_DRIVER_ALL_STATIC		0x01000000
#define SLBT_DRIVER_DISABLE_STATIC	0x02000000
#define SLBT_DRIVER_DISABLE_SHARED	0x04000000
#define SLBT_DRIVER_LEGABITS		0x08000000

#define SLBT_DRIVER_ANNOTATE_ALWAYS	0x10000000
#define SLBT_DRIVER_ANNOTATE_NEVER	0x20000000
#define SLBT_DRIVER_ANNOTATE_FULL	0x40000000

#define SLBT_DRIVER_IMPLIB_IDATA	SLBT_DRIVER_XFLAG(0x0001)
#define SLBT_DRIVER_IMPLIB_DSOMETA	SLBT_DRIVER_XFLAG(0x0002)
#define SLBT_DRIVER_EXPORT_DYNAMIC	SLBT_DRIVER_XFLAG(0x0010)
#define SLBT_DRIVER_STATIC_LIBTOOL_LIBS	SLBT_DRIVER_XFLAG(0x0100)
#define SLBT_DRIVER_OUTPUT_MACHINE	SLBT_DRIVER_XFLAG(0x1000)
#define SLBT_DRIVER_OUTPUT_CONFIG	SLBT_DRIVER_XFLAG(0x2000)

#define SLBT_DRIVER_MODE_AR		SLBT_DRIVER_XFLAG(0x010000)
#define SLBT_DRIVER_MODE_AR_CHECK	SLBT_DRIVER_XFLAG(0x020000)
#define SLBT_DRIVER_MODE_AR_MERGE	SLBT_DRIVER_XFLAG(0x040000)

#define SLBT_DRIVER_MODE_STOOLIE	SLBT_DRIVER_XFLAG(0x080000)
#define SLBT_DRIVER_MODE_SLIBTOOLIZE    SLBT_DRIVER_XFLAG(0x080000)

#define SLBT_DRIVER_PREFER_SHARED       SLBT_DRIVER_XFLAG(0x100000)
#define SLBT_DRIVER_PREFER_STATIC       SLBT_DRIVER_XFLAG(0x200000)

#define SLBT_DRIVER_STOOLIE_COPY        SLBT_DRIVER_XFLAG(0x01000000)
#define SLBT_DRIVER_STOOLIE_FORCE       SLBT_DRIVER_XFLAG(0x02000000)
#define SLBT_DRIVER_STOOLIE_INSTALL     SLBT_DRIVER_XFLAG(0x04000000)

#define SLBT_DRIVER_DLOPEN_SELF         SLBT_DRIVER_XFLAG(0x10000000)
#define SLBT_DRIVER_DLOPEN_FORCE        SLBT_DRIVER_XFLAG(0x20000000)
#define SLBT_DRIVER_DLPREOPEN_SELF      SLBT_DRIVER_XFLAG(0x40000000)
#define SLBT_DRIVER_DLPREOPEN_FORCE     SLBT_DRIVER_XFLAG(0x80000000)

/* unit action flags */
#define SLBT_ACTION_MAP_READWRITE	0x0001

/* error flags */
#define SLBT_ERROR_TOP_LEVEL		0x0001
#define SLBT_ERROR_NESTED		0x0002
#define SLBT_ERROR_CHILD		0x0004
#define SLBT_ERROR_CUSTOM		0x0008

enum slbt_custom_error {
	SLBT_ERR_FLOW_ERROR,
	SLBT_ERR_FLEE_ERROR,
	SLBT_ERR_COMPILE_ERROR,
	SLBT_ERR_LINK_ERROR,
	SLBT_ERR_INSTALL_ERROR,
	SLBT_ERR_AR_ERROR,
	SLBT_ERR_COPY_ERROR,
	SLBT_ERR_MDSO_ERROR,
	SLBT_ERR_DLLTOOL_ERROR,
	SLBT_ERR_ARCHIVE_IMPORT,
	SLBT_ERR_HOST_INIT,
	SLBT_ERR_INSTALL_FAIL,
	SLBT_ERR_INSTALL_FLOW,
	SLBT_ERR_INSTALL_REV,
	SLBT_ERR_LDRPATH_INIT,
	SLBT_ERR_LINK_FLOW,
	SLBT_ERR_LINK_FREQ,
	SLBT_ERR_BAD_DATA,
	SLBT_ERR_UNINSTALL_FAIL,
	SLBT_ERR_LCONF_OPEN,
	SLBT_ERR_LCONF_MAP,
	SLBT_ERR_LCONF_PARSE,
	SLBT_ERR_AR_FAIL,
	SLBT_ERR_AR_EMPTY_FILE,
	SLBT_ERR_AR_INVALID_SIGNATURE,
	SLBT_ERR_AR_INVALID_HEADER,
	SLBT_ERR_AR_TRUNCATED_DATA,
	SLBT_ERR_AR_DUPLICATE_LONG_NAMES,
	SLBT_ERR_AR_DUPLICATE_ARMAP_MEMBER,
	SLBT_ERR_AR_MISPLACED_ARMAP_MEMBER,
	SLBT_ERR_AR_NO_ACTION_SPECIFIED,
	SLBT_ERR_AR_NO_INPUT_SPECIFIED,
	SLBT_ERR_AR_DRIVER_MISMATCH,
	SLBT_ERR_AR_ARMAP_MISMATCH,
	SLBT_ERR_AR_INVALID_ARMAP_NUMBER_OF_SYMS,
	SLBT_ERR_AR_INVALID_ARMAP_SIZE_OF_REFS,
	SLBT_ERR_AR_INVALID_ARMAP_SIZE_OF_STRS,
	SLBT_ERR_AR_INVALID_ARMAP_STRING_TABLE,
	SLBT_ERR_AR_INVALID_ARMAP_MEMBER_OFFSET,
	SLBT_ERR_AR_INVALID_ARMAP_NAME_OFFSET,
	SLBT_ERR_AR_DLUNIT_NOT_SPECIFIED,
	SLBT_ERR_AR_OUTPUT_NOT_SPECIFIED,
	SLBT_ERR_AR_OUTPUT_NOT_APPLICABLE,
};

/* execution modes */
enum slbt_mode {
	SLBT_MODE_UNKNOWN,
	SLBT_MODE_CONFIG,
	SLBT_MODE_INFO,
	SLBT_MODE_CLEAN,
	SLBT_MODE_COMPILE,
	SLBT_MODE_EXECUTE,
	SLBT_MODE_FINISH,
	SLBT_MODE_INSTALL,
	SLBT_MODE_LINK,
	SLBT_MODE_UNINSTALL,
	SLBT_MODE_AR,
	SLBT_MODE_STOOLIE,
};

enum slbt_tag {
	SLBT_TAG_UNKNOWN,
	SLBT_TAG_CC,
	SLBT_TAG_CXX,
	SLBT_TAG_FC,
	SLBT_TAG_F77,
	SLBT_TAG_ASM,
	SLBT_TAG_NASM,
	SLBT_TAG_RC,
};

enum slbt_warning_level {
	SLBT_WARNING_LEVEL_UNKNOWN,
	SLBT_WARNING_LEVEL_ALL,
	SLBT_WARNING_LEVEL_ERROR,
	SLBT_WARNING_LEVEL_NONE,
};

struct slbt_input {
	void *		addr;
	size_t		size;
};

struct slbt_source_version {
	int		major;
	int		minor;
	int		revision;
	const char *	commit;
};

struct slbt_fd_ctx {
	int		fdin;
	int		fdout;
	int		fderr;
	int		fdlog;
	int		fdcwd;
	int		fddst;
};

struct slbt_exec_ctx {
	char *		program;
	char *		compiler;

	char **		cargv;
	char **		xargv;
	char **		argv;
	char **		envp;
	char ** 	altv;

	char ** 	dpic;
	char ** 	fpic;

	char ** 	cass;
	char ** 	noundef;
	char ** 	soname;
	char ** 	lsoname;

	char ** 	symdefs;
	char ** 	symfile;

	char **         explarg;
	char **         expsyms;

	char ** 	lout[2];
	char ** 	mout[2];
	char ** 	rpath[2];

	char ** 	sentinel;
	char *		csrc;

	int		ldirdepth;
	char *		ldirname;
	char *		lbasename;

	char *		lobjname;
	char *		aobjname;
	char *		ltobjname;

	char *		dlunit;
	char *		dlopensrc;
	char *		dlopenobj;
	char *		dlpreopen;

	char *		arfilename;
	char *		lafilename;
	char *		laifilename;

	char *		dsobasename;
	char *		dsofilename;

	char *		relfilename;
	char *		dsorellnkname;
	char *		deffilename;
	char *		mapfilename;
	char *		rpathfilename;

	char *		dimpfilename;
	char *		pimpfilename;
	char *		vimpfilename;

	char *		exefilename;
	char *		sonameprefix;

	pid_t		pid;
	int		exitcode;
};

struct slbt_version_info {
	int		major;
	int		minor;
	int		revision;
	const char *	verinfo;
	const char *	vernumber;
};

struct slbt_error_info {
	const struct slbt_driver_ctx *	edctx;
	int				esyscode;
	int				elibcode;
	const char *			efunction;
	int				eline;
	unsigned			eflags;
	void *				eany;
};

struct slbt_host_params {
	const char *			host;
	const char *			flavor;
	const char *			ar;
	const char *			as;
	const char *			nm;
	const char *			ranlib;
	const char *			windres;
	const char *			dlltool;
	const char *			mdso;
	const char *			ldrpath;
};

struct slbt_flavor_settings {
	const char *			imagefmt;
	const char *			arprefix;
	const char *			arsuffix;
	const char *			dsoprefix;
	const char *			dsosuffix;
	const char *			osdsuffix;
	const char *			osdfussix;
	const char *			exeprefix;
	const char *			exesuffix;
	const char *			impprefix;
	const char *			impsuffix;
	const char *			mapsuffix;
	const char *			ldpathenv;
	char *				picswitch;
};

struct slbt_common_ctx {
	uint64_t			drvflags;
	uint64_t			actflags;
	uint64_t			fmtflags;
	struct slbt_host_params		host;
	struct slbt_host_params		cfgmeta;
	struct slbt_flavor_settings	settings;
	struct slbt_host_params		ahost;
	struct slbt_host_params		acfgmeta;
	struct slbt_flavor_settings	asettings;
	struct slbt_version_info	verinfo;
	enum slbt_mode			mode;
	enum slbt_tag			tag;
	enum slbt_warning_level		warnings;
	char **				cargv;
	char **				targv;
	char *				libname;
	const char *			dlunit;
	const char *			ccwrap;
	const char *			target;
	const char *			output;
	const char *			shrext;
	const char *			rpath;
	const char *			sysroot;
	const char *			release;
	const char *			expsyms;
	const char *			regex;
	const char *			user;
};

struct slbt_driver_ctx {
	const char *			program;
	const char *			module;
	const struct slbt_common_ctx *	cctx;
	struct slbt_error_info **	errv;
	void *				any;
};

struct slbt_raw_archive {
	void *				map_addr;
	size_t				map_size;
};

struct slbt_archive_meta {
	struct slbt_raw_archive         r_archive;
	struct ar_raw_signature *       r_signature;

	struct ar_meta_signature *      m_signature;

	struct ar_meta_member_info **   a_memberv;
	struct ar_meta_member_info *    a_arref_longnames;
	struct ar_meta_armap_info       a_armap_primary;
	struct ar_meta_armap_info       a_armap_pecoff;
};

struct slbt_archive_ctx {
	const char * const *		path;
	const struct slbt_raw_archive *	map;
	const struct slbt_archive_meta *meta;
	void *				any;
};

struct slbt_symlist_ctx {
	const char * const *            path;
	const char **                   symstrv;
};

struct slbt_txtfile_ctx {
	const char * const *            path;
	const char **                   txtlinev;
};

struct slbt_stoolie_ctx {
	const char * const *		path;
	const struct slbt_txtfile_ctx * acinc;
	const struct slbt_txtfile_ctx * cfgac;
	const struct slbt_txtfile_ctx * makam;
	const char * const *            auxarg;
	const char * const *            m4arg;
};

/* raw input api */
slbt_api int  slbt_fs_map_input         (const struct slbt_driver_ctx *,
                                         int, const char *, int,
                                         struct slbt_input *);

slbt_api int  slbt_fs_unmap_input       (struct slbt_input *);

/* driver api */
slbt_api int  slbt_lib_get_driver_ctx   (char ** argv, char ** envp, uint64_t flags,
                                         const struct slbt_fd_ctx *,
                                         struct slbt_driver_ctx **);

slbt_api void slbt_lib_free_driver_ctx  (struct slbt_driver_ctx *);

slbt_api int  slbt_lib_get_driver_fdctx (const struct slbt_driver_ctx *, struct slbt_fd_ctx *);

slbt_api int  slbt_lib_set_driver_fdctx (struct slbt_driver_ctx *, const struct slbt_fd_ctx *);

slbt_api int  slbt_lib_get_symlist_ctx  (const struct slbt_driver_ctx *, const char *, struct slbt_symlist_ctx **);

slbt_api void slbt_lib_free_symlist_ctx (struct slbt_symlist_ctx *);

slbt_api int  slbt_lib_get_txtfile_ctx  (const struct slbt_driver_ctx *, const char *, struct slbt_txtfile_ctx **);

slbt_api void slbt_lib_free_txtfile_ctx (struct slbt_txtfile_ctx *);

/* command execution context api */
slbt_api int  slbt_ectx_get_exec_ctx    (const struct slbt_driver_ctx *, struct slbt_exec_ctx **);
slbt_api void slbt_ectx_free_exec_ctx   (struct slbt_exec_ctx *);
slbt_api void slbt_ectx_reset_argvector (struct slbt_exec_ctx *);
slbt_api void slbt_ectx_reset_arguments (struct slbt_exec_ctx *);

/* core api */
slbt_api int  slbt_exec_compile         (const struct slbt_driver_ctx *);
slbt_api int  slbt_exec_execute         (const struct slbt_driver_ctx *);
slbt_api int  slbt_exec_install         (const struct slbt_driver_ctx *);
slbt_api int  slbt_exec_link            (const struct slbt_driver_ctx *);
slbt_api int  slbt_exec_uninstall       (const struct slbt_driver_ctx *);
slbt_api int  slbt_exec_ar              (const struct slbt_driver_ctx *);
slbt_api int  slbt_exec_stoolie         (const struct slbt_driver_ctx *);
slbt_api int  slbt_exec_slibtoolize     (const struct slbt_driver_ctx *);

/* host and flavor interfaces */
slbt_api int  slbt_host_set_althost     (const struct slbt_driver_ctx *, const char * host, const char * flavor);

slbt_api void slbt_host_reset_althost   (const struct slbt_driver_ctx *);

slbt_api int slbt_host_objfmt_is_coff   (const struct slbt_driver_ctx *);

slbt_api int slbt_host_objfmt_is_macho  (const struct slbt_driver_ctx *);

slbt_api int slbt_host_group_is_winnt   (const struct slbt_driver_ctx *);

slbt_api int slbt_host_group_is_darwin  (const struct slbt_driver_ctx *);

slbt_api int  slbt_host_flavor_settings (const char *, const struct slbt_flavor_settings **);

/* utility helper interfaces */
slbt_api int  slbt_util_import_archive  (const struct slbt_exec_ctx *,
                                         char * dstarchive, char * srcarchive);

slbt_api int  slbt_util_copy_file       (struct slbt_exec_ctx *,
                                         const char * from, const char * to);

slbt_api int  slbt_util_create_mapfile  (const struct slbt_symlist_ctx *, const char *, mode_t);

slbt_api int  slbt_util_create_symfile  (const struct slbt_symlist_ctx *, const char *, mode_t);

slbt_api int  slbt_util_dump_machine    (const char * compiler, char * machine, size_t bufsize);

slbt_api int  slbt_util_real_path       (int, const char *, int, char *, size_t);

/* archiver api */
slbt_api int  slbt_ar_get_archive_ctx   (const struct slbt_driver_ctx *, const char * path,
                                         struct slbt_archive_ctx **);

slbt_api void slbt_ar_free_archive_ctx  (struct slbt_archive_ctx *);

slbt_api int  slbt_ar_get_varchive_ctx  (const struct slbt_driver_ctx *,
                                         struct slbt_archive_ctx **);

slbt_api int  slbt_ar_get_archive_meta  (const struct slbt_driver_ctx *,
                                         const struct slbt_raw_archive *,
                                         struct slbt_archive_meta **);

slbt_api void slbt_ar_free_archive_meta (struct slbt_archive_meta *);

slbt_api int  slbt_ar_merge_archives    (struct slbt_archive_ctx * const [],
                                         struct slbt_archive_ctx **);

slbt_api int  slbt_ar_store_archive     (struct slbt_archive_ctx *,
                                         const char *, mode_t);

slbt_api int  slbt_ar_create_mapfile    (const struct slbt_archive_meta *, const char *, mode_t);

slbt_api int  slbt_ar_create_symfile    (const struct slbt_archive_meta *, const char *, mode_t);

slbt_api int slbt_ar_create_dlsyms      (struct slbt_archive_ctx **, const char *, const char *, mode_t);

/* slibtoolize api */
slbt_api int  slbt_st_get_stoolie_ctx   (const struct slbt_driver_ctx *, const char * path,
                                         struct slbt_stoolie_ctx **);

slbt_api void slbt_st_free_stoolie_ctx  (struct slbt_stoolie_ctx *);

/* utility api */
slbt_api int  slbt_main                 (char **, char **,
                                         const struct slbt_fd_ctx *);

slbt_api int  slbt_output_info          (const struct slbt_driver_ctx *);
slbt_api int  slbt_output_config        (const struct slbt_driver_ctx *);
slbt_api int  slbt_output_machine       (const struct slbt_driver_ctx *);
slbt_api int  slbt_output_features      (const struct slbt_driver_ctx *);
slbt_api int  slbt_output_fdcwd         (const struct slbt_driver_ctx *);

slbt_api int  slbt_output_exec          (const struct slbt_exec_ctx *, const char *);
slbt_api int  slbt_output_compile       (const struct slbt_exec_ctx *);
slbt_api int  slbt_output_execute       (const struct slbt_exec_ctx *);
slbt_api int  slbt_output_install       (const struct slbt_exec_ctx *);
slbt_api int  slbt_output_link          (const struct slbt_exec_ctx *);
slbt_api int  slbt_output_uninstall     (const struct slbt_exec_ctx *);
slbt_api int  slbt_output_mapfile       (const struct slbt_symlist_ctx *);

slbt_api int  slbt_output_error_vector  (const struct slbt_driver_ctx *);
slbt_api int  slbt_output_error_record  (const struct slbt_driver_ctx *, const struct slbt_error_info *);

/* archiver utility api */
slbt_api int  slbt_au_output_arname     (const struct slbt_archive_ctx *);
slbt_api int  slbt_au_output_members    (const struct slbt_archive_meta *);
slbt_api int  slbt_au_output_symbols    (const struct slbt_archive_meta *);
slbt_api int  slbt_au_output_mapfile    (const struct slbt_archive_meta *);

slbt_api int  slbt_au_output_dlsyms     (struct slbt_archive_ctx **, const char *);

/* package info */
slbt_api const struct slbt_source_version * slbt_api_source_version(void);

#ifdef __cplusplus
}
#endif

#endif