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 (argc != 2) {
  13                fprintf(stderr, "Error: no arch\n");
  14        }
  15        if (fread(ei, 1, EI_NIDENT, stdin) != EI_NIDENT) {
  16                fprintf(stderr, "Error: input truncated\n");
  17                return 1;
  18        }
  19        if (memcmp(ei, ELFMAG, SELFMAG) != 0) {
  20                fprintf(stderr, "Error: not ELF\n");
  21                return 1;
  22        }
  23        switch (ei[EI_CLASS]) {
  24        case ELFCLASS32:
  25                printf("#define KERNEL_ELFCLASS ELFCLASS32\n");
  26                break;
  27        case ELFCLASS64:
  28                printf("#define KERNEL_ELFCLASS ELFCLASS64\n");
  29                break;
  30        default:
  31                exit(1);
  32        }
  33        switch (ei[EI_DATA]) {
  34        case ELFDATA2LSB:
  35                printf("#define KERNEL_ELFDATA ELFDATA2LSB\n");
  36                break;
  37        case ELFDATA2MSB:
  38                printf("#define KERNEL_ELFDATA ELFDATA2MSB\n");
  39                break;
  40        default:
  41                exit(1);
  42        }
  43
  44        if (sizeof(unsigned long) == 4) {
  45                printf("#define HOST_ELFCLASS ELFCLASS32\n");
  46        } else if (sizeof(unsigned long) == 8) {
  47                printf("#define HOST_ELFCLASS ELFCLASS64\n");
  48        }
  49
  50        endian_test.s = 0x0102;
  51        if (memcmp(endian_test.c, "\x01\x02", 2) == 0)
  52                printf("#define HOST_ELFDATA ELFDATA2MSB\n");
  53        else if (memcmp(endian_test.c, "\x02\x01", 2) == 0)
  54                printf("#define HOST_ELFDATA ELFDATA2LSB\n");
  55        else
  56                exit(1);
  57
  58        if ((strcmp(argv[1], "h8300") == 0)
  59            || (strcmp(argv[1], "blackfin") == 0))
  60                printf("#define MODULE_SYMBOL_PREFIX \"_\"\n");
  61        else
  62                printf("#define MODULE_SYMBOL_PREFIX \"\"\n");
  63
  64        return 0;
  65}
  66
  67