diff options
-rw-r--r-- | ltrace-elf.c | 7 | ||||
-rw-r--r-- | ltrace-elf.h | 11 |
2 files changed, 16 insertions, 2 deletions
diff --git a/ltrace-elf.c b/ltrace-elf.c index bdb6220..f4a58a5 100644 --- a/ltrace-elf.c +++ b/ltrace-elf.c @@ -63,13 +63,16 @@ arch_elf_destroy(struct ltelf *lte) } #endif -static int +int default_elf_add_plt_entry(struct Process *proc, struct ltelf *lte, const char *a_name, GElf_Rela *rela, size_t ndx, struct library_symbol **ret) { char *name = strdup(a_name); if (name == NULL) { + fail_message: + fprintf(stderr, "Couldn't create symbol for PLT entry: %s\n", + strerror(errno)); fail: free(name); return -1; @@ -79,7 +82,7 @@ default_elf_add_plt_entry(struct Process *proc, struct ltelf *lte, struct library_symbol *libsym = malloc(sizeof(*libsym)); if (libsym == NULL) - goto fail; + goto fail_message; /* XXX The double cast should be removed when * arch_addr_t becomes integral type. */ diff --git a/ltrace-elf.h b/ltrace-elf.h index 5470c28..1a1321e 100644 --- a/ltrace-elf.h +++ b/ltrace-elf.h @@ -80,6 +80,17 @@ int ltelf_read_library(struct library *lib, struct Process *proc, * point address is stored to *ENTRYP. */ struct library *ltelf_read_main_binary(struct Process *proc, const char *path); +/* Create a default PLT entry. This can be used instead (or in + * addition to) returning plt_default from arch_elf_add_plt_entry. + * RET shall be initialized, the created symbol will be added to the + * beginning of the linked list at *RET. This function doesn't add + * the symbol to LTE. arch_elf_add_plt_entry has the chance to adjust + * symbol internals to its liking, and then return either plt_default + * or plt_ok. */ +int default_elf_add_plt_entry(struct Process *proc, struct ltelf *lte, + const char *a_name, GElf_Rela *rela, size_t ndx, + struct library_symbol **ret); + /* The base implementation of backend.h (arch_get_sym_info). * See backend.h for details. */ int elf_get_sym_info(struct ltelf *lte, const char *filename, |