// SPDX-License-Identifier: GPL-2.0 #include <stdbool.h> #include <inttypes.h> #include <stdlib.h> #include <string.h> #include <linux/bitops.h> #include <linux/kernel.h> #include <linux/types.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <subcmd/exec-cmd.h> #include "debug.h" #include "util/build-id.h" #include "util/symbol.h" #include "util/dso.h" #include "tests.h" #ifdef HAVE_LIBBFD_SUPPORT static int run_dir(const char *d) { char filename[PATH_MAX]; char debugfile[PATH_MAX]; struct build_id bid; char debuglink[PATH_MAX]; char expect_build_id[] = { 0x5a, 0x0f, 0xd8, 0x82, 0xb5, 0x30, 0x84, 0x22, 0x4b, 0xa4, 0x7b, 0x62, 0x4c, 0x55, 0xa4, 0x69, }; char expect_debuglink[PATH_MAX] = "pe-file.exe.debug"; struct dso *dso; struct symbol *sym; int ret; size_t idx; scnprintf(filename, PATH_MAX, "%s/pe-file.exe", d); ret = filename__read_build_id(filename, &bid); TEST_ASSERT_VAL("Failed to read build_id", ret == sizeof(expect_build_id)); TEST_ASSERT_VAL("Wrong build_id", !memcmp(bid.data, expect_build_id, sizeof(expect_build_id))); ret = filename__read_debuglink(filename, debuglink, PATH_MAX); TEST_ASSERT_VAL("Failed to read debuglink", ret == 0); TEST_ASSERT_VAL("Wrong debuglink", !strcmp(debuglink, expect_debuglink)); scnprintf(debugfile, PATH_MAX, "%s/%s", d, debuglink); ret = filename__read_build_id(debugfile, &bid); TEST_ASSERT_VAL("Failed to read debug file build_id", ret == sizeof(expect_build_id)); TEST_ASSERT_VAL("Wrong build_id", !memcmp(bid.data, expect_build_id, sizeof(expect_build_id))); dso = dso__new(filename); TEST_ASSERT_VAL("Failed to get dso", dso); ret = dso__load_bfd_symbols(dso, debugfile); TEST_ASSERT_VAL("Failed to load symbols", ret == 0); dso__sort_by_name(dso); sym = dso__find_symbol_by_name(dso, "main", &idx); TEST_ASSERT_VAL("Failed to find main", sym); dso__delete(dso); return TEST_OK; } static int test__pe_file_parsing(struct test_suite *test __maybe_unused, int subtest __maybe_unused) { struct stat st; char path_dir[PATH_MAX]; /* First try development tree tests. */ if (!lstat("./tests", &st)) return run_dir("./tests"); /* Then installed path. */ snprintf(path_dir, PATH_MAX, "%s/tests", get_argv_exec_path()); if (!lstat(path_dir, &st)) return run_dir(path_dir); return TEST_SKIP; } #else static int test__pe_file_parsing(struct test_suite *test __maybe_unused, int subtest __maybe_unused) { return TEST_SKIP; } #endif DEFINE_SUITE("PE file support", pe_file_parsing);