This functions searches the DYNAMIC vector of an inferior process searching for
the first entry whose d_tag matches. An out parameter is provided to copy out
address stored in the matching entry.
---
 ltrace-elf.h             |    1 +
 sysdeps/linux-gnu/proc.c |   34 ++++++++++++++++++++++++++++++++++
 2 files changed, 35 insertions(+), 0 deletions(-)

diff --git a/ltrace-elf.h b/ltrace-elf.h
index 6ac143b..b21f6e3 100644
--- a/ltrace-elf.h
+++ b/ltrace-elf.h
@@ -34,6 +34,7 @@ struct ltelf {
 #endif // __mips__
 };
 
+#define ELF_MAX_SEGMENTS  50
 #define LTE_HASH_MALLOCED 1
 #define LTE_PLT_EXECUTABLE 2
 
diff --git a/sysdeps/linux-gnu/proc.c b/sysdeps/linux-gnu/proc.c
index 4251c1d..86ad301 100644
--- a/sysdeps/linux-gnu/proc.c
+++ b/sysdeps/linux-gnu/proc.c
@@ -1,6 +1,8 @@
 #include "config.h"
+#include "common.h"
 
 #include <sys/types.h>
+#include <link.h>
 #include <stdio.h>
 #include <string.h>
 #include <signal.h>
@@ -34,3 +36,35 @@ pid2name(pid_t pid) {
        }
        return NULL;
 }
+
+static int
+find_dynamic_entry_addr(Process *proc, void *pvAddr, int d_tag, void **addr) {
+       int i = 0, done = 0;
+       ElfW(Dyn) entry;
+
+       debug(DEBUG_FUNCTION, "find_dynamic_entry()");
+
+       if (addr ==     NULL || pvAddr == NULL || d_tag < 0 || d_tag > DT_NUM) {
+               return -1;
+       }
+
+       while ((!done) && (i < ELF_MAX_SEGMENTS) &&
+               (sizeof(entry) == umovebytes(proc, pvAddr, &entry, 
sizeof(entry))) &&
+               (entry.d_tag != DT_NULL)) {
+               if (entry.d_tag == d_tag) {
+                       done = 1;
+                       *addr = (void *)entry.d_un.d_val;
+               }
+               pvAddr += sizeof(entry);
+               i++;
+       }
+
+       if (done) {
+               debug(2, "found address: 0x%p in dtag %d\n", *addr, d_tag);
+               return 0;
+       }
+       else {
+               debug(2, "Couldn't address for dtag!\n");
+               return -1;
+       }
+}
-- 
1.7.0.4


_______________________________________________
Ltrace-devel mailing list
[email protected]
http://lists.alioth.debian.org/mailman/listinfo/ltrace-devel

Reply via email to