diff options
Diffstat (limited to 'include/slibtool/slibtool.h')
-rw-r--r-- | include/slibtool/slibtool.h | 287 |
1 files changed, 252 insertions, 35 deletions
diff --git a/include/slibtool/slibtool.h b/include/slibtool/slibtool.h index ee34b9a..f05de74 100644 --- a/include/slibtool/slibtool.h +++ b/include/slibtool/slibtool.h @@ -1,12 +1,14 @@ #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" { @@ -36,7 +38,7 @@ extern "C" { #define SLBT_DRIVER_VERSION 0x0010 #define SLBT_DRIVER_DRY_RUN 0x0020 -#define SLBT_DRIVER_CONFIG 0x0040 +#define SLBT_DRIVER_INFO 0x0040 #define SLBT_DRIVER_DEBUG 0x0080 #define SLBT_DRIVER_FEATURES 0x0100 #define SLBT_DRIVER_DEPS 0x0200 @@ -69,7 +71,33 @@ extern "C" { #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_OUTPUT_AUX_DIR SLBT_DRIVER_XFLAG(0x4000) +#define SLBT_DRIVER_OUTPUT_M4_DIR SLBT_DRIVER_XFLAG(0x8000) + +#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 @@ -80,6 +108,13 @@ extern "C" { 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, @@ -93,11 +128,36 @@ enum slbt_custom_error { SLBT_ERR_LCONF_OPEN, SLBT_ERR_LCONF_MAP, SLBT_ERR_LCONF_PARSE, + SLBT_ERR_MKVARS_OPEN, + SLBT_ERR_MKVARS_MAP, + SLBT_ERR_MKVARS_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, @@ -106,6 +166,8 @@ enum slbt_mode { SLBT_MODE_INSTALL, SLBT_MODE_LINK, SLBT_MODE_UNINSTALL, + SLBT_MODE_AR, + SLBT_MODE_STOOLIE, }; enum slbt_tag { @@ -114,6 +176,7 @@ enum slbt_tag { SLBT_TAG_CXX, SLBT_TAG_FC, SLBT_TAG_F77, + SLBT_TAG_ASM, SLBT_TAG_NASM, SLBT_TAG_RC, }; @@ -125,6 +188,11 @@ enum slbt_warning_level { SLBT_WARNING_LEVEL_NONE, }; +struct slbt_input { + void * addr; + size_t size; +}; + struct slbt_source_version { int major; int minor; @@ -144,44 +212,67 @@ struct slbt_fd_ctx { 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; }; @@ -208,6 +299,8 @@ 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; @@ -227,6 +320,7 @@ struct slbt_flavor_settings { const char * exesuffix; const char * impprefix; const char * impsuffix; + const char * mapsuffix; const char * ldpathenv; char * picswitch; }; @@ -248,6 +342,7 @@ struct slbt_common_ctx { char ** cargv; char ** targv; char * libname; + const char * dlunit; const char * ccwrap; const char * target; const char * output; @@ -255,7 +350,7 @@ struct slbt_common_ctx { const char * rpath; const char * sysroot; const char * release; - const char * symfile; + const char * expsyms; const char * regex; const char * user; }; @@ -268,63 +363,185 @@ struct slbt_driver_ctx { 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_get_driver_ctx (char ** argv, char ** envp, uint32_t flags, +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_free_driver_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_get_driver_fdctx (const struct slbt_driver_ctx *, struct slbt_fd_ctx *); -slbt_api int slbt_set_driver_fdctx (struct slbt_driver_ctx *, const struct slbt_fd_ctx *); +slbt_api int slbt_lib_set_driver_fdctx (struct slbt_driver_ctx *, const struct slbt_fd_ctx *); -/* execution context api */ -slbt_api int slbt_get_exec_ctx (const struct slbt_driver_ctx *, struct slbt_exec_ctx **); -slbt_api void slbt_free_exec_ctx (struct slbt_exec_ctx *); -slbt_api void slbt_reset_argvector (struct slbt_exec_ctx *); -slbt_api void slbt_reset_arguments (struct slbt_exec_ctx *); -slbt_api void slbt_reset_placeholders (struct slbt_exec_ctx *); -slbt_api void slbt_disable_placeholders (struct slbt_exec_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 *, struct slbt_exec_ctx *); -slbt_api int slbt_exec_execute (const struct slbt_driver_ctx *, struct slbt_exec_ctx *); -slbt_api int slbt_exec_install (const struct slbt_driver_ctx *, struct slbt_exec_ctx *); -slbt_api int slbt_exec_link (const struct slbt_driver_ctx *, struct slbt_exec_ctx *); -slbt_api int slbt_exec_uninstall (const struct slbt_driver_ctx *, struct slbt_exec_ctx *); +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 int slbt_set_alternate_host (const struct slbt_driver_ctx *, const char * host, const char * flavor); -slbt_api void slbt_reset_alternate_host (const struct slbt_driver_ctx *); +slbt_api void slbt_host_reset_althost (const struct slbt_driver_ctx *); -slbt_api int slbt_get_flavor_settings (const char *, const struct slbt_flavor_settings **); +slbt_api int slbt_host_objfmt_is_coff (const struct slbt_driver_ctx *); -/* helper api */ -slbt_api int slbt_archive_import (const struct slbt_driver_ctx *, struct slbt_exec_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_copy_file (const struct slbt_driver_ctx *, struct slbt_exec_ctx *, - char * src, char * dst); -slbt_api int slbt_dump_machine (const char * compiler, char * machine, size_t bufsize); -slbt_api int slbt_realpath (int, const char *, int, char *, size_t); + +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_driver_ctx *, const struct slbt_exec_ctx *, const char *); -slbt_api int slbt_output_compile (const struct slbt_driver_ctx *, const struct slbt_exec_ctx *); -slbt_api int slbt_output_execute (const struct slbt_driver_ctx *, const struct slbt_exec_ctx *); -slbt_api int slbt_output_install (const struct slbt_driver_ctx *, const struct slbt_exec_ctx *); -slbt_api int slbt_output_link (const struct slbt_driver_ctx *, const struct slbt_exec_ctx *); -slbt_api int slbt_output_uninstall (const struct slbt_driver_ctx *, const struct slbt_exec_ctx *); -slbt_api int slbt_output_error_record (const struct slbt_driver_ctx *, const struct slbt_error_info *); + +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_source_version(void); +slbt_api const struct slbt_source_version * slbt_api_source_version(void); #ifdef __cplusplus } |