mk_elfconfig.c 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  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], "v850") == 0) || (strcmp(argv[1], "h8300") == 0))
  54. printf("#define MODULE_SYMBOL_PREFIX \"_\"\n");
  55. else
  56. printf("#define MODULE_SYMBOL_PREFIX \"\"\n");
  57. return 0;
  58. }