X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Fcommon%2Flttng-elf.c;h=cd10632ce46bbe6f9364d31d39aa15570be7fbaf;hb=7ea24db3075a52487a76894057db56eba29581b3;hp=47dc89900237f4e88aa537ec8a8d6be548c95998;hpb=8bd52288b87c954916e836066241790f23e9d5e6;p=lttng-tools.git diff --git a/src/common/lttng-elf.c b/src/common/lttng-elf.c index 47dc89900..cd10632ce 100644 --- a/src/common/lttng-elf.c +++ b/src/common/lttng-elf.c @@ -38,6 +38,8 @@ #define TEXT_SECTION_NAME ".text" #define SYMBOL_TAB_SECTION_NAME ".symtab" #define STRING_TAB_SECTION_NAME ".strtab" +#define DYNAMIC_SYMBOL_TAB_SECTION_NAME ".dynsym" +#define DYNAMIC_STRING_TAB_SECTION_NAME ".dynstr" #define NOTE_STAPSDT_SECTION_NAME ".note.stapsdt" #define NOTE_STAPSDT_NAME "stapsdt" #define NOTE_STAPSDT_TYPE 3 @@ -54,13 +56,13 @@ do { \ switch (sizeof(x)) { \ case 8: \ - x = be64toh(x); \ + x = be64toh((uint64_t)x); \ break; \ case 4: \ - x = be32toh(x); \ + x = be32toh((uint32_t)x); \ break; \ case 2: \ - x = be16toh(x); \ + x = be16toh((uint16_t)x); \ break; \ case 1: \ break; \ @@ -331,7 +333,6 @@ struct lttng_elf_shdr *lttng_elf_get_section_hdr(struct lttng_elf *elf, ret = populate_section_header(elf, section_header, index); if (ret) { - ret = LTTNG_ERR_ELF_PARSING; DBG("Error populating section header."); goto error; } @@ -737,6 +738,7 @@ int lttng_elf_get_symbol_offset(int fd, char *symbol, uint64_t *offset) char *curr_sym_str = NULL; char *symbol_table_data = NULL; char *string_table_data = NULL; + char *string_table_name = NULL; struct lttng_elf_shdr *symtab_hdr = NULL; struct lttng_elf_shdr *strtab_hdr = NULL; struct lttng_elf *elf = NULL; @@ -752,14 +754,29 @@ int lttng_elf_get_symbol_offset(int fd, char *symbol, uint64_t *offset) goto end; } - /* Get the symbol table section header. */ + /* + * The .symtab section might not exist on stripped binaries. + * Try to get the symbol table section header first. If it's absent, + * try to get the dynamic symbol table. All symbols in the dynamic + * symbol tab are in the (normal) symbol table if it exists. + */ ret = lttng_elf_get_section_hdr_by_name(elf, SYMBOL_TAB_SECTION_NAME, &symtab_hdr); if (ret) { - DBG("Cannot get ELF Symbol Table section."); - ret = LTTNG_ERR_ELF_PARSING; - goto destroy_elf; + DBG("Cannot get ELF Symbol Table section. Trying to get ELF Dynamic Symbol Table section."); + /* Get the dynamic symbol table section header. */ + ret = lttng_elf_get_section_hdr_by_name(elf, DYNAMIC_SYMBOL_TAB_SECTION_NAME, + &symtab_hdr); + if (ret) { + DBG("Cannot get ELF Symbol Table nor Dynamic Symbol Table sections."); + ret = LTTNG_ERR_ELF_PARSING; + goto destroy_elf; + } + string_table_name = DYNAMIC_STRING_TAB_SECTION_NAME; + } else { + string_table_name = STRING_TAB_SECTION_NAME; } + /* Get the data associated with the symbol table section. */ symbol_table_data = lttng_elf_get_section_data(elf, symtab_hdr); if (symbol_table_data == NULL) { @@ -769,7 +786,7 @@ int lttng_elf_get_symbol_offset(int fd, char *symbol, uint64_t *offset) } /* Get the string table section header. */ - ret = lttng_elf_get_section_hdr_by_name(elf, STRING_TAB_SECTION_NAME, + ret = lttng_elf_get_section_hdr_by_name(elf, string_table_name, &strtab_hdr); if (ret) { DBG("Cannot get ELF string table section."); @@ -844,7 +861,7 @@ int lttng_elf_get_symbol_offset(int fd, char *symbol, uint64_t *offset) */ ret = lttng_elf_convert_addr_in_text_to_offset(elf, addr, offset); if (ret) { - DBG("Cannot convet addr to offset."); + DBG("Cannot convert addr to offset."); goto free_string_table_data; } @@ -875,7 +892,7 @@ int lttng_elf_get_sdt_probe_offsets(int fd, const char *provider_name, struct lttng_elf *elf = NULL; char *stap_note_section_data = NULL; char *curr_note_section_begin, *curr_data_ptr, *curr_probe, *curr_provider; - char *next_note_ptr, *curr_desc_beg; + char *next_note_ptr; uint32_t name_size, desc_size, note_type; uint64_t curr_probe_location, curr_probe_offset, curr_semaphore_location; uint64_t *probe_locs = NULL, *new_probe_locs = NULL; @@ -909,7 +926,6 @@ int lttng_elf_get_sdt_probe_offsets(int fd, const char *provider_name, goto destroy_elf_error; } - curr_data_ptr = stap_note_section_data; next_note_ptr = stap_note_section_data; curr_note_section_begin = stap_note_section_data; @@ -965,9 +981,6 @@ int lttng_elf_get_sdt_probe_offsets(int fd, const char *provider_name, curr_data_ptr += name_size; - /* Get description field. */ - curr_desc_beg = curr_data_ptr; - /* Get probe location. */ curr_probe_location = *(uint64_t *) curr_data_ptr; curr_data_ptr += sizeof(uint64_t); @@ -984,9 +997,6 @@ int lttng_elf_get_sdt_probe_offsets(int fd, const char *provider_name, /* Get probe name. */ curr_probe = curr_data_ptr; - curr_data_ptr += strlen(curr_probe) + 1; - - curr_data_ptr = curr_desc_beg + desc_size; /* Check if the provider and probe name match */ if (strcmp(provider_name, curr_provider) == 0 && @@ -1000,7 +1010,7 @@ int lttng_elf_get_sdt_probe_offsets(int fd, const char *provider_name, */ if (curr_semaphore_location != 0) { ret = LTTNG_ERR_SDT_PROBE_SEMAPHORE; - goto end; + goto realloc_error; } new_size = (++nb_match) * sizeof(uint64_t);