mk_elfconfig.c 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <elf.h>
  5. int
  6. main(int argc, char **argv)
  7. {
  8. unsigned char ei[EI_NIDENT];
  9. union { short s; char c[2]; } endian_test;
  10. if (argc != 2) {
  11. fprintf(stderr, "Error: no arch\n");
  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. 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. endian_test.s = 0x0102;
  47. if (memcmp(endian_test.c, "\x01\x02", 2) == 0)
  48. printf("#define HOST_ELFDATA ELFDATA2MSB\n");
  49. else if (memcmp(endian_test.c, "\x02\x01", 2) == 0)
  50. printf("#define HOST_ELFDATA ELFDATA2LSB\n");
  51. else
  52. exit(1);
  53. if ((strcmp(argv[1], "h8300") == 0)
  54. || (strcmp(argv[1], "blackfin") == 0))
  55. printf("#define MODULE_SYMBOL_PREFIX \"_\"\n");
  56. else
  57. printf("#define MODULE_SYMBOL_PREFIX \"\"\n");
  58. return 0;
  59. }