diff options
author | Jiri Olsa <Jiri Olsa jolsa@redhat.com> | 2011-06-16 11:04:30 +0200 |
---|---|---|
committer | Jiri Olsa <Jiri Olsa jolsa@redhat.com> | 2011-06-17 12:08:20 +0200 |
commit | 23916445a712b64e34735a7d06bc69bfcfa4b3b6 (patch) | |
tree | 6dba80cbad70536e18483b625b812fbbd722d5f0 | |
parent | b56d0731ccb162f5830a94c037d6975371a067ac (diff) | |
download | latrace-23916445a712b64e34735a7d06bc69bfcfa4b3b6.tar.gz latrace-23916445a712b64e34735a7d06bc69bfcfa4b3b6.tar.xz latrace-23916445a712b64e34735a7d06bc69bfcfa4b3b6.zip |
config: Add SYM_NOEXIT option
Added SYM_NOEXIT option to be able to run only pltentry
callback for specified symbols.
This option is needed for setjmp symbol, otherwise the
tracee segfaults. The "_setjmp" symbol is added as default
value to the global config file.
-rw-r--r-- | ChangeLog | 2 | ||||
-rw-r--r-- | etc/latrace.d/latrace.conf.in | 5 | ||||
-rw-r--r-- | src/audit-init.c | 8 | ||||
-rw-r--r-- | src/audit.c | 8 | ||||
-rw-r--r-- | src/config-bison.y | 12 | ||||
-rw-r--r-- | src/config-flex.l | 1 | ||||
-rw-r--r-- | src/config.c | 6 | ||||
-rw-r--r-- | src/config.h | 5 |
8 files changed, 44 insertions, 3 deletions
@@ -3,7 +3,7 @@ * make tracer return actual tracee status * move all tests to scripts * added following options - LIBS, LIBS_TO, LIBS_FROM, SYM, SYM_OMIT, SYM_BELOW + LIBS, LIBS_TO, LIBS_FROM, SYM, SYM_OMIT, SYM_BELOW, SYM_NOEXIT 2011-06-02 Jiri Olsa <olsajiri@gmail.com> * adding large file support diff --git a/etc/latrace.d/latrace.conf.in b/etc/latrace.d/latrace.conf.in index a14c51a..2126021 100644 --- a/etc/latrace.d/latrace.conf.in +++ b/etc/latrace.d/latrace.conf.in @@ -64,7 +64,7 @@ OPTIONS { # Following options: # LIBS/LIBS_TO/LIBS_FROM - # SYM/SYM_OMIT/SYM_BELOW + # SYM/SYM_OMIT/SYM_BELOW/SYM_NOEXIT # # use list of names as value. Single names in the list are # separated by comma ','. If the first char of a single name @@ -88,4 +88,7 @@ OPTIONS { # -b, --flow-below # SYM_BELOW = krava + + # no command line option equivalent + SYM_NOEXIT = _setjmp } diff --git a/src/audit-init.c b/src/audit-init.c index 27e38f5..f36fee3 100644 --- a/src/audit-init.c +++ b/src/audit-init.c @@ -204,6 +204,14 @@ int audit_init(int argc, char **argv, char **env) return -1; } + /* SYM_NOEXIT option */ + if ((*lt_sh(&cfg, symbols_noexit)) && + (-1 == (cfg.symbols_noexit_cnt = get_names(&cfg, lt_sh(&cfg, symbols_noexit), + cfg.symbols_noexit)))) { + printf("latrace failed to parse noexit symbols\n"); + return -1; + } + /* -b */ if ((*lt_sh(&cfg, flow_below)) && (-1 == (cfg.flow_below_cnt = get_names(&cfg, lt_sh(&cfg, flow_below), diff --git a/src/audit.c b/src/audit.c index 2d00c88..97cbaf3 100644 --- a/src/audit.c +++ b/src/audit.c @@ -245,12 +245,20 @@ static unsigned int la_symbind(ElfW(Sym) *sym, const char *symname) { unsigned int flags = 0; + /* particular symbols specified, omit all others */ if (cfg.symbols_cnt) { flags = LA_SYMB_NOPLTENTER|LA_SYMB_NOPLTEXIT; if (check_names((char*) symname, cfg.symbols)) flags = 0; } + /* we might want just pltenter for some.. eg for _setjmp */ + if (cfg.symbols_noexit_cnt) { + if (check_names((char*) symname, cfg.symbols_noexit)) + flags = LA_SYMB_NOPLTEXIT; + } + + /* and keep omit options the strongest */ if (cfg.symbols_omit_cnt) { if (check_names((char*) symname, cfg.symbols_omit)) flags = LA_SYMB_NOPLTENTER|LA_SYMB_NOPLTEXIT; diff --git a/src/config-bison.y b/src/config-bison.y index 0000907..cc7d88b 100644 --- a/src/config-bison.y +++ b/src/config-bison.y @@ -64,7 +64,7 @@ static struct lt_list_head ln_names; %token OPT_DEMANGLE OPT_BRACES OPT_ENABLE_ARGS %token OPT_DETAIL_ARGS OPT_OUTPUT_TTY %token OPT_LIBS OPT_LIBS_TO OPT_LIBS_FROM -%token OPT_SYM OPT_SYM_OMIT OPT_SYM_BELOW +%token OPT_SYM OPT_SYM_OMIT OPT_SYM_BELOW OPT_SYM_NOEXIT %union { @@ -240,6 +240,16 @@ OPTIONS_DEF OPT_SYM_BELOW '=' list_names_comma OPTION_ADD(LT_OPT_SYM_BELOW, sym_below, -1); } | +OPTIONS_DEF OPT_SYM_NOEXIT '=' list_names_comma +{ + char sym_noexit[LT_SYMBOLS_MAXSIZE]; + + if (lt_config_ln_fill(&ln_names, sym_noexit, LT_SYMBOLS_MAXSIZE)) + ERROR("failed to process sym_below option"); + + OPTION_ADD(LT_OPT_SYM_NOEXIT, sym_noexit, -1); +} +| /* left blank intentionally */ list_names_comma: diff --git a/src/config-flex.l b/src/config-flex.l index a15a687..89de981 100644 --- a/src/config-flex.l +++ b/src/config-flex.l @@ -90,6 +90,7 @@ OPTIONS { BEGIN(options); return OPTIONS; } <options>SYM { return OPT_SYM; } <options>SYM_OMIT { return OPT_SYM_OMIT; } <options>SYM_BELOW { return OPT_SYM_BELOW; } +<options>SYM_NOEXIT { return OPT_SYM_NOEXIT; } <options>{bool} { RETURN_STR(BOOL); } <options>{value} { RETURN_LONG(VALUE); } diff --git a/src/config.c b/src/config.c index 4ab9f97..20eaa45 100644 --- a/src/config.c +++ b/src/config.c @@ -319,6 +319,12 @@ static int process_option_val(struct lt_config_app *cfg, int idx, lt_sh(cfg, flow_below)); break; + case LT_OPT_SYM_NOEXIT: + strcpy(lt_sh(cfg, symbols_noexit), sval); + PRINT_VERBOSE(cfg, 1, "SYM_NOEXIT '%s'\n", + lt_sh(cfg, symbols_noexit)); + break; + default: return -1; } diff --git a/src/config.h b/src/config.h index 2006f7e..9f0b5d7 100644 --- a/src/config.h +++ b/src/config.h @@ -90,6 +90,7 @@ enum { LT_OPT_SYM, LT_OPT_SYM_OMIT, LT_OPT_SYM_BELOW, + LT_OPT_SYM_NOEXIT, }; struct lt_config_opt { @@ -114,6 +115,7 @@ struct lt_config_shared { #define LT_SYMBOLS_MAXSIZE 200 char symbols[LT_SYMBOLS_MAXSIZE]; char symbols_omit[LT_SYMBOLS_MAXSIZE]; + char symbols_noexit[LT_SYMBOLS_MAXSIZE]; char flow_below[LT_SYMBOLS_MAXSIZE]; @@ -224,6 +226,9 @@ struct lt_config_audit { char *symbols_omit[LT_NAMES_MAX]; int symbols_omit_cnt; + char *symbols_noexit[LT_NAMES_MAX]; + int symbols_noexit_cnt; + char *flow_below[LT_NAMES_MAX]; int flow_below_cnt; |