From 3c75c3cfc64538068419d916b94029dfe2f0f802 Mon Sep 17 00:00:00 2001 From: an7s <an7s@git.zephyr-software.com> Date: Sat, 21 Mar 2015 20:05:15 +0000 Subject: [PATCH] Clear jmptable map between each file ir Test jmptable detection code when in shared library Former-commit-id: 334533e895f76f1f9593efa5a0f23e84dfa2b091 --- .gitattributes | 3 + libIRDB/test/fill_in_indtargs.cpp | 2 + libIRDB/test/tests/switchtable/Makefile | 22 +++-- libIRDB/test/tests/switchtable/jmp.main.cpp | 11 +++ libIRDB/test/tests/switchtable/jmp.shared.cpp | 49 ++++++++++ .../test/tests/switchtable/jmp2.shared.cpp | 92 +++++++++++++++++++ 6 files changed, 172 insertions(+), 7 deletions(-) create mode 100644 libIRDB/test/tests/switchtable/jmp.main.cpp create mode 100644 libIRDB/test/tests/switchtable/jmp.shared.cpp create mode 100644 libIRDB/test/tests/switchtable/jmp2.shared.cpp diff --git a/.gitattributes b/.gitattributes index 2d3086a3a..ad8885e11 100644 --- a/.gitattributes +++ b/.gitattributes @@ -257,8 +257,11 @@ libIRDB/test/read_variantir.cpp -text libIRDB/test/rename_function.cpp -text libIRDB/test/tests/switchtable/Makefile -text libIRDB/test/tests/switchtable/README -text +libIRDB/test/tests/switchtable/jmp.main.cpp -text +libIRDB/test/tests/switchtable/jmp.shared.cpp -text libIRDB/test/tests/switchtable/jmp1.cpp -text libIRDB/test/tests/switchtable/jmp2.cpp -text +libIRDB/test/tests/switchtable/jmp2.shared.cpp -text libIRDB/test/unfix_calls.cpp -text libIRDB/test/unwind-pe.h -text libMEDSannotation/LICENSE.txt -text diff --git a/libIRDB/test/fill_in_indtargs.cpp b/libIRDB/test/fill_in_indtargs.cpp index 80fb91897..a6eb6bd31 100644 --- a/libIRDB/test/fill_in_indtargs.cpp +++ b/libIRDB/test/fill_in_indtargs.cpp @@ -1142,6 +1142,8 @@ main(int argc, char* argv[]) pqxx::largeobject lo(elfoid); lo.to_file(pqxx_interface.GetTransaction(),"readeh_tmp_file.exe"); + jmptables.clear(); + ELFIO::elfio* elfiop=new ELFIO::elfio; elfiop->load("readeh_tmp_file.exe"); diff --git a/libIRDB/test/tests/switchtable/Makefile b/libIRDB/test/tests/switchtable/Makefile index 0695aea29..096fd1d68 100644 --- a/libIRDB/test/tests/switchtable/Makefile +++ b/libIRDB/test/tests/switchtable/Makefile @@ -1,12 +1,11 @@ INCLUDES= -I../../../../include -I../../../include/ -I../../../../beaengine/include LIBS=-L ../../../lib/ -lIRDB-core -lIRDB-cfg -lIRDB-util -lpqxx -L ../../../../beaengine/lib/Linux.gnu.Debug -lBeaEngine_s_d -#OPT=-g -fPIE -fPIC -O2 -# OPT=-g -O2 oops no switch tables generated with -O2 -OPT=-g -O +OPT=-g -fPIE -fPIC -O2 +#OPT=-g -O .SUFFIXES: .exe .cpp .peasoup -PROGS=jmp1.exe jmp2.exe -PEASOUP_PROGS=jmp1.peasoup jmp2.peasoup +PROGS=jmp1.exe jmp2.exe jmp.shared.exe +PEASOUP_PROGS=jmp1.peasoup jmp2.peasoup jmp.shared.peasoup all: $(PROGS) peasoup: $(PEASOUP_PROGS) @@ -14,7 +13,7 @@ peasoup: $(PEASOUP_PROGS) $(PROGS): ../../../../lib/* .exe.peasoup: $< - $(PEASOUP_HOME)/tools/ps_analyze.sh $< $@ --step integertransform=off --step p1transform=off --step ilr=off + LD_LIBRARY_PATH="$(LD_LIBRARY_PATH):." $(PEASOUP_HOME)/tools/ps_analyze.sh $< $@ --step integertransform=off --step p1transform=off --step ilr=off .o.exe: $< ../lib/libIRDB-core.a ../lib/libIRDB-cfg.a g++ $< $(INCLUDES) $(LIBS) $(OPT) -o $@ @@ -22,5 +21,14 @@ $(PROGS): ../../../../lib/* .cpp.o: $< g++ $< $(INCLUDES) $(LIBS) $(OPT) -o $@ -c +jmp.shared.so: jmp.shared.cpp jmp2.shared.cpp + g++ -fPIC -c jmp.shared.cpp + g++ -fPIC -c jmp2.shared.cpp + g++ -shared -Wl,-soname,libjmp.so -o libjmp.so jmp.shared.o jmp2.shared.o + +jmp.shared.exe: jmp.shared.so jmp.main.cpp + g++ -c jmp.main.cpp + g++ jmp.main.o -L. -ljmp -o $@ + clean: - rm -fr $(PROGS) *.o peasoup_executable* *.peasoup + rm -fr $(PROGS) *.o *.so peasoup_executable* *.peasoup diff --git a/libIRDB/test/tests/switchtable/jmp.main.cpp b/libIRDB/test/tests/switchtable/jmp.main.cpp new file mode 100644 index 000000000..13d92e21c --- /dev/null +++ b/libIRDB/test/tests/switchtable/jmp.main.cpp @@ -0,0 +1,11 @@ +#include <stdio.h> + +extern int switch_table(int, char**); +extern int switch_table_2(int, char**); + +int main(int argc, char** argv) +{ + printf("testing switch tables in shared library\n"); + switch_table(argc, argv); + switch_table_2(argc, argv); +} diff --git a/libIRDB/test/tests/switchtable/jmp.shared.cpp b/libIRDB/test/tests/switchtable/jmp.shared.cpp new file mode 100644 index 000000000..f03c7085f --- /dev/null +++ b/libIRDB/test/tests/switchtable/jmp.shared.cpp @@ -0,0 +1,49 @@ +#include <stdlib.h> +#include <stdio.h> + +int add(int a, int b) +{ + int x = a + b; + printf("add(): %d + %d = %d\n", a, b, x); + return x; +} + +int switch_table(int argc, char **argv) +{ + int i = atoi(argv[1]); + + switch(i) + { + case 20: + printf("i = 20\n"); + break; + case 22: + printf("i = 22\n"); + break; + case 23: + printf("hello: "); + printf("i = 23\n"); + break; + case 24: + printf("i = 24\n"); + break; + case 25: + printf("i = 25\n"); + break; + case 26: + printf("bar: "); + printf("i = 26\n"); + break; + case 27: + printf("i = 27\n"); + break; + case 28: + printf("i = 28\n"); + break; + default: + printf("i = %d\n", i); + } + + int val = add(i,i); + printf("main(): %d + %d = %d\n", i, i, val); +} diff --git a/libIRDB/test/tests/switchtable/jmp2.shared.cpp b/libIRDB/test/tests/switchtable/jmp2.shared.cpp new file mode 100644 index 000000000..e4b263f44 --- /dev/null +++ b/libIRDB/test/tests/switchtable/jmp2.shared.cpp @@ -0,0 +1,92 @@ +#include <stdlib.h> +#include <stdio.h> + +extern int add(int, int); + +int switch_table_2(int argc, char **argv) +{ + int i = atoi(argv[1]); + + switch(i) + { + case 20: + printf("i = 20\n"); + break; + case 22: + printf("i = 22\n"); + break; + case 23: + printf("hello: "); + printf("i = 23\n"); + break; + case 24: + printf("i = 24\n"); + break; + case 25: + printf("i = 25\n"); + break; + case 26: + printf("bar: "); + printf("i = 26\n"); + break; + case 27: + printf("i = 27\n"); + break; + case 28: + printf("i = 28\n"); + break; + default: + printf("i = %d\n", i); + } + + int val = add(i,i); + printf("main(): %d + %d = %d\n", i, i, val); + + switch(val) + { + case 20: + val = 35; + printf("a\n"); + break; + case 22: + val = add(21,31); + printf("36\n"); + break; + case 23: + val = add(val, val); + printf("37\n"); + break; + case 24: + val = add(val, 34); + printf("38\n"); + break; + case 25: + val = 38; + printf("39\n"); + break; + case 26: + val = 45; + printf("45\n"); + break; + case 27: + val = 55; + printf("55\n"); + break; + case 28: + val = 69; + printf("69\n"); + break; + case 29: + val = 72; + break; + case 31: + val = 82; + printf("82\n"); + break; + default: + val = 99; + } + + printf("val = %d\n", val); + +} -- GitLab