#include #include #include #include #include /* First Elf_Data buffer for section .foo (ELF_T_WORD, align 4) */ uint32_t hash_words[] = { 0x01234567, 0x89abcdef, 0xdeadc0de }; /* Second Elf_Data buffer for section .foo (ELF_T_BYTE, align 1) */ char data_string[] = "helloworld"; /* Third Elf_Data buffer for section .foo (ELF_T_WORD, align 4) */ uint32_t checksum[] = { 0xffffeeee }; char string_table[] = { /* Offset 0 */ '\0', /* Offset 1 */ '.', 'f' ,'o', 'o', '\0', /* Offset 6 */ '.', 's' , 'h' , 's' , 't', 'r', 't', 'a', 'b', '\0' }; int main(int argc, char **argv) { Elf *e; Elf_Scn *scn; Elf_Data *data, *data1, *data2, *data3; Elf32_Ehdr *ehdr; Elf32_Phdr *phdr; Elf32_Shdr *shdr; int fd; if (argc != 2) { fprintf(stderr, "usage: %s: file\n", argv[0]); exit(1); } if ((fd = open(argv[1], O_CREAT | O_WRONLY | O_TRUNC, 0644)) < 0) { fprintf(stderr, "open %s failed\n", argv[1]); exit(1); } if (elf_version(EV_CURRENT) == EV_NONE) { fprintf(stderr, "elf_version failed\n"); exit(1); } if ((e = elf_begin(fd, ELF_C_WRITE, NULL)) == NULL) { fprintf(stderr, "elf_begin failed\n"); exit(1); } if ((ehdr = elf32_newehdr(e)) == NULL) { fprintf(stderr, "elf32_newehdr failed\n"); exit(1); } ehdr->e_ident[EI_DATA] = ELFDATA2MSB; ehdr->e_machine = EM_386; ehdr->e_type = ET_REL; /* * Create .foo section (which has three Elf_Data buffer) */ if ((scn = elf_newscn(e)) == NULL) { fprintf(stderr, "elf_newscn failed\n"); exit(1); } if ((data1 = elf_newdata(scn)) == NULL) { fprintf(stderr, "elf_newdata failed\n"); exit(1); } data1->d_align = 4; data1->d_off = 0; data1->d_buf = hash_words; /* Elf_Data elftype != section elftype. */ data1->d_type = ELF_T_WORD; data1->d_size = sizeof(hash_words); data1->d_version = EV_CURRENT; if ((data2 = elf_newdata(scn)) == NULL) { fprintf(stderr, "elf_newdata failed\n"); exit(1); } data2->d_align = 1; data2->d_off = 0; data2->d_buf = data_string; data2->d_type = ELF_T_BYTE; data2->d_size = sizeof(data_string); data2->d_version = EV_CURRENT; if ((data3 = elf_newdata(scn)) == NULL) { fprintf(stderr, "elf_newdata failed\n"); exit(1); } data3->d_align = 4; data3->d_off = 0; data3->d_buf = checksum; /* Elf_Data elftype != section elftype. */ data3->d_type = ELF_T_WORD; data3->d_size = sizeof(checksum); data3->d_version = EV_CURRENT; if ((shdr = elf32_getshdr(scn)) == NULL) { fprintf(stderr, "elf32_getshdr failed\n"); exit(1); } shdr->sh_name = 1; shdr->sh_type = SHT_PROGBITS; /* section elftype is ELF_T_BYTE */ shdr->sh_flags = SHF_ALLOC; shdr->sh_entsize = 0; shdr->sh_addralign = 4; /* Set .foo section alignment to 4. */ /* * Create .shstrtab section. */ if ((scn = elf_newscn(e)) == NULL) { fprintf(stderr, "elf_newscn failed\n"); exit(1); } if ((data = elf_newdata(scn)) == NULL) { fprintf(stderr, "elf_newdata failed\n"); exit(1); } data->d_align = 1; data->d_off = 0; data->d_buf = string_table; data->d_type = ELF_T_BYTE; data->d_size = sizeof(string_table); data->d_version = EV_CURRENT; if ((shdr = elf32_getshdr(scn)) == NULL) { fprintf(stderr, "elf32_getshdr failed\n"); exit(1); } shdr->sh_name = 6; shdr->sh_type = SHT_STRTAB; shdr->sh_flags = SHF_STRINGS | SHF_ALLOC; shdr->sh_entsize = 0; ehdr->e_shstrndx = elf_ndxscn(scn); /* * Write out the ELF object. */ if (elf_update(e, ELF_C_WRITE) < 0) { fprintf(stderr, "elf_update failed: %s\n", elf_errmsg(elf_errno())); exit(1); } elf_end(e); close(fd); exit(0); }