90 lines · c
1/* SPDX-License-Identifier: GPL-2.0 */2#ifndef __GENELF_H__3#define __GENELF_H__4 5#include <linux/math.h>6 7/* genelf.c */8int jit_write_elf(int fd, uint64_t code_addr, const char *sym,9 const void *code, int csize, void *debug, int nr_debug_entries,10 void *unwinding, uint64_t unwinding_header_size, uint64_t unwinding_size);11#ifdef HAVE_DWARF_SUPPORT12/* genelf_debug.c */13int jit_add_debug_info(Elf *e, uint64_t code_addr, void *debug, int nr_debug_entries);14#endif15 16#if defined(__arm__)17#define GEN_ELF_ARCH EM_ARM18#define GEN_ELF_CLASS ELFCLASS3219#elif defined(__aarch64__)20#define GEN_ELF_ARCH EM_AARCH6421#define GEN_ELF_CLASS ELFCLASS6422#elif defined(__x86_64__)23#define GEN_ELF_ARCH EM_X86_6424#define GEN_ELF_CLASS ELFCLASS6425#elif defined(__i386__)26#define GEN_ELF_ARCH EM_38627#define GEN_ELF_CLASS ELFCLASS3228#elif defined(__powerpc64__)29#define GEN_ELF_ARCH EM_PPC6430#define GEN_ELF_CLASS ELFCLASS6431#elif defined(__powerpc__)32#define GEN_ELF_ARCH EM_PPC33#define GEN_ELF_CLASS ELFCLASS3234#elif defined(__sparc__) && defined(__arch64__)35#define GEN_ELF_ARCH EM_SPARCV936#define GEN_ELF_CLASS ELFCLASS6437#elif defined(__sparc__)38#define GEN_ELF_ARCH EM_SPARC39#define GEN_ELF_CLASS ELFCLASS3240#elif defined(__s390x__)41#define GEN_ELF_ARCH EM_S39042#define GEN_ELF_CLASS ELFCLASS6443#elif defined(__riscv) && __riscv_xlen == 6444#define GEN_ELF_ARCH EM_RISCV45#define GEN_ELF_CLASS ELFCLASS6446#elif defined(__riscv) && __riscv_xlen == 3247#define GEN_ELF_ARCH EM_RISCV48#define GEN_ELF_CLASS ELFCLASS3249#elif defined(__loongarch__)50#define GEN_ELF_ARCH EM_LOONGARCH51#define GEN_ELF_CLASS ELFCLASS6452#else53#error "unsupported architecture"54#endif55 56#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__57#define GEN_ELF_ENDIAN ELFDATA2MSB58#else59#define GEN_ELF_ENDIAN ELFDATA2LSB60#endif61 62#if GEN_ELF_CLASS == ELFCLASS6463#define elf_newehdr elf64_newehdr64#define elf_newphdr elf64_newphdr65#define elf_getshdr elf64_getshdr66#define Elf_Ehdr Elf64_Ehdr67#define Elf_Phdr Elf64_Phdr68#define Elf_Shdr Elf64_Shdr69#define Elf_Sym Elf64_Sym70#define ELF_ST_TYPE(a) ELF64_ST_TYPE(a)71#define ELF_ST_BIND(a) ELF64_ST_BIND(a)72#define ELF_ST_VIS(a) ELF64_ST_VISIBILITY(a)73#else74#define elf_newehdr elf32_newehdr75#define elf_newphdr elf32_newphdr76#define elf_getshdr elf32_getshdr77#define Elf_Ehdr Elf32_Ehdr78#define Elf_Phdr Elf32_Phdr79#define Elf_Shdr Elf32_Shdr80#define Elf_Sym Elf32_Sym81#define ELF_ST_TYPE(a) ELF32_ST_TYPE(a)82#define ELF_ST_BIND(a) ELF32_ST_BIND(a)83#define ELF_ST_VIS(a) ELF32_ST_VISIBILITY(a)84#endif85 86/* The .text section is directly after the ELF header */87#define GEN_ELF_TEXT_OFFSET round_up(sizeof(Elf_Ehdr) + sizeof(Elf_Phdr), 16)88 89#endif90