Blame view
tools/prelink-riscv.c
2.34 KB
83d290c56 SPDX: Convert all... |
1 |
// SPDX-License-Identifier: GPL-2.0+ |
42ac26f2b riscv: tools: Pre... |
2 3 4 5 |
/* * Copyright (C) 2017 Andes Technology * Chih-Mao Chen <cmchen@andestech.com> * |
42ac26f2b riscv: tools: Pre... |
6 7 8 9 |
* Statically process runtime relocations on RISC-V ELF images * so that it can be directly executed when loaded at LMA * without fixup. Both RV32 and RV64 are supported. */ |
42ac26f2b riscv: tools: Pre... |
10 11 12 13 14 15 16 17 18 19 20 21 22 |
#include <errno.h> #include <stdbool.h> #include <stdint.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <elf.h> #include <fcntl.h> #include <sys/mman.h> #include <sys/stat.h> #include <sys/types.h> #include <unistd.h> |
e604410d3 riscv: tools: Fix... |
23 |
#include <compiler.h> |
42ac26f2b riscv: tools: Pre... |
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
#ifndef EM_RISCV #define EM_RISCV 243 #endif #ifndef R_RISCV_32 #define R_RISCV_32 1 #endif #ifndef R_RISCV_64 #define R_RISCV_64 2 #endif #ifndef R_RISCV_RELATIVE #define R_RISCV_RELATIVE 3 #endif const char *argv0; #define die(fmt, ...) \ do { \ fprintf(stderr, "%s: " fmt " ", argv0, ## __VA_ARGS__); \ exit(EXIT_FAILURE); \ } while (0) |
4539926a9 riscv: tools: Add... |
49 |
#define PRELINK_BYTEORDER le |
42ac26f2b riscv: tools: Pre... |
50 51 |
#define PRELINK_INC_BITS 32 #include "prelink-riscv.inc" |
4539926a9 riscv: tools: Add... |
52 |
#undef PRELINK_BYTEORDER |
42ac26f2b riscv: tools: Pre... |
53 |
#undef PRELINK_INC_BITS |
4539926a9 riscv: tools: Add... |
54 |
#define PRELINK_BYTEORDER le |
42ac26f2b riscv: tools: Pre... |
55 56 |
#define PRELINK_INC_BITS 64 #include "prelink-riscv.inc" |
4539926a9 riscv: tools: Add... |
57 58 59 60 61 62 63 64 65 66 67 68 69 |
#undef PRELINK_BYTEORDER #undef PRELINK_INC_BITS #define PRELINK_BYTEORDER be #define PRELINK_INC_BITS 32 #include "prelink-riscv.inc" #undef PRELINK_BYTEORDER #undef PRELINK_INC_BITS #define PRELINK_BYTEORDER be #define PRELINK_INC_BITS 64 #include "prelink-riscv.inc" #undef PRELINK_BYTEORDER |
42ac26f2b riscv: tools: Pre... |
70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 |
#undef PRELINK_INC_BITS int main(int argc, const char *const *argv) { argv0 = argv[0]; if (argc < 2) { fprintf(stderr, "Usage: %s <u-boot> ", argv0); exit(EXIT_FAILURE); } int fd = open(argv[1], O_RDWR, 0); if (fd < 0) die("Cannot open %s: %s", argv[1], strerror(errno)); struct stat st; if (fstat(fd, &st) < 0) die("Cannot stat %s: %s", argv[1], strerror(errno)); void *data = mmap(0, st.st_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); if (data == MAP_FAILED) die("Cannot mmap %s: %s", argv[1], strerror(errno)); close(fd); unsigned char *e_ident = (unsigned char *)data; if (memcmp(e_ident, ELFMAG, SELFMAG) != 0) die("Invalid ELF file %s", argv[1]); bool is64 = e_ident[EI_CLASS] == ELFCLASS64; |
4539926a9 riscv: tools: Add... |
106 107 108 109 110 111 112 113 114 115 116 117 118 |
bool isbe = e_ident[EI_DATA] == ELFDATA2MSB; if (is64) { if (isbe) prelink_be64(data); else prelink_le64(data); } else { if (isbe) prelink_be32(data); else prelink_le32(data); } |
42ac26f2b riscv: tools: Pre... |
119 120 121 |
return 0; } |