#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
ret = populate_section_header(elf, section_header, index);
if (ret) {
- ret = LTTNG_ERR_ELF_PARSING;
DBG("Error populating section header.");
goto error;
}
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;
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) {
}
/* 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.");
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;
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;
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);
/* 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 &&
*/
if (curr_semaphore_location != 0) {
ret = LTTNG_ERR_SDT_PROBE_SEMAPHORE;
- goto end;
+ goto realloc_error;
}
new_size = (++nb_match) * sizeof(uint64_t);