Blame src/internal/slibtool_driver_impl.h

089c8b
/*******************************************************************/
089c8b
/*  slibtool: a skinny libtool implementation, written in C        */
49181b
/*  Copyright (C) 2016--2024  SysDeer Technologies, LLC            */
089c8b
/*  Released under the Standard MIT License; see COPYING.SLIBTOOL. */
089c8b
/*******************************************************************/
089c8b
582d19
#ifndef SLIBTOOL_DRIVER_IMPL_H
582d19
#define SLIBTOOL_DRIVER_IMPL_H
9ca8c4
9ca8c4
#include <stdint.h>
9ca8c4
#include <stdio.h>
a126a7
#include <sys/stat.h>
9ca8c4
#include <sys/types.h>
9ca8c4
9ca8c4
#include <slibtool/slibtool.h>
608847
#include "slibtool_dprintf_impl.h"
6ab3f1
#include "slibtool_mapfile_impl.h"
4b56de
#include "slibtool_visibility_impl.h"
9ca8c4
#include "argv/argv.h"
9ca8c4
5e0269
#define SLBT_OPTV_ELEMENTS 128
d58d2f
9ca8c4
extern const struct argv_option slbt_default_options[];
9ca8c4
9ca8c4
enum app_tags {
9ca8c4
	TAG_HELP,
efd47f
	TAG_HELP_ALL,
9ca8c4
	TAG_VERSION,
c57816
	TAG_INFO,
c1f216
	TAG_CONFIG,
6f4115
	TAG_DUMPMACHINE,
efd47f
	TAG_DEBUG,
efd47f
	TAG_DRY_RUN,
efd47f
	TAG_FEATURES,
0a9bff
	TAG_LEGABITS,
efd47f
	TAG_MODE,
b9575f
	TAG_FINISH,
efd47f
	TAG_WARNINGS,
2bc175
	TAG_ANNOTATE,
efd47f
	TAG_DEPS,
efd47f
	TAG_SILENT,
efd47f
	TAG_TAG,
34988f
	TAG_CCWRAP,
efd47f
	TAG_VERBOSE,
302dac
	TAG_TARGET,
302dac
	TAG_HOST,
302dac
	TAG_FLAVOR,
302dac
	TAG_AR,
6bc170
	TAG_AS,
302dac
	TAG_RANLIB,
9a02e2
	TAG_WINDRES,
302dac
	TAG_DLLTOOL,
fbda3a
	TAG_MDSO,
fbda3a
	TAG_IMPLIB,
116dbb
	TAG_OUTPUT,
63a1b4
	TAG_BINDIR,
523027
	TAG_LDRPATH,
bfa8ca
	TAG_SHREXT,
9c664d
	TAG_RPATH,
17e18a
	TAG_SYSROOT,
9aa1f4
	TAG_RELEASE,
a126a7
	TAG_OBJECTLIST,
05ca7e
	TAG_DLOPEN,
bb5843
	TAG_DLPREOPEN,
916050
	TAG_EXPORT_DYNAMIC,
21bb4b
	TAG_EXPSYMS_FILE,
21bb4b
	TAG_EXPSYMS_REGEX,
5a9161
	TAG_VERSION_INFO,
cd3d41
	TAG_VERSION_NUMBER,
116dbb
	TAG_NO_SUPPRESS,
b76221
	TAG_NO_INSTALL,
116dbb
	TAG_PREFER_PIC,
116dbb
	TAG_PREFER_NON_PIC,
499a71
	TAG_HEURISTICS,
116dbb
	TAG_SHARED,
116dbb
	TAG_STATIC,
56f236
	TAG_STATIC_LIBTOOL_LIBS,
f7645c
	TAG_ALL_STATIC,
0e609b
	TAG_DISABLE_STATIC,
f5fa4c
	TAG_DISABLE_SHARED,
93b62c
	TAG_NO_UNDEFINED,
a943fc
	TAG_MODULE,
68f313
	TAG_AVOID_VERSION,
116dbb
	TAG_COMPILER_FLAG,
116dbb
	TAG_VERBATIM_FLAG,
53b931
	TAG_THREAD_SAFE,
5e0269
	TAG_WEAK,
995aad
	/* ar mode */
995aad
	TAG_AR_HELP,
995aad
	TAG_AR_VERSION,
995aad
	TAG_AR_CHECK,
8afddf
	TAG_AR_PRINT,
2dc23e
	TAG_AR_MAPFILE,
874b59
	TAG_AR_NOSORT,
76c5e9
	TAG_AR_REGEX,
8afddf
	TAG_AR_PRETTY,
886865
	TAG_AR_POSIX,
886865
	TAG_AR_YAML,
0b177b
	TAG_AR_MERGE,
0b177b
	TAG_AR_OUTPUT,
191700
	TAG_AR_VERBOSE,
9ca8c4
};
9ca8c4
0cbb20
struct slbt_split_vector {
0cbb20
	char *		dargs;
0cbb20
	char **		dargv;
0cbb20
	char **		targv;
0cbb20
	char **		cargv;
0cbb20
};
0cbb20
46ea99
struct slbt_host_strs {
c67e64
	char *		machine;
46ea99
	char *		host;
46ea99
	char *		flavor;
46ea99
	char *		ar;
6bc170
	char *		as;
46ea99
	char *		ranlib;
9a02e2
	char *		windres;
46ea99
	char *		dlltool;
fbda3a
	char *		mdso;
5ddd2a
	char **		ar_argv;
5ddd2a
	char **		as_argv;
5ddd2a
	char **		ranlib_argv;
5ddd2a
	char **		windres_argv;
5ddd2a
	char **		dlltool_argv;
5ddd2a
	char **		mdso_argv;
46ea99
};
46ea99
a126a7
struct slbt_obj_list {
a126a7
	const char *	name;
a126a7
	void *		addr;
a126a7
	size_t		size;
a126a7
	int		objc;
a126a7
	char **		objv;
a126a7
};
a126a7
9ca8c4
struct slbt_driver_ctx_impl {
9ca8c4
	struct slbt_common_ctx	cctx;
9ca8c4
	struct slbt_driver_ctx	ctx;
46ea99
	struct slbt_host_strs	host;
a313a4
	struct slbt_host_strs	ahost;
a82cc2
	struct slbt_fd_ctx	fdctx;
6ab3f1
	struct slbt_map_info    lconf;
a126a7
	struct slbt_obj_list *	objlistv;
7bab5a
7bab5a
	const struct slbt_archive_ctx * arctx;
7bab5a
	const char *                    arpath;
7bab5a
f8e27e
	char *			libname;
0cbb20
	char *			dargs;
0cbb20
	char **			dargv;
56cab3
	char **			targv;
56cab3
	char **			cargv;
e8bfe5
	char **			envp;
41c05b
	struct slbt_error_info**errinfp;
41c05b
	struct slbt_error_info**erricap;
41c05b
	struct slbt_error_info *erriptr[64];
41c05b
	struct slbt_error_info	erribuf[64];
9ca8c4
};
9ca8c4
8f60d4
struct slbt_driver_ctx_alloc {
8f60d4
	struct argv_meta *		meta;
8f60d4
	struct slbt_driver_ctx_impl	ctx;
8f60d4
	uint64_t			guard;
8f60d4
};
8f60d4
9706fa
struct slbt_exec_ctx_impl {
9706fa
	int			argc;
9706fa
	char *			args;
9706fa
	char *			shadow;
9706fa
	char *			dsoprefix;
9706fa
	size_t			size;
9706fa
	struct slbt_exec_ctx	ctx;
9706fa
	int			fdwrapper;
d98877
	char **			lout[2];
d98877
	char **			mout[2];
9706fa
	char *			vbuffer[];
9706fa
};
9706fa
7bab5a
struct slbt_archive_ctx_impl {
b1d1a0
	const struct slbt_driver_ctx *	dctx;
7bab5a
	const char *			path;
7bab5a
	struct slbt_raw_archive		map;
7bab5a
	struct slbt_archive_meta *	meta;
7bab5a
	struct slbt_archive_ctx		actx;
7bab5a
};
7bab5a
8f60d4
99c275
const char * slbt_program_name(const char *);
99c275
99c275
c3d88b
int slbt_optv_init(
c3d88b
	const struct argv_option[],
c3d88b
	const struct argv_option **);
c3d88b
c3d88b
1ed017
uint64_t slbt_argv_flags(uint64_t flags);
1ed017
1ed017
c3d88b
void slbt_argv_scan(
c3d88b
	char **				argv,
c3d88b
	const struct argv_option **	optv,
c3d88b
	struct argv_ctx *		ctx,
c3d88b
	struct argv_meta *		meta);
c3d88b
c3d88b
c3d88b
struct argv_meta * slbt_argv_get(
c3d88b
	char **,
c3d88b
	const struct argv_option **,
c3d88b
	int flags,
c3d88b
	int fd);
c3d88b
c3d88b
void slbt_argv_free(struct argv_meta *);
c3d88b
c3d88b
6b2413
void slbt_argv_usage(
6b2413
	int		fd,
6b2413
	const char *	header,
6b2413
	const struct	argv_option **,
6b2413
	const char *	mode);
6b2413
6b2413
6b2413
void slbt_argv_usage_plain(
6b2413
	int		fd,
6b2413
	const char *	header,
6b2413
	const struct	argv_option **,
6b2413
	const char *	mode);
6b2413
6b2413
1ed017
int slbt_driver_usage(
1ed017
	int				fdout,
1ed017
	const char *			program,
1ed017
	const char *			arg,
1ed017
	const struct argv_option **	optv,
1ed017
	struct argv_meta *		meta,
1ed017
	struct slbt_split_vector *	sargv,
1ed017
	struct slbt_obj_list *		objlistv,
1ed017
	int				noclr);
1ed017
1ed017
1ed017
int slbt_split_argv(
1ed017
	char **				argv,
1ed017
	uint64_t			flags,
1ed017
	struct slbt_split_vector *	sargv,
1ed017
	struct slbt_obj_list **		aobjlistv,
1ed017
	int				fderr,
1ed017
	int				fdcwd);
1ed017
1ed017
99c275
int slbt_init_version_info(
99c275
	struct slbt_driver_ctx_impl *	ictx,
99c275
	struct slbt_version_info *	verinfo);
99c275
99c275
8f60d4
int slbt_init_host_params(
8f60d4
	const struct slbt_driver_ctx *	dctx,
8f60d4
	const struct slbt_common_ctx *	cctx,
8f60d4
	struct slbt_host_strs *		drvhost,
8f60d4
	struct slbt_host_params *	host,
8f60d4
	struct slbt_host_params *	cfgmeta,
771899
	const char *                    cfgmeta_host,
8f60d4
	const char *                    cfgmeta_ar,
b4058c
	const char *                    cfgmeta_as,
fc8ee9
	const char *                    cfgmeta_ranlib,
fc8ee9
	const char *                    cfgmeta_dlltool);
8f60d4
8f60d4
8f60d4
void slbt_free_host_params(struct slbt_host_strs * host);
8f60d4
8f60d4
741c4d
int slbt_init_link_params(struct slbt_driver_ctx_impl * ctx);
741c4d
741c4d
8f60d4
void slbt_init_flavor_settings(
8f60d4
	struct slbt_common_ctx *	cctx,
8f60d4
	const struct slbt_host_params * ahost,
8f60d4
	struct slbt_flavor_settings *	psettings);
8f60d4
8f60d4
8f60d4
int slbt_init_ldrpath(
8f60d4
	struct slbt_common_ctx *  cctx,
8f60d4
	struct slbt_host_params * host);
8f60d4
8f60d4
5d46be
static inline struct slbt_archive_ctx_impl * slbt_get_archive_ictx(const struct slbt_archive_ctx * actx)
5d46be
{
5d46be
	uintptr_t addr;
5d46be
5d46be
	if (actx) {
5d46be
		addr = (uintptr_t)actx - offsetof(struct slbt_archive_ctx_impl,actx);
5d46be
		return (struct slbt_archive_ctx_impl *)addr;
5d46be
	}
5d46be
5d46be
	return 0;
5d46be
}
5d46be
3a8090
static inline struct slbt_driver_ctx_impl * slbt_get_driver_ictx(const struct slbt_driver_ctx * dctx)
3a8090
{
3a8090
	uintptr_t addr;
3a8090
3a8090
	if (dctx) {
3a8090
		addr = (uintptr_t)dctx - offsetof(struct slbt_driver_ctx_impl,ctx);
3a8090
		return (struct slbt_driver_ctx_impl *)addr;
3a8090
	}
3a8090
3a8090
	return 0;
3a8090
}
3a8090
7bab5a
static inline void slbt_driver_set_arctx(
7bab5a
	const struct slbt_driver_ctx *  dctx,
7bab5a
	const struct slbt_archive_ctx * arctx,
7bab5a
	const char *                    arpath)
7bab5a
{
7bab5a
	struct slbt_driver_ctx_impl * ictx;
7bab5a
7bab5a
7bab5a
	ictx         = slbt_get_driver_ictx(dctx);
7bab5a
	ictx->arctx  = arctx;
7bab5a
	ictx->arpath = arpath;
7bab5a
}
7bab5a
e8bfe5
static inline char ** slbt_driver_envp(const struct slbt_driver_ctx * dctx)
e8bfe5
{
e8bfe5
	struct slbt_driver_ctx_impl * ictx;
e8bfe5
	ictx = slbt_get_driver_ictx(dctx);
e8bfe5
	return ictx->envp;
e8bfe5
}
e8bfe5
a82cc2
static inline int slbt_driver_fdin(const struct slbt_driver_ctx * dctx)
a82cc2
{
a82cc2
	struct slbt_fd_ctx fdctx;
a82cc2
	slbt_get_driver_fdctx(dctx,&fdctx);
a82cc2
	return fdctx.fdin;
a82cc2
}
a82cc2
a82cc2
static inline int slbt_driver_fdout(const struct slbt_driver_ctx * dctx)
a82cc2
{
a82cc2
	struct slbt_fd_ctx fdctx;
a82cc2
	slbt_get_driver_fdctx(dctx,&fdctx);
a82cc2
	return fdctx.fdout;
a82cc2
}
a82cc2
a82cc2
static inline int slbt_driver_fderr(const struct slbt_driver_ctx * dctx)
a82cc2
{
a82cc2
	struct slbt_fd_ctx fdctx;
a82cc2
	slbt_get_driver_fdctx(dctx,&fdctx);
a82cc2
	return fdctx.fderr;
a82cc2
}
a82cc2
a82cc2
static inline int slbt_driver_fdlog(const struct slbt_driver_ctx * dctx)
a82cc2
{
a82cc2
	struct slbt_fd_ctx fdctx;
a82cc2
	slbt_get_driver_fdctx(dctx,&fdctx);
a82cc2
	return fdctx.fdlog;
a82cc2
}
a82cc2
ca72f5
static inline int slbt_driver_fdcwd(const struct slbt_driver_ctx * dctx)
ca72f5
{
ca72f5
	struct slbt_fd_ctx fdctx;
ca72f5
	slbt_get_driver_fdctx(dctx,&fdctx);
ca72f5
	return fdctx.fdcwd;
ca72f5
}
ca72f5
ca72f5
static inline int slbt_driver_fddst(const struct slbt_driver_ctx * dctx)
ca72f5
{
ca72f5
	struct slbt_fd_ctx fdctx;
ca72f5
	slbt_get_driver_fdctx(dctx,&fdctx);
ca72f5
	return fdctx.fddst;
ca72f5
}
ca72f5
9706fa
static inline struct slbt_exec_ctx_impl * slbt_get_exec_ictx(const struct slbt_exec_ctx * ectx)
9706fa
{
9706fa
	uintptr_t addr;
9706fa
9706fa
	addr = (uintptr_t)ectx - offsetof(struct slbt_exec_ctx_impl,ctx);
9706fa
	return (struct slbt_exec_ctx_impl *)addr;
9706fa
}
9706fa
9706fa
static inline int slbt_exec_get_fdwrapper(const struct slbt_exec_ctx * ectx)
9706fa
{
9706fa
	struct slbt_exec_ctx_impl * ictx;
9706fa
	ictx = slbt_get_exec_ictx(ectx);
9706fa
	return ictx->fdwrapper;
9706fa
}
9706fa
9706fa
static inline void slbt_exec_set_fdwrapper(const struct slbt_exec_ctx * ectx, int fd)
9706fa
{
9706fa
	struct slbt_exec_ctx_impl * ictx;
9706fa
	ictx = slbt_get_exec_ictx(ectx);
9706fa
	ictx->fdwrapper = fd;
9706fa
}
9706fa
9706fa
static inline void slbt_exec_close_fdwrapper(const struct slbt_exec_ctx * ectx)
9706fa
{
9706fa
	struct slbt_exec_ctx_impl * ictx;
9706fa
	ictx = slbt_get_exec_ictx(ectx);
9706fa
	close(ictx->fdwrapper);
9706fa
	ictx->fdwrapper = (-1);
9706fa
}
9706fa
9ca8c4
#endif