diff --git a/.gitattributes b/.gitattributes index 2d3086a3a4706663ec7cdf6d5020561240159ea1..ad8885e11a5a0b48a0be0c590105daf50ab719cd 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 80fb91897aff567d7551b74cab357590a09db96f..a6eb6bd313ff8115e690d74786f716751b51997a 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 0695aea2981de1583ee8c43d893e5cfa7cd02b07..096fd1d6856e416e35a6454597d2645d1a6faf32 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 0000000000000000000000000000000000000000..13d92e21c8c5fc863ae4fab61bf1ac5d88df8535 --- /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 0000000000000000000000000000000000000000..f03c7085fbe3b65a333705b97d94d0e916c9e27e --- /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 0000000000000000000000000000000000000000..e4b263f445e7d13a53b349ff99e909d030de1863 --- /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); + +}