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