]> granicus.if.org Git - strace/commitdiff
tests: robustify pc.test
authorDmitry V. Levin <ldv@altlinux.org>
Fri, 27 Feb 2015 04:09:56 +0000 (04:09 +0000)
committerDmitry V. Levin <ldv@altlinux.org>
Fri, 27 Feb 2015 04:09:56 +0000 (04:09 +0000)
* configure.ac: Check for dladdr in -ldl.
* tests/Makefile.am (pc_LDADD): Adde $(dl_LIBS).
* tests/pc.c: Include "config.h" and <dlfcn.h>.
(main): Use dladdr to find the address to unmap.

configure.ac
tests/Makefile.am
tests/pc.c

index b21941ea3dd6564dffce7007f55012988865b4af..0d009ea1b2dbe271b1073b6a839dc7c32eb77d73 100644 (file)
@@ -729,6 +729,14 @@ if test "x$st_cv_have___builtin_popcount" = xyes; then
                  [Define to 1 if the system provides __builtin_popcount function])
 fi
 
+dl_LIBS=
+AC_CHECK_LIB([dl], [dladdr], [])
+if test "x$ac_cv_lib_dl_dladdr" = xyes; then
+       AC_DEFINE([HAVE_DLADDR], [1], [Define to 1 if the system provides dladdr])
+       dl_LIBS='-ldl'
+fi
+AC_SUBST(dl_LIBS)
+
 AC_PATH_PROG([PERL], [perl])
 
 dnl stack trace with libunwind
index 21f736169fa883aa77211a9a03c72bd3965a6fbb..36a187d1ce3fd75bff1d1f3ae21aec4cb635aa25 100644 (file)
@@ -34,6 +34,7 @@ check_PROGRAMS = \
        uio \
        unix-pair-send-recv
 
+pc_LDADD = $(dl_LIBS)
 stat_CFLAGS = $(AM_CFLAGS) -D_FILE_OFFSET_BITS=64
 statfs_CFLAGS = $(AM_CFLAGS) -D_FILE_OFFSET_BITS=64
 uio_CFLAGS = $(AM_CFLAGS) -D_FILE_OFFSET_BITS=64
index 944c1a8902a6110e31f905eff418852dd6e19975..a450c0d15129eec2c3044cf00bb757b11c519a3d 100644 (file)
@@ -1,3 +1,7 @@
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+#include <dlfcn.h>
 #include <fcntl.h>
 #include <unistd.h>
 #include <sys/mman.h>
@@ -6,7 +10,7 @@
 
 int main(void)
 {
-       const unsigned long size = sysconf(_SC_PAGESIZE);
+       const unsigned long pagesize = sysconf(_SC_PAGESIZE);
 
        /* write instruction pointer length to the log */
        if (write(-1, NULL, 2 * sizeof(void *)) >= 0)
@@ -21,12 +25,29 @@ int main(void)
                return 77;
 
        if (!pid) {
-               const unsigned long mask = ~(size - 1);
-               const unsigned long addr = (unsigned long) &main;
+               const unsigned long mask = ~(pagesize - 1);
+               unsigned long addr = (unsigned long) &main & mask;
+               unsigned long size = pagesize << 1;
+
+#ifdef HAVE_DLADDR
+               Dl_info info;
+               if (dladdr(&main, &info)) {
+                       const unsigned long base =
+                               (unsigned long) info.dli_fbase & mask;
+                       if (base < addr) {
+                               size += addr - base;
+                               addr = base;
+                       }
+               } else
+#endif
+               {
+                       addr -= size;
+                       size <<= 1;
+               }
 
                /* SIGSEGV is expected */
-               (void) munmap((void *) ((addr & mask) - size * 2), size * 4);
-               (void) munmap((void *) ((addr & mask) - size * 2), size * 4);
+               (void) munmap((void *) addr, size);
+               (void) munmap((void *) addr, size);
                return 77;
        }
 
@@ -39,7 +60,7 @@ int main(void)
        /* dump process map for debug purposes */
        close(0);
        if (!open("/proc/self/maps", O_RDONLY))
-               (void) sendfile(1, 0, NULL, size);
+               (void) sendfile(1, 0, NULL, pagesize);
 
        return 0;
 }