From 86d2e8f5434ef851efffd0c832a128b5a588ee5b Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Thu, 20 Feb 2014 20:29:51 +0000 Subject: [PATCH] [DLLEXPORT_TEST] Add a test that checks the ability to link to function and data exports with cdecl, stdcall and c++ mangled names, including forwarders. It just prints "done". Feel free to convert it into a proper rostests, if you think it's required. svn path=/trunk/; revision=62269 --- rostests/tests/CMakeLists.txt | 1 + rostests/tests/dllexport/CMakeLists.txt | 21 +++++ rostests/tests/dllexport/dllexport_test.c | 89 +++++++++++++++++++ .../tests/dllexport/dllexport_test_dll1.c | 49 ++++++++++ .../tests/dllexport/dllexport_test_dll1.spec | 55 ++++++++++++ .../tests/dllexport/dllexport_test_dll2.c | 45 ++++++++++ .../tests/dllexport/dllexport_test_dll2.spec | 23 +++++ 7 files changed, 283 insertions(+) create mode 100644 rostests/tests/dllexport/CMakeLists.txt create mode 100644 rostests/tests/dllexport/dllexport_test.c create mode 100644 rostests/tests/dllexport/dllexport_test_dll1.c create mode 100644 rostests/tests/dllexport/dllexport_test_dll1.spec create mode 100644 rostests/tests/dllexport/dllexport_test_dll2.c create mode 100644 rostests/tests/dllexport/dllexport_test_dll2.spec diff --git a/rostests/tests/CMakeLists.txt b/rostests/tests/CMakeLists.txt index 93b5020f9a3..a1e44ede2b4 100644 --- a/rostests/tests/CMakeLists.txt +++ b/rostests/tests/CMakeLists.txt @@ -2,3 +2,4 @@ add_subdirectory(mmixer_test) if (NOT MSVC) add_subdirectory(pseh2) endif() +add_subdirectory(dllexport) diff --git a/rostests/tests/dllexport/CMakeLists.txt b/rostests/tests/dllexport/CMakeLists.txt new file mode 100644 index 00000000000..6e82a4394ab --- /dev/null +++ b/rostests/tests/dllexport/CMakeLists.txt @@ -0,0 +1,21 @@ + +spec2def(dllexport_test_dll1.dll dllexport_test_dll1.spec ADD_IMPORTLIB) +spec2def(dllexport_test_dll2.dll dllexport_test_dll2.spec ADD_IMPORTLIB) + +add_library(dllexport_test_dll1 SHARED + dllexport_test_dll1.c + ${CMAKE_CURRENT_BINARY_DIR}/dllexport_test_dll1.def) +set_module_type(dllexport_test_dll1 win32dll ENTRYPOINT 0) +add_importlibs(dllexport_test_dll1 dllexport_test_dll2) + +add_library(dllexport_test_dll2 SHARED + dllexport_test_dll2.c + ${CMAKE_CURRENT_BINARY_DIR}/dllexport_test_dll2.def) +set_module_type(dllexport_test_dll2 win32dll ENTRYPOINT 0) + + +add_executable(dllexport_test + dllexport_test.c) + +set_module_type(dllexport_test win32cui) +add_importlibs(dllexport_test dllexport_test_dll1 msvcrt kernel32 ntdll) diff --git a/rostests/tests/dllexport/dllexport_test.c b/rostests/tests/dllexport/dllexport_test.c new file mode 100644 index 00000000000..4f8922aaae3 --- /dev/null +++ b/rostests/tests/dllexport/dllexport_test.c @@ -0,0 +1,89 @@ + +#include + +#ifdef __GNUC__ +#endif + +__declspec(dllimport) int __cdecl CdeclFunc0(void); +__declspec(dllimport) int __cdecl CdeclFunc1(char* a1); +__declspec(dllimport) int __cdecl CdeclFunc2(char* a1); +__declspec(dllimport) int __cdecl CdeclFunc3(char* a1); + +__declspec(dllimport) int __stdcall StdcallFunc0(void); +__declspec(dllimport) int __stdcall StdcallFunc1(char* a1); +__declspec(dllimport) int __stdcall StdcallFunc2(char* a1); +__declspec(dllimport) int __stdcall StdcallFunc3(char* a1); +__declspec(dllimport) int __stdcall StdcallFunc4(char* a1); +__declspec(dllimport) int __stdcall StdcallFunc5(char* a1); + +__declspec(dllimport) int __stdcall DecoratedStdcallFunc1(char* a1); +__declspec(dllimport) int __stdcall DecoratedStdcallFunc2(char* a1); +__declspec(dllimport) int __stdcall DecoratedStdcallFunc3(char* a1); +__declspec(dllimport) int __stdcall DecoratedStdcallFunc4(char* a1); +__declspec(dllimport) int __stdcall DecoratedStdcallFunc5(char* a1); + +__declspec(dllimport) int __fastcall FastcallFunc0(void); +__declspec(dllimport) int __fastcall FastcallFunc1(char* a1); +__declspec(dllimport) int __fastcall FastcallFunc2(char* a1); +__declspec(dllimport) int __fastcall FastcallFunc3(char* a1); +__declspec(dllimport) int __fastcall FastcallFunc4(char* a1); +__declspec(dllimport) int __fastcall FastcallFunc5(char* a1); + +__declspec(dllimport) int __fastcall DecoratedFastcallFunc1(char* a1); +__declspec(dllimport) int __fastcall DecoratedFastcallFunc2(char* a1); +__declspec(dllimport) int __fastcall DecoratedFastcallFunc3(char* a1); +__declspec(dllimport) int __fastcall DecoratedFastcallFunc4(char* a1); +__declspec(dllimport) int __fastcall DecoratedFastcallFunc5(char* a1); + +__declspec(dllimport) extern int DataItem1; +__declspec(dllimport) extern int DataItem2; +__declspec(dllimport) extern int DataItem3; + +#define ok_int(a, b) \ + if ((a) != (b)) { printf("wrong result in line %d, expected 0x%x, got 0x%x\n", __LINE__, (b), (a)); } + +int main(int argc, char *argv[]) +{ + char* str = "defaultstring"; + + if (argc > 2) + str = argv[1]; + + ok_int(CdeclFunc0(), 0); + ok_int(CdeclFunc1(str), 1); + ok_int(CdeclFunc2(str), 1); + ok_int(CdeclFunc3(str), 0x10001); + + ok_int(StdcallFunc0(), 0x10); + ok_int(StdcallFunc1(str), 0x11); + ok_int(StdcallFunc2(str), 0x11); + ok_int(StdcallFunc3(str), 0x10011); + ok_int(StdcallFunc4(str), 0x21); + ok_int(StdcallFunc5(str), 0x10021); + + ok_int(DecoratedStdcallFunc1(str), 0x21); + ok_int(DecoratedStdcallFunc2(str), 0x11); + //ok_int(DecoratedStdcallFunc3(str), 11); + ok_int(DecoratedStdcallFunc4(str), 0x21); + ok_int(DecoratedStdcallFunc5(str), 0x10021); + + ok_int(FastcallFunc0(), 0x30); + ok_int(FastcallFunc1(str), 0x31); + ok_int(FastcallFunc2(str), 0x31); + ok_int(FastcallFunc3(str), 0x10031); + ok_int(FastcallFunc4(str), 0x42); + ok_int(FastcallFunc5(str), 0x10041); + ok_int(DecoratedFastcallFunc1(str), 0x42); + ok_int(DecoratedFastcallFunc2(str), 0x31); + //ok_int(DecoratedFastcallFunc3(str), 11); + ok_int(DecoratedFastcallFunc4(str), 0x42); + ok_int(DecoratedFastcallFunc5(str), 0x10041); + + ok_int(DataItem1, 0x51); + ok_int(DataItem2, 0x51); + ok_int(DataItem3, 0x10051); + + printf("done.\n"); + + return 0; +} diff --git a/rostests/tests/dllexport/dllexport_test_dll1.c b/rostests/tests/dllexport/dllexport_test_dll1.c new file mode 100644 index 00000000000..e71774c8a01 --- /dev/null +++ b/rostests/tests/dllexport/dllexport_test_dll1.c @@ -0,0 +1,49 @@ + +int __cdecl CdeclFunc0(void) +{ + return 0x0; +} + +int __cdecl CdeclFunc1(char *p1) +{ + return 0x1; +} + +int __stdcall StdcallFunc0(void) +{ + return 0x10; +} + +int __stdcall StdcallFunc1(char *p1) +{ + return 0x11; +} + +int __stdcall DecoratedStdcallFunc1(char *p1) +{ + return 0x21; +} + +int __fastcall FastcallFunc0(void) +{ + return 0x30; +} + +int __fastcall FastcallFunc1(char *p1) +{ + return 0x31; +} + +int __fastcall DecoratedFastcallFunc1(char *p1) +{ + return 0x42; +} + +int __stdcall ExportByOrdinal1(char *p1) +{ + return 0x11; +} + +int DataItem1 = 0x51; +int DataItem2 = 0x52; + diff --git a/rostests/tests/dllexport/dllexport_test_dll1.spec b/rostests/tests/dllexport/dllexport_test_dll1.spec new file mode 100644 index 00000000000..a6f4860d52e --- /dev/null +++ b/rostests/tests/dllexport/dllexport_test_dll1.spec @@ -0,0 +1,55 @@ + +# Normal export of a cdecl function + @ cdecl CdeclFunc0() + @ cdecl CdeclFunc1(ptr) + +# Redirected cdecl function + @ cdecl CdeclFunc2() CdeclFunc1 + @ cdecl CdeclFunc3() dllexport_test_dll2.CdeclFunc1 + +# Normal export of a stdcall function + @ stdcall StdcallFunc0() + @ stdcall StdcallFunc1(ptr) + +# Decorated export of a stdcall function + @ stdcall _StdcallFunc1@4(ptr) + @ stdcall _DecoratedStdcallFunc1@4(ptr) + +# Redirected stdcall function + @ stdcall StdcallFunc2(ptr) StdcallFunc1 + @ stdcall StdcallFunc3(ptr) dllexport_test_dll2.StdcallFunc1 + @ stdcall StdcallFunc4(ptr) _DecoratedStdcallFunc1@4 + @ stdcall StdcallFunc5(ptr) dllexport_test_dll2._DecoratedStdcallFunc1@4 + @ stdcall _DecoratedStdcallFunc2@4(ptr) StdcallFunc1 +; @ stdcall _DecoratedStdcallFunc3@4(ptr) dllexport_test_dll2.StdcallFunc1 # This doesn't work with MSVC! + @ stdcall _DecoratedStdcallFunc4@4(ptr) _DecoratedStdcallFunc1@4 + @ stdcall _DecoratedStdcallFunc5@4(ptr) dllexport_test_dll2._DecoratedStdcallFunc1@4 + +# Normal export of a fastcall function + @ fastcall FastcallFunc0() + @ fastcall FastcallFunc1(ptr) + +# Decorated export of a fastcall function + @ fastcall @DecoratedFastcallFunc1@4(ptr) + +# Redirected fastcall function + @ fastcall FastcallFunc2(ptr) FastcallFunc1 + @ fastcall FastcallFunc3(ptr) dllexport_test_dll2.FastcallFunc1 + @ fastcall FastcallFunc4(ptr) @DecoratedFastcallFunc1@4 + @ fastcall FastcallFunc5(ptr) dllexport_test_dll2.@DecoratedFastcallFunc1@4 + + @ fastcall @DecoratedFastcallFunc2@4(ptr) FastcallFunc1 +; @ fastcall @DecoratedFastcallFunc3@4(ptr) dllexport_test_dll2.FastcallFunc1 # This doesn't work with MSVC! + @ fastcall @DecoratedFastcallFunc4@4(ptr) @DecoratedFastcallFunc1@4 + @ fastcall @DecoratedFastcallFunc5@4(ptr) dllexport_test_dll2.@DecoratedFastcallFunc1@4 + +# Normal export of data + @ extern DataItem1 + +# Redirected data + @ extern DataItem2 DataItem1 + @ extern DataItem3 dllexport_test_dll2.DataItem1 + +# other stuff + 123 stdcall @(ptr) ExportByOrdinal1 + 218 stdcall -noname ExportByOrdinal1(ptr) diff --git a/rostests/tests/dllexport/dllexport_test_dll2.c b/rostests/tests/dllexport/dllexport_test_dll2.c new file mode 100644 index 00000000000..34b1c7694dc --- /dev/null +++ b/rostests/tests/dllexport/dllexport_test_dll2.c @@ -0,0 +1,45 @@ + +int __cdecl CdeclFunc0(void) +{ + return 0x10000; +} + +int __cdecl CdeclFunc1(char *p1) +{ + return 0x10001; +} + +int __stdcall StdcallFunc0(void) +{ + return 0x10010; +} + +int __stdcall StdcallFunc1(char *p1) +{ + return 0x10011; +} + +int __stdcall DecoratedStdcallFunc1(char *p1) +{ + return 0x10021; +} + +int __fastcall FastcallFunc0(void) +{ + return 0x10030; +} + +int __fastcall FastcallFunc1(char *p1) +{ + return 0x10031; +} + +int __fastcall DecoratedFastcallFunc1(char *p1) +{ + return 0x10041; +} + +int DataItem1 = 0x10051; +int DataItem2 = 0x10052; + + diff --git a/rostests/tests/dllexport/dllexport_test_dll2.spec b/rostests/tests/dllexport/dllexport_test_dll2.spec new file mode 100644 index 00000000000..28e147ac278 --- /dev/null +++ b/rostests/tests/dllexport/dllexport_test_dll2.spec @@ -0,0 +1,23 @@ + +# Normal export of a cdecl function + @ cdecl CdeclFunc0() + @ cdecl CdeclFunc1(ptr) + +# Normal export of a stdcall function + @ stdcall StdcallFunc0() + @ stdcall StdcallFunc1(ptr) + +# Decorated export of a stdcall function + @ stdcall _DecoratedStdcallFunc1@4(ptr) + +# Normal export of a fastcall function + @ fastcall FastcallFunc0() + @ fastcall FastcallFunc1(ptr) + +# Decorated export of a fastcall function + @ fastcall @DecoratedFastcallFunc1@4(ptr) + +# Normal export of data + @ extern DataItem1 + @ extern DataItem2 +