[IMPROVE] add tool for ELF parsing 74/46474/1
authorKonstantin Baladurin <k.baladurin@partner.samsung.com>
Thu, 9 Jul 2015 14:12:28 +0000 (17:12 +0300)
committerAlexander Aksenov <a.aksenov@samsung.com>
Thu, 20 Aug 2015 10:26:57 +0000 (13:26 +0300)
Change-Id: Iefc5e85d6c4df64e973a5cab9d21e445a6479b7e
Signed-off-by: Konstantin Baladurin <k.baladurin@partner.samsung.com>
Signed-off-by: Alexander Aksenov <a.aksenov@samsung.com>
packaging/swap-manager.spec
scripts/gen_nsp_data.sh
scripts/gen_preload_header.sh
scripts/gen_wsi_prof.sh
scripts/gen_wsp_data.sh

index 6c73b72..fae67ef 100644 (file)
@@ -19,6 +19,7 @@ BuildRequires:  pkgconfig(ecore)
 BuildRequires:  pkgconfig(callmgr_client)
 %endif
 BuildRequires:  swap-probe-devel
+BuildRequires:  swap-probe-elf
 %if "%{?tizen_profile_name}" == "tv"
 BuildRequires:  webkit2-efl-tv
 BuildRequires:  webkit2-efl-tv-debuginfo
@@ -33,6 +34,7 @@ BuildRequires:  app-core-debuginfo
 Requires:  swap-modules
 %endif
 Requires:  swap-probe
+Requires:  swap-probe-elf
 Requires:  sdbd
 
 %description
index f81c6e5..3022362 100755 (executable)
@@ -45,25 +45,22 @@ check_null_or_exit path_launchpad
 
 
 # get appcore_efl_main addr
-addr_appcore_efl_main=$(readelf -s ${path_app_core_efl} | grep appcore_efl_main | awk '{print $2}' | head -1)
+addr_appcore_efl_main=$(parse_elf ${path_app_core_efl} -s appcore_efl_main)
 check_null_or_exit addr_appcore_efl_main
 
 # get __do_app addr
-addr_do_app=$(readelf -s ${dpath_app_core_efl} | grep __do_app | awk '{print $2}' | head -1)
+addr_do_app=$(parse_elf ${dpath_app_core_efl} -s __do_app)
 check_null_or_exit addr_do_app
 
 
 tmp=$(mktemp)
 # launchpad
-su root -c "objdump -d --section=.plt $path_launchpad" | grep ">:"  > $tmp
-addr_dlopen_plt=$(cat $tmp | grep " <dlopen@" | cut -f1 -d' ')
-addr_dlsym_plt=$(cat $tmp | grep " <dlsym@" | cut -f1 -d' ')
+addr_dlopen_plt=$(su root -c "parse_elf $path_launchpad -r dlopen")
+addr_dlsym_plt=$(su root -c "parse_elf $path_launchpad -r dlsym")
 
 # libappcore-efl.so
-objdump -d --section=.plt $path_app_core_efl | grep ">:"  > $tmp
-addr_appcore_init_plt=$(cat $tmp | grep " <appcore_init@" | cut -f1 -d' ')
-addr_elm_run_plt=$(cat $tmp | grep " <elm_run@" | cut -f1 -d' ')
-rm $tmp
+addr_appcore_init_plt=$(parse_elf $path_app_core_efl -r appcore_init)
+addr_elm_run_plt=$(parse_elf $path_app_core_efl -r elm_run)
 
 
 # PLT
index 6b34605..3ec3635 100755 (executable)
@@ -1,7 +1,7 @@
 #!/bin/bash
 preload_library_pattern="libdl[.-].*"
 preload_library_path="/lib/"
-preload_open_function="dlopen@@GLIBC"
+preload_open_function="dlopen"
 handlers_lib="/usr/lib/da_probe_tizen.so"
 linker_path="/lib/"
 linker_sym="_r_debug"
@@ -22,7 +22,7 @@ function print_loader()
     filename=$1
     el=$(find $preload_library_path -regextype posix-extended -regex $preload_library_path$preload_library_pattern | head -n1)
     preload_lib=$(readlink -f $el)
-    addr=$(readelf -sW $preload_lib | grep $preload_open_function | head -1 | awk '{print $2}')
+       addr=$(parse_elf $preload_lib -s $preload_open_function)
 
     echo -e "/bin/echo \"$preload_lib\" > /sys/kernel/debug/swap/preload/loader/loader_path" >> $filename
     echo -e "/bin/echo 0x$addr > /sys/kernel/debug/swap/preload/loader/loader_offset" >> $filename
index ee40179..bc95602 100755 (executable)
@@ -1,16 +1,20 @@
 #!/bin/bash
 
-get_addr()
+get_addrs()
 {
-       name=$1
-
-       addr=$(cat ${tmp} | grep " $name$" | awk '{print $2}')
-       if [ -z "$addr" ]; then
-               echo "ERROR: symbol '$name' not found" >&2
-               exit 1
-       fi
-
-       echo 0x$addr
+       names=($@)
+       addrs=($(parse_elf ${lib_file} -sf ${names[@]}))
+
+       len=${#names[@]}
+       for (( i=0; i < ${len}; ++i)); do
+               name=${names[$i]}
+               addr=${addrs[$i]}
+               if [ -z "$addr" -o $((16#$addr)) -eq 0 ]; then
+                       addr=0
+                       echo "ERROR: symbol '$name' not found" >&2
+               fi
+               echo 0x$addr
+       done
 }
 
 script_dir=$(readlink -f $0 | xargs dirname)
@@ -24,11 +28,16 @@ fi
 lib_file=$(rpm -ql ${webkit_package_name}-debuginfo | grep "/usr/lib/debug/usr/lib/libewebkit2.so.debug$" | head -1)
 tmp=$(mktemp)
 
-readelf -sW ${lib_file} | grep " FUNC " > ${tmp}
+func_names=()
+func_names+=(ewk_\(context\|view\)_inspector_server_start)
+func_names+=(_ZN3JSC16ProfileGenerator11willExecuteEPNS_9ExecStateERKNS_14CallIdentifierE)
+func_names+=(_ZN3JSC16ProfileGenerator10didExecuteEPNS_9ExecStateERKNS_14CallIdentifierE)
+
+addrs=(`get_addrs ${func_names[@]}`)
 
-inspector_addr=$(get_addr 'ewk_\(context\|view\)_inspector_server_start');
-willexecute_addr=$(get_addr _ZN3JSC16ProfileGenerator11willExecuteEPNS_9ExecStateERKNS_14CallIdentifierE);
-didexecute_addr=$(get_addr _ZN3JSC16ProfileGenerator10didExecuteEPNS_9ExecStateERKNS_14CallIdentifierE);
+inspector_addr=${addrs[0]}
+willexecute_addr=${addrs[1]}
+didexecute_addr=${addrs[2]}
 
 rm ${tmp}
 
index 3015cfa..d6a1241 100755 (executable)
@@ -17,26 +17,39 @@ path_libewebkit2_debuginfo=`rpm -ql ${webkit_package_name}-debuginfo | grep "lib
 g_names=()
 g_nick_names=()
 
+g_names_plt=()
+g_nick_names_plt=()
 
-get_addr()
+get_addrs()
 {
-       name=$1
+       param=$1
+       shift
+       names=($@)
+       len=${#names[@]}
+
+       if [[ "$param" == "-r" ]]; then
+               path_lib=$path_libewebkit2
 
-       if [[ "$name" == *@plt ]]; then
-               addr=$(objdump --section=.plt -d $path_libewebkit2 | grep $name | head -1 | cut -f1 -d' ')
+               for (( i=0; i < ${len}; ++i)); do
+                       names[$i]=`echo ${names[$i]} | cut -d'@' -f 1`
+               done
        else
-               addr=$(readelf -sW $path_libewebkit2_debuginfo | grep " ${name}\(\.part\.[0-9]*\)*$" | grep " FUNC " | head -1 |awk '{print $2}')
+               path_lib=$path_libewebkit2_debuginfo
        fi
 
-       if [[ -z "$addr" ]]; then
-               echo "ERROR: symbol '$name' not found" >&2
-               addr=0
-       fi
+       addrs=($(parse_elf $path_lib $param ${names[@]}))
 
-       echo 0x$addr
+       for (( i=0; i < ${len}; ++i)); do
+               name=${names[$i]}
+               addr=${addrs[$i]}
+               if [ -z "$addr" -o $((16#$addr)) -eq 0 ]; then
+                       addr=0
+                       echo "ERROR: symbol '$name' not found" >&2
+               fi
+               echo 0x$addr
+       done
 }
 
-
 add_func()
 {
        name=$1
@@ -46,24 +59,40 @@ add_func()
        g_nick_names+=($nick_name)
 }
 
+add_func_plt()
+{
+       name=$1
+       nick_name=$2
+
+       g_names_plt+=($name)
+       g_nick_names_plt+=($nick_name)
+}
 
 gen_array()
 {
+       addrs_plt=`get_addrs -r ${g_names_plt[@]}`
+       if [ $? -ne 0 ]; then
+               exit 1;
+       fi
+
+       addrs=`get_addrs -sf ${g_names[@]}`
+       if [ $? -ne 0 ]; then
+               exit 1;
+       fi
+
+       addrs=($addrs_plt $addrs)
+       g_names=(${g_names_plt[@]} ${g_names[@]})
+       g_nick_names=(${g_nick_names_plt[@]} ${g_nick_names[@]})
+
        len=${#g_names[@]}
        for (( i=0; i < ${len}; ++i)); do
-               name=${g_names[$i]}
-               addr=`get_addr $name`
-               if [ $? -ne 0 ]; then
-                       exit 1;
-               fi
-
-               echo -e "\t{ \"$name\", \"${g_nick_names[$i]}\", $addr },"
+               echo -e "\t{ \"${g_names[$i]}\", \"${g_nick_names[$i]}\", ${addrs[$i]} },"
        done
 }
 
 
 if [ "$__tizen_profile_name__" == "tv" ]; then
-       add_func soup_requester_request_uri@plt soup_request
+       add_func_plt soup_requester_request_uri@plt soup_request
        add_func _ZN7WebCore14ResourceLoader15willSendRequestERNS_15ResourceRequestERKNS_16ResourceResponseE main_res_will
        add_func _ZN7WebCore11CachedImage7addDataEPKcj main_res_add
        add_func _ZN7WebCore14ResourceLoader16didFinishLoadingEd main_res_finish
@@ -71,7 +100,7 @@ if [ "$__tizen_profile_name__" == "tv" ]; then
        add_func _ZN7WebCore14ResourceLoader16didFinishLoadingEPNS_14ResourceHandleEd res_finish
        add_func _ZN7WebCore22CompositingCoordinator24flushPendingLayerChangesEv redraw
 else
-       add_func soup_requester_request@plt soup_request
+       add_func_plt soup_requester_request@plt soup_request
        add_func _ZN7WebCore18MainResourceLoader15willSendRequestERNS_15ResourceRequestERKNS_16ResourceResponseE main_res_will
        add_func _ZN7WebCore18MainResourceLoader7addDataEPKcib main_res_add
        add_func _ZN7WebCore18MainResourceLoader16didFinishLoadingEd main_res_finish