#include #include #include #include typedef uint32_t u32; typedef uint16_t u16; typedef uint8_t u8; typedef int32_t i32; typedef int16_t i16; typedef int8_t i8; #define nil NULL u8 data[10*1024*1042]; int filelen; #define PHDR(n) (Elf32_Phdr*)&data[eh->e_phoff + (n)*eh->e_phentsize] #define SHDR(n) (Elf32_Shdr*)&data[eh->e_shoff + (n)*eh->e_shentsize] int main() { Elf32_Ehdr *eh; Elf32_Phdr *pht; Elf32_Shdr *sht; int i; FILE *f = fopen("SLES_503.30", "rb"); if(f == nil) return 1; filelen = fread(data, 1, sizeof(data), f); fclose(f); printf("size: %d\n", filelen); eh = (Elf32_Ehdr*)data; pht = (Elf32_Phdr*)&data[eh->e_phoff]; sht = (Elf32_Shdr*)&data[eh->e_shoff]; printf("%X %X\n", eh->e_type, eh->e_flags); printf("%d %d\n", eh->e_phnum, eh->e_shnum); // SLES 50330: // code 100000 - 417080 (sz 317080) // bss 417080 - 6b0980 (sz 417080) // heap... for(i = 0; i < eh->e_phnum; i++){ pht = PHDR(i); printf(" %x: %08X %08X -> %08X %08X\n", pht->p_type, pht->p_offset, pht->p_filesz, pht->p_vaddr, pht->p_memsz); } /* // as a test, copy headers to the end memcpy(&data[filelen], PHDR(0), eh->e_phnum*eh->e_phentsize); memset(PHDR(0), 0, eh->e_phnum*eh->e_phentsize); eh->e_phoff = filelen; filelen += eh->e_phnum*eh->e_phentsize; memcpy(&data[filelen], SHDR(0), eh->e_shnum*eh->e_shentsize); memset(SHDR(0), 0, eh->e_shnum*eh->e_shentsize); eh->e_shoff = filelen; filelen += eh->e_shnum*eh->e_shentsize; */ // clear .relmain memset(SHDR(5), 0, eh->e_shentsize); // clear .mwcats just to be sure memset(SHDR(7), 0, eh->e_shentsize); f = fopen("foo.elf", "wb"); if(f == nil) return 1; fwrite(data, 1, filelen, f); return 0; }