^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * genelf.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * Copyright (C) 2014, Google, Inc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * Contributed by:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * Stephane Eranian <eranian@gmail.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <sys/types.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <stddef.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <libelf.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <string.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <stdlib.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <unistd.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <inttypes.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include <fcntl.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #include <err.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #ifdef HAVE_DWARF_SUPPORT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #include <dwarf.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #include "genelf.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #include "../util/jitdump.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #include <linux/compiler.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #ifndef NT_GNU_BUILD_ID
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #define NT_GNU_BUILD_ID 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #define BUILD_ID_URANDOM /* different uuid for each run */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #ifdef HAVE_LIBCRYPTO
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #define BUILD_ID_MD5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) #undef BUILD_ID_SHA /* does not seem to work well when linked with Java */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) #undef BUILD_ID_URANDOM /* different uuid for each run */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) #ifdef BUILD_ID_SHA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) #include <openssl/sha.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) #ifdef BUILD_ID_MD5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) #include <openssl/md5.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) typedef struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) unsigned int namesz; /* Size of entry's owner string */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) unsigned int descsz; /* Size of the note descriptor */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) unsigned int type; /* Interpretation of the descriptor */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) char name[0]; /* Start of the name+desc data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) } Elf_Note;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) struct options {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) char *output;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) int fd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) static char shd_string_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) '.', 't', 'e', 'x', 't', 0, /* 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) '.', 's', 'h', 's', 't', 'r', 't', 'a', 'b', 0, /* 7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) '.', 's', 'y', 'm', 't', 'a', 'b', 0, /* 17 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) '.', 's', 't', 'r', 't', 'a', 'b', 0, /* 25 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) '.', 'n', 'o', 't', 'e', '.', 'g', 'n', 'u', '.', 'b', 'u', 'i', 'l', 'd', '-', 'i', 'd', 0, /* 33 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) '.', 'd', 'e', 'b', 'u', 'g', '_', 'l', 'i', 'n', 'e', 0, /* 52 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) '.', 'd', 'e', 'b', 'u', 'g', '_', 'i', 'n', 'f', 'o', 0, /* 64 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) '.', 'd', 'e', 'b', 'u', 'g', '_', 'a', 'b', 'b', 'r', 'e', 'v', 0, /* 76 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) '.', 'e', 'h', '_', 'f', 'r', 'a', 'm', 'e', '_', 'h', 'd', 'r', 0, /* 90 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) '.', 'e', 'h', '_', 'f', 'r', 'a', 'm', 'e', 0, /* 104 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) static struct buildid_note {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) Elf_Note desc; /* descsz: size of build-id, must be multiple of 4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) char name[4]; /* GNU\0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) char build_id[20];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) } bnote;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) static Elf_Sym symtab[]={
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) /* symbol 0 MUST be the undefined symbol */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) { .st_name = 0, /* index in sym_string table */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) .st_info = ELF_ST_TYPE(STT_NOTYPE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) .st_shndx = 0, /* for now */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) .st_value = 0x0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) .st_other = ELF_ST_VIS(STV_DEFAULT),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) .st_size = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) { .st_name = 1, /* index in sym_string table */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) .st_info = ELF_ST_BIND(STB_LOCAL) | ELF_ST_TYPE(STT_FUNC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) .st_shndx = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) .st_value = 0, /* for now */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) .st_other = ELF_ST_VIS(STV_DEFAULT),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) .st_size = 0, /* for now */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) #ifdef BUILD_ID_URANDOM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) gen_build_id(struct buildid_note *note,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) unsigned long load_addr __maybe_unused,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) const void *code __maybe_unused,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) size_t csize __maybe_unused)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) int fd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) size_t sz = sizeof(note->build_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) ssize_t sret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) fd = open("/dev/urandom", O_RDONLY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) if (fd == -1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) err(1, "cannot access /dev/urandom for buildid");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) sret = read(fd, note->build_id, sz);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) close(fd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) if (sret != (ssize_t)sz)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) memset(note->build_id, 0, sz);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) #ifdef BUILD_ID_SHA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) gen_build_id(struct buildid_note *note,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) unsigned long load_addr __maybe_unused,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) const void *code,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) size_t csize)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) if (sizeof(note->build_id) < SHA_DIGEST_LENGTH)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) errx(1, "build_id too small for SHA1");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) SHA1(code, csize, (unsigned char *)note->build_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) #ifdef BUILD_ID_MD5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) gen_build_id(struct buildid_note *note, unsigned long load_addr, const void *code, size_t csize)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) MD5_CTX context;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) if (sizeof(note->build_id) < 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) errx(1, "build_id too small for MD5");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) MD5_Init(&context);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) MD5_Update(&context, &load_addr, sizeof(load_addr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) MD5_Update(&context, code, csize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) MD5_Final((unsigned char *)note->build_id, &context);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) jit_add_eh_frame_info(Elf *e, void* unwinding, uint64_t unwinding_header_size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) uint64_t unwinding_size, uint64_t base_offset)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) Elf_Data *d;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) Elf_Scn *scn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) Elf_Shdr *shdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) uint64_t unwinding_table_size = unwinding_size - unwinding_header_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) * setup eh_frame section
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) scn = elf_newscn(e);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) if (!scn) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) warnx("cannot create section");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) d = elf_newdata(scn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) if (!d) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) warnx("cannot get new data");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) d->d_align = 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) d->d_off = 0LL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) d->d_buf = unwinding;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) d->d_type = ELF_T_BYTE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) d->d_size = unwinding_table_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) d->d_version = EV_CURRENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) shdr = elf_getshdr(scn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) if (!shdr) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) warnx("cannot get section header");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) shdr->sh_name = 104;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) shdr->sh_type = SHT_PROGBITS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) shdr->sh_addr = base_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) shdr->sh_flags = SHF_ALLOC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) shdr->sh_entsize = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) * setup eh_frame_hdr section
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) scn = elf_newscn(e);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) if (!scn) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) warnx("cannot create section");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) d = elf_newdata(scn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) if (!d) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) warnx("cannot get new data");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) d->d_align = 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) d->d_off = 0LL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) d->d_buf = unwinding + unwinding_table_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) d->d_type = ELF_T_BYTE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) d->d_size = unwinding_header_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) d->d_version = EV_CURRENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) shdr = elf_getshdr(scn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) if (!shdr) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) warnx("cannot get section header");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) shdr->sh_name = 90;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) shdr->sh_type = SHT_PROGBITS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) shdr->sh_addr = base_offset + unwinding_table_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) shdr->sh_flags = SHF_ALLOC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) shdr->sh_entsize = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) * fd: file descriptor open for writing for the output file
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) * load_addr: code load address (could be zero, just used for buildid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) * sym: function name (for native code - used as the symbol)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) * code: the native code
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) * csize: the code size in bytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) jit_write_elf(int fd, uint64_t load_addr, const char *sym,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) const void *code, int csize,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) void *debug __maybe_unused, int nr_debug_entries __maybe_unused,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) void *unwinding, uint64_t unwinding_header_size, uint64_t unwinding_size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) Elf *e;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) Elf_Data *d;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) Elf_Scn *scn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) Elf_Ehdr *ehdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) Elf_Shdr *shdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) uint64_t eh_frame_base_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) char *strsym = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) int symlen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) int retval = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) if (elf_version(EV_CURRENT) == EV_NONE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) warnx("ELF initialization failed");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) e = elf_begin(fd, ELF_C_WRITE, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) if (!e) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) warnx("elf_begin failed");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) * setup ELF header
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) ehdr = elf_newehdr(e);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) if (!ehdr) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) warnx("cannot get ehdr");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) ehdr->e_ident[EI_DATA] = GEN_ELF_ENDIAN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) ehdr->e_ident[EI_CLASS] = GEN_ELF_CLASS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) ehdr->e_machine = GEN_ELF_ARCH;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) ehdr->e_type = ET_DYN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) ehdr->e_entry = GEN_ELF_TEXT_OFFSET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) ehdr->e_version = EV_CURRENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) ehdr->e_shstrndx= unwinding ? 4 : 2; /* shdr index for section name */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) * setup text section
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) scn = elf_newscn(e);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) if (!scn) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) warnx("cannot create section");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) d = elf_newdata(scn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) if (!d) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) warnx("cannot get new data");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) d->d_align = 16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) d->d_off = 0LL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) d->d_buf = (void *)code;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) d->d_type = ELF_T_BYTE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) d->d_size = csize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) d->d_version = EV_CURRENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) shdr = elf_getshdr(scn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) if (!shdr) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) warnx("cannot get section header");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) shdr->sh_name = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) shdr->sh_type = SHT_PROGBITS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) shdr->sh_addr = GEN_ELF_TEXT_OFFSET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) shdr->sh_flags = SHF_EXECINSTR | SHF_ALLOC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) shdr->sh_entsize = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) * Setup .eh_frame_hdr and .eh_frame
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) if (unwinding) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) eh_frame_base_offset = ALIGN_8(GEN_ELF_TEXT_OFFSET + csize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) retval = jit_add_eh_frame_info(e, unwinding,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) unwinding_header_size, unwinding_size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) eh_frame_base_offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) if (retval)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) * setup section headers string table
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) scn = elf_newscn(e);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) if (!scn) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) warnx("cannot create section");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) d = elf_newdata(scn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) if (!d) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) warnx("cannot get new data");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) d->d_align = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) d->d_off = 0LL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) d->d_buf = shd_string_table;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) d->d_type = ELF_T_BYTE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) d->d_size = sizeof(shd_string_table);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) d->d_version = EV_CURRENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) shdr = elf_getshdr(scn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) if (!shdr) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) warnx("cannot get section header");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) shdr->sh_name = 7; /* offset of '.shstrtab' in shd_string_table */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) shdr->sh_type = SHT_STRTAB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) shdr->sh_flags = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) shdr->sh_entsize = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) * setup symtab section
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) symtab[1].st_size = csize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) symtab[1].st_value = GEN_ELF_TEXT_OFFSET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) scn = elf_newscn(e);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) if (!scn) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) warnx("cannot create section");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) d = elf_newdata(scn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) if (!d) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) warnx("cannot get new data");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) d->d_align = 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) d->d_off = 0LL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) d->d_buf = symtab;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) d->d_type = ELF_T_SYM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) d->d_size = sizeof(symtab);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) d->d_version = EV_CURRENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) shdr = elf_getshdr(scn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) if (!shdr) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) warnx("cannot get section header");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) shdr->sh_name = 17; /* offset of '.symtab' in shd_string_table */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) shdr->sh_type = SHT_SYMTAB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) shdr->sh_flags = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) shdr->sh_entsize = sizeof(Elf_Sym);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) shdr->sh_link = unwinding ? 6 : 4; /* index of .strtab section */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) * setup symbols string table
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) * 2 = 1 for 0 in 1st entry, 1 for the 0 at end of symbol for 2nd entry
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) symlen = 2 + strlen(sym);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) strsym = calloc(1, symlen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) if (!strsym) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) warnx("cannot allocate strsym");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) strcpy(strsym + 1, sym);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) scn = elf_newscn(e);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) if (!scn) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) warnx("cannot create section");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) d = elf_newdata(scn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) if (!d) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) warnx("cannot get new data");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) d->d_align = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) d->d_off = 0LL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) d->d_buf = strsym;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) d->d_type = ELF_T_BYTE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) d->d_size = symlen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) d->d_version = EV_CURRENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) shdr = elf_getshdr(scn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) if (!shdr) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) warnx("cannot get section header");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) shdr->sh_name = 25; /* offset in shd_string_table */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) shdr->sh_type = SHT_STRTAB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) shdr->sh_flags = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) shdr->sh_entsize = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) * setup build-id section
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) scn = elf_newscn(e);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) if (!scn) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) warnx("cannot create section");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) d = elf_newdata(scn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) if (!d) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) warnx("cannot get new data");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) * build-id generation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) gen_build_id(&bnote, load_addr, code, csize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) bnote.desc.namesz = sizeof(bnote.name); /* must include 0 termination */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) bnote.desc.descsz = sizeof(bnote.build_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) bnote.desc.type = NT_GNU_BUILD_ID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) strcpy(bnote.name, "GNU");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) d->d_align = 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) d->d_off = 0LL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) d->d_buf = &bnote;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) d->d_type = ELF_T_BYTE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) d->d_size = sizeof(bnote);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) d->d_version = EV_CURRENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) shdr = elf_getshdr(scn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) if (!shdr) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) warnx("cannot get section header");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) shdr->sh_name = 33; /* offset in shd_string_table */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) shdr->sh_type = SHT_NOTE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) shdr->sh_addr = 0x0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) shdr->sh_flags = SHF_ALLOC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) shdr->sh_size = sizeof(bnote);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) shdr->sh_entsize = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) #ifdef HAVE_DWARF_SUPPORT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) if (debug && nr_debug_entries) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) retval = jit_add_debug_info(e, load_addr, debug, nr_debug_entries);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) if (retval)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) } else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) if (elf_update(e, ELF_C_WRITE) < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) warnx("elf_update 4 failed");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) retval = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) (void)elf_end(e);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) free(strsym);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) return retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) }