⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 elfparts.c

📁 ELFkickers是一组elf工具
💻 C
字号:
/* elfparts.c: Global functions supplied by the elfparts library. * * Copyright (C) 1999-2001 by Brian Raiter, under the GNU General * Public License. No warranty. See COPYING for details. */#include	<stdio.h>#include	<stdlib.h>#include	<errno.h>#include	<linux/elf.h>#include	"elfparts.h"#include	"gen.h"/* Align a position to the next dword/page boundary. */#define	filealign(off)	(((off) + 3) & ~3)#define	memalign(off)	(((off) + 0x0FFF) & ~0x0FFF)static int const	loadaddr = 0x08048000;void newparts(blueprint const *bp){    elfpart    *part;    int		i;    for (i = 0, part = bp->parts ; i < bp->partcount ; ++i, ++part)	if (part->new)	    (*part->new)(part);}void initparts(blueprint const *bp){    elfpart    *part;    int		i, m, n;    for (i = 0, part = bp->parts ; i < bp->partcount ; ++i, ++part)	part->done = !(part->shtype && part->init);    m = bp->partcount;    do {	n = 0;	for (i = 0, part = bp->parts ; i < bp->partcount ; ++i, ++part) {	    if (!part->done) {		(*part->init)(part, bp);		if (!part->done)		    ++n;	    }	}	if (n == m)	    assert(!"Mutually dependent ELF parts in init().");	m = n;    } while (n);}void fillparts(blueprint const *bp){    elfpart    *part;    int		i, m, n;    for (i = 0, part = bp->parts ; i < bp->partcount ; ++i, ++part)	part->done = !(part->shtype && part->fill);    m = bp->partcount;    do {	n = 0;	for (i = 0, part = bp->parts ; i < bp->partcount ; ++i, ++part) {	    if (!part->done) {		(*part->fill)(part, bp);		if (!part->done)		    ++n;	    }	}	if (n == m)	    assert(!"Mutually dependent ELF parts in fill().");	m = n;    } while (n);}void completeparts(blueprint const *bp){    elfpart    *part;    int		i, m, n;    for (i = 0, part = bp->parts ; i < bp->partcount ; ++i, ++part)	part->done = !(part->shtype && part->complete);    m = bp->partcount;    do {	n = 0;	for (i = 0, part = bp->parts ; i < bp->partcount ; ++i, ++part) {	    if (!part->done) {		(*part->complete)(part, bp);		if (!part->done)		    ++n;	    }	}	if (n == m)	    assert(!"Mutually dependent ELF parts in complete().");	m = n;    } while (n);}int computeoffsets(blueprint const *bp){    Elf32_Off	off;    elfpart    *part;    int		i;    off = 0;    for (i = 0, part = bp->parts ; i < bp->partcount ; ++i, ++part) {	if (part->shtype) {	    if (part->entsize)		part->size = part->count * part->entsize;	    part->offset = off;	    off = filealign(off + part->size);	}    }    if (bp->filetype != ET_REL) {	off = 0;	for (i = 0, part = bp->parts ; i < bp->partcount ; ++i, ++part) {	    if (part->flags) {		part->addr = part->offset;		if (!(part->flags & PF_W)) {		    if (off < part->addr + part->size)			off = part->addr + part->size;		}	    }	}	off = memalign(off);	for (i = 0, part = bp->parts ; i < bp->partcount ; ++i, ++part)	    if (part->flags & PF_W)		part->addr += off;	if (bp->filetype == ET_EXEC) {	    for (i = 0, part = bp->parts ; i < bp->partcount ; ++i, ++part)		if (part->flags)		    part->addr += loadaddr;	}    }    return TRUE;}#define	fout(fp, p, n)	((n) <= 0 || fwrite((p), (n), 1, (fp)) == 1)int outputelf(blueprint const *bp, char const *filename){    FILE       *fp;    elfpart    *part;    char	padding[16] = { 0 };    Elf32_Off	off;    int		i;    if (!(fp = fopen(filename, "wb")))	return FALSE;    off = 0;    for (i = 0, part = bp->parts ; i < bp->partcount ; ++i, ++part) {	if (!part->shtype)	    continue;	if (!fout(fp, padding, part->offset - off)			|| !fout(fp, part->part, part->size)) {	    i = errno;	    fclose(fp);	    errno = i;	    return FALSE;	}	off = part->offset + part->size;    }    if (fclose(fp))	return FALSE;    return TRUE;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -