return data_dict
+def __path_var_name_from_path(path):
+ var_name = os.path.basename(path)
+ var_name = os.path.splitext(var_name)[0]
+ var_name += "_path"
+ return var_name
#################### Parsing api_names_all.txt #####################
libs_in_dir = {}
filename_tag = "#filename"
lib_tag = "#lib"
feature_tag = "#feature"
+ handler_tag = "#handler"
current_filename = ""
current_libs = []
global defines
dbg_log("defines[" + list[1] + "] = " + list[2])
defines[list[1]] = list[2]
+ elif line[:8] == handler_tag:
+ current_handler = re.sub("\"", "", line.split()[1])
+ current_handler = current_handler.replace("__lib_prefix__", lib_prefix)
elif line[:1] == "#":
#dbg_log("[WARN]: commented code : <" + line + ">")
continue
dbg_log("[WARN]: Skip func <" + func + "> file <" + current_filename + "> lib <" + current_libs[0] + ">")
continue
- libs_data = __add_item(libs_data, [current_libs, [func, [current_feature]]], (handler, probe_type))
+ libs_data = __add_item(libs_data, [current_handler, [current_libs, [func, [current_feature]]]], (handler, probe_type))
dbg_log("<--- __parse_file")
return libs_data
return libs_data
-def parse_probe_lib(da_lib):
+def parse_probe_libs(data):
dbg_log("parse_probe_lib")
- return get_all_symbols(da_lib)
+ probe_libs = {}
+
+ for lib in data:
+ lib_to_parse = os.path.basename(lib)
+ probe_libs[lib] = get_all_symbols(lib_to_parse)
+
+ return probe_libs
####################################################################
################## Getting function's addresses ####################
def __get_addr_by_funcname_handler(lib_data, funcname):
- if funcname in lib_data:
- return lib_data[funcname]
+ for lib in lib_data:
+ if funcname in lib_data[lib]:
+ return lib_data[lib][funcname]
return None
def __get_addr_by_funcname_lib(lib_data, funcname):
def iterate_over_libs(data, probe_lib):
dbg_log("iterate_over_libs")
feature_dict = {}
- for libname in data:
- lib_data = get_all_symbols(libname)
- if lib_data is None:
- continue
- for funcname in data[libname]:
- addr = __get_addr_by_funcname_lib(lib_data, funcname)
- if funcname not in function_errors:
- function_errors[funcname] = ERR_HANDLER_NO_FEATURE;
+ for handler in data:
+ for libname in data[handler]:
+ lib_data = get_all_symbols(libname)
+ if lib_data is None:
+ continue
+ for funcname in data[handler][libname]:
+ addr = __get_addr_by_funcname_lib(lib_data, funcname)
+ if funcname not in function_errors:
+ function_errors[funcname] = ERR_HANDLER_NO_FEATURE;
- for feature in data[libname][funcname]:
- if function_errors[funcname] == ERR_HANDLER_NO_FEATURE:
- function_errors[funcname] = ERR_HANDLER_FOUND_BUT_CANNOT_BE_LINKED;
+ for feature in data[handler][libname][funcname]:
+ if function_errors[funcname] == ERR_HANDLER_NO_FEATURE:
+ function_errors[funcname] = ERR_HANDLER_FOUND_BUT_CANNOT_BE_LINKED;
- handler_addr = __get_addr_by_funcname_handler(probe_lib, data[libname][funcname][feature][0])
+ handler_addr = __get_addr_by_funcname_handler(probe_lib, data[handler][libname][funcname][feature][0])
- if handler_addr is None:
- function_errors[funcname] = ERR_HANDLER_NOT_FOUND_IN_LD_LIB
- continue
+ if handler_addr is None:
+ function_errors[funcname] = ERR_HANDLER_NOT_FOUND_IN_LD_LIB
+ continue
- if addr is not None:
- feature_dict = __add_item(feature_dict, [feature, [libname, [funcname]]], (addr, handler_addr, data[libname][funcname][feature][1]))
- function_errors[funcname] = ERR_NO;
+ if addr is not None:
+ feature_dict = __add_item(feature_dict, [handler, [feature, [libname, [funcname]]]], (addr, handler_addr, data[handler][libname][funcname][feature][1]))
+ function_errors[funcname] = ERR_NO;
return feature_dict
####################################################################
return probes_cnt
-def __print_feature_list(file, features_cnt, features_list_dict):
+def __print_feature_list(file, features_cnt, features_list_dict, handlers_list):
file.write("int feature_to_data_count = " + str(features_cnt) + ";\n")
+ for handler in handlers_list:
+ handler_var = __path_var_name_from_path(handler)
+ file.write("char " + handler_var +"[] = \"" + handler + "\";\n")
file.write("struct feature_list_t feature_to_data[] = {\n")
for feature in features_list_dict:
- file.write("\t{.feature_value_0 = 0, .feature_value_1 = " + feature + ", .feature_ld = &" + features_list_dict[feature] + "},\n")
+ handler_var = __path_var_name_from_path(features_list_dict[feature][1])
+ if "LSAN" in feature:
+ file.write("\t{.feature_value_0 = " + feature + ", .feature_value_1 = 0, .feature_ld = &" + features_list_dict[feature][0] + ", .feature_handler = &" + handler_var + "},\n")
+ else:
+ file.write("\t{.feature_value_0 = 0, .feature_value_1 = " + feature + ", .feature_ld = &" + features_list_dict[feature][0] + ", .feature_handler = &" + handler_var + "},\n")
file.write("};\n")
def __print_features(file, data):
features_cnt = 0
features_list_dict = {}
+ handlers_list = []
+
+ for handler in data:
+ handlers_list.append(handler)
+ for feature in data[handler]:
+ write_feature = feature
+ if write_feature == "---":
+ write_feature = "NOFEATURE"
+ feature_lib_list = write_feature + "_lib_list"
+ feature_list = write_feature + "_list"
+ if features_list_dict is None:
+ features_list_dict = {write_feature : (feature_list, handler)}
+ else:
+ features_list_dict[write_feature] = (feature_list, handler)
- for feature in data:
- write_feature = feature
- if write_feature == "---":
- write_feature = "NOFEATURE"
- feature_lib_list = write_feature + "_lib_list"
- feature_list = write_feature + "_list"
- if features_list_dict is None:
- features_list_dict = {write_feature : feature_list}
- else:
- features_list_dict[write_feature] = feature_list
-
- __print_feature_begin(file, write_feature)
- features_cnt += 1
- libs_in_feature = {}
+ __print_feature_begin(file, write_feature)
+ features_cnt += 1
+ libs_in_feature = {}
- for lib in data[feature]:
- # skip /emul/*
- if lib.startswith('/emul/'):
- continue
- lib_feature_name = re.sub("\.", "_", re.sub("-", "__", os.path.basename(lib)))
- lib_feature_name = write_feature + "_" + lib_feature_name
- __print_lib_begin(file, lib, lib_feature_name)
- probes_in_feature = 0
+ for lib in data[handler][feature]:
+ # skip /emul/*
+ if lib.startswith('/emul/'):
+ continue
+ lib_feature_name = re.sub("\.", "_", re.sub("-", "__", os.path.basename(lib)))
+ lib_feature_name = write_feature + "_" + lib_feature_name
+ __print_lib_begin(file, lib, lib_feature_name)
+ probes_in_feature = 0
- for func in data[feature][lib]:
- probes_in_feature += __print_probes(file, func, data[feature][lib][func][0], data[feature][lib][func][1], data[feature][lib][func][2])
+ for func in data[handler][feature][lib]:
+ probes_in_feature += __print_probes(file, func, data[handler][feature][lib][func][0], data[handler][feature][lib][func][1], data[handler][feature][lib][func][2])
- if libs_in_feature is None:
- libs_in_feature = {lib : (probes_in_feature, lib_feature_name)}
- else:
- libs_in_feature[lib] = (probes_in_feature, lib_feature_name)
- __print_lib_end(file)
+ if libs_in_feature is None:
+ libs_in_feature = {lib : (probes_in_feature, lib_feature_name)}
+ else:
+ libs_in_feature[lib] = (probes_in_feature, lib_feature_name)
+ __print_lib_end(file)
- __print_feature_end(file, libs_in_feature, feature_lib_list, feature_list)
+ __print_feature_end(file, libs_in_feature, feature_lib_list, feature_list)
- __print_feature_list(file, features_cnt, features_list_dict)
+ __print_feature_list(file, features_cnt, features_list_dict, handlers_list)
def __print_probe_el_t(file):
file.write("struct ld_probe_el_t {\n")
file.write("\tenum feature_code_0 feature_value_0;\n")
file.write("\tenum feature_code_1 feature_value_1;\n")
file.write("\tstruct ld_feature_list_el_t *feature_ld;\n")
+ file.write("\tchar *feature_handler;\n")
file.write("};\n")
def __print_types(file):
exit(1)
data = parse_apis(func_list_file)
-probe_lib = parse_probe_lib(da_lib)
+probe_lib = parse_probe_libs(data)
feature_dict = iterate_over_libs(data, probe_lib)
generate_headers(feature_dict, da_inst_dir, da_lib, probe_lib)