summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJiri Olsa <Jiri Olsa jolsa@redhat.com>2011-06-16 11:04:30 +0200
committerJiri Olsa <Jiri Olsa jolsa@redhat.com>2011-06-17 12:08:20 +0200
commit23916445a712b64e34735a7d06bc69bfcfa4b3b6 (patch)
tree6dba80cbad70536e18483b625b812fbbd722d5f0
parentb56d0731ccb162f5830a94c037d6975371a067ac (diff)
downloadlatrace-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--ChangeLog2
-rw-r--r--etc/latrace.d/latrace.conf.in5
-rw-r--r--src/audit-init.c8
-rw-r--r--src/audit.c8
-rw-r--r--src/config-bison.y12
-rw-r--r--src/config-flex.l1
-rw-r--r--src/config.c6
-rw-r--r--src/config.h5
8 files changed, 44 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index 16a5e6b..4fc640b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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;