Fix bug in `expr_clone`
[platform/upstream/ltrace.git] / proc.c
diff --git a/proc.c b/proc.c
index 6d6562f..bf2a172 100644 (file)
--- a/proc.c
+++ b/proc.c
 #include "options.h"
 #include "proc.h"
 #include "value_dict.h"
-#include "dwarf_prototypes.h"
+
+#if defined(HAVE_LIBDW)
+# include "dwarf_prototypes.h"
+#endif /* defined(HAVE_LIBDW) */
 
 #ifndef OS_HAVE_PROCESS_DATA
 int
@@ -871,25 +874,18 @@ proc_activate_delayed_symbol(struct process *proc,
 struct activate_latent_in_context
 {
        struct process *proc;
-       struct library *lib;
+       struct library_exported_names *exported_names;
 };
 static enum callback_status
-activate_latent_in_cb(const char *name, void *data)
+activate_latent_in_cb(struct library_symbol *libsym, void *data)
 {
-       const struct activate_latent_in_context *ctx =
-               (const struct activate_latent_in_context*)data;
+       struct activate_latent_in_context *ctx =
+               (struct activate_latent_in_context*)data;
 
-       struct process *proc = ctx->proc;
-       struct library *lib  = ctx->lib;
-
-       struct library_symbol *libsym = NULL;
-       while ((libsym = library_each_symbol(lib, libsym,
-                                            library_symbol_named_cb,
-                                            (void *)name))
-              != NULL)
-               if (libsym->latent
-                   && proc_activate_latent_symbol(proc, libsym) < 0)
-                       return CBS_FAIL;
+       if (libsym->latent &&
+           library_exported_names_contains(ctx->exported_names,
+                                           libsym->name) != 0)
+               proc_activate_latent_symbol(ctx->proc, libsym);
 
        return CBS_CONT;
 }
@@ -897,17 +893,21 @@ activate_latent_in_cb(const char *name, void *data)
 static enum callback_status
 activate_latent_in(struct process *proc, struct library *lib, void *data)
 {
+       struct library_symbol *libsym = NULL;
+
        struct library_exported_names *exported_names =
                (struct library_exported_names*)data;
 
-       struct activate_latent_in_context context = {.proc = proc,
-                                                    .lib = lib};
-       if (library_exported_names_each(exported_names,
-                                       activate_latent_in_cb,
-                                       &context))
-               return CBS_CONT;
-       else
+       struct activate_latent_in_context ctx =
+               {.proc = proc,
+                .exported_names = exported_names};
+
+       if (library_each_symbol(lib, libsym,
+                               activate_latent_in_cb,
+                               &ctx) != NULL)
                return CBS_FAIL;
+
+       return CBS_CONT;
 }
 
 void
@@ -990,15 +990,19 @@ proc_add_library(struct process *proc, struct library *lib)
                        "Couldn't insert breakpoint for %s to %d: %s.\n",
                        libsym->name, proc->pid, strerror(errno));
 
-       /* Look through export list of the new library and compare it
-        * with latent symbols of all libraries (including this
-        * library itself).  */
-       struct library *lib2 = NULL;
-       while ((lib2 = proc_each_library(proc, lib2, activate_latent_in,
-                                        &lib->exported_names)) != NULL)
-               fprintf(stderr,
-                       "Couldn't activate latent symbols for %s in %d: %s.\n",
-                       lib2->soname, proc->pid, strerror(errno));
+       if (lib->should_activate_latent != 0) {
+               /* Look through export list of the new library and compare it
+                * with latent symbols of all libraries (including this
+                * library itself).  */
+               struct library *lib2 = NULL;
+
+               while ((lib2 = proc_each_library(proc, lib2, activate_latent_in,
+                                                &lib->exported_names)) != NULL)
+                       fprintf(stderr,
+                               "Couldn't activate latent symbols "
+                               "for %s in %d: %s.\n",
+                               lib2->soname, proc->pid, strerror(errno));
+       }
 }
 
 int