/* 
	Author: Sandeep Budanur Ramanna
	E-mail: sbudanu@ncsu.edu
*/
	
Reference
-----------
http://www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.html
http://gcc.gnu.org/onlinedocs/gcc-3.1.1/gcc/Link-Options.html#Link%20Options
http://reality.sgiweb.org/davea/dwarf.html

/////////////////////////////////////////////////////////////////////////////////
	Steps to install Wisconsin Stackwalker standalone library
/////////////////////////////////////////////////////////////////////////////////

Download stackwalker library (.so) from http://www.paradyn.org
run $tar -xvvzf  stackwalk_linux_amd64_1.1.tar.gz
  
create symbolic link
---------------------
$ln -sf ./Wisc_Stackwalk/stackwalkAPI/x86_64-unknown-linux2.4/lib/libcommon.so ./Wisc_Stackwalk/stackwalkAPI/x86_64-unknown-linux2.4/lib/libcommon.so.1
$ln -sf ./Wisc_Stackwalk/stackwalkAPI/x86_64-unknown-linux2.4/lib/libstackwalk.so ./Wisc_Stackwalk/stackwalkAPI/x86_64-unknown-linux2.4/lib/libstackwalk.so.1
$ln -sf ./Wisc_Stackwalk/stackwalkAPI/x86_64-unknown-linux2.4/lib/libsymtabAPI.so ./Wisc_Stackwalk/stackwalkAPI/x86_64-unknown-linux2.4/lib/libsymtabAPI.so.1
$ln -sf ./Wisc_Stackwalk/stackwalkAPI/x86_64-unknown-linux2.4/lib/libxml2.so ./Wisc_Stackwalk/stackwalkAPI/x86_64-unknown-linux2.4/lib/libxml2.so.1

building dwarf
---------------
****download code from http://reality.sgiweb.org/davea/dwarf.html****
run $tar -xvvzf libdwarf-20091230.tar.gz
run $cd .../libdwarf
run $./configure --enable-shared  --disable-nonshared

Previous command creates a 'Makefile'. Modify it as given below.
File: .../libdwarf/Makefile
add -fPIC option

OLD: (for non-shared modules)
CFLAGS =        -g -O2 $(INCLUDES)

NEW: (for shared modules)
CFLAGS =        -fPIC -g -O2 $(INCLUDES)


OLD:
libdwarf.so: dwarf_names.h dwarf_names.c $(OBJS) dwarf_names.o
        $(CC) $(CFLAGS) -shared $(OBJS)  dwarf_names.o -o $@

NEW:
libdwarf.so: dwarf_names.h dwarf_names.c $(OBJS) dwarf_names.o
        $(CC) $(CFLAGS) -shared $(OBJS)  dwarf_names.o -o $@


run $make 
run $ln -sf libdwarf.so libdwarf.so.1


building user app 'wtest.c'
----------------------------
$gcc -Wall -I./Wisc_Stackwalk/stackwalkAPI/include -I./Wisc_Stackwalk/dwarf-20091230/libdwarf -L./Wisc_Stackwalk/dwarf-20091230/libdwarf -L./Wisc_Stackwalk/stackwalkAPI/x86_64-unknown-linux2.4/lib -ldwarf -lcommon -lstackwalk -lsymtabAPI -lxml2 wtest.c -o wtest.exe	

check the correctness of linking
---------------------------------
$ldd ./wtest

running user app 'wtest.exe'
----------------------------
(need to do the steps 1-4 only once)
File: ~/.bashrc
1)export LD_LIBRARY_PATH="/home/sbudanu/pin-2.5-24110-gcc.4.0.0-ia32_intel64-linux/source/tools/MyMemTraceW/Wisc_Stackwalk/stackwalkAPI/x86_64-unknown-linux2.4/lib:$LD_LIBRARY_PATH"
2)export LD_LIBRARY_PATH="/home/sbudanu/pin-2.5-24110-gcc.4.0.0-ia32_intel64-linux/source/tools/MyMemTraceW/Wisc_Stackwalk/dwarf-20091230/libdwarf:$LD_LIBRARY_PATH"
3)logout
4)login

run $./wtest


running PIN tool with Wisconsin Stackwalk library
---------------------------------------------------
It is similar to ruuning 'wtest' as above but compiler and linker options are given in the 'makefile' inside
the directory '/home/sbudanu/pin-2.7-31933-gcc.3.4.6-ia32_intel64-linux/source/tools/MyMemTraceW'

change '/home/sbudanu/pin-2.7-31933-gcc.3.4.6-ia32_intel64-linux/source/tools/MyMemTraceW/makefile' as below

OLD:
EXTRA_LIBS = -lpthread

NEW:
#Wisconsin Stackwalker changes - start
EXTRA_LIBS = -ldwarf -lcommon -lstackwalk -lsymtabAPI -lxml2
EXTRA_INCPATHS = -I./Wisc_Stackwalk/stackwalkAPI/include -I./Wisc_Stackwalk/dwarf-20091230/libdwarf
EXTRA_LPATHS = -L./Wisc_Stackwalk/dwarf-20091230/libdwarf -L./Wisc_Stackwalk/stackwalkAPI/x86_64-unknown-linux2.4/lib
EXTRA_FLAGS = -Wall
#Wisconsin Stackwalker changes - end

OLD:
$(CXX) -c $(CXXFLAGS) $(PIN_CXXFLAGS) ${OUTOPT}$@ $<
NEW:
$(CXX) -c $(CXXFLAGS) $(PIN_CXXFLAGS) ${OUTOPT}$@ $< $(EXTRA_FLAGS) ${EXTRA_INCPATHS} ${EXTRA_LPATHS} $(EXTRA_LIBS)

OLD:
${LINKER} $(PIN_LDFLAGS) $(LINK_DEBUG) ${LINK_OUT}$@ $< ${PIN_LPATHS} $(PIN_LIBS) $(EXTRA_LIBS) $(DBG)
NEW:
${LINKER} $(PIN_LDFLAGS) $(LINK_DEBUG) ${LINK_OUT}$@ $< ${PIN_LPATHS} $(PIN_LIBS) $(EXTRA_FLAGS) ${EXTRA_INCPATHS} ${EXTRA_LPATHS} $(EXTRA_LIBS) $(DBG)




/*******************************************************************************************************************************************/
//////////////////////////////////////////////////////////////////////////////////						
	Steps to install Wisonsin Stackwalker library from source code
//////////////////////////////////////////////////////////////////////////////////
1)Download stackwalker code from http://www.paradyn.org
  run $tar -xvvzf  stackwalk_src_1.1.tar.gz

2) !!! Use latest release of LIBELF and LIBDWARF !!!	

   building dwarf
   ---------------
   ****download code from http://reality.sgiweb.org/davea/dwarf.html****
   cd  ..../dwarf_install_dir
   run $tar -xvvzf ./libdwarf-20091230.tar.gz
   run $cd .../libdwarf
   run $./configure --enable-shared  --disable-nonshared
   
   Previous command creates a 'Makefile'. Modify it as given below.
   File: .../libdwarf/Makefile
   add -fPIC option
   
   OLD: (for non-shared modules)
   CFLAGS =        -g -O2 $(INCLUDES)
   
   NEW: (for shared modules)
   CFLAGS =        -fPIC -g -O2 $(INCLUDES)
       
   run $make 
   
   building libelf
   -----------------
   Download code from ***http://linux.softpedia.com/progDownload/Libelf-Download-14655.html**** or any other website
   $tar -xvvzf libelf-0.8.13.tar.gz
   $cd libelf-0.8.13
   $./configure
   $make --disable-compat
   $make install
   
3) mkdir .../stackwalkAPI/src/dyninst/libdwarf
   copy libdwarf.so to the directory '.../stackwalkAPI/src/dyninst/libdwarf/lib'
   copy libdwarf.h and dwarf.h to the directory '.../stackwalkAPI/src/dyninst/libdwarf/include'
   create symbolic link $ln -sf ./lib/libdwarf.so ./lib/libdwarf.so.1

4) edit .../stackwalkAPI/src/dyninst/make.config as below - add the libdwarf directory path
      
   ifdef USES_DWARF_DEBUG
   #LIBDWARF_INC   ?= $(LIBDWARFDIR)/include
   #LIBDWARF_LIB   ?= $(LIBDWARFDIR)/lib
   LIBDWARF_INC    ?= /home/sbudanu/pin-2.7-31933-gcc.3.4.6-ia32_intel64-linux/source/tools/MyMemTraceW/Wisc_Stackwalk/dwarf-20100204/libdwarf
   LIBDWARF_LIB    ?= /home/sbudanu/pin-2.7-31933-gcc.3.4.6-ia32_intel64-linux/source/tools/MyMemTraceW/Wisc_Stackwalk/dwarf-20100204/libdwarf
   endif
   
   ifdef USES_LIBELF
   #LIBELF_INC     ?= $(LIBELFDIR)/include
   #LIBELF_LIB     ?= $(LIBELFDIR)/lib
   LIBELF_INC     ?= /home/sbudanu/pin-2.7-31933-gcc.3.4.6-ia32_intel64-linux/source/tools/MyMemTraceW/Wisc_Stackwalk/libelf-0.8.13/lib
   LIBELF_LIB     ?= /home/sbudanu/pin-2.7-31933-gcc.3.4.6-ia32_intel64-linux/source/tools/MyMemTraceW/Wisc_Stackwalk/libelf-0.8.13/lib
   endif
   		
5) build the StackwalkerAPI libraries by running "make StackwalkerAPI" in
the dyninst directory
   $cd .../stackwalkAPI/src/dyninst 
   $make StackwalkerAPI or   $make PLATFORM=x86_64-unknown-linux2.4
   directory .../dyninst/x86_64-unknown-linux2.4/ contains the shared library

building user app 'stackwalk_test_wisc.cpp'
----------------------------------------------
g++ -Wall\
 -I/home/sbudanu/pin-2.7-31933-gcc.3.4.6-ia32_intel64-linux/source/tools/MyMemTraceW/Wisc_Stackwalk/dwarf-20100204/libdwarf\
 -L/home/sbudanu/pin-2.7-31933-gcc.3.4.6-ia32_intel64-linux/source/tools/MyMemTraceW/Wisc_Stackwalk/dwarf-20100204/libdwarf\
 -ldwarf -Wl,-rpath=/home/sbudanu/pin-2.7-31933-gcc.3.4.6-ia32_intel64-linux/source/tools/MyMemTraceW/Wisc_Stackwalk/dwarf-20100204/libdwarf\
 -I/home/sbudanu/pin-2.7-31933-gcc.3.4.6-ia32_intel64-linux/source/tools/MyMemTraceW/Wisc_Stackwalk/libelf-0.8.13/lib\
 -lelf -Wl,-rpath=/home/sbudanu/pin-2.7-31933-gcc.3.4.6-ia32_intel64-linux/source/tools/MyMemTraceW/Wisc_Stackwalk/libelf-0.8.13/lib\
 -I/home/sbudanu/pin-2.7-31933-gcc.3.4.6-ia32_intel64-linux/source/tools/MyMemTraceW/Wisc_Stackwalk/stackwalkAPI/src/include\
 -L/home/sbudanu/pin-2.7-31933-gcc.3.4.6-ia32_intel64-linux/source/tools/MyMemTraceW/Wisc_Stackwalk/stackwalkAPI/src/x86_64-unknown-linux2.4/lib\
 -lcommon -lstackwalk -lsymtabAPI -Wl,-rpath=/home/sbudanu/pin-2.7-31933-gcc.3.4.6-ia32_intel64-linux/source/tools/MyMemTraceW/Wisc_Stackwalk/stackwalkAPI/src/x86_64-unknown-linux2.4/lib\
 -lxml2\
 stackwalk_test_wisc.cpp -o stackwalk_test_wisc



check the correctness of linking
---------------------------------
$ldd ./stackwalk_test_wisc

running user app 'stackwalk_test_wisc'
----------------------------------------
(need to do the steps 1-3 only once)
File: ~/.bashrc
1)export LD_LIBRARY_PATH="/home/sbudanu/pin-2.7-31933-gcc.3.4.6-ia32_intel64-linux/source/tools/MyMemTraceW/Wisc_Stackwalk/stackwalkAPI/src/x86_64-unknown-linux2.4/lib:/home/sbudanu/pin-2.7-31933-gcc.3.4.6-ia32_intel64-linux/source/tools/MyMemTraceW/Wisc_Stackwalk/dwarf-20100204/libdwarf:/home/sbudanu/pin-2.7-31933-gcc.3.4.6-ia32_intel64-linux/source/tools/MyMemTraceW/Wisc_Stackwalk/libelf-0.8.13/lib:/usr/local/lib64:/usr/local/lib:/usr/lib64:$LD_LIBRARY_PATH"
2)logout
3)login

run $./stackwalk_test_wisc


running PIN tool with Wisconsin Stackwalk library
---------------------------------------------------
It is similar to ruuning 'wtest2' as above but compiler and linker options are given in the 'makefile' inside
the directory '/home/sbudanu/pin-2.7-31933-gcc.3.4.6-ia32_intel64-linux/source/tools/MyMemTraceW'

change '/home/sbudanu/pin-2.7-31933-gcc.3.4.6-ia32_intel64-linux/source/tools/MyMemTraceW/makefile' as below

OLD:
EXTRA_LIBS = 

NEW:
#Wisconsin Stackwalker changes - start
EXTRA_LIBS = -lcommon -lstackwalk -lsymtabAPI
EXTRA_INCPATHS = -I./Wisc_Stackwalk/stackwalkAPI/src/include
EXTRA_LPATHS = -L./Wisc_Stackwalk/stackwalkAPI/src/x86_64-unknown-linux2.4/lib
EXTRA_FLAGS = -Wall
#Wisconsin Stackwalker changes - end
#since PIN uses libelf, need not link libelf here

OLD:
$(CXX) -c $(CXXFLAGS) $(PIN_CXXFLAGS) ${OUTOPT}$@ $<
NEW:
$(CXX) -c $(CXXFLAGS) $(PIN_CXXFLAGS) ${OUTOPT}$@ $< $(EXTRA_FLAGS) ${EXTRA_INCPATHS} ${EXTRA_LPATHS} $(EXTRA_LIBS)

OLD:
${LINKER} $(PIN_LDFLAGS) $(LINK_DEBUG) ${LINK_OUT}$@ $< ${PIN_LPATHS} $(PIN_LIBS) $(EXTRA_LIBS) $(DBG)
NEW:
${LINKER} $(PIN_LDFLAGS) $(LINK_DEBUG) ${LINK_OUT}$@ $< ${PIN_LPATHS} $(PIN_LIBS) $(EXTRA_FLAGS) ${EXTRA_INCPATHS} ${EXTRA_LPATHS} $(EXTRA_LIBS) $(DBG)


To enable Wisconsin stackwalk - define or uncomment the flag WISC_STACKWALK_ENABLED in memtrace.cpp
To disable Wisconsin stackwalk or enable original stackwalk - undefine or comment WISC_STACKWALK_ENABLED flag in memtrace.cpp
Wisconsin stackwalk is disabled by default and the macro looks as below
//#define WISC_STACKWALK_ENABLED 1


build pin tool
---------------
run $make


run pin tool to instrument binary
-----------------------------------
$../../../pin -t ./obj-intel64/memtrace.so -- ./thread_sample &

output is written to the pipe '~/prsd_pipe'
redirect the output from pipe another file

$cat ~/prsd_pipe > tmp1.txt

memory trace willl be in "./log.txt" file


