| 1 | /* |
| 2 | Copyright (c) 2005-2019 Intel Corporation |
| 3 | |
| 4 | Licensed under the Apache License, Version 2.0 (the "License"); |
| 5 | you may not use this file except in compliance with the License. |
| 6 | You may obtain a copy of the License at |
| 7 | |
| 8 | http://www.apache.org/licenses/LICENSE-2.0 |
| 9 | |
| 10 | Unless required by applicable law or agreed to in writing, software |
| 11 | distributed under the License is distributed on an "AS IS" BASIS, |
| 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 13 | See the License for the specific language governing permissions and |
| 14 | limitations under the License. |
| 15 | */ |
| 16 | |
| 17 | enum FOO_TYPE { |
| 18 | FOO_DUMMY, |
| 19 | FOO_IMPLEMENTATION |
| 20 | }; |
| 21 | |
| 22 | #if _WIN32 || _WIN64 |
| 23 | #define TEST_EXPORT |
| 24 | #else |
| 25 | #define TEST_EXPORT extern "C" |
| 26 | #endif /* _WIN32 || _WIN64 */ |
| 27 | |
| 28 | // foo "implementations". |
| 29 | TEST_EXPORT FOO_TYPE foo1() { return FOO_IMPLEMENTATION; } |
| 30 | TEST_EXPORT FOO_TYPE foo2() { return FOO_IMPLEMENTATION; } |
| 31 | // foo "dummies". |
| 32 | FOO_TYPE dummy_foo1() { return FOO_DUMMY; } |
| 33 | FOO_TYPE dummy_foo2() { return FOO_DUMMY; } |
| 34 | |
| 35 | // Handlers. |
| 36 | static FOO_TYPE (*foo1_handler)() = &dummy_foo1; |
| 37 | static FOO_TYPE (*foo2_handler)() = &dummy_foo2; |
| 38 | |
| 39 | #include "tbb/tbb_config.h" |
| 40 | // Suppress the weak symbol mechanism to avoid surplus compiler warnings. |
| 41 | #ifdef __TBB_WEAK_SYMBOLS_PRESENT |
| 42 | #undef __TBB_WEAK_SYMBOLS_PRESENT |
| 43 | #endif |
| 44 | // Use of harness assert to avoid the dependency on TBB |
| 45 | #include "harness_assert.h" |
| 46 | #define LIBRARY_ASSERT(p,message) ASSERT(p,message) |
| 47 | #include "tbb/dynamic_link.h" |
| 48 | // Table describing how to link the handlers. |
| 49 | static const tbb::internal::dynamic_link_descriptor LinkTable[] = { |
| 50 | { "foo1" , (tbb::internal::pointer_to_handler*)(void*)(&foo1_handler) }, |
| 51 | { "foo2" , (tbb::internal::pointer_to_handler*)(void*)(&foo2_handler) } |
| 52 | }; |
| 53 | |
| 54 | // The direct include since we want to test internal functionality. |
| 55 | #include "tbb/dynamic_link.cpp" |
| 56 | #include "harness_dynamic_libs.h" |
| 57 | #include "harness.h" |
| 58 | |
| 59 | #if !HARNESS_SKIP_TEST |
| 60 | int TestMain () { |
| 61 | #if !_WIN32 |
| 62 | // Check if the executable exports its symbols. |
| 63 | ASSERT( Harness::GetAddress( Harness::OpenLibrary(NULL), "foo1" ) && Harness::GetAddress( Harness::OpenLibrary(NULL), "foo2" ), |
| 64 | "The executable doesn't export its symbols. Is the -rdynamic switch set during linking?" ); |
| 65 | #endif /* !_WIN32 */ |
| 66 | // We want to link (or fail to link) to the symbols available from the |
| 67 | // executable so it doesn't matter what the library name is specified in |
| 68 | // the dynamic_link call - let it be an empty string. |
| 69 | // Generally speaking the test has sense only on Linux but on Windows it |
| 70 | // checks the dynamic_link graceful behavior with incorrect library name. |
| 71 | if ( tbb::internal::dynamic_link( "" , LinkTable, sizeof(LinkTable)/sizeof(LinkTable[0]) ) ) { |
| 72 | ASSERT( foo1_handler && foo2_handler, "The symbols are corrupted by dynamic_link" ); |
| 73 | ASSERT( foo1_handler() == FOO_IMPLEMENTATION && foo2_handler() == FOO_IMPLEMENTATION, |
| 74 | "dynamic_link returned the successful code but symbol(s) are wrong" ); |
| 75 | } else { |
| 76 | ASSERT( foo1_handler==dummy_foo1 && foo2_handler==dummy_foo2, "The symbols are corrupted by dynamic_link" ); |
| 77 | } |
| 78 | return Harness::Done; |
| 79 | } |
| 80 | #endif // HARNESS_SKIP_TEST |
| 81 | |