diff --git a/Makefile b/Makefile index 4e750c714..6b9d7da7d 100644 --- a/Makefile +++ b/Makefile @@ -64,7 +64,6 @@ OBJS += cr-dump.o OBJS += cr-restore.o OBJS += cr-show.o OBJS += util.o -OBJS += elf.o OBJS += seize.o OBJS += restorer.o @@ -89,7 +88,6 @@ $(HEAD-BIN): $(OBJS-BLOB) $(HEAD-LDS) %.bin: %.o $(E) " GEN " $@ $(Q) $(LD) -T $(patsubst %.bin,%.lds.S,$@) $< -o $@ - $(Q) $(LD) -T $(patsubst %.bin,%-elf.lds.S,$@) $< -o $@.o $(HEAD-BLOB-GEN): $(HEAD-BIN) $(DEPS-BLOB) $(HEAD-BLOB): $(DEPS-BLOB) $(HEAD-BIN) @@ -135,7 +133,6 @@ clean: $(Q) $(RM) -f ./*.o $(Q) $(RM) -f ./*.d $(Q) $(RM) -f ./*.img - $(Q) $(RM) -f ./*.elf $(Q) $(RM) -f ./*.out $(Q) $(RM) -f ./*.bin $(Q) $(RM) -f ./tags diff --git a/cr-restore.c b/cr-restore.c index 6ae5a0a7d..84a85e22e 100644 --- a/cr-restore.c +++ b/cr-restore.c @@ -827,7 +827,7 @@ static int prepare_image_maps(int fd, int pid) static int prepare_and_execute_image(int pid) { - char path[128], elf_path[128]; + char path[128]; int fd, fd_new; struct stat buf; @@ -851,10 +851,7 @@ static int prepare_and_execute_image(int pid) return 1; } - sprintf(elf_path, "core-%d.elf", pid); - unlink(elf_path); - - pr_info("%d: Preparing execution image %s (%li bytes)\n", pid, path, buf.st_size); + pr_info("%d: Preparing restore image %s (%li bytes)\n", pid, path, buf.st_size); if (sendfile(fd_new, fd, NULL, buf.st_size) != buf.st_size) { pr_perror("sendfile failed\n"); return 1; @@ -876,16 +873,10 @@ static int prepare_and_execute_image(int pid) if (prepare_image_maps(fd_new, pid)) return 1; + close(fd_new); sigreturn_restore(pstree_pid, pid); - if (convert_to_elf(elf_path, fd_new)) - return 1; - - sync(); - close(fd_new); - - pr_info("%d/%d EXEC ELF-IMAGE\n", pid, getpid()); - return execl(elf_path, elf_path, NULL); + return 0; } static int create_pipe(int pid, struct pipe_entry *e, struct pipe_info *pi, int pipes_fd) diff --git a/elf.c b/elf.c deleted file mode 100644 index 4cd61f98c..000000000 --- a/elf.c +++ /dev/null @@ -1,218 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include -#include -#include -#include -#include -#include -#include - -#include - -#include "types.h" -#include "list.h" - -#include "compiler.h" -#include "crtools.h" -#include "syscall.h" -#include "util.h" - -#include "image.h" -#include "elf.h" - -#define ELF_MAX_PHDR ((65536U / sizeof(Elf64_Phdr)) - 1) -#define ELF_MAX_PAGES ((1 << 30) / PAGE_IMAGE_SIZE) - -/* - * Convert the c/r core file into elf - * executable, the kernel will handle it. - */ -int convert_to_elf(char *elf_path, int fd_core) -{ - Elf64_Ehdr elf_ehdr; - Elf64_Phdr elf_phdr; - - Elf64_Half e_phnum = 0; - Elf64_Addr e_entry = 0; - - struct page_entry page_entry; - unsigned long nrpages = 0; - struct core_entry *core = NULL; - struct vma_area area; - struct vma_entry vma; - u64 va; - - unsigned long phoff = 0; - unsigned long phoff_regs, phoff_pages; - - int fd_elf; - int ret = -1; - - core = xzalloc(sizeof(*core)); - if (!core) - goto err; - - fd_elf = open(elf_path, O_RDWR | O_CREAT | O_EXCL, 0700); - if (fd_elf < 0) { - pr_perror("Can't open %s\n", elf_path); - goto err; - } - - memset(&elf_ehdr, 0, sizeof(elf_ehdr)); - memset(&area, 0, sizeof(area)); - - memcpy(elf_ehdr.e_ident, ELFMAG, SELFMAG); - elf_ehdr.e_ident[EI_CLASS] = ELFCLASS64; - elf_ehdr.e_ident[EI_DATA] = ELFDATA2LSB; - elf_ehdr.e_ident[EI_VERSION] = EV_CURRENT; - - elf_ehdr.e_type = ET_CKPT; - elf_ehdr.e_machine = EM_X86_64; - elf_ehdr.e_version = EV_CURRENT; - elf_ehdr.e_phoff = sizeof(elf_ehdr); - elf_ehdr.e_ehsize = sizeof(elf_ehdr); - elf_ehdr.e_phentsize = sizeof(Elf64_Phdr); - - /* Get EP */ - lseek(fd_core, MAGIC_OFFSET, SEEK_SET); - read_ptr_safe(fd_core, core, err_close); - - /* - * Count the numbers of segments. Each segment - * is the VMA record with appropriate permissions. - * Then we need one big segment which would hold - * all the pages dumped. - */ - lseek(fd_core, GET_FILE_OFF_AFTER(struct core_entry), SEEK_SET); - while(1) { - read_ptr_safe(fd_core, &vma, err_close); - if (vma.start == 0 && vma.end == 0) - break; - e_phnum++; - } - - while (1) { - read_ptr_safe(fd_core, &va, err_close); - nrpages++; - if (va == 0) - break; - lseek(fd_core, PAGE_SIZE, SEEK_CUR); - } - - /* Figure out if we're overflowed */ - if (e_phnum > ELF_MAX_PHDR) { - pr_err("Too many VMA areas (%li of %li allowed)\n", - e_phnum, ELF_MAX_PHDR); - goto err_close; - } else if (nrpages > ELF_MAX_PAGES) { - pr_err("Too many pages to restore (%li of %li allowed)\n", - nrpages, ELF_MAX_PAGES); - goto err_close; - } - - /* - * We can write elf header now. - */ - lseek(fd_elf, 0, SEEK_SET); - elf_ehdr.e_phnum = e_phnum + 2; - elf_ehdr.e_entry = core->u.arch.gpregs.ip; - write_ptr_safe(fd_elf, &elf_ehdr, err_close); - - /* Offset in file (after all headers) */ - phoff = elf_ehdr.e_phnum * sizeof(elf_phdr) + sizeof(elf_ehdr); - - /* VMAs to headers */ - e_phnum = 0; - lseek(fd_core, GET_FILE_OFF_AFTER(struct core_entry), SEEK_SET); - while(1) { - read_ptr_safe(fd_core, &vma, err_close); - if (vma.start == 0 && vma.end == 0) - break; - - memset(&elf_phdr, 0, sizeof(elf_phdr)); - - elf_phdr.p_type = PT_CKPT_VMA; - elf_phdr.p_offset = phoff; - elf_phdr.p_vaddr = vma.start; - elf_phdr.p_paddr = vma.start; - elf_phdr.p_filesz = sizeof(vma); - elf_phdr.p_memsz = vma.end - vma.start; - elf_phdr.p_align = 0x1000; - - if (vma.prot & PROT_READ) - elf_phdr.p_flags |= PF_R; - if (vma.prot & PROT_WRITE) - elf_phdr.p_flags |= PF_W; - if (vma.prot & PROT_EXEC) - elf_phdr.p_flags |= PF_X; - - write_ptr_safe(fd_elf, &elf_phdr, err_close); - - phoff += sizeof(vma); - } - - /* The binfmt header */ - memset(&elf_phdr, 0, sizeof(elf_phdr)); - - elf_phdr.p_type = PT_CKPT_CORE; - elf_phdr.p_flags = PF_R; - elf_phdr.p_offset = phoff; - elf_phdr.p_vaddr = 0; - elf_phdr.p_filesz = sizeof(*core); - elf_phdr.p_memsz = sizeof(*core); - elf_phdr.p_align = 0x1000; - - write_ptr_safe(fd_elf, &elf_phdr, err_close); - - phoff += sizeof(*core); - - /* The pages and binfmt header */ - memset(&elf_phdr, 0, sizeof(elf_phdr)); - - elf_phdr.p_type = PT_CKPT_PAGES; - elf_phdr.p_flags = PF_R; - elf_phdr.p_offset = phoff; - elf_phdr.p_vaddr = 0; - elf_phdr.p_filesz = nrpages * (sizeof(page_entry)); - elf_phdr.p_memsz = nrpages * (sizeof(page_entry)); - elf_phdr.p_align = 0x1000; - - write_ptr_safe(fd_elf, &elf_phdr, err_close); - - /* Now write real contents for program segments */ - lseek(fd_core, GET_FILE_OFF_AFTER(struct core_entry), SEEK_SET); - while(1) { - read_ptr_safe(fd_core, &vma, err_close); - if (vma.start == 0 && vma.end == 0) - break; - area.vma = vma, pr_info_vma(&area); - write_ptr_safe(fd_elf, &vma, err_close); - } - - write_ptr_safe(fd_elf, core, err_close); - - if (sendfile(fd_elf, fd_core, NULL, nrpages * (sizeof(page_entry))) != - nrpages * (sizeof(page_entry))) { - pr_perror("Can't send %li bytes to elf\n", - (long)(nrpages * (sizeof(page_entry)))); - goto err; - } - - ret = 0; - -err_close: - close(fd_elf); -err: - xfree(core); - return ret; -} diff --git a/include/elf.h b/include/elf.h deleted file mode 100644 index 96c992d63..000000000 --- a/include/elf.h +++ /dev/null @@ -1,507 +0,0 @@ -#ifndef CR_ELF_H -#define CR_ELF_H - -#include "types.h" - -/* Segment types */ -#define PT_NULL 0 -#define PT_LOAD 1 -#define PT_DYNAMIC 2 -#define PT_INTERP 3 -#define PT_NOTE 4 -#define PT_SHLIB 5 -#define PT_PHDR 6 -#define PT_TLS 7 -#define PT_LOOS 0x60000000 -#define PT_HIOS 0x6fffffff -#define PT_LOPROC 0x70000000 -#define PT_HIPROC 0x7fffffff -#define PT_GNU_EH_FRAME 0x6474e550 - -#define PT_CKPT_OFFSET 0x01010101 - -#define PT_CKPT_VMA (PT_LOOS + PT_CKPT_OFFSET + 1) -#define PT_CKPT_CORE (PT_LOOS + PT_CKPT_OFFSET + 2) -#define PT_CKPT_PAGES (PT_LOOS + PT_CKPT_OFFSET + 3) - -/* ELF file types */ -#define ET_NONE 0 -#define ET_REL 1 -#define ET_EXEC 2 -#define ET_DYN 3 -#define ET_CORE 4 -#define ET_CKPT 5 -#define ET_LOPROC 0xff00 -#define ET_HIPROC 0xffff - -/* ELF machine types */ -#define EM_NONE 0 -#define EM_M32 1 -#define EM_SPARC 2 -#define EM_386 3 -#define EM_68K 4 -#define EM_88K 5 -#define EM_486 6 /* Not used in Linux at least */ -#define EM_860 7 -#define EM_MIPS 8 /* R3k, bigendian(?) */ -#define EM_MIPS_RS4_BE 10 /* R4k BE */ -#define EM_PARISC 15 -#define EM_SPARC32PLUS 18 -#define EM_PPC 20 -#define EM_PPC64 21 -#define EM_S390 22 -#define EM_SH 42 -#define EM_SPARCV9 43 /* v9 = SPARC64 */ -#define EM_H8_300H 47 -#define EM_H8S 48 -#define EM_IA_64 50 -#define EM_X86_64 62 -#define EM_CRIS 76 -#define EM_V850 87 -#define EM_ALPHA 0x9026 /* Interrim Alpha that stuck around */ -#define EM_CYGNUS_V850 0x9080 /* Old v850 ID used by Cygnus */ -#define EM_S390_OLD 0xA390 /* Obsolete interrim value for S/390 */ - -/* Dynamic type values */ -#define DT_NULL 0 -#define DT_NEEDED 1 -#define DT_PLTRELSZ 2 -#define DT_PLTGOT 3 -#define DT_HASH 4 -#define DT_STRTAB 5 -#define DT_SYMTAB 6 -#define DT_RELA 7 -#define DT_RELASZ 8 -#define DT_RELAENT 9 -#define DT_STRSZ 10 -#define DT_SYMENT 11 -#define DT_INIT 12 -#define DT_FINI 13 -#define DT_SONAME 14 -#define DT_RPATH 15 -#define DT_SYMBOLIC 16 -#define DT_REL 17 -#define DT_RELSZ 18 -#define DT_RELENT 19 -#define DT_PLTREL 20 -#define DT_DEBUG 21 -#define DT_TEXTREL 22 -#define DT_JMPREL 23 -#define DT_LOPROC 0x70000000 -#define DT_HIPROC 0x7fffffff - -/* Auxilliary table entries */ -#define AT_NULL 0 /* end of vector */ -#define AT_IGNORE 1 /* entry should be ignored */ -#define AT_EXECFD 2 /* file descriptor of program */ -#define AT_PHDR 3 /* program headers for program */ -#define AT_PHENT 4 /* size of program header entry */ -#define AT_PHNUM 5 /* number of program headers */ -#define AT_PAGESZ 6 /* system page size */ -#define AT_BASE 7 /* base address of interpreter */ -#define AT_FLAGS 8 /* flags */ -#define AT_ENTRY 9 /* entry point of program */ -#define AT_NOTELF 10 /* program is not ELF */ -#define AT_UID 11 /* real uid */ -#define AT_EUID 12 /* effective uid */ -#define AT_GID 13 /* real gid */ -#define AT_EGID 14 /* effective gid */ -#define AT_PLATFORM 15 /* string identifying CPU for optimizations */ -#define AT_HWCAP 16 /* arch dependent hints at CPU capabilities */ -#define AT_CLKTCK 17 /* frequency at which times() increments */ -/* 18..22 = ? */ -#define AT_SECURE 23 /* secure mode boolean */ - -/* Program header permission flags */ -#define PF_X 0x1 -#define PF_W 0x2 -#define PF_R 0x4 - -/* Section header types */ -#define SHT_NULL 0 -#define SHT_PROGBITS 1 -#define SHT_SYMTAB 2 -#define SHT_STRTAB 3 -#define SHT_RELA 4 -#define SHT_HASH 5 -#define SHT_DYNAMIC 6 -#define SHT_NOTE 7 -#define SHT_NOBITS 8 -#define SHT_REL 9 -#define SHT_SHLIB 10 -#define SHT_DYNSYM 11 -#define SHT_NUM 12 -#define SHT_LOPROC 0x70000000 -#define SHT_HIPROC 0x7fffffff -#define SHT_LOUSER 0x80000000 -#define SHT_HIUSER 0xffffffff - -/* Section header flags */ -#define SHF_WRITE (1 << 0) /* Writable */ -#define SHF_ALLOC (1 << 1) /* Occupies memory during execution */ -#define SHF_EXECINSTR (1 << 2) /* Executable */ -#define SHF_MERGE (1 << 4) /* Might be merged */ -#define SHF_STRINGS (1 << 5) /* Contains nul-terminated strings */ -#define SHF_INFO_LINK (1 << 6) /* `sh_info' contains SHT index */ -#define SHF_LINK_ORDER (1 << 7) /* Preserve order after combining */ -#define SHF_OS_NONCONFORMING (1 << 8) /* Non-standard OS specific handling required */ -#define SHF_GROUP (1 << 9) /* Section is member of a group. */ -#define SHF_TLS (1 << 10) /* Section hold thread-local data. */ - -/* Special section numbers */ -#define SHN_UNDEF 0 -#define SHN_LORESERVE 0xff00 -#define SHN_LOPROC 0xff00 -#define SHN_HIPROC 0xff1f -#define SHN_ABS 0xfff1 -#define SHN_COMMON 0xfff2 -#define SHN_HIRESERVE 0xffff - -/* Section align flag */ -#define SHA_ANY 1 /* No alignment constraint */ - -/* Lenght of magic at the start of a file */ -#define EI_NIDENT 16 - -/* Magic number constants... */ -#define EI_MAG0 0 /* e_ident[] indexes */ -#define EI_MAG1 1 -#define EI_MAG2 2 -#define EI_MAG3 3 -#define EI_CLASS 4 -#define EI_DATA 5 -#define EI_VERSION 6 -#define EI_OSABI 7 -#define EI_PAD 8 - -#define ELFMAG0 0x7f /* EI_MAG */ -#define ELFMAG1 'E' -#define ELFMAG2 'L' -#define ELFMAG3 'F' -#define ELFMAG "\177ELF" -#define SELFMAG 4 - -#define ELFCLASSNONE 0 /* EI_CLASS */ -#define ELFCLASS32 1 -#define ELFCLASS64 2 -#define ELFCLASSNUM 3 - -#define ELFDATANONE 0 /* e_ident[EI_DATA] */ -#define ELFDATA2LSB 1 -#define ELFDATA2MSB 2 - -#define EV_NONE 0 /* e_version, EI_VERSION */ -#define EV_CURRENT 1 -#define EV_NUM 2 - -#define ELFOSABI_NONE 0 -#define ELFOSABI_LINUX 3 - -/* Legal values for ST_BIND subfield of st_info (symbol binding). */ -#define STB_LOCAL 0 /* Local symbol */ -#define STB_GLOBAL 1 /* Global symbol */ -#define STB_WEAK 2 /* Weak symbol */ -#define STB_NUM 3 /* Number of defined types. */ -#define STB_LOOS 10 /* Start of OS-specific */ -#define STB_HIOS 12 /* End of OS-specific */ -#define STB_LOPROC 13 /* Start of processor-specific */ -#define STB_HIPROC 15 /* End of processor-specific */ - -/* Symbol types */ -#define STT_NOTYPE 0 /* Symbol type is unspecified */ -#define STT_OBJECT 1 /* Symbol is a data object */ -#define STT_FUNC 2 /* Symbol is a code object */ -#define STT_SECTION 3 /* Symbol associated with a section */ -#define STT_FILE 4 /* Symbol's name is file name */ -#define STT_COMMON 5 /* Symbol is a common data object */ -#define STT_TLS 6 /* Symbol is thread-local data object */ -#define STT_NUM 7 /* Number of defined types. */ - -/* Symbol visibilities */ -#define STV_DEFAULT 0 /* Default symbol visibility rules */ -#define STV_INTERNAL 1 /* Processor specific hidden class */ -#define STV_HIDDEN 2 /* Sym unavailable in other modules */ -#define STV_PROTECTED 3 /* Not preemptible, not exported */ - -/* Both Elf32_Sym and Elf64_Sym use the same one-byte st_info field */ -#define ELF32_ST_BIND(i) ((i) >> 4) -#define ELF32_ST_MKBIND(i) ((i) << 4) /* just a helper */ -#define ELF32_ST_TYPE(i) ((i) & 0xf) -#define ELF32_ST_INFO(b, i) (ELF_ST_MKBIND(b) + ELF_ST_TYPE(i)) - -#define ELF64_ST_BIND(i) ELF32_ST_BIND(i) -#define ELF64_ST_MKBIND(i) ELF32_ST_MKBIND(i) -#define ELF64_ST_TYPE(i) ELF32_ST_TYPE(i) -#define ELF64_ST_INFO(b, i) ELF32_ST_INFO(b, i) - -/* - * ELF standard typedefs (yet more proof that was way overdue) - */ - -typedef u16 Elf32_Half; -typedef s16 Elf32_SHalf; -typedef u32 Elf32_Word; -typedef s32 Elf32_Sword; -typedef u64 Elf32_Xword; -typedef s64 Elf32_Sxword; - -typedef u32 Elf32_Off; -typedef u32 Elf32_Addr; -typedef u16 Elf32_Section; - -typedef u16 Elf64_Half; -typedef s16 Elf64_SHalf; -typedef u32 Elf64_Word; -typedef s32 Elf64_Sword; -typedef u64 Elf64_Xword; -typedef s64 Elf64_Sxword; - -typedef u64 Elf64_Off; -typedef u64 Elf64_Addr; -typedef u16 Elf64_Section; - -/* - * Dynamic header - */ - -typedef struct elf32_dyn { - Elf32_Sword d_tag; - union { - Elf32_Sword d_val; - Elf32_Addr d_ptr; - } d_un; -} Elf32_Dyn; - -typedef struct elf64_dyn { - Elf64_Sxword d_tag; - union { - Elf64_Xword d_val; - Elf64_Addr d_ptr; - } d_un; -} Elf64_Dyn; - -/* - * Relocations - */ - -#define ELF32_R_SYM(x) ((x) >> 8) -#define ELF32_R_TYPE(x) ((x) & 0xff) - -typedef struct elf32_rel { - Elf32_Addr r_offset; - Elf32_Word r_info; -} Elf32_Rel; - -typedef struct elf32_rela { - Elf32_Addr r_offset; - Elf32_Word r_info; - Elf32_Sword r_addend; -} Elf32_Rela; - -enum reloc32_type { - R_386_32 = 1, /* ordinary absolute relocation */ - R_386_PC32 = 2, /* PC-relative relocation */ - R_386_GOT32 = 3, /* an offset into GOT */ - R_386_PLT32 = 4, /* a PC-relative offset into PLT */ - R_386_COPY = 5, /* ??? */ - R_386_GLOB_DAT = 6, /* ??? */ - R_386_JUMP_SLOT = 7, /* ??? */ - R_386_RELATIVE = 8, /* ??? */ - R_386_GOTOFF = 9, /* an offset from GOT base */ - R_386_GOTPC = 10, /* a PC-relative offset _to_ GOT */ - R_386_TLS_TPOFF = 14, /* Offset in static TLS block */ - R_386_TLS_IE = 15, /* Address of GOT entry for static TLS block offset */ - - /* These are GNU extensions, but useful */ - R_386_16 = 20, /* A 16-bit absolute relocation */ - R_386_PC16 = 21, /* A 16-bit PC-relative relocation */ - R_386_8 = 22, /* An 8-bit absolute relocation */ - R_386_PC8 = 23 /* An 8-bit PC-relative relocation */ -}; - -#define ELF64_R_SYM(x) ((x) >> 32) -#define ELF64_R_TYPE(x) ((x) & 0xffffffff) - -typedef struct elf64_rel { - Elf64_Addr r_offset; - Elf64_Xword r_info; -} Elf64_Rel; - -typedef struct elf64_rela { - Elf64_Addr r_offset; - Elf64_Xword r_info; - Elf64_Sxword r_addend; -} Elf64_Rela; - -enum reloc64_type { - R_X86_64_NONE = 0, /* No reloc */ - R_X86_64_64 = 1, /* Direct 64 bit */ - R_X86_64_PC32 = 2, /* PC relative 32 bit signed */ - R_X86_64_GOT32 = 3, /* 32 bit GOT entry */ - R_X86_64_PLT32 = 4, /* 32 bit PLT address */ - R_X86_64_COPY = 5, /* Copy symbol at runtime */ - R_X86_64_GLOB_DAT = 6, /* Create GOT entry */ - R_X86_64_JUMP_SLOT = 7, /* Create PLT entry */ - R_X86_64_RELATIVE = 8, /* Adjust by program base */ - R_X86_64_GOTPCREL = 9, /* 32 bit signed PC relative offset to GOT */ - R_X86_64_32 = 10, /* Direct 32 bit zero extended */ - R_X86_64_32S = 11, /* Direct 32 bit sign extended */ - R_X86_64_16 = 12, /* Direct 16 bit zero extended */ - R_X86_64_PC16 = 13, /* 16 bit sign extended pc relative */ - R_X86_64_8 = 14, /* Direct 8 bit sign extended */ - R_X86_64_PC8 = 15, /* 8 bit sign extended pc relative */ - R_X86_64_DTPMOD64 = 16, /* ID of module containing symbol */ - R_X86_64_DTPOFF64 = 17, /* Offset in module's TLS block */ - R_X86_64_TPOFF64 = 18, /* Offset in initial TLS block */ - R_X86_64_TLSGD = 19, /* 32 bit signed PC relative offset to two GOT entries for GD symbol */ - R_X86_64_TLSLD = 20, /* 32 bit signed PC relative offset to two GOT entries for LD symbol */ - R_X86_64_DTPOFF32 = 21, /* Offset in TLS block */ - R_X86_64_GOTTPOFF = 22, /* 32 bit signed PC relative offset to GOT entry for IE symbol */ - R_X86_64_TPOFF32 = 23, /* Offset in initial TLS block */ - R_X86_64_PC64 = 24, /* word64 S + A - P */ - R_X86_64_GOTOFF64 = 25, /* word64 S + A - GOT */ - R_X86_64_GOTPC32 = 26, /* word32 GOT + A - P */ - R_X86_64_GOT64 = 27, /* word64 G + A */ - R_X86_64_GOTPCREL64 = 28,/* word64 G + GOT - P + A */ - R_X86_64_GOTPC64 = 29, /* word64 GOT - P + A */ - R_X86_64_GOTPLT64 = 30, /* word64 G + A */ - R_X86_64_PLTOFF64 = 31, /* word64 L - GOT + A */ - R_X86_64_SIZE32 = 32, /* word32 Z + A */ - R_X86_64_SIZE64 = 33, /* word64 Z + A */ - R_X86_64_GOTPC32_TLSDESC = 34, /* word32 */ - R_X86_64_TLSDESC_CALL = 35, /* none */ - R_X86_64_TLSDESC = 36 /* word64?2 */ -}; - -/* - * Symbol - */ - -typedef struct elf32_sym { - Elf32_Word st_name; - Elf32_Addr st_value; - Elf32_Word st_size; - unsigned char st_info; - unsigned char st_other; - Elf32_Half st_shndx; -} Elf32_Sym; - -typedef struct elf64_sym { - Elf64_Word st_name; - unsigned char st_info; - unsigned char st_other; - Elf64_Half st_shndx; - Elf64_Addr st_value; - Elf64_Xword st_size; -} Elf64_Sym; - -/* - * Main file header - */ - -typedef struct elf32_hdr { - unsigned char e_ident[EI_NIDENT]; - Elf32_Half e_type; - Elf32_Half e_machine; - Elf32_Word e_version; - Elf32_Addr e_entry; - Elf32_Off e_phoff; - Elf32_Off e_shoff; - Elf32_Word e_flags; - Elf32_Half e_ehsize; - Elf32_Half e_phentsize; - Elf32_Half e_phnum; - Elf32_Half e_shentsize; - Elf32_Half e_shnum; - Elf32_Half e_shstrndx; -} Elf32_Ehdr; - -typedef struct elf64_hdr { - unsigned char e_ident[EI_NIDENT]; - Elf64_Half e_type; - Elf64_Half e_machine; - Elf64_Word e_version; - Elf64_Addr e_entry; - Elf64_Off e_phoff; - Elf64_Off e_shoff; - Elf64_Word e_flags; - Elf64_Half e_ehsize; - Elf64_Half e_phentsize; - Elf64_Half e_phnum; - Elf64_Half e_shentsize; - Elf64_Half e_shnum; - Elf64_Half e_shstrndx; -} Elf64_Ehdr; - -/* - * Program header - */ - -typedef struct elf32_phdr { - Elf32_Word p_type; - Elf32_Off p_offset; - Elf32_Addr p_vaddr; - Elf32_Addr p_paddr; - Elf32_Word p_filesz; - Elf32_Word p_memsz; - Elf32_Word p_flags; - Elf32_Word p_align; -} Elf32_Phdr; - -typedef struct elf64_phdr { - Elf64_Word p_type; - Elf64_Word p_flags; - Elf64_Off p_offset; - Elf64_Addr p_vaddr; - Elf64_Addr p_paddr; - Elf64_Xword p_filesz; - Elf64_Xword p_memsz; - Elf64_Xword p_align; -} Elf64_Phdr; - -/* - * Section headers. - */ - -typedef struct elf32_shdr { - Elf32_Word sh_name; - Elf32_Word sh_type; - Elf32_Word sh_flags; - Elf32_Addr sh_addr; - Elf32_Off sh_offset; - Elf32_Word sh_size; - Elf32_Word sh_link; - Elf32_Word sh_info; - Elf32_Word sh_addralign; - Elf32_Word sh_entsize; -} Elf32_Shdr; - -typedef struct elf64_shdr { - Elf64_Word sh_name; - Elf64_Word sh_type; - Elf64_Xword sh_flags; - Elf64_Addr sh_addr; - Elf64_Off sh_offset; - Elf64_Xword sh_size; - Elf64_Word sh_link; - Elf64_Word sh_info; - Elf64_Xword sh_addralign; - Elf64_Xword sh_entsize; -} Elf64_Shdr; - -/* - * Note header - */ -typedef struct elf32_note { - Elf32_Word n_namesz; /* Name size */ - Elf32_Word n_descsz; /* Content size */ - Elf32_Word n_type; /* Content type */ -} Elf32_Nhdr; - -typedef struct elf64_note { - Elf64_Word n_namesz; /* Name size */ - Elf64_Word n_descsz; /* Content size */ - Elf64_Word n_type; /* Content type */ -} Elf64_Nhdr; - -#endif /* CR_ELF_H */ diff --git a/parasite-elf.lds.S b/parasite-elf.lds.S deleted file mode 100644 index 83e0b40dd..000000000 --- a/parasite-elf.lds.S +++ /dev/null @@ -1,19 +0,0 @@ -OUTPUT_FORMAT("elf64-x86-64", "elf64-x86-64", "elf64-x86-64") -OUTPUT_ARCH(i386:x86-64) - -SECTIONS -{ - . = 0; - .text : { - *(.parasite.head.text) - *(.text) - . = ALIGN(8); - } - .data : { - *(.data) - *(.rodata) - *(.bss) - *(.parasite.stack) - . = ALIGN(8); - } -}