diff options
author | Petr Machata <pmachata@redhat.com> | 2012-02-10 13:14:43 +0100 |
---|---|---|
committer | Petr Machata <pmachata@redhat.com> | 2012-04-19 00:55:47 +0200 |
commit | a7db59c355cef464073496221ad27519a48466f9 (patch) | |
tree | 17ff1533c38dd9668031a79a21bf02baac73afe3 | |
parent | 14184b3a0c938c196f77d2d3bfc7e82fa10d661b (diff) | |
download | ltrace-a7db59c355cef464073496221ad27519a48466f9.tar.gz |
New interface library_symbol_init
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | common.h | 5 | ||||
-rw-r--r-- | ltrace-elf.c | 54 |
3 files changed, 40 insertions, 24 deletions
@@ -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 @@ -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; } |