mkelf.c 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdint.h>
  4. #define EI_NIDENT 16
  5. typedef uint16_t Elf32_Half;
  6. typedef uint32_t Elf32_Word;
  7. typedef uint32_t Elf32_Addr;
  8. typedef uint32_t Elf32_Off;
  9. typedef struct {
  10. unsigned char e_ident[EI_NIDENT];
  11. Elf32_Half e_type;
  12. Elf32_Half e_machine;
  13. Elf32_Word e_version;
  14. Elf32_Addr e_entry;
  15. Elf32_Off e_phoff;
  16. Elf32_Off e_shoff;
  17. Elf32_Word e_flags;
  18. Elf32_Half e_ehsize;
  19. Elf32_Half e_phentsize;
  20. Elf32_Half e_phnum;
  21. Elf32_Half e_shentsize;
  22. Elf32_Half e_shnum;
  23. Elf32_Half e_shstrndx;
  24. } Elf32_Ehdr;
  25. #define ELFCLASS32 1
  26. #define ELFCLASS64 2
  27. #define ELFDATA2LSB 1
  28. #define ELFDATA2MSB 2
  29. #define EV_CURRENT 1
  30. #define ELFOSABI_LINUX 3
  31. #define ET_REL 1
  32. #define ET_EXEC 2
  33. #define EM_NONE 0
  34. #define EM_X86_64 62
  35. #define EV_CURRENT 1
  36. void print_elf(Elf32_Ehdr hdr);
  37. void main(int argc, char **argv) {
  38. Elf32_Ehdr hdr;
  39. hdr.e_ident[0] = 0x7f;
  40. hdr.e_ident[1] = 'E';
  41. hdr.e_ident[2] = 'L';
  42. hdr.e_ident[3] = 'F';
  43. // class
  44. hdr.e_ident[4] = ELFCLASS32;
  45. // data
  46. hdr.e_ident[5] = ELFDATA2LSB;
  47. // version
  48. hdr.e_ident[6] = EV_CURRENT;
  49. // osabi
  50. hdr.e_ident[7] = ELFOSABI_LINUX;
  51. // abiversion
  52. hdr.e_ident[8] = 0;
  53. // pad
  54. hdr.e_ident[9] = 0;
  55. hdr.e_type = ET_EXEC;
  56. hdr.e_machine = EM_NONE;
  57. hdr.e_version = EV_CURRENT;
  58. print_elf(hdr);
  59. }
  60. void octet(unsigned char c) {
  61. printf("%02x", c);
  62. }
  63. void oct2(uint16_t c) {
  64. printf("%02x %02x", c&0xFF, (c>>8)&0xFF);
  65. }
  66. void print_elf(Elf32_Ehdr hdr) {
  67. int i;
  68. for(i = 0; i < EI_NIDENT; i++) {
  69. octet(hdr.e_ident[i]);
  70. if(i != EI_NIDENT-1)
  71. printf(" ");
  72. }
  73. puts(" # e_ident");
  74. oct2(hdr.e_type);
  75. puts(" # e_type");
  76. oct2(hdr.e_machine);
  77. puts(" # e_machine");
  78. oct2(hdr.e_version);
  79. puts(" # e_version");
  80. /* Elf32_Addr e_entry; */
  81. /* Elf32_Off e_phoff; */
  82. /* Elf32_Off e_shoff; */
  83. /* Elf32_Word e_flags; */
  84. /* Elf32_Half e_ehsize; */
  85. /* Elf32_Half e_phentsize; */
  86. /* Elf32_Half e_phnum; */
  87. /* Elf32_Half e_shentsize; */
  88. /* Elf32_Half e_shnum; */
  89. /* Elf32_Half e_shstrndx; */
  90. }