18c2ecf20Sopenharmony_ci#include "dso.h" 28c2ecf20Sopenharmony_ci#include "symbol.h" 38c2ecf20Sopenharmony_ci#include "symsrc.h" 48c2ecf20Sopenharmony_ci 58c2ecf20Sopenharmony_ci#include <errno.h> 68c2ecf20Sopenharmony_ci#include <unistd.h> 78c2ecf20Sopenharmony_ci#include <stdio.h> 88c2ecf20Sopenharmony_ci#include <fcntl.h> 98c2ecf20Sopenharmony_ci#include <string.h> 108c2ecf20Sopenharmony_ci#include <stdlib.h> 118c2ecf20Sopenharmony_ci#include <byteswap.h> 128c2ecf20Sopenharmony_ci#include <sys/stat.h> 138c2ecf20Sopenharmony_ci#include <linux/zalloc.h> 148c2ecf20Sopenharmony_ci#include <internal/lib.h> 158c2ecf20Sopenharmony_ci 168c2ecf20Sopenharmony_cistatic bool check_need_swap(int file_endian) 178c2ecf20Sopenharmony_ci{ 188c2ecf20Sopenharmony_ci const int data = 1; 198c2ecf20Sopenharmony_ci u8 *check = (u8 *)&data; 208c2ecf20Sopenharmony_ci int host_endian; 218c2ecf20Sopenharmony_ci 228c2ecf20Sopenharmony_ci if (check[0] == 1) 238c2ecf20Sopenharmony_ci host_endian = ELFDATA2LSB; 248c2ecf20Sopenharmony_ci else 258c2ecf20Sopenharmony_ci host_endian = ELFDATA2MSB; 268c2ecf20Sopenharmony_ci 278c2ecf20Sopenharmony_ci return host_endian != file_endian; 288c2ecf20Sopenharmony_ci} 298c2ecf20Sopenharmony_ci 308c2ecf20Sopenharmony_ci#define NOTE_ALIGN(sz) (((sz) + 3) & ~3) 318c2ecf20Sopenharmony_ci 328c2ecf20Sopenharmony_ci#define NT_GNU_BUILD_ID 3 338c2ecf20Sopenharmony_ci 348c2ecf20Sopenharmony_cistatic int read_build_id(void *note_data, size_t note_len, struct build_id *bid, 358c2ecf20Sopenharmony_ci bool need_swap) 368c2ecf20Sopenharmony_ci{ 378c2ecf20Sopenharmony_ci size_t size = sizeof(bid->data); 388c2ecf20Sopenharmony_ci struct { 398c2ecf20Sopenharmony_ci u32 n_namesz; 408c2ecf20Sopenharmony_ci u32 n_descsz; 418c2ecf20Sopenharmony_ci u32 n_type; 428c2ecf20Sopenharmony_ci } *nhdr; 438c2ecf20Sopenharmony_ci void *ptr; 448c2ecf20Sopenharmony_ci 458c2ecf20Sopenharmony_ci ptr = note_data; 468c2ecf20Sopenharmony_ci while (ptr < (note_data + note_len)) { 478c2ecf20Sopenharmony_ci const char *name; 488c2ecf20Sopenharmony_ci size_t namesz, descsz; 498c2ecf20Sopenharmony_ci 508c2ecf20Sopenharmony_ci nhdr = ptr; 518c2ecf20Sopenharmony_ci if (need_swap) { 528c2ecf20Sopenharmony_ci nhdr->n_namesz = bswap_32(nhdr->n_namesz); 538c2ecf20Sopenharmony_ci nhdr->n_descsz = bswap_32(nhdr->n_descsz); 548c2ecf20Sopenharmony_ci nhdr->n_type = bswap_32(nhdr->n_type); 558c2ecf20Sopenharmony_ci } 568c2ecf20Sopenharmony_ci 578c2ecf20Sopenharmony_ci namesz = NOTE_ALIGN(nhdr->n_namesz); 588c2ecf20Sopenharmony_ci descsz = NOTE_ALIGN(nhdr->n_descsz); 598c2ecf20Sopenharmony_ci 608c2ecf20Sopenharmony_ci ptr += sizeof(*nhdr); 618c2ecf20Sopenharmony_ci name = ptr; 628c2ecf20Sopenharmony_ci ptr += namesz; 638c2ecf20Sopenharmony_ci if (nhdr->n_type == NT_GNU_BUILD_ID && 648c2ecf20Sopenharmony_ci nhdr->n_namesz == sizeof("GNU")) { 658c2ecf20Sopenharmony_ci if (memcmp(name, "GNU", sizeof("GNU")) == 0) { 668c2ecf20Sopenharmony_ci size_t sz = min(size, descsz); 678c2ecf20Sopenharmony_ci memcpy(bid->data, ptr, sz); 688c2ecf20Sopenharmony_ci memset(bid->data + sz, 0, size - sz); 698c2ecf20Sopenharmony_ci bid->size = sz; 708c2ecf20Sopenharmony_ci return 0; 718c2ecf20Sopenharmony_ci } 728c2ecf20Sopenharmony_ci } 738c2ecf20Sopenharmony_ci ptr += descsz; 748c2ecf20Sopenharmony_ci } 758c2ecf20Sopenharmony_ci 768c2ecf20Sopenharmony_ci return -1; 778c2ecf20Sopenharmony_ci} 788c2ecf20Sopenharmony_ci 798c2ecf20Sopenharmony_ciint filename__read_debuglink(const char *filename __maybe_unused, 808c2ecf20Sopenharmony_ci char *debuglink __maybe_unused, 818c2ecf20Sopenharmony_ci size_t size __maybe_unused) 828c2ecf20Sopenharmony_ci{ 838c2ecf20Sopenharmony_ci return -1; 848c2ecf20Sopenharmony_ci} 858c2ecf20Sopenharmony_ci 868c2ecf20Sopenharmony_ci/* 878c2ecf20Sopenharmony_ci * Just try PT_NOTE header otherwise fails 888c2ecf20Sopenharmony_ci */ 898c2ecf20Sopenharmony_ciint filename__read_build_id(const char *filename, struct build_id *bid) 908c2ecf20Sopenharmony_ci{ 918c2ecf20Sopenharmony_ci FILE *fp; 928c2ecf20Sopenharmony_ci int ret = -1; 938c2ecf20Sopenharmony_ci bool need_swap = false; 948c2ecf20Sopenharmony_ci u8 e_ident[EI_NIDENT]; 958c2ecf20Sopenharmony_ci size_t buf_size; 968c2ecf20Sopenharmony_ci void *buf; 978c2ecf20Sopenharmony_ci int i; 988c2ecf20Sopenharmony_ci 998c2ecf20Sopenharmony_ci fp = fopen(filename, "r"); 1008c2ecf20Sopenharmony_ci if (fp == NULL) 1018c2ecf20Sopenharmony_ci return -1; 1028c2ecf20Sopenharmony_ci 1038c2ecf20Sopenharmony_ci if (fread(e_ident, sizeof(e_ident), 1, fp) != 1) 1048c2ecf20Sopenharmony_ci goto out; 1058c2ecf20Sopenharmony_ci 1068c2ecf20Sopenharmony_ci if (memcmp(e_ident, ELFMAG, SELFMAG) || 1078c2ecf20Sopenharmony_ci e_ident[EI_VERSION] != EV_CURRENT) 1088c2ecf20Sopenharmony_ci goto out; 1098c2ecf20Sopenharmony_ci 1108c2ecf20Sopenharmony_ci need_swap = check_need_swap(e_ident[EI_DATA]); 1118c2ecf20Sopenharmony_ci 1128c2ecf20Sopenharmony_ci /* for simplicity */ 1138c2ecf20Sopenharmony_ci fseek(fp, 0, SEEK_SET); 1148c2ecf20Sopenharmony_ci 1158c2ecf20Sopenharmony_ci if (e_ident[EI_CLASS] == ELFCLASS32) { 1168c2ecf20Sopenharmony_ci Elf32_Ehdr ehdr; 1178c2ecf20Sopenharmony_ci Elf32_Phdr *phdr; 1188c2ecf20Sopenharmony_ci 1198c2ecf20Sopenharmony_ci if (fread(&ehdr, sizeof(ehdr), 1, fp) != 1) 1208c2ecf20Sopenharmony_ci goto out; 1218c2ecf20Sopenharmony_ci 1228c2ecf20Sopenharmony_ci if (need_swap) { 1238c2ecf20Sopenharmony_ci ehdr.e_phoff = bswap_32(ehdr.e_phoff); 1248c2ecf20Sopenharmony_ci ehdr.e_phentsize = bswap_16(ehdr.e_phentsize); 1258c2ecf20Sopenharmony_ci ehdr.e_phnum = bswap_16(ehdr.e_phnum); 1268c2ecf20Sopenharmony_ci } 1278c2ecf20Sopenharmony_ci 1288c2ecf20Sopenharmony_ci buf_size = ehdr.e_phentsize * ehdr.e_phnum; 1298c2ecf20Sopenharmony_ci buf = malloc(buf_size); 1308c2ecf20Sopenharmony_ci if (buf == NULL) 1318c2ecf20Sopenharmony_ci goto out; 1328c2ecf20Sopenharmony_ci 1338c2ecf20Sopenharmony_ci fseek(fp, ehdr.e_phoff, SEEK_SET); 1348c2ecf20Sopenharmony_ci if (fread(buf, buf_size, 1, fp) != 1) 1358c2ecf20Sopenharmony_ci goto out_free; 1368c2ecf20Sopenharmony_ci 1378c2ecf20Sopenharmony_ci for (i = 0, phdr = buf; i < ehdr.e_phnum; i++, phdr++) { 1388c2ecf20Sopenharmony_ci void *tmp; 1398c2ecf20Sopenharmony_ci long offset; 1408c2ecf20Sopenharmony_ci 1418c2ecf20Sopenharmony_ci if (need_swap) { 1428c2ecf20Sopenharmony_ci phdr->p_type = bswap_32(phdr->p_type); 1438c2ecf20Sopenharmony_ci phdr->p_offset = bswap_32(phdr->p_offset); 1448c2ecf20Sopenharmony_ci phdr->p_filesz = bswap_32(phdr->p_filesz); 1458c2ecf20Sopenharmony_ci } 1468c2ecf20Sopenharmony_ci 1478c2ecf20Sopenharmony_ci if (phdr->p_type != PT_NOTE) 1488c2ecf20Sopenharmony_ci continue; 1498c2ecf20Sopenharmony_ci 1508c2ecf20Sopenharmony_ci buf_size = phdr->p_filesz; 1518c2ecf20Sopenharmony_ci offset = phdr->p_offset; 1528c2ecf20Sopenharmony_ci tmp = realloc(buf, buf_size); 1538c2ecf20Sopenharmony_ci if (tmp == NULL) 1548c2ecf20Sopenharmony_ci goto out_free; 1558c2ecf20Sopenharmony_ci 1568c2ecf20Sopenharmony_ci buf = tmp; 1578c2ecf20Sopenharmony_ci fseek(fp, offset, SEEK_SET); 1588c2ecf20Sopenharmony_ci if (fread(buf, buf_size, 1, fp) != 1) 1598c2ecf20Sopenharmony_ci goto out_free; 1608c2ecf20Sopenharmony_ci 1618c2ecf20Sopenharmony_ci ret = read_build_id(buf, buf_size, bid, need_swap); 1628c2ecf20Sopenharmony_ci if (ret == 0) 1638c2ecf20Sopenharmony_ci ret = bid->size; 1648c2ecf20Sopenharmony_ci break; 1658c2ecf20Sopenharmony_ci } 1668c2ecf20Sopenharmony_ci } else { 1678c2ecf20Sopenharmony_ci Elf64_Ehdr ehdr; 1688c2ecf20Sopenharmony_ci Elf64_Phdr *phdr; 1698c2ecf20Sopenharmony_ci 1708c2ecf20Sopenharmony_ci if (fread(&ehdr, sizeof(ehdr), 1, fp) != 1) 1718c2ecf20Sopenharmony_ci goto out; 1728c2ecf20Sopenharmony_ci 1738c2ecf20Sopenharmony_ci if (need_swap) { 1748c2ecf20Sopenharmony_ci ehdr.e_phoff = bswap_64(ehdr.e_phoff); 1758c2ecf20Sopenharmony_ci ehdr.e_phentsize = bswap_16(ehdr.e_phentsize); 1768c2ecf20Sopenharmony_ci ehdr.e_phnum = bswap_16(ehdr.e_phnum); 1778c2ecf20Sopenharmony_ci } 1788c2ecf20Sopenharmony_ci 1798c2ecf20Sopenharmony_ci buf_size = ehdr.e_phentsize * ehdr.e_phnum; 1808c2ecf20Sopenharmony_ci buf = malloc(buf_size); 1818c2ecf20Sopenharmony_ci if (buf == NULL) 1828c2ecf20Sopenharmony_ci goto out; 1838c2ecf20Sopenharmony_ci 1848c2ecf20Sopenharmony_ci fseek(fp, ehdr.e_phoff, SEEK_SET); 1858c2ecf20Sopenharmony_ci if (fread(buf, buf_size, 1, fp) != 1) 1868c2ecf20Sopenharmony_ci goto out_free; 1878c2ecf20Sopenharmony_ci 1888c2ecf20Sopenharmony_ci for (i = 0, phdr = buf; i < ehdr.e_phnum; i++, phdr++) { 1898c2ecf20Sopenharmony_ci void *tmp; 1908c2ecf20Sopenharmony_ci long offset; 1918c2ecf20Sopenharmony_ci 1928c2ecf20Sopenharmony_ci if (need_swap) { 1938c2ecf20Sopenharmony_ci phdr->p_type = bswap_32(phdr->p_type); 1948c2ecf20Sopenharmony_ci phdr->p_offset = bswap_64(phdr->p_offset); 1958c2ecf20Sopenharmony_ci phdr->p_filesz = bswap_64(phdr->p_filesz); 1968c2ecf20Sopenharmony_ci } 1978c2ecf20Sopenharmony_ci 1988c2ecf20Sopenharmony_ci if (phdr->p_type != PT_NOTE) 1998c2ecf20Sopenharmony_ci continue; 2008c2ecf20Sopenharmony_ci 2018c2ecf20Sopenharmony_ci buf_size = phdr->p_filesz; 2028c2ecf20Sopenharmony_ci offset = phdr->p_offset; 2038c2ecf20Sopenharmony_ci tmp = realloc(buf, buf_size); 2048c2ecf20Sopenharmony_ci if (tmp == NULL) 2058c2ecf20Sopenharmony_ci goto out_free; 2068c2ecf20Sopenharmony_ci 2078c2ecf20Sopenharmony_ci buf = tmp; 2088c2ecf20Sopenharmony_ci fseek(fp, offset, SEEK_SET); 2098c2ecf20Sopenharmony_ci if (fread(buf, buf_size, 1, fp) != 1) 2108c2ecf20Sopenharmony_ci goto out_free; 2118c2ecf20Sopenharmony_ci 2128c2ecf20Sopenharmony_ci ret = read_build_id(buf, buf_size, bid, need_swap); 2138c2ecf20Sopenharmony_ci if (ret == 0) 2148c2ecf20Sopenharmony_ci ret = bid->size; 2158c2ecf20Sopenharmony_ci break; 2168c2ecf20Sopenharmony_ci } 2178c2ecf20Sopenharmony_ci } 2188c2ecf20Sopenharmony_ciout_free: 2198c2ecf20Sopenharmony_ci free(buf); 2208c2ecf20Sopenharmony_ciout: 2218c2ecf20Sopenharmony_ci fclose(fp); 2228c2ecf20Sopenharmony_ci return ret; 2238c2ecf20Sopenharmony_ci} 2248c2ecf20Sopenharmony_ci 2258c2ecf20Sopenharmony_ciint sysfs__read_build_id(const char *filename, struct build_id *bid) 2268c2ecf20Sopenharmony_ci{ 2278c2ecf20Sopenharmony_ci int fd; 2288c2ecf20Sopenharmony_ci int ret = -1; 2298c2ecf20Sopenharmony_ci struct stat stbuf; 2308c2ecf20Sopenharmony_ci size_t buf_size; 2318c2ecf20Sopenharmony_ci void *buf; 2328c2ecf20Sopenharmony_ci 2338c2ecf20Sopenharmony_ci fd = open(filename, O_RDONLY); 2348c2ecf20Sopenharmony_ci if (fd < 0) 2358c2ecf20Sopenharmony_ci return -1; 2368c2ecf20Sopenharmony_ci 2378c2ecf20Sopenharmony_ci if (fstat(fd, &stbuf) < 0) 2388c2ecf20Sopenharmony_ci goto out; 2398c2ecf20Sopenharmony_ci 2408c2ecf20Sopenharmony_ci buf_size = stbuf.st_size; 2418c2ecf20Sopenharmony_ci buf = malloc(buf_size); 2428c2ecf20Sopenharmony_ci if (buf == NULL) 2438c2ecf20Sopenharmony_ci goto out; 2448c2ecf20Sopenharmony_ci 2458c2ecf20Sopenharmony_ci if (read(fd, buf, buf_size) != (ssize_t) buf_size) 2468c2ecf20Sopenharmony_ci goto out_free; 2478c2ecf20Sopenharmony_ci 2488c2ecf20Sopenharmony_ci ret = read_build_id(buf, buf_size, bid, false); 2498c2ecf20Sopenharmony_ciout_free: 2508c2ecf20Sopenharmony_ci free(buf); 2518c2ecf20Sopenharmony_ciout: 2528c2ecf20Sopenharmony_ci close(fd); 2538c2ecf20Sopenharmony_ci return ret; 2548c2ecf20Sopenharmony_ci} 2558c2ecf20Sopenharmony_ci 2568c2ecf20Sopenharmony_ciint symsrc__init(struct symsrc *ss, struct dso *dso, const char *name, 2578c2ecf20Sopenharmony_ci enum dso_binary_type type) 2588c2ecf20Sopenharmony_ci{ 2598c2ecf20Sopenharmony_ci int fd = open(name, O_RDONLY); 2608c2ecf20Sopenharmony_ci if (fd < 0) 2618c2ecf20Sopenharmony_ci goto out_errno; 2628c2ecf20Sopenharmony_ci 2638c2ecf20Sopenharmony_ci ss->name = strdup(name); 2648c2ecf20Sopenharmony_ci if (!ss->name) 2658c2ecf20Sopenharmony_ci goto out_close; 2668c2ecf20Sopenharmony_ci 2678c2ecf20Sopenharmony_ci ss->fd = fd; 2688c2ecf20Sopenharmony_ci ss->type = type; 2698c2ecf20Sopenharmony_ci 2708c2ecf20Sopenharmony_ci return 0; 2718c2ecf20Sopenharmony_ciout_close: 2728c2ecf20Sopenharmony_ci close(fd); 2738c2ecf20Sopenharmony_ciout_errno: 2748c2ecf20Sopenharmony_ci dso->load_errno = errno; 2758c2ecf20Sopenharmony_ci return -1; 2768c2ecf20Sopenharmony_ci} 2778c2ecf20Sopenharmony_ci 2788c2ecf20Sopenharmony_cibool symsrc__possibly_runtime(struct symsrc *ss __maybe_unused) 2798c2ecf20Sopenharmony_ci{ 2808c2ecf20Sopenharmony_ci /* Assume all sym sources could be a runtime image. */ 2818c2ecf20Sopenharmony_ci return true; 2828c2ecf20Sopenharmony_ci} 2838c2ecf20Sopenharmony_ci 2848c2ecf20Sopenharmony_cibool symsrc__has_symtab(struct symsrc *ss __maybe_unused) 2858c2ecf20Sopenharmony_ci{ 2868c2ecf20Sopenharmony_ci return false; 2878c2ecf20Sopenharmony_ci} 2888c2ecf20Sopenharmony_ci 2898c2ecf20Sopenharmony_civoid symsrc__destroy(struct symsrc *ss) 2908c2ecf20Sopenharmony_ci{ 2918c2ecf20Sopenharmony_ci zfree(&ss->name); 2928c2ecf20Sopenharmony_ci close(ss->fd); 2938c2ecf20Sopenharmony_ci} 2948c2ecf20Sopenharmony_ci 2958c2ecf20Sopenharmony_ciint dso__synthesize_plt_symbols(struct dso *dso __maybe_unused, 2968c2ecf20Sopenharmony_ci struct symsrc *ss __maybe_unused) 2978c2ecf20Sopenharmony_ci{ 2988c2ecf20Sopenharmony_ci return 0; 2998c2ecf20Sopenharmony_ci} 3008c2ecf20Sopenharmony_ci 3018c2ecf20Sopenharmony_cistatic int fd__is_64_bit(int fd) 3028c2ecf20Sopenharmony_ci{ 3038c2ecf20Sopenharmony_ci u8 e_ident[EI_NIDENT]; 3048c2ecf20Sopenharmony_ci 3058c2ecf20Sopenharmony_ci if (lseek(fd, 0, SEEK_SET)) 3068c2ecf20Sopenharmony_ci return -1; 3078c2ecf20Sopenharmony_ci 3088c2ecf20Sopenharmony_ci if (readn(fd, e_ident, sizeof(e_ident)) != sizeof(e_ident)) 3098c2ecf20Sopenharmony_ci return -1; 3108c2ecf20Sopenharmony_ci 3118c2ecf20Sopenharmony_ci if (memcmp(e_ident, ELFMAG, SELFMAG) || 3128c2ecf20Sopenharmony_ci e_ident[EI_VERSION] != EV_CURRENT) 3138c2ecf20Sopenharmony_ci return -1; 3148c2ecf20Sopenharmony_ci 3158c2ecf20Sopenharmony_ci return e_ident[EI_CLASS] == ELFCLASS64; 3168c2ecf20Sopenharmony_ci} 3178c2ecf20Sopenharmony_ci 3188c2ecf20Sopenharmony_cienum dso_type dso__type_fd(int fd) 3198c2ecf20Sopenharmony_ci{ 3208c2ecf20Sopenharmony_ci Elf64_Ehdr ehdr; 3218c2ecf20Sopenharmony_ci int ret; 3228c2ecf20Sopenharmony_ci 3238c2ecf20Sopenharmony_ci ret = fd__is_64_bit(fd); 3248c2ecf20Sopenharmony_ci if (ret < 0) 3258c2ecf20Sopenharmony_ci return DSO__TYPE_UNKNOWN; 3268c2ecf20Sopenharmony_ci 3278c2ecf20Sopenharmony_ci if (ret) 3288c2ecf20Sopenharmony_ci return DSO__TYPE_64BIT; 3298c2ecf20Sopenharmony_ci 3308c2ecf20Sopenharmony_ci if (readn(fd, &ehdr, sizeof(ehdr)) != sizeof(ehdr)) 3318c2ecf20Sopenharmony_ci return DSO__TYPE_UNKNOWN; 3328c2ecf20Sopenharmony_ci 3338c2ecf20Sopenharmony_ci if (ehdr.e_machine == EM_X86_64) 3348c2ecf20Sopenharmony_ci return DSO__TYPE_X32BIT; 3358c2ecf20Sopenharmony_ci 3368c2ecf20Sopenharmony_ci return DSO__TYPE_32BIT; 3378c2ecf20Sopenharmony_ci} 3388c2ecf20Sopenharmony_ci 3398c2ecf20Sopenharmony_ciint dso__load_sym(struct dso *dso, struct map *map __maybe_unused, 3408c2ecf20Sopenharmony_ci struct symsrc *ss, 3418c2ecf20Sopenharmony_ci struct symsrc *runtime_ss __maybe_unused, 3428c2ecf20Sopenharmony_ci int kmodule __maybe_unused) 3438c2ecf20Sopenharmony_ci{ 3448c2ecf20Sopenharmony_ci struct build_id bid; 3458c2ecf20Sopenharmony_ci int ret; 3468c2ecf20Sopenharmony_ci 3478c2ecf20Sopenharmony_ci ret = fd__is_64_bit(ss->fd); 3488c2ecf20Sopenharmony_ci if (ret >= 0) 3498c2ecf20Sopenharmony_ci dso->is_64_bit = ret; 3508c2ecf20Sopenharmony_ci 3518c2ecf20Sopenharmony_ci if (filename__read_build_id(ss->name, &bid) > 0) 3528c2ecf20Sopenharmony_ci dso__set_build_id(dso, &bid); 3538c2ecf20Sopenharmony_ci return 0; 3548c2ecf20Sopenharmony_ci} 3558c2ecf20Sopenharmony_ci 3568c2ecf20Sopenharmony_ciint file__read_maps(int fd __maybe_unused, bool exe __maybe_unused, 3578c2ecf20Sopenharmony_ci mapfn_t mapfn __maybe_unused, void *data __maybe_unused, 3588c2ecf20Sopenharmony_ci bool *is_64_bit __maybe_unused) 3598c2ecf20Sopenharmony_ci{ 3608c2ecf20Sopenharmony_ci return -1; 3618c2ecf20Sopenharmony_ci} 3628c2ecf20Sopenharmony_ci 3638c2ecf20Sopenharmony_ciint kcore_extract__create(struct kcore_extract *kce __maybe_unused) 3648c2ecf20Sopenharmony_ci{ 3658c2ecf20Sopenharmony_ci return -1; 3668c2ecf20Sopenharmony_ci} 3678c2ecf20Sopenharmony_ci 3688c2ecf20Sopenharmony_civoid kcore_extract__delete(struct kcore_extract *kce __maybe_unused) 3698c2ecf20Sopenharmony_ci{ 3708c2ecf20Sopenharmony_ci} 3718c2ecf20Sopenharmony_ci 3728c2ecf20Sopenharmony_ciint kcore_copy(const char *from_dir __maybe_unused, 3738c2ecf20Sopenharmony_ci const char *to_dir __maybe_unused) 3748c2ecf20Sopenharmony_ci{ 3758c2ecf20Sopenharmony_ci return -1; 3768c2ecf20Sopenharmony_ci} 3778c2ecf20Sopenharmony_ci 3788c2ecf20Sopenharmony_civoid symbol__elf_init(void) 3798c2ecf20Sopenharmony_ci{ 3808c2ecf20Sopenharmony_ci} 3818c2ecf20Sopenharmony_ci 3828c2ecf20Sopenharmony_cichar *dso__demangle_sym(struct dso *dso __maybe_unused, 3838c2ecf20Sopenharmony_ci int kmodule __maybe_unused, 3848c2ecf20Sopenharmony_ci const char *elf_name __maybe_unused) 3858c2ecf20Sopenharmony_ci{ 3868c2ecf20Sopenharmony_ci return NULL; 3878c2ecf20Sopenharmony_ci} 388