Improve diagnostic info printed by failures in
VG_(mash_LD_PRELOAD_and_LD_LIBRARY_PATH).
git-svn-id: svn://svn.valgrind.org/valgrind/trunk@297 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/coregrind/vg_main.c b/coregrind/vg_main.c
index ddaf556..399291d 100644
--- a/coregrind/vg_main.c
+++ b/coregrind/vg_main.c
@@ -1164,37 +1164,66 @@
"valgrinq.so", which doesn't do anything. This is used to avoid
tracing into child processes. To make this work the build system
also supplies a dummy file, "valgrinq.so".
+
+ Also look for $(libdir)/lib/valgrind in LD_LIBRARY_PATH and change
+ it to $(libdir)/lib/valgrinq, so as to make our libpthread.so
+ disappear.
*/
void VG_(mash_LD_PRELOAD_and_LD_LIBRARY_PATH) ( Char* ld_preload_str,
Char* ld_library_path_str )
{
- Char* p;
- vg_assert(ld_preload_str != NULL);
- vg_assert(ld_library_path_str != NULL);
- /* VG_(printf)("%s %s\n", ld_preload_str, ld_library_path_str); */
- /* in LD_PRELOAD, turn valgrind.so into valgrinq.so. */
- p = VG_(strstr)(ld_preload_str, "valgrind.so");
+ Char* p_prel = NULL;
+ Char* p_path = NULL;
+ Int what = 0;
+ if (ld_preload_str == NULL || ld_library_path_str == NULL)
+ goto mutancy;
- if (p == NULL) {
+ /* VG_(printf)("%s %s\n", ld_preload_str, ld_library_path_str); */
+
+ p_prel = VG_(strstr)(ld_preload_str, "valgrind.so");
+ p_path = VG_(strstr)(ld_library_path_str, VG_LIBDIR);
+
+ if (p_prel == NULL) {
/* perhaps already happened? */
- vg_assert(VG_(strstr)(ld_preload_str, "valgrinq.so") != NULL);
- vg_assert(VG_(strstr)(ld_library_path_str, "lib/valgrinq") != NULL);
+ what = 1;
+ if (VG_(strstr)(ld_preload_str, "valgrinq.so") == NULL)
+ goto mutancy;
+ if (VG_(strstr)(ld_library_path_str, "lib/valgrinq") == NULL)
+ goto mutancy;
return;
}
- vg_assert(p[7] == 'd');
- p[7] = 'q';
+ what = 2;
+ if (p_path == NULL) goto mutancy;
+
+ /* in LD_PRELOAD, turn valgrind.so into valgrinq.so. */
+ what = 3;
+ if (p_prel[7] != 'd') goto mutancy;
+ p_prel[7] = 'q';
/* in LD_LIBRARY_PATH, turn $libdir/valgrind (as configure'd) from
.../lib/valgrind .../lib/valgrinq, which doesn't exist,
so that our own libpthread.so goes out of scope. */
- p = VG_(strstr)(ld_library_path_str, VG_LIBDIR);
- vg_assert(NULL != p);
- p += VG_(strlen)(VG_LIBDIR);
- p += VG_(strlen)("/valgrind");
- p --;
- vg_assert(p[0] == 'd');
- p[0] = 'q';
+ p_path += VG_(strlen)(VG_LIBDIR);
+ what = 4;
+ if (p_path[0] != '/') goto mutancy;
+ p_path++; /* step over / */
+ what = 5;
+ if (p_path[7] != 'd') goto mutancy;
+ p_path[7] = 'q';
+ return;
+
+ mutancy:
+ VG_(printf)(
+ "\nVG_(mash_LD_PRELOAD_and_LD_LIBRARY_PATH): internal error:\n"
+ " what = %d\n"
+ " ld_preload_str = `%s'\n"
+ " ld_library_path_str = `%s'\n"
+ " p_prel = `%s'\n"
+ " p_path = `%s'\n"
+ " VG_LIBDIR = `%s'\n",
+ what, ld_preload_str, ld_library_path_str, p_prel, p_path, VG_LIBDIR );
+ VG_(panic)("VG_(mash_LD_PRELOAD_and_LD_LIBRARY_PATH) failed\n");
}
diff --git a/vg_main.c b/vg_main.c
index ddaf556..399291d 100644
--- a/vg_main.c
+++ b/vg_main.c
@@ -1164,37 +1164,66 @@
"valgrinq.so", which doesn't do anything. This is used to avoid
tracing into child processes. To make this work the build system
also supplies a dummy file, "valgrinq.so".
+
+ Also look for $(libdir)/lib/valgrind in LD_LIBRARY_PATH and change
+ it to $(libdir)/lib/valgrinq, so as to make our libpthread.so
+ disappear.
*/
void VG_(mash_LD_PRELOAD_and_LD_LIBRARY_PATH) ( Char* ld_preload_str,
Char* ld_library_path_str )
{
- Char* p;
- vg_assert(ld_preload_str != NULL);
- vg_assert(ld_library_path_str != NULL);
- /* VG_(printf)("%s %s\n", ld_preload_str, ld_library_path_str); */
- /* in LD_PRELOAD, turn valgrind.so into valgrinq.so. */
- p = VG_(strstr)(ld_preload_str, "valgrind.so");
+ Char* p_prel = NULL;
+ Char* p_path = NULL;
+ Int what = 0;
+ if (ld_preload_str == NULL || ld_library_path_str == NULL)
+ goto mutancy;
- if (p == NULL) {
+ /* VG_(printf)("%s %s\n", ld_preload_str, ld_library_path_str); */
+
+ p_prel = VG_(strstr)(ld_preload_str, "valgrind.so");
+ p_path = VG_(strstr)(ld_library_path_str, VG_LIBDIR);
+
+ if (p_prel == NULL) {
/* perhaps already happened? */
- vg_assert(VG_(strstr)(ld_preload_str, "valgrinq.so") != NULL);
- vg_assert(VG_(strstr)(ld_library_path_str, "lib/valgrinq") != NULL);
+ what = 1;
+ if (VG_(strstr)(ld_preload_str, "valgrinq.so") == NULL)
+ goto mutancy;
+ if (VG_(strstr)(ld_library_path_str, "lib/valgrinq") == NULL)
+ goto mutancy;
return;
}
- vg_assert(p[7] == 'd');
- p[7] = 'q';
+ what = 2;
+ if (p_path == NULL) goto mutancy;
+
+ /* in LD_PRELOAD, turn valgrind.so into valgrinq.so. */
+ what = 3;
+ if (p_prel[7] != 'd') goto mutancy;
+ p_prel[7] = 'q';
/* in LD_LIBRARY_PATH, turn $libdir/valgrind (as configure'd) from
.../lib/valgrind .../lib/valgrinq, which doesn't exist,
so that our own libpthread.so goes out of scope. */
- p = VG_(strstr)(ld_library_path_str, VG_LIBDIR);
- vg_assert(NULL != p);
- p += VG_(strlen)(VG_LIBDIR);
- p += VG_(strlen)("/valgrind");
- p --;
- vg_assert(p[0] == 'd');
- p[0] = 'q';
+ p_path += VG_(strlen)(VG_LIBDIR);
+ what = 4;
+ if (p_path[0] != '/') goto mutancy;
+ p_path++; /* step over / */
+ what = 5;
+ if (p_path[7] != 'd') goto mutancy;
+ p_path[7] = 'q';
+ return;
+
+ mutancy:
+ VG_(printf)(
+ "\nVG_(mash_LD_PRELOAD_and_LD_LIBRARY_PATH): internal error:\n"
+ " what = %d\n"
+ " ld_preload_str = `%s'\n"
+ " ld_library_path_str = `%s'\n"
+ " p_prel = `%s'\n"
+ " p_path = `%s'\n"
+ " VG_LIBDIR = `%s'\n",
+ what, ld_preload_str, ld_library_path_str, p_prel, p_path, VG_LIBDIR );
+ VG_(panic)("VG_(mash_LD_PRELOAD_and_LD_LIBRARY_PATH) failed\n");
}