1*ed21d6d7SRemi Bernon // SPDX-License-Identifier: GPL-2.0 2*ed21d6d7SRemi Bernon #include <stdbool.h> 3*ed21d6d7SRemi Bernon #include <inttypes.h> 4*ed21d6d7SRemi Bernon #include <stdlib.h> 5*ed21d6d7SRemi Bernon #include <string.h> 6*ed21d6d7SRemi Bernon #include <linux/bitops.h> 7*ed21d6d7SRemi Bernon #include <linux/kernel.h> 8*ed21d6d7SRemi Bernon #include <linux/types.h> 9*ed21d6d7SRemi Bernon #include <sys/types.h> 10*ed21d6d7SRemi Bernon #include <sys/stat.h> 11*ed21d6d7SRemi Bernon #include <unistd.h> 12*ed21d6d7SRemi Bernon #include <subcmd/exec-cmd.h> 13*ed21d6d7SRemi Bernon 14*ed21d6d7SRemi Bernon #include "debug.h" 15*ed21d6d7SRemi Bernon #include "util/build-id.h" 16*ed21d6d7SRemi Bernon #include "util/symbol.h" 17*ed21d6d7SRemi Bernon #include "util/dso.h" 18*ed21d6d7SRemi Bernon 19*ed21d6d7SRemi Bernon #include "tests.h" 20*ed21d6d7SRemi Bernon 21*ed21d6d7SRemi Bernon #ifdef HAVE_LIBBFD_SUPPORT 22*ed21d6d7SRemi Bernon 23*ed21d6d7SRemi Bernon static int run_dir(const char *d) 24*ed21d6d7SRemi Bernon { 25*ed21d6d7SRemi Bernon char filename[PATH_MAX]; 26*ed21d6d7SRemi Bernon char debugfile[PATH_MAX]; 27*ed21d6d7SRemi Bernon char build_id[BUILD_ID_SIZE]; 28*ed21d6d7SRemi Bernon char debuglink[PATH_MAX]; 29*ed21d6d7SRemi Bernon char expect_build_id[] = { 30*ed21d6d7SRemi Bernon 0x5a, 0x0f, 0xd8, 0x82, 0xb5, 0x30, 0x84, 0x22, 31*ed21d6d7SRemi Bernon 0x4b, 0xa4, 0x7b, 0x62, 0x4c, 0x55, 0xa4, 0x69, 32*ed21d6d7SRemi Bernon }; 33*ed21d6d7SRemi Bernon char expect_debuglink[PATH_MAX] = "pe-file.exe.debug"; 34*ed21d6d7SRemi Bernon struct dso *dso; 35*ed21d6d7SRemi Bernon struct symbol *sym; 36*ed21d6d7SRemi Bernon int ret; 37*ed21d6d7SRemi Bernon 38*ed21d6d7SRemi Bernon scnprintf(filename, PATH_MAX, "%s/pe-file.exe", d); 39*ed21d6d7SRemi Bernon ret = filename__read_build_id(filename, build_id, BUILD_ID_SIZE); 40*ed21d6d7SRemi Bernon TEST_ASSERT_VAL("Failed to read build_id", 41*ed21d6d7SRemi Bernon ret == sizeof(expect_build_id)); 42*ed21d6d7SRemi Bernon TEST_ASSERT_VAL("Wrong build_id", !memcmp(build_id, expect_build_id, 43*ed21d6d7SRemi Bernon sizeof(expect_build_id))); 44*ed21d6d7SRemi Bernon 45*ed21d6d7SRemi Bernon ret = filename__read_debuglink(filename, debuglink, PATH_MAX); 46*ed21d6d7SRemi Bernon TEST_ASSERT_VAL("Failed to read debuglink", ret == 0); 47*ed21d6d7SRemi Bernon TEST_ASSERT_VAL("Wrong debuglink", 48*ed21d6d7SRemi Bernon !strcmp(debuglink, expect_debuglink)); 49*ed21d6d7SRemi Bernon 50*ed21d6d7SRemi Bernon scnprintf(debugfile, PATH_MAX, "%s/%s", d, debuglink); 51*ed21d6d7SRemi Bernon ret = filename__read_build_id(debugfile, build_id, BUILD_ID_SIZE); 52*ed21d6d7SRemi Bernon TEST_ASSERT_VAL("Failed to read debug file build_id", 53*ed21d6d7SRemi Bernon ret == sizeof(expect_build_id)); 54*ed21d6d7SRemi Bernon TEST_ASSERT_VAL("Wrong build_id", !memcmp(build_id, expect_build_id, 55*ed21d6d7SRemi Bernon sizeof(expect_build_id))); 56*ed21d6d7SRemi Bernon 57*ed21d6d7SRemi Bernon dso = dso__new(filename); 58*ed21d6d7SRemi Bernon TEST_ASSERT_VAL("Failed to get dso", dso); 59*ed21d6d7SRemi Bernon 60*ed21d6d7SRemi Bernon ret = dso__load_bfd_symbols(dso, debugfile); 61*ed21d6d7SRemi Bernon TEST_ASSERT_VAL("Failed to load symbols", ret == 0); 62*ed21d6d7SRemi Bernon 63*ed21d6d7SRemi Bernon dso__sort_by_name(dso); 64*ed21d6d7SRemi Bernon sym = dso__find_symbol_by_name(dso, "main"); 65*ed21d6d7SRemi Bernon TEST_ASSERT_VAL("Failed to find main", sym); 66*ed21d6d7SRemi Bernon dso__delete(dso); 67*ed21d6d7SRemi Bernon 68*ed21d6d7SRemi Bernon return TEST_OK; 69*ed21d6d7SRemi Bernon } 70*ed21d6d7SRemi Bernon 71*ed21d6d7SRemi Bernon int test__pe_file_parsing(struct test *test __maybe_unused, 72*ed21d6d7SRemi Bernon int subtest __maybe_unused) 73*ed21d6d7SRemi Bernon { 74*ed21d6d7SRemi Bernon struct stat st; 75*ed21d6d7SRemi Bernon char path_dir[PATH_MAX]; 76*ed21d6d7SRemi Bernon 77*ed21d6d7SRemi Bernon /* First try development tree tests. */ 78*ed21d6d7SRemi Bernon if (!lstat("./tests", &st)) 79*ed21d6d7SRemi Bernon return run_dir("./tests"); 80*ed21d6d7SRemi Bernon 81*ed21d6d7SRemi Bernon /* Then installed path. */ 82*ed21d6d7SRemi Bernon snprintf(path_dir, PATH_MAX, "%s/tests", get_argv_exec_path()); 83*ed21d6d7SRemi Bernon 84*ed21d6d7SRemi Bernon if (!lstat(path_dir, &st)) 85*ed21d6d7SRemi Bernon return run_dir(path_dir); 86*ed21d6d7SRemi Bernon 87*ed21d6d7SRemi Bernon return TEST_SKIP; 88*ed21d6d7SRemi Bernon } 89*ed21d6d7SRemi Bernon 90*ed21d6d7SRemi Bernon #else 91*ed21d6d7SRemi Bernon 92*ed21d6d7SRemi Bernon int test__pe_file_parsing(struct test *test __maybe_unused, 93*ed21d6d7SRemi Bernon int subtest __maybe_unused) 94*ed21d6d7SRemi Bernon { 95*ed21d6d7SRemi Bernon return TEST_SKIP; 96*ed21d6d7SRemi Bernon } 97*ed21d6d7SRemi Bernon 98*ed21d6d7SRemi Bernon #endif 99