Fix: typo 'convet' -> 'convert'
[lttng-tools.git] / src / common / lttng-elf.c
index 47dc89900237f4e88aa537ec8a8d6be548c95998..cb01f7bb7d38195ed9e214ea784bd578379677c4 100644 (file)
@@ -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
@@ -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);
This page took 0.026022 seconds and 4 git commands to generate.