/*
- * bin-info.c
+ * SPDX-License-Identifier: MIT
*
* Babeltrace - Executable and Shared Object Debug Info Reader
*
* Copyright 2015 Antoine Busque <abusque@efficios.com>
- *
- * Author: Antoine Busque <abusque@efficios.com>
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
*/
#define BT_COMP_LOG_SELF_COMP (bin->self_comp)
#include <inttypes.h>
#include <libgen.h>
#include <math.h>
+#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define ADDR_STR_LEN 20
#define BUILD_ID_NOTE_NAME "GNU"
-BT_HIDDEN
int bin_info_init(bt_logging_level log_level, bt_self_component *self_comp)
{
int ret = 0;
return ret;
}
-BT_HIDDEN
struct bin_info *bin_info_create(struct bt_fd_cache *fdc, const char *path,
uint64_t low_addr, uint64_t memsz, bool is_pic,
const char *debug_info_dir, const char *target_prefix,
return NULL;
}
-BT_HIDDEN
void bin_info_destroy(struct bin_info *bin)
{
if (!bin) {
{
struct bt_fd_cache_handle *elf_handle = NULL;
Elf *elf_file = NULL;
+ int ret;
- if (!bin) {
- goto error;
- }
+ BT_ASSERT(bin);
elf_handle = bt_fd_cache_get_handle(bin->fd_cache, bin->elf_path);
if (!elf_handle) {
elf_file = elf_begin(bt_fd_cache_handle_get_fd(bin->elf_handle),
ELF_C_READ, NULL);
if (!elf_file) {
- BT_COMP_LOGE("elf_begin failed: %s", elf_errmsg(-1));
+ BT_COMP_LOGE_APPEND_CAUSE(bin->self_comp,
+ "elf_begin failed: %s", elf_errmsg(-1));
goto error;
}
bin->elf_file = elf_file;
if (elf_kind(elf_file) != ELF_K_ELF) {
- BT_COMP_LOGE("Error: %s is not an ELF object", bin->elf_path);
+ BT_COMP_LOGE_APPEND_CAUSE(bin->self_comp,
+ "Error: %s is not an ELF object", bin->elf_path);
goto error;
}
- return 0;
+
+ ret = 0;
+ goto end;
error:
bt_fd_cache_put_handle(bin->fd_cache, elf_handle);
elf_end(elf_file);
- return -1;
+ ret = -1;
+
+end:
+ return ret;
}
/**
*
* @returns 1 on if the build id of stored in `bin` matches
* the build id of the ondisk file.
- * 0 on if they are different or an error occured.
+ * 0 on if they are different or an error occurred.
*/
static
int is_build_id_matching(struct bin_info *bin)
return is_matching;
}
-BT_HIDDEN
int bin_info_set_build_id(struct bin_info *bin, uint8_t *build_id,
size_t build_id_len)
{
goto error;
}
+ /* Free any previously set build id. */
+ g_free(bin->build_id);
+
/* Set the build id. */
bin->build_id = g_new0(uint8_t, build_id_len);
if (!bin->build_id) {
bin->file_build_id_matches = is_build_id_matching(bin);
if (!bin->file_build_id_matches) {
BT_COMP_LOGI_STR("Supplied Build ID does not match Build ID of the "
- "binary or library found on the file system.");
+ "binary or library found on the file system.");
goto error;
}
return -1;
}
-BT_HIDDEN
int bin_info_set_debug_link(struct bin_info *bin, const char *filename,
uint32_t crc)
{
return ret;
}
-BT_HIDDEN
void source_location_destroy(struct source_location *src_loc)
{
if (!src_loc) {
while (scn && !sym) {
ret = bin_info_get_nearest_symbol_from_section(
- scn, addr, &sym, &shdr);
+ scn, addr, &sym, &shdr);
if (ret) {
goto error;
}
if (sym) {
sym_name = elf_strptr(bin->elf_file, shdr->sh_link,
- sym->st_name);
+ sym->st_name);
if (!sym_name) {
goto error;
}
ret = bin_info_append_offset_str(sym_name, sym->st_value, addr,
- func_name);
+ func_name);
if (ret) {
goto error;
}
}
ret = bin_info_append_offset_str(die_name, low_addr, addr,
- func_name);
+ func_name);
free(die_name);
if (ret) {
goto error;
return -1;
}
-BT_HIDDEN
int bin_info_lookup_function_name(struct bin_info *bin,
uint64_t addr, char **func_name)
{
ret = bin_info_set_dwarf_info(bin);
if (ret) {
BT_COMP_LOGI_STR("Failed to set bin dwarf info, falling "
- "back to ELF lookup.");
+ "back to ELF lookup.");
/* Failed to set DWARF info, fallback to ELF. */
bin->is_elf_only = true;
}
if (bin->is_elf_only) {
ret = bin_info_lookup_elf_function_name(bin, addr,
- &_func_name);
+ &_func_name);
if (ret) {
BT_COMP_LOGI("Failed to lookup function name (ELF): "
"ret=%d", ret);
}
} else {
ret = bin_info_lookup_dwarf_function_name(bin, addr,
- &_func_name);
+ &_func_name);
if (ret) {
BT_COMP_LOGI("Failed to lookup function name (DWARF): "
"ret=%d", ret);
return -1;
}
-BT_HIDDEN
int bin_info_get_bin_loc(struct bin_info *bin, uint64_t addr, char **bin_loc)
{
gchar *_bin_loc = NULL;
return -1;
}
-BT_HIDDEN
int bin_info_lookup_source_location(struct bin_info *bin, uint64_t addr,
struct source_location **src_loc)
{