aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPetr Machata <pmachata@redhat.com>2012-02-10 13:14:43 +0100
committerPetr Machata <pmachata@redhat.com>2012-04-19 00:55:47 +0200
commita7db59c355cef464073496221ad27519a48466f9 (patch)
tree17ff1533c38dd9668031a79a21bf02baac73afe3
parent14184b3a0c938c196f77d2d3bfc7e82fa10d661b (diff)
downloadltrace-a7db59c355cef464073496221ad27519a48466f9.tar.gz
New interface library_symbol_init
-rw-r--r--ChangeLog5
-rw-r--r--common.h5
-rw-r--r--ltrace-elf.c54
3 files changed, 40 insertions, 24 deletions
diff --git a/ChangeLog b/ChangeLog
index c46f5a8..5380ff6 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -5,6 +5,11 @@
* proc.c: Call it.
* configure.ac: Add support for libselinux.
+2012-02-10 Petr Machata <pmachata@redhat.com>
+
+ * common.h (library_symbol_init): New interface
+ * ltrace-elf.c: Implemented and reused here
+
2012-02-09 Petr Machata <pmachata@redhat.com>
* proc.h: New file. Move there struct Process and related types
diff --git a/common.h b/common.h
index 265ef4b..0d56a2b 100644
--- a/common.h
+++ b/common.h
@@ -123,7 +123,7 @@ extern Function * list_of_functions;
extern char *PLTs_initialized_by_here;
struct library_symbol {
- char * name;
+ const char *name;
void * enter_addr;
char needs_init;
enum toplt plt_type;
@@ -178,6 +178,9 @@ extern int do_init_elf(struct ltelf *lte, const char *filename);
extern void do_close_elf(struct ltelf *lte);
extern int in_load_libraries(const char *name, struct ltelf *lte, size_t count, GElf_Sym *sym);
extern struct library_symbol *library_symbols;
+extern void library_symbol_init(struct library_symbol *libsym,
+ GElf_Addr addr, const char *name,
+ enum toplt type_of_plt, int is_weak);
extern void add_library_symbol(GElf_Addr addr, const char *name,
struct library_symbol **library_symbolspp,
enum toplt type_of_plt, int is_weak);
diff --git a/ltrace-elf.c b/ltrace-elf.c
index d379178..d3d67d5 100644
--- a/ltrace-elf.c
+++ b/ltrace-elf.c
@@ -477,19 +477,34 @@ do_close_elf(struct ltelf *lte) {
close(lte->fd);
}
+void
+library_symbol_init(struct library_symbol *libsym,
+ GElf_Addr addr, const char *name,
+ enum toplt type_of_plt, int is_weak)
+{
+ libsym->needs_init = 0;
+ libsym->is_weak = is_weak;
+ libsym->plt_type = type_of_plt;
+ libsym->name = name;
+ libsym->enter_addr = (void *)(uintptr_t)addr;
+ libsym->next = NULL;
+}
+
static struct library_symbol *
-create_library_symbol(const char * name, GElf_Addr addr)
+create_library_symbol(const char *name, GElf_Addr addr,
+ enum toplt type_of_plt, int is_weak)
{
size_t namel = strlen(name) + 1;
- struct library_symbol * sym = calloc(sizeof(*sym) + namel, 1);
- if (sym == NULL) {
+ struct library_symbol * libsym = calloc(sizeof(*libsym) + namel, 1);
+ if (libsym == NULL) {
perror("create_library_symbol");
return NULL;
}
- sym->name = (char *)(sym + 1);
- memcpy(sym->name, name, namel);
- sym->enter_addr = (void *)(uintptr_t) addr;
- return sym;
+ memcpy(libsym + 1, name, namel);
+ library_symbol_init(libsym, addr,
+ (char *)(libsym + 1), type_of_plt, is_weak);
+
+ return libsym;
}
void
@@ -497,18 +512,14 @@ add_library_symbol(GElf_Addr addr, const char *name,
struct library_symbol **library_symbolspp,
enum toplt type_of_plt, int is_weak)
{
- struct library_symbol *s;
-
debug(DEBUG_FUNCTION, "add_library_symbol()");
- s = create_library_symbol(name, addr);
+ struct library_symbol *s = create_library_symbol(name, addr,
+ type_of_plt, is_weak);
if (s == NULL)
error(EXIT_FAILURE, errno, "add_library_symbol failed");
s->needs_init = 1;
- s->is_weak = is_weak;
- s->plt_type = type_of_plt;
-
s->next = *library_symbolspp;
*library_symbolspp = s;
@@ -516,17 +527,14 @@ add_library_symbol(GElf_Addr addr, const char *name,
}
struct library_symbol *
-clone_library_symbol(struct library_symbol * sym)
+clone_library_symbol(struct library_symbol *libsym)
{
- struct library_symbol * copy
- = create_library_symbol(sym->name,
- (GElf_Addr)(uintptr_t)sym->enter_addr);
- if (copy == NULL)
- return NULL;
-
- copy->needs_init = sym->needs_init;
- copy->is_weak = sym->is_weak;
- copy->plt_type = sym->plt_type;
+ GElf_Addr addr = (uintptr_t)libsym->enter_addr;
+ struct library_symbol *copy
+ = create_library_symbol(libsym->name, addr,
+ libsym->plt_type, libsym->is_weak);
+ if (copy != NULL)
+ copy->needs_init = libsym->needs_init;
return copy;
}