test: add trying to load nonexistent symbols test
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
diff --git a/test.c b/test.c
index b8f6c9e..4dff8f0 100644
--- a/test.c
+++ b/test.c
@@ -42,15 +42,20 @@
* - Get global object
* - Get symbol from library through library object <- works
* - Run function if it worked
+ * - Get nonexistent symbol from library through library object <- fails
* - Get symbol from library through global object <- works
* - Run function if it worked
+ * - Get nonexistent symbol from library through global object <- fails
* - Close library
* - Open library with RTLD_LOCAL
* - Get symbol from library through library object <- works
* - Run function if it worked
- * - Get symbol from library through global object <- fails
+ * - Get nonexistent symbol from library through library object <- fails
+ * - Get local symbol from library through global object <- fails
+ * - Get nonexistent local symbol from library through global object <- fails
* - Open library again (without closing it first) with RTLD_GLOBAL
* - Get symbol from library through global object <- works
+ * - Get nonexistent symbol from library through global object <- fails
* - Close library
* - Close global object
*
@@ -63,6 +68,7 @@ int main()
void *library;
char *error;
int (*function)( void );
+ int (*nonexistentfunction)( void );
int ret;
library = dlopen( "testdll.dll", RTLD_GLOBAL );
@@ -101,6 +107,21 @@ int main()
RUNFUNC;
+ nonexistentfunction = dlsym( library, "nonexistentfunction" );
+ if( nonexistentfunction )
+ {
+ error = dlerror( );
+ printf( "ERROR\tGot nonexistent symbol from library handle: %p\n", nonexistentfunction );
+ CLOSE_LIB;
+ CLOSE_GLOBAL;
+ RETURN_ERROR;
+ }
+ else {
+ error = dlerror( );
+ printf( "SUCCESS\tCould not get nonexistent symbol from library handle: %s\n",
+ error ? error : "" );
+ }
+
function = dlsym( global, "function" );
if( !function )
{
@@ -116,6 +137,21 @@ int main()
RUNFUNC;
+ nonexistentfunction = dlsym( global, "nonexistentfunction" );
+ if( nonexistentfunction )
+ {
+ error = dlerror( );
+ printf( "ERROR\tGot nonexistent symbol from global handle: %p\n", nonexistentfunction );
+ CLOSE_LIB;
+ CLOSE_GLOBAL;
+ RETURN_ERROR;
+ }
+ else {
+ error = dlerror( );
+ printf( "SUCCESS\tCould not get nonexistent symbol from global handle: %s\n",
+ error ? error : "" );
+ }
+
ret = dlclose( library );
if( ret )
{
@@ -153,6 +189,21 @@ int main()
RUNFUNC;
+ nonexistentfunction = dlsym( library, "nonexistentfunction" );
+ if( nonexistentfunction )
+ {
+ error = dlerror( );
+ printf( "ERROR\tGot nonexistent symbol from library handle: %p\n", nonexistentfunction );
+ CLOSE_LIB;
+ CLOSE_GLOBAL;
+ RETURN_ERROR;
+ }
+ else {
+ error = dlerror( );
+ printf( "SUCCESS\tCould not get nonexistent symbol from library handle: %s\n",
+ error ? error : "" );
+ }
+
function = dlsym( global, "function" );
if( function )
{
@@ -166,6 +217,21 @@ int main()
else
printf( "SUCCESS\tDid not get local symbol from global handle.\n" );
+ nonexistentfunction = dlsym( global, "nonexistentfunction" );
+ if( nonexistentfunction )
+ {
+ error = dlerror( );
+ printf( "ERROR\tGot nonexistent local symbol from global handle: %p\n", nonexistentfunction );
+ CLOSE_LIB;
+ CLOSE_GLOBAL;
+ RETURN_ERROR;
+ }
+ else {
+ error = dlerror( );
+ printf( "SUCCESS\tDid not get nonexistent local symbol from global handle: %s\n",
+ error ? error : "" );
+ }
+
library = dlopen( "testdll.dll", RTLD_GLOBAL );
if( !library )
{
@@ -193,6 +259,21 @@ int main()
RUNFUNC;
+ nonexistentfunction = dlsym( global, "nonexistentfunction" );
+ if( nonexistentfunction )
+ {
+ error = dlerror( );
+ printf( "ERROR\tGot nonexistent symbol from global handle: %p\n", nonexistentfunction );
+ CLOSE_LIB;
+ CLOSE_GLOBAL;
+ RETURN_ERROR;
+ }
+ else {
+ error = dlerror( );
+ printf( "SUCCESS\tCould not get nonexistent symbol from global handle: %s\n",
+ error ? error : "" );
+ }
+
ret = dlclose( library );
if( ret )
{