diff test/dynload_plain/dynload_plain.c @ 272:a94a9a83dae6

- dynload_plain test handling symbol aliases, now - removed some hardcoded libc.so paths in dynload_plain, and pushed deduction logic to build instead
author Tassilo Philipp
date Fri, 29 Dec 2017 21:19:07 +0100
parents 9d70178c1ded
children f5577f6bf97a
line wrap: on
line diff
--- a/test/dynload_plain/dynload_plain.c	Mon Dec 11 22:53:46 2017 +0100
+++ b/test/dynload_plain/dynload_plain.c	Fri Dec 29 21:19:07 2017 +0100
@@ -43,31 +43,26 @@
   DLLib* pLib;
   DLSyms* pSyms;
   const char* path = NULL;
-  const char* clibs[] = { /* hacky/lazy list of some clib paths per platform */
+  /* hacky/lazy list of some clib paths per platform - more/others, like version-suffixed ones */
+  /* can be specified in Makefile; this avoids trying to write portable directory traversal stuff */
+  const char* clibs[] = {
+#if defined(DEF_C_DYLIB)
+	DEF_C_DYLIB,
+#endif
     "/lib/libc.so",
-    "/lib/libc.so.0.1",
-    "/lib/libc.so.6",
-    "/lib/libc.so.7",
+    "/lib32/libc.so",
     "/lib64/libc.so",
-    "/lib64/libc.so.6",
-    "/lib64/libc.so.7",
-    "/lib32/libc.so",
-    "/lib32/libc.so.6",
-    "/lib32/libc.so.7",
     "/usr/lib/libc.so",
-    "/usr/lib/libc.so.6",
-    "/usr/lib/libc.so.7",
-    "/usr/lib/libc.so.39.3", /* hack: for OpenBSD used in dyncall test env */
-    "/usr/lib/system/libsystem_c.dylib",
+    "/usr/lib/system/libsystem_c.dylib", /* macos */
     "/usr/lib/libc.dylib",
     "/boot/system/lib/libroot.so", /* Haiku */
-    "\\ReactOS\\system32\\msvcrt.dll",
+    "\\ReactOS\\system32\\msvcrt.dll", /* ReactOS */
     "C:\\ReactOS\\system32\\msvcrt.dll",
-    "\\Windows\\system32\\msvcrt.dll",
+    "\\Windows\\system32\\msvcrt.dll", /* Windows */
     "C:\\Windows\\system32\\msvcrt.dll"
   };
 
-
+  /* use first matching path of hacky hardcoded list, above */
   for(i=0; i<(sizeof(clibs)/sizeof(const char*)); ++i) {
     if(access(clibs[i], F_OK) != -1) {
       path = clibs[i];
@@ -101,7 +96,7 @@
         b = (stat(path, &st0) != -1) && (stat(queriedPath, &st1) != -1);
         printf("lib (inode:%d) and looked up lib (inode:%d) are same: %d\n", b?st0.st_ino:-1, b?st1.st_ino:-1, b && (st0.st_ino == st1.st_ino)); //@@@ on windows, inode numbers returned here are always 0
         r += b && (st0.st_ino == st1.st_ino); /* compare if same lib using inode */
-/*@@@ check of resolved path is absolute*/
+/*@@@ check if resolved path is absolute*/
 
         /* check correct bufsize retval */
         b = (bs == strlen(queriedPath) + 1);
@@ -149,7 +144,16 @@
         p = dlFindSymbol(pLib, "printf");
         name = dlSymsNameFromValue(pSyms, p);
         printf("printf symbol name by its own address (%p): %s\n", p, name?name:"");
-        r += (name && strcmp(name, "printf") == 0);
+        if(name) {
+			if(strcmp(name, "printf") == 0)
+      			++r;
+			else {
+				/* Symbol name returned might be an "alias". In that case, check address again (full lookup to be sure). */
+				void* p0 = dlFindSymbol(pLib, name);
+        		printf("lookup by address returned different name (%s), which is alias of printf: %d\n", name, (p==p0));
+        		r += (p == p0);
+			}
+		}
         dlFreeLibrary(pLib);
       }