cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

relocs_main.c (1553B)


      1// SPDX-License-Identifier: GPL-2.0
      2
      3#include <stdio.h>
      4#include <stdint.h>
      5#include <stdarg.h>
      6#include <stdlib.h>
      7#include <string.h>
      8#include <errno.h>
      9#include <endian.h>
     10#include <elf.h>
     11
     12#include "relocs.h"
     13
     14void die(char *fmt, ...)
     15{
     16	va_list ap;
     17
     18	va_start(ap, fmt);
     19	vfprintf(stderr, fmt, ap);
     20	va_end(ap);
     21	exit(1);
     22}
     23
     24static void usage(void)
     25{
     26	die("relocs [--reloc-info|--text|--bin|--keep] vmlinux\n");
     27}
     28
     29int main(int argc, char **argv)
     30{
     31	int show_reloc_info, as_text, as_bin, keep_relocs;
     32	const char *fname;
     33	FILE *fp;
     34	int i;
     35	unsigned char e_ident[EI_NIDENT];
     36
     37	show_reloc_info = 0;
     38	as_text = 0;
     39	as_bin = 0;
     40	keep_relocs = 0;
     41	fname = NULL;
     42	for (i = 1; i < argc; i++) {
     43		char *arg = argv[i];
     44
     45		if (*arg == '-') {
     46			if (strcmp(arg, "--reloc-info") == 0) {
     47				show_reloc_info = 1;
     48				continue;
     49			}
     50			if (strcmp(arg, "--text") == 0) {
     51				as_text = 1;
     52				continue;
     53			}
     54			if (strcmp(arg, "--bin") == 0) {
     55				as_bin = 1;
     56				continue;
     57			}
     58			if (strcmp(arg, "--keep") == 0) {
     59				keep_relocs = 1;
     60				continue;
     61			}
     62		} else if (!fname) {
     63			fname = arg;
     64			continue;
     65		}
     66		usage();
     67	}
     68	if (!fname)
     69		usage();
     70
     71	fp = fopen(fname, "r+");
     72	if (!fp)
     73		die("Cannot open %s: %s\n", fname, strerror(errno));
     74
     75	if (fread(&e_ident, 1, EI_NIDENT, fp) != EI_NIDENT)
     76		die("Cannot read %s: %s", fname, strerror(errno));
     77
     78	rewind(fp);
     79	if (e_ident[EI_CLASS] == ELFCLASS64)
     80		process_64(fp, as_text,  as_bin, show_reloc_info, keep_relocs);
     81	else
     82		process_32(fp, as_text, as_bin, show_reloc_info, keep_relocs);
     83	fclose(fp);
     84	return 0;
     85}