diff options
-rw-r--r-- | include/slibtool/slibtool.h | 2 | ||||
-rw-r--r-- | project/common.mk | 1 | ||||
-rw-r--r-- | src/util/slbt_create_symfile.c | 88 |
3 files changed, 91 insertions, 0 deletions
diff --git a/include/slibtool/slibtool.h b/include/slibtool/slibtool.h index 86d5ca5..4046352 100644 --- a/include/slibtool/slibtool.h +++ b/include/slibtool/slibtool.h @@ -422,6 +422,8 @@ slbt_api int slbt_util_copy_file (struct slbt_exec_ctx *, 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); diff --git a/project/common.mk b/project/common.mk index f022fde..3139daa 100644 --- a/project/common.mk +++ b/project/common.mk @@ -24,6 +24,7 @@ API_SRCS = \ src/host/slbt_host_params.c \ src/util/slbt_archive_import.c \ src/util/slbt_create_mapfile.c \ + src/util/slbt_create_symfile.c \ src/util/slbt_copy_file.c \ src/util/slbt_dump_machine.c \ src/util/slbt_map_input.c \ diff --git a/src/util/slbt_create_symfile.c b/src/util/slbt_create_symfile.c new file mode 100644 index 0000000..d6ab9f7 --- /dev/null +++ b/src/util/slbt_create_symfile.c @@ -0,0 +1,88 @@ +/*******************************************************************/ +/* slibtool: a skinny libtool implementation, written in C */ +/* Copyright (C) 2016--2024 SysDeer Technologies, LLC */ +/* Released under the Standard MIT License; see COPYING.SLIBTOOL. */ +/*******************************************************************/ + +#include <time.h> +#include <locale.h> +#include <regex.h> +#include <inttypes.h> +#include <slibtool/slibtool.h> +#include <slibtool/slibtool_output.h> +#include "slibtool_driver_impl.h" +#include "slibtool_dprintf_impl.h" +#include "slibtool_errinfo_impl.h" +#include "slibtool_pecoff_impl.h" +#include "slibtool_ar_impl.h" + +/********************************************************/ +/* Clone a symbol list that could be used by a build */ +/* system for code generation or any other purpose. */ +/********************************************************/ + +static int slbt_util_output_symfile_impl( + const struct slbt_driver_ctx * dctx, + const struct slbt_symlist_ctx * sctx, + int fdout) +{ + bool fcoff; + const char ** symv; + const char ** symstrv; + + fcoff = slbt_host_objfmt_is_coff(dctx); + + symstrv = sctx->symstrv; + + for (symv=symstrv; *symv; symv++) + if (!fcoff || slbt_is_strong_coff_symbol(*symv)) + if (slbt_dprintf(fdout,"%s\n",*symv) < 0) + return SLBT_SYSTEM_ERROR(dctx,0); + + return 0; +} + + +static int slbt_util_create_symfile_impl( + const struct slbt_symlist_ctx * sctx, + const char * path, + mode_t mode) +{ + int ret; + const struct slbt_driver_ctx * dctx; + struct slbt_fd_ctx fdctx; + int fdout; + + dctx = (slbt_get_symlist_ictx(sctx))->dctx; + + if (slbt_lib_get_driver_fdctx(dctx,&fdctx) < 0) + return SLBT_NESTED_ERROR(dctx); + + if (path) { + if ((fdout = openat( + fdctx.fdcwd,path, + O_WRONLY|O_CREAT|O_TRUNC, + mode)) < 0) + return SLBT_SYSTEM_ERROR(dctx,0); + } else { + fdout = fdctx.fdout; + } + + ret = slbt_util_output_symfile_impl( + dctx,sctx,fdout); + + if (path) { + close(fdout); + } + + return ret; +} + + +int slbt_util_create_symfile( + const struct slbt_symlist_ctx * sctx, + const char * path, + mode_t mode) +{ + return slbt_util_create_symfile_impl(sctx,path,mode); +} |