linux/scripts/mod/mk_elfconfig.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2#include <stdio.h>
   3#include <stdlib.h>
   4#include <string.h>
   5#include <elf.h>
   6
   7int
   8main(int argc, char **argv)
   9{
  10        unsigned char ei[EI_NIDENT];
  11        union { short s; char c[2]; } endian_test;
  12
  13        if (fread(ei, 1, EI_NIDENT, stdin) != EI_NIDENT) {
  14                fprintf(stderr, "Error: input truncated\n");
  15                return 1;
  16        }
  17        if (memcmp(ei, ELFMAG, SELFMAG) != 0) {
  18                fprintf(stderr, "Error: not ELF\n");
  19                return 1;
  20        }
  21        switch (ei[EI_CLASS]) {
  22        case ELFCLASS32:
  23                printf("#define KERNEL_ELFCLASS ELFCLASS32\n");
  24                break;
  25        case ELFCLASS64:
  26                printf("#define KERNEL_ELFCLASS ELFCLASS64\n");
  27                break;
  28        default:
  29                exit(1);
  30        }
  31        switch (ei[EI_DATA]) {
  32        case ELFDATA2LSB:
  33                printf("#define KERNEL_ELFDATA ELFDATA2LSB\n");
  34                break;
  35        case ELFDATA2MSB:
  36                printf("#define KERNEL_ELFDATA ELFDATA2MSB\n");
  37                break;
  38        default:
  39                exit(1);
  40        }
  41
  42        if (sizeof(unsigned long) == 4) {
  43                printf("#define HOST_ELFCLASS ELFCLASS32\n");
  44        } else if (sizeof(unsigned long) == 8) {
  45                printf("#define HOST_ELFCLASS ELFCLASS64\n");
  46        }
  47
  48        endian_test.s = 0x0102;
  49        if (memcmp(endian_test.c, "\x01\x02", 2) == 0)
  50                printf("#define HOST_ELFDATA ELFDATA2MSB\n");
  51        else if (memcmp(endian_test.c, "\x02\x01", 2) == 0)
  52                printf("#define HOST_ELFDATA ELFDATA2LSB\n");
  53        else
  54                exit(1);
  55
  56        return 0;
  57}
  58