summaryrefslogtreecommitdiff
path: root/src/internal/slibtool_driver_impl.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/internal/slibtool_driver_impl.h')
-rw-r--r--src/internal/slibtool_driver_impl.h357
1 files changed, 321 insertions, 36 deletions
diff --git a/src/internal/slibtool_driver_impl.h b/src/internal/slibtool_driver_impl.h
index 270e9d6..429cdc4 100644
--- a/src/internal/slibtool_driver_impl.h
+++ b/src/internal/slibtool_driver_impl.h
@@ -1,6 +1,6 @@
/*******************************************************************/
-/* slibtool: a skinny libtool implementation, written in C */
-/* Copyright (C) 2016--2021 Z. Gilboa */
+/* slibtool: a strong libtool implementation, written in C */
+/* Copyright (C) 2016--2024 SysDeer Technologies, LLC */
/* Released under the Standard MIT License; see COPYING.SLIBTOOL. */
/*******************************************************************/
@@ -9,13 +9,16 @@
#include <stdint.h>
#include <stdio.h>
+#include <sys/stat.h>
#include <sys/types.h>
#include <slibtool/slibtool.h>
#include "slibtool_dprintf_impl.h"
+#include "slibtool_mapfile_impl.h"
+#include "slibtool_visibility_impl.h"
#include "argv/argv.h"
-#define SLBT_OPTV_ELEMENTS 64
+#define SLBT_OPTV_ELEMENTS 128
extern const struct argv_option slbt_default_options[];
@@ -23,8 +26,12 @@ enum app_tags {
TAG_HELP,
TAG_HELP_ALL,
TAG_VERSION,
+ TAG_INFO,
TAG_CONFIG,
+ TAG_MKVARS,
TAG_DUMPMACHINE,
+ TAG_PRINT_AUX_DIR,
+ TAG_PRINT_M4_DIR,
TAG_DEBUG,
TAG_DRY_RUN,
TAG_FEATURES,
@@ -42,6 +49,8 @@ enum app_tags {
TAG_HOST,
TAG_FLAVOR,
TAG_AR,
+ TAG_AS,
+ TAG_NM,
TAG_RANLIB,
TAG_WINDRES,
TAG_DLLTOOL,
@@ -54,11 +63,12 @@ enum app_tags {
TAG_RPATH,
TAG_SYSROOT,
TAG_RELEASE,
+ TAG_OBJECTLIST,
TAG_DLOPEN,
TAG_DLPREOPEN,
TAG_EXPORT_DYNAMIC,
- TAG_EXPSYM_FILE,
- TAG_EXPSYM_REGEX,
+ TAG_EXPSYMS_FILE,
+ TAG_EXPSYMS_REGEX,
TAG_VERSION_INFO,
TAG_VERSION_NUMBER,
TAG_NO_SUPPRESS,
@@ -78,6 +88,36 @@ enum app_tags {
TAG_COMPILER_FLAG,
TAG_VERBATIM_FLAG,
TAG_THREAD_SAFE,
+ TAG_WEAK,
+ /* ar mode */
+ TAG_AR_HELP,
+ TAG_AR_VERSION,
+ TAG_AR_CHECK,
+ TAG_AR_PRINT,
+ TAG_AR_MAPFILE,
+ TAG_AR_DLUNIT,
+ TAG_AR_DLSYMS,
+ TAG_AR_NOSORT,
+ TAG_AR_REGEX,
+ TAG_AR_PRETTY,
+ TAG_AR_POSIX,
+ TAG_AR_YAML,
+ TAG_AR_MERGE,
+ TAG_AR_OUTPUT,
+ TAG_AR_VERBOSE,
+ /* slibtoolize (stoolie) mode */
+ TAG_STLE_VERSION,
+ TAG_STLE_HELP,
+ TAG_STLE_COPY,
+ TAG_STLE_FORCE,
+ TAG_STLE_INSTALL,
+ TAG_STLE_DEBUG,
+ TAG_STLE_DRY_RUN,
+ TAG_STLE_SILENT,
+ TAG_STLE_VERBOSE,
+ TAG_STLE_WARNINGS,
+ TAG_STLE_NO_WARNINGS,
+ TAG_STLE_LTDL,
};
struct slbt_split_vector {
@@ -92,43 +132,251 @@ struct slbt_host_strs {
char * host;
char * flavor;
char * ar;
+ char * as;
+ char * nm;
char * ranlib;
char * windres;
char * dlltool;
char * mdso;
+ char ** ar_argv;
+ char ** as_argv;
+ char ** nm_argv;
+ char ** ranlib_argv;
+ char ** windres_argv;
+ char ** dlltool_argv;
+ char ** mdso_argv;
+};
+
+struct slbt_obj_list {
+ const char * name;
+ void * addr;
+ size_t size;
+ int objc;
+ char ** objv;
};
struct slbt_driver_ctx_impl {
- struct slbt_common_ctx cctx;
- struct slbt_driver_ctx ctx;
- struct slbt_host_strs host;
- struct slbt_host_strs ahost;
- struct slbt_fd_ctx fdctx;
- char * libname;
- char * dargs;
- char ** dargv;
- char ** targv;
- char ** cargv;
- char ** envp;
- struct slbt_error_info**errinfp;
- struct slbt_error_info**erricap;
- struct slbt_error_info *erriptr[64];
- struct slbt_error_info erribuf[64];
+ struct argv_meta * meta;
+ struct slbt_common_ctx cctx;
+ struct slbt_driver_ctx ctx;
+ struct slbt_host_strs host;
+ struct slbt_host_strs ahost;
+ struct slbt_fd_ctx fdctx;
+ struct slbt_map_info lconf;
+ struct slbt_txtfile_ctx * lconfctx;
+ struct slbt_txtfile_ctx * mkvarsctx;
+ struct slbt_obj_list * objlistv;
+
+ struct argv_entry ** dlopenv;
+ size_t ndlopen;
+
+ const struct slbt_archive_ctx * arctx;
+ const char * arpath;
+
+ char * libname;
+ char * dargs;
+ char ** dargv;
+ char ** targv;
+ char ** cargv;
+ char ** envp;
+
+ struct slbt_error_info** errinfp;
+ struct slbt_error_info** erricap;
+ struct slbt_error_info * erriptr[64];
+ struct slbt_error_info erribuf[64];
+};
+
+struct slbt_driver_ctx_alloc {
+ struct slbt_driver_ctx_impl ctx;
+ uint64_t guard;
};
struct slbt_exec_ctx_impl {
- int argc;
- char * args;
- char * shadow;
- char * dsoprefix;
- size_t size;
- struct slbt_exec_ctx ctx;
- int fdwrapper;
- char ** lout[2];
- char ** mout[2];
- char * vbuffer[];
+ const struct slbt_driver_ctx * dctx;
+ struct slbt_symlist_ctx * sctx;
+ struct slbt_exec_ctx ctx;
+ struct slbt_archive_ctx ** dlactxv;
+ struct slbt_archive_ctx * dlpreopen;
+ char ** dlargv;
+ int argc;
+ char * args;
+ char * shadow;
+ char * dsoprefix;
+ size_t size;
+ size_t exts;
+ int fdwrapper;
+ char sbuf[PATH_MAX];
+ char ** lout[2];
+ char ** mout[2];
+ char ** vbuffer;
};
+struct slbt_archive_ctx_impl {
+ const struct slbt_driver_ctx * dctx;
+ const char * path;
+ char * pathbuf;
+ struct slbt_raw_archive map;
+ struct slbt_archive_meta * meta;
+ struct slbt_archive_ctx actx;
+};
+
+struct slbt_symlist_ctx_impl {
+ const struct slbt_driver_ctx * dctx;
+ const char * path;
+ char * pathbuf;
+ char * symstrs;
+ const char ** symstrv;
+ struct slbt_symlist_ctx sctx;
+};
+
+
+struct slbt_txtfile_ctx_impl {
+ const struct slbt_driver_ctx * dctx;
+ const char * path;
+ char * pathbuf;
+ char * txtlines;
+ const char ** txtlinev;
+ struct slbt_txtfile_ctx tctx;
+};
+
+struct slbt_stoolie_ctx_impl {
+ const struct slbt_driver_ctx * dctx;
+ const char * path;
+ char * pathbuf;
+ int fdtgt;
+ int fdaux;
+ int fdm4;
+ const char * auxarg;
+ char * auxbuf;
+ const char * m4arg;
+ char * m4buf;
+ char ** m4argv;
+ struct slbt_txtfile_ctx * acinc;
+ struct slbt_txtfile_ctx * cfgac;
+ struct slbt_txtfile_ctx * makam;
+ struct slbt_stoolie_ctx zctx;
+};
+
+const char * slbt_program_name(const char *);
+
+
+int slbt_optv_init(
+ const struct argv_option[],
+ const struct argv_option **);
+
+
+uint64_t slbt_argv_flags(uint64_t flags);
+
+
+void slbt_argv_scan(
+ char ** argv,
+ const struct argv_option ** optv,
+ struct argv_ctx * ctx,
+ struct argv_meta * meta);
+
+
+struct argv_meta * slbt_argv_get(
+ char **,
+ const struct argv_option **,
+ int flags,
+ int fd);
+
+void slbt_argv_free(struct argv_meta *);
+
+
+void slbt_argv_usage(
+ int fd,
+ const char * header,
+ const struct argv_option **,
+ const char * mode);
+
+
+void slbt_argv_usage_plain(
+ int fd,
+ const char * header,
+ const struct argv_option **,
+ const char * mode);
+
+
+int slbt_driver_usage(
+ int fdout,
+ const char * program,
+ const char * arg,
+ const struct argv_option ** optv,
+ struct argv_meta * meta,
+ struct slbt_split_vector * sargv,
+ struct slbt_obj_list * objlistv,
+ int noclr);
+
+
+int slbt_split_argv(
+ char ** argv,
+ uint64_t flags,
+ struct slbt_split_vector * sargv,
+ struct slbt_obj_list ** aobjlistv,
+ int fderr,
+ int fdcwd);
+
+
+int slbt_init_version_info(
+ struct slbt_driver_ctx_impl * ictx,
+ struct slbt_version_info * verinfo);
+
+
+int slbt_init_host_params(
+ const struct slbt_driver_ctx * dctx,
+ const struct slbt_common_ctx * cctx,
+ struct slbt_host_strs * drvhost,
+ struct slbt_host_params * host,
+ struct slbt_host_params * cfgmeta,
+ const char * cfgmeta_host,
+ const char * cfgmeta_ar,
+ const char * cfgmeta_as,
+ const char * cfgmeta_nm,
+ const char * cfgmeta_ranlib,
+ const char * cfgmeta_dlltool);
+
+
+void slbt_free_host_params(struct slbt_host_strs * host);
+
+
+int slbt_init_link_params(struct slbt_driver_ctx_impl * ctx);
+
+
+void slbt_init_flavor_settings(
+ struct slbt_common_ctx * cctx,
+ const struct slbt_host_params * ahost,
+ struct slbt_flavor_settings * psettings);
+
+
+int slbt_init_ldrpath(
+ struct slbt_common_ctx * cctx,
+ struct slbt_host_params * host);
+
+
+void slbt_reset_placeholders (struct slbt_exec_ctx *);
+
+void slbt_disable_placeholders (struct slbt_exec_ctx *);
+
+int slbt_impl_get_txtfile_ctx(
+ const struct slbt_driver_ctx * dctx,
+ const char * path,
+ int fdsrc,
+ struct slbt_txtfile_ctx ** pctx);
+
+
+static inline struct slbt_archive_ctx_impl * slbt_get_archive_ictx(const struct slbt_archive_ctx * actx)
+{
+ uintptr_t addr;
+
+ if (actx) {
+ addr = (uintptr_t)actx - offsetof(struct slbt_archive_ctx_impl,actx);
+ return (struct slbt_archive_ctx_impl *)addr;
+ }
+
+ return 0;
+}
+
static inline struct slbt_driver_ctx_impl * slbt_get_driver_ictx(const struct slbt_driver_ctx * dctx)
{
uintptr_t addr;
@@ -141,6 +389,43 @@ static inline struct slbt_driver_ctx_impl * slbt_get_driver_ictx(const struct sl
return 0;
}
+static inline struct slbt_symlist_ctx_impl * slbt_get_symlist_ictx(const struct slbt_symlist_ctx * sctx)
+{
+ uintptr_t addr;
+
+ if (sctx) {
+ addr = (uintptr_t)sctx - offsetof(struct slbt_symlist_ctx_impl,sctx);
+ return (struct slbt_symlist_ctx_impl *)addr;
+ }
+
+ return 0;
+}
+
+static inline struct slbt_stoolie_ctx_impl * slbt_get_stoolie_ictx(const struct slbt_stoolie_ctx * stctx)
+{
+ uintptr_t addr;
+
+ if (stctx) {
+ addr = (uintptr_t)stctx - offsetof(struct slbt_stoolie_ctx_impl,zctx);
+ return (struct slbt_stoolie_ctx_impl *)addr;
+ }
+
+ return 0;
+}
+
+static inline void slbt_driver_set_arctx(
+ const struct slbt_driver_ctx * dctx,
+ const struct slbt_archive_ctx * arctx,
+ const char * arpath)
+{
+ struct slbt_driver_ctx_impl * ictx;
+
+
+ ictx = slbt_get_driver_ictx(dctx);
+ ictx->arctx = arctx;
+ ictx->arpath = arpath;
+}
+
static inline char ** slbt_driver_envp(const struct slbt_driver_ctx * dctx)
{
struct slbt_driver_ctx_impl * ictx;
@@ -151,42 +436,42 @@ static inline char ** slbt_driver_envp(const struct slbt_driver_ctx * dctx)
static inline int slbt_driver_fdin(const struct slbt_driver_ctx * dctx)
{
struct slbt_fd_ctx fdctx;
- slbt_get_driver_fdctx(dctx,&fdctx);
+ slbt_lib_get_driver_fdctx(dctx,&fdctx);
return fdctx.fdin;
}
static inline int slbt_driver_fdout(const struct slbt_driver_ctx * dctx)
{
struct slbt_fd_ctx fdctx;
- slbt_get_driver_fdctx(dctx,&fdctx);
+ slbt_lib_get_driver_fdctx(dctx,&fdctx);
return fdctx.fdout;
}
static inline int slbt_driver_fderr(const struct slbt_driver_ctx * dctx)
{
struct slbt_fd_ctx fdctx;
- slbt_get_driver_fdctx(dctx,&fdctx);
+ slbt_lib_get_driver_fdctx(dctx,&fdctx);
return fdctx.fderr;
}
static inline int slbt_driver_fdlog(const struct slbt_driver_ctx * dctx)
{
struct slbt_fd_ctx fdctx;
- slbt_get_driver_fdctx(dctx,&fdctx);
+ slbt_lib_get_driver_fdctx(dctx,&fdctx);
return fdctx.fdlog;
}
static inline int slbt_driver_fdcwd(const struct slbt_driver_ctx * dctx)
{
struct slbt_fd_ctx fdctx;
- slbt_get_driver_fdctx(dctx,&fdctx);
+ slbt_lib_get_driver_fdctx(dctx,&fdctx);
return fdctx.fdcwd;
}
static inline int slbt_driver_fddst(const struct slbt_driver_ctx * dctx)
{
struct slbt_fd_ctx fdctx;
- slbt_get_driver_fdctx(dctx,&fdctx);
+ slbt_lib_get_driver_fdctx(dctx,&fdctx);
return fdctx.fddst;
}