diff options
Diffstat (limited to 'src/arbits/output')
-rw-r--r-- | src/arbits/output/slbt_au_output_symbols.c | 87 |
1 files changed, 84 insertions, 3 deletions
diff --git a/src/arbits/output/slbt_au_output_symbols.c b/src/arbits/output/slbt_au_output_symbols.c index 911af2c..950cde8 100644 --- a/src/arbits/output/slbt_au_output_symbols.c +++ b/src/arbits/output/slbt_au_output_symbols.c @@ -14,6 +14,7 @@ #include "slibtool_dprintf_impl.h" #include "slibtool_errinfo_impl.h" #include "slibtool_pecoff_impl.h" +#include "slibtool_tmpfile_impl.h" #include "slibtool_ar_impl.h" #define SLBT_PRETTY_FLAGS (SLBT_PRETTY_YAML \ @@ -78,14 +79,94 @@ static int slbt_au_output_symbols_posix( return 0; } +static int slbt_au_output_one_symbol_yaml( + int fdout, + struct slbt_archive_meta_impl * mctx, + const char * symname) +{ + struct ar_meta_symbol_info ** syminfv; + + for (syminfv=mctx->syminfv; *syminfv; syminfv++) + if (!strcmp(syminfv[0]->ar_symbol_name,symname)) + return slbt_dprintf( + fdout, + " - Symbol:\n" + " - [ object_name: " "%s" " ]\n" + " - [ symbol_name: " "%s" " ]\n" + " - [ symbol_type: " "%s" " ]\n\n", + syminfv[0]->ar_object_name, + symname, + syminfv[0]->ar_symbol_type); + + return 0; +} + static int slbt_au_output_symbols_yaml( const struct slbt_driver_ctx * dctx, struct slbt_archive_meta_impl * mctx, int fdout) { - (void)dctx; - (void)mctx; - (void)fdout; + int fdtmp; + bool fsort; + bool fcoff; + const char * dot; + const char * mark; + const char * regex; + const char ** symv; + const char ** symstrv; + regex_t regctx; + regmatch_t pmatch[2] = {{0,0},{0,0}}; + char strbuf[4096]; + + fsort = !(dctx->cctx->fmtflags & SLBT_OUTPUT_ARCHIVE_NOSORT); + fcoff = (mctx->ofmtattr & AR_OBJECT_ATTR_COFF); + + if ((fdtmp = slbt_tmpfile()) < 0) + return SLBT_SYSTEM_ERROR(dctx,0); + + if (fsort && !mctx->mapstrv) + if (slbt_update_mapstrv(dctx,mctx) < 0) + return SLBT_NESTED_ERROR(dctx); + + if (slbt_ar_update_syminfo_ex(mctx->actx,fdtmp) < 0) + return SLBT_NESTED_ERROR(dctx); + + if ((regex = dctx->cctx->regex)) + if (regcomp(®ctx,regex,REG_EXTENDED|REG_NEWLINE)) + return SLBT_CUSTOM_ERROR( + dctx, + SLBT_ERR_FLOW_ERROR); + + symstrv = fsort ? mctx->mapstrv : mctx->symstrv; + + if (slbt_dprintf(fdout," - Symbols:\n") < 0) + return SLBT_SYSTEM_ERROR(dctx,0); + + for (symv=symstrv; *symv; symv++) { + if (!fcoff || slbt_is_strong_coff_symbol(*symv)) { + if (!regex || !regexec(®ctx,*symv,1,pmatch,0)) { + if (slbt_au_output_one_symbol_yaml( + fdout,mctx,*symv) < 0) + return SLBT_SYSTEM_ERROR(dctx,0); + } + + /* coff weak symbols: expsym = .weak.alias.strong */ + } else if (fcoff && !strncmp(*symv,".weak.",6)) { + mark = &(*symv)[6]; + dot = strchr(mark,'.'); + + strncpy(strbuf,mark,dot-mark); + strbuf[dot-mark] = '\0'; + + if (!regex || !regexec(®ctx,strbuf,1,pmatch,0)) + if (slbt_au_output_one_symbol_yaml( + fdout,mctx,strbuf) < 0) + return SLBT_SYSTEM_ERROR(dctx,0); + } + } + + if (regex) + regfree(®ctx); return 0; } |