Application of mopd-2.5.3-elf.patch:

* Sun Nov 17 2002 Maciej W. Rozycki <macro@ds2.pg.gda.pl> 2.5.3-15
- modified Makefiles to improve portability: specify "-lelf"
  last for the linker, define LIBELF in the top-level Makefile
  to permit overriding (elf)

* Sun Nov 11 2001 Maciej W. Rozycki <macro@ds2.pg.gda.pl> 2.5.3-13
- a bug affecting multisegment ELF files again, sigh... (elf)

* Sun Nov 11 2001 Maciej W. Rozycki <macro@ds2.pg.gda.pl>
- 64-bit ELF support (elf)

* Sun Nov 11 2001 Maciej W. Rozycki <macro@ds2.pg.gda.pl>
- pass the entry point address as is as it's more flexible;
  print ELF file information; bug fixes (elf)

* Sat Nov 10 2001 Maciej W. Rozycki <macro@ds2.pg.gda.pl>
- reject dynamically linked executables; calculate a physical
  entry point address from the virtual one; bug fixes (elf)

* Fri Nov  9 2001 Maciej W. Rozycki <macro@ds2.pg.gda.pl>
- map ELF segments by their physical addresses to facilitate
  systems which boot with their memory mapping different from
  the final one; sort phdrs by ascending addresses; bug fixes
  (elf)

* Thu Nov  8 2001 Maciej W. Rozycki <macro@ds2.pg.gda.pl>
- took the header block count of MOP images into account (elf)
- addedd handling of MOP images with a null block count or size
  specified in the header (elf)

* Sun Oct 28 2001 Maciej W. Rozycki <macro@ds2.pg.gda.pl>
- fixed a stupid bug causing multisegment ELF files not to be
  sent properly (elf)

* Fri Oct 26 2001 Maciej W. Rozycki <macro@ds2.pg.gda.pl>
- added ELF support (elf)

Downloaded from:
ftp://ftp.linux-mips.org/pub/linux/mips/people/macro/mopd/mopd-2.5.3-elf.patch.gz
.patch SHA256 = f63818152cd74e551068ea7856e0cc872ddd2f78485cda08a77b3d81a1aa845c
Patch history copied from:
ftp://ftp.linux-mips.org/pub/linux/mips/people/macro/mopd/mopd-2.5.3-15.spec
This commit is contained in:
Maciej W. Rozycki
2002-11-17 12:00:00 -05:00
committed by Boris Gjenero
parent 3b606eb2af
commit 8920dbffcd
8 changed files with 418 additions and 204 deletions

View File

@@ -4,6 +4,7 @@ RANLIB = ranlib
CFLAGS = -O2 -g
LDFLAGS =
LIBELF = -lelf
SUBDIRS = common mopd mopchk mopprobe moptrace
@@ -11,6 +12,7 @@ all clean:
@for dir in $(SUBDIRS); do \
(cd $$dir && \
$(MAKE) "AR=$(AR)" "CC=$(CC)" "RANLIB=$(RANLIB)" \
"CFLAGS=$(CFLAGS)" "LDFLAGS=$(LDFLAGS)" $@) || \
"CFLAGS=$(CFLAGS)" "LDFLAGS=$(LDFLAGS)" \
"LIBELF=$(LIBELF)" $@) || \
exit 1; \
done

View File

@@ -71,6 +71,28 @@ struct if_info {
#define DL_STATUS_SENT_MLD 2
#define DL_STATUS_SENT_PLT 3
#define FTYPE_NONE 0 /* unindentified image */
#define FTYPE_MOP 1 /* DEC MOP image */
#define FTYPE_AOUT 2 /* a.out executable */
#define FTYPE_COFF 3 /* COFF executable */
#define FTYPE_ELF 4 /* ELF executable */
#define SEG_TEXT 0 /* Segment table entry numbers */
#define SEG_DATA 1 /* for file types that use */
#define SEG_BSS 2 /* fixed segments */
#define MAXSEG 16 /* Max. number of program segments */
struct seg {
off_t seek; /* File offset of segment */
u_long data; /* Size of segment data */
u_long fill; /* Size of segment fill */
};
struct segs {
struct seg s[MAXSEG]; /* File segments */
};
struct dllist {
u_char status; /* Status byte */
struct if_info *ii; /* interface pointer */
@@ -82,15 +104,9 @@ struct dllist {
u_long loadaddr; /* Load Address */
u_long xferaddr; /* Transfer Address */
u_long nloadaddr; /* Next Load Address */
long lseek; /* Seek before last read */
int aout; /* Is it an a.out file */
u_long a_text; /* Size of text segment */
u_long a_text_fill; /* Size of text segment fill */
u_long a_data; /* Size of data segment */
u_long a_data_fill; /* Size of data segment fill */
u_long a_bss; /* Size of bss segment */
u_long a_bss_fill; /* Size of bss segment fill */
long a_lseek; /* Keep track of pos in newfile */
int ftype; /* File type */
struct segs seg; /* File segments */
u_long addr; /* Current relative address */
};
#endif _COMMON_H_

View File

@@ -72,6 +72,22 @@ static char rcsid[] = "$Id: file.c,v 1.4 1996/08/16 22:39:22 moj Exp $";
#endif
#endif
#ifndef NOELF
#include <libelf/libelf.h>
#endif
struct mopphdr {
off_t offset;
u_long paddr;
u_long filesz;
u_long memsz;
u_long fill;
};
struct mopphdrs {
struct mopphdr p[MAXSEG];
};
int fileinfo;
void
@@ -178,13 +194,15 @@ CheckMopFile(fd)
}
int
GetMopFileInfo(fd, load, xfr)
int fd;
GetMopFileInfo(fd, load, xfr, ftype, seg)
int fd, *ftype;
u_long *load, *xfr;
struct segs *seg;
{
u_char header[512];
short image_type;
u_long load_addr, xfr_addr, isd, iha, hbcnt, isize;
u_long load_addr, xfr_addr, isd, iha;
off_t hbcnt, isize;
(void)lseek(fd, (off_t) 0, SEEK_SET);
@@ -309,6 +327,26 @@ GetMopFileInfo(fd, load, xfr)
*xfr = xfr_addr;
}
if (seg != NULL) {
off_t hsize;
hsize = hbcnt * 512;
if (!hsize || !isize) {
hsize = 512;
isize = lseek(fd, (off_t) 0, SEEK_END);
if (isize < 0)
return(-1);
isize -= hsize;
}
seg->s[SEG_TEXT].seek = hsize;
seg->s[SEG_TEXT].data = isize;
}
if (ftype != NULL) {
*ftype = FTYPE_MOP;
}
return(0);
}
@@ -463,11 +501,10 @@ CheckAOutFile(fd)
/*###440 [cc] syntax error before `int'%%%*/
int
GetAOutFileInfo(fd, load, xfr, a_text, a_text_fill,
a_data, a_data_fill, a_bss, a_bss_fill, aout)
int fd, *aout;
u_long *load, *xfr, *a_text, *a_text_fill;
u_long *a_data, *a_data_fill, *a_bss, *a_bss_fill;
GetAOutFileInfo(fd, load, xfr, ftype, seg)
int fd, *ftype;
u_long *load, *xfr;
struct segs *seg;
{
#ifdef NOAOUT
return(-1);
@@ -631,7 +668,7 @@ GetAOutFileInfo(fd, load, xfr, a_text, a_text_fill,
/*###608 [cc] `load' undeclared (first use this function)%%%*/
if (load != NULL) {
*load = 0;
*load = N_TXTADDR(ex);
}
/*###612 [cc] `xfr' undeclared (first use this function)%%%*/
@@ -639,106 +676,321 @@ GetAOutFileInfo(fd, load, xfr, a_text, a_text_fill,
*xfr = ex.a_entry;
}
/*###616 [cc] `a_text' undeclared (first use this function)%%%*/
if (a_text != NULL) {
*a_text = ex.a_text;
}
/*###616 [cc] `seg' undeclared (first use this function)%%%*/
if (seg != NULL) {
u_long fill;
/*###620 [cc] `a_text_fill' undeclared (first use this function)%%%*/
if (a_text_fill != NULL) {
seg->s[SEG_TEXT].seek = N_TXTOFF(ex);
seg->s[SEG_TEXT].data = ex.a_text;
if (magic == ZMAGIC || magic == NMAGIC) {
*a_text_fill = clbytes - (ex.a_text & clofset);
if (*a_text_fill == clbytes) {
*a_text_fill = 0;
fill = clbytes - (ex.a_text & clofset);
if (fill == clbytes) {
fill = 0;
}
} else {
*a_text_fill = 0;
seg->s[SEG_TEXT].fill = fill;
}
}
/*###631 [cc] `a_data' undeclared (first use this function)%%%*/
if (a_data != NULL) {
*a_data = ex.a_data;
}
/*###635 [cc] `a_data_fill' undeclared (first use this function)%%%*/
if (a_data_fill != NULL) {
seg->s[SEG_DATA].seek = N_DATOFF(ex);
seg->s[SEG_DATA].data = ex.a_data;
if (magic == ZMAGIC || magic == NMAGIC) {
*a_data_fill = clbytes - (ex.a_data & clofset);
if (*a_data_fill == clbytes) {
*a_data_fill = 0;
fill = clbytes - (ex.a_data & clofset);
if (fill == clbytes) {
fill = 0;
}
} else {
*a_data_fill = 0;
seg->s[SEG_DATA].fill = fill;
}
}
/*###646 [cc] `a_bss' undeclared (first use this function)%%%*/
if (a_bss != NULL) {
*a_bss = ex.a_bss;
}
/*###650 [cc] `a_bss_fill' undeclared (first use this function)%%%*/
if (a_bss_fill != NULL) {
if (magic == ZMAGIC || magic == NMAGIC) {
*a_bss_fill = clbytes - (ex.a_bss & clofset);
if (*a_bss_fill == clbytes) {
*a_bss_fill = 0;
}
} else {
*a_bss_fill = clbytes -
((ex.a_text+ex.a_data+ex.a_bss) & clofset);
if (*a_text_fill == clbytes) {
*a_text_fill = 0;
}
fill = clbytes - (ex.a_bss & clofset);
} else {
fill = clbytes -
((ex.a_text + ex.a_data + ex.a_bss) & clofset);
}
if (fill == clbytes) {
fill = 0;
}
seg->s[SEG_BSS].fill = ex.a_bss + fill;
}
/*###665 [cc] `aout' undeclared (first use this function)%%%*/
if (aout != NULL) {
*aout = mid;
/*###665 [cc] `ftype' undeclared (first use this function)%%%*/
if (ftype != NULL) {
*ftype = FTYPE_AOUT;
}
return(0);
#endif NOAOUT
}
#ifndef NOELF
void
sortELFphdrs(p, l, r)
struct mopphdrs *p;
int l, r;
{
struct mopphdr tmp;
int lp = l, rp = r, mp = (l + r) / 2;
do {
while (p->p[lp].paddr < p->p[mp].paddr)
lp++;
while (p->p[mp].paddr < p->p[rp].paddr)
rp--;
if (lp <= rp) {
tmp = p->p[lp];
p->p[lp] = p->p[rp];
p->p[rp] = tmp;
lp++;
rp--;
}
} while (lp <= rp);
if (l < rp)
sortELFphdrs(p, l, rp);
if (lp < r)
sortELFphdrs(p, lp, r);
}
#endif /* NOELF */
int
CheckELFFile(fd)
int fd;
{
#ifdef NOELF
return(-1);
#else
Elf *elf;
if (elf_version(EV_CURRENT) == EV_NONE)
return(-1);
elf = elf_begin(fd, ELF_C_READ, NULL);
if (!elf)
return(-1);
if (elf_kind(elf) != ELF_K_ELF) {
elf_end(elf);
return(-1);
}
elf_end(elf);
return(0);
#endif /* NOELF */
}
int
GetELFFileInfo(fd, load, xfr, ftype, seg)
int fd, *ftype;
u_long *load, *xfr;
struct segs *seg;
{
#ifdef NOELF
return(-1);
#else
struct mopphdrs p;
Elf *elf;
Elf32_Ehdr *ehdr;
Elf32_Phdr *phdr;
Elf64_Ehdr *e64hdr;
Elf64_Phdr *p64hdr;
char ei_class;
char ei_data;
int e_type;
u_long e_entry;
int e_phnum;
long p_type;
int i, j;
elf = elf_begin(fd, ELF_C_READ, NULL);
if (!elf)
return(-1);
ehdr = elf32_getehdr(elf);
phdr = elf32_getphdr(elf);
e64hdr = elf64_getehdr(elf);
p64hdr = elf64_getphdr(elf);
if ((!ehdr || !phdr) && (!e64hdr || !p64hdr)) {
elf_end(elf);
return(-1);
}
e_type = ehdr ? ehdr->e_type : e64hdr->e_type;
if (e_type != ET_EXEC) {
if (fileinfo)
printf("ELF non-executable, not supported\n");
elf_end(elf);
return(-1);
}
e_entry = ehdr ? ehdr->e_entry : e64hdr->e_entry;
bzero(&p, sizeof(p));
i = 0;
j = 0;
e_phnum = ehdr ? ehdr->e_phnum : e64hdr->e_phnum;
while (i < e_phnum) {
p_type = phdr ? phdr->p_type : p64hdr->p_type;
if (p_type == PT_DYNAMIC) {
if (fileinfo)
printf("ELF dynamic executable, "
"not supported\n");
elf_end(elf);
return(-1);
}
if (p_type == PT_LOAD) {
if (j >= MAXSEG) {
if (fileinfo)
printf("ELF executable, "
"over %u segments, "
"not supported\n", MAXSEG);
elf_end(elf);
return(-1);
}
if (phdr) {
p.p[j].offset = phdr->p_offset;
p.p[j].paddr = phdr->p_paddr;
p.p[j].filesz = phdr->p_filesz;
p.p[j].memsz = phdr->p_memsz;
} else {
p.p[j].offset = p64hdr->p_offset;
p.p[j].paddr = p64hdr->p_paddr;
p.p[j].filesz = p64hdr->p_filesz;
p.p[j].memsz = p64hdr->p_memsz;
}
j++;
}
if (phdr)
phdr++;
else
p64hdr++;
i++;
};
if (!j) {
if (fileinfo)
printf("ELF executable, no segments to load\n");
elf_end(elf);
return(-1);
}
sortELFphdrs(&p, 0, j - 1);
for (i = 0; i < j; i++) {
p.p[i].fill = p.p[i].memsz - p.p[i].filesz;
if (i > 0)
p.p[i - 1].fill += p.p[i].paddr -
(p.p[i - 1].paddr +
p.p[i - 1].memsz);
if (seg != NULL) {
seg->s[i].seek = p.p[i].offset;
seg->s[i].data = p.p[i].filesz;
seg->s[i].fill = p.p[i].fill;
if (i > 0)
seg->s[i - 1].fill = p.p[i - 1].fill;
}
};
if (load != NULL) {
*load = p.p[0].paddr;
}
if (xfr != NULL) {
*xfr = e_entry;
}
if (fileinfo) {
char *clstr = "";
char *dtstr = "";
ei_class = ehdr ? ehdr->e_ident[EI_CLASS] :
e64hdr->e_ident[EI_CLASS];
ei_data = ehdr ? ehdr->e_ident[EI_DATA] :
e64hdr->e_ident[EI_DATA];
switch (ei_class) {
case ELFCLASS32:
clstr = " 32-bit";
break;
case ELFCLASS64:
clstr = " 64-bit";
break;
default:
;
}
switch (ei_data) {
case ELFDATA2LSB:
dtstr = " LSB";
break;
case ELFDATA2MSB:
dtstr = " MSB";
break;
default:
;
}
printf("ELF%s%s executable\n", clstr, dtstr);
for (i = 0; i < j; i++)
printf("Size of seg #%02d: %08x (+ %08x fill)\n",
i, p.p[i].filesz, p.p[i].fill);
printf("Load Address: %08x\n", p.p[0].paddr);
printf("Transfer Address: %08x\n", e_entry);
}
if (ftype != NULL) {
*ftype = FTYPE_ELF;
}
elf_end(elf);
return(0);
#endif /* NOELF */
}
/*###673 [cc] syntax error before `int'%%%*/
int
GetFileInfo(fd, load, xfr, aout,
a_text, a_text_fill, a_data, a_data_fill, a_bss, a_bss_fill)
int fd, *aout;
u_long *load, *xfr, *a_text, *a_text_fill;
u_long *a_data, *a_data_fill, *a_bss, *a_bss_fill;
GetFileInfo(fd, load, xfr, ftype, seg)
int fd, *ftype;
u_long *load, *xfr;
struct segs *seg;
{
int err;
*ftype = FTYPE_NONE;
bzero(seg, sizeof(*seg));
err = CheckELFFile(fd);
if (err == 0) {
err = GetELFFileInfo(fd, load, xfr, ftype, seg);
if (err != 0) {
return(-1);
}
return(0);
}
err = CheckAOutFile(fd);
if (err == 0) {
err = GetAOutFileInfo(fd, load, xfr,
a_text, a_text_fill,
a_data, a_data_fill,
a_bss, a_bss_fill,
aout);
err = GetAOutFileInfo(fd, load, xfr, ftype, seg);
if (err != 0) {
return(-1);
}
} else {
err = CheckMopFile(fd);
if (err == 0) {
err = GetMopFileInfo(fd, load, xfr);
if (err != 0) {
return(-1);
}
*aout = -1;
} else {
return(-1);
}
return(0);
}
return(0);
err = CheckMopFile(fd);
if (err == 0) {
err = GetMopFileInfo(fd, load, xfr, ftype, seg);
if (err != 0) {
return(-1);
}
return(0);
}
return(-1);
}
ssize_t
@@ -748,20 +1000,20 @@ mopFileRead(dlslot, buf)
u_char *buf;
{
ssize_t len, outlen;
int bsz;
int bsz, i;
long pos, notdone, total;
/*###719 [cc] `dlslot' undeclared (first use this function)%%%*/
if (dlslot->aout == -1) {
/*###720 [cc] `buf' undeclared (first use this function)%%%*/
len = read(dlslot->ldfd,buf,dlslot->dl_bsz);
} else {
bsz = dlslot->dl_bsz;
pos = dlslot->a_lseek;
len = 0;
bsz = dlslot->dl_bsz;
pos = dlslot->addr;
total = 0;
len = 0;
total = dlslot->a_text;
i = 0;
while (i < MAXSEG) {
if (pos == total)
lseek(dlslot->ldfd, dlslot->seg.s[i].seek, SEEK_SET);
total += dlslot->seg.s[i].data;
if (pos < total) {
notdone = total - pos;
if (notdone <= bsz) {
@@ -776,8 +1028,11 @@ mopFileRead(dlslot, buf)
bsz = bsz - outlen;
}
total = total + dlslot->a_text_fill;
dlslot->addr = pos;
if (!bsz)
break;
total += dlslot->seg.s[i].fill;
if ((bsz > 0) && (pos < total)) {
notdone = total - pos;
if (notdone <= bsz) {
@@ -792,72 +1047,11 @@ mopFileRead(dlslot, buf)
bsz = bsz - outlen;
}
total = total + dlslot->a_data;
if ((bsz > 0) && (pos < total)) {
notdone = total - pos;
if (notdone <= bsz) {
/*###760 [cc] subscripted value is neither array nor pointer%%%*/
outlen = read(dlslot->ldfd,&buf[len],notdone);
} else {
/*###762 [cc] subscripted value is neither array nor pointer%%%*/
outlen = read(dlslot->ldfd,&buf[len],bsz);
}
len = len + outlen;
pos = pos + outlen;
bsz = bsz - outlen;
}
total = total + dlslot->a_data_fill;
if ((bsz > 0) && (pos < total)) {
notdone = total - pos;
if (notdone <= bsz) {
outlen = notdone;
} else {
outlen = bsz;
}
/*###778 [cc] subscripted value is neither array nor pointer%%%*/
bzero(&buf[len],outlen);
len = len + outlen;
pos = pos + outlen;
bsz = bsz - outlen;
}
total = total + dlslot->a_bss;
if ((bsz > 0) && (pos < total)) {
notdone = total - pos;
if (notdone <= bsz) {
outlen = notdone;
} else {
outlen = bsz;
}
/*###793 [cc] subscripted value is neither array nor pointer%%%*/
bzero(&buf[len],outlen);
len = len + outlen;
pos = pos + outlen;
bsz = bsz - outlen;
}
total = total + dlslot->a_bss_fill;
if ((bsz > 0) && (pos < total)) {
notdone = total - pos;
if (notdone <= bsz) {
outlen = notdone;
} else {
outlen = bsz;
}
/*###808 [cc] subscripted value is neither array nor pointer%%%*/
bzero(&buf[len],outlen);
len = len + outlen;
pos = pos + outlen;
bsz = bsz - outlen;
}
dlslot->a_lseek = pos;
dlslot->addr = pos;
if (!bsz)
break;
i++;
}
return(len);

View File

@@ -42,12 +42,12 @@ u_long mopFileGetLX (/* u_char *, int, int */);
u_long mopFileGetBX (/* u_char *, int, int */);
void mopFileSwapX (/* u_char *, int, int */);
int CheckMopFile (/* int */);
int GetMopFileInfo (/* int, u_long *, u_long * */);
int GetMopFileInfo (/* int, u_long *, u_long *, int *, struct segs * */);
int CheckAOutFile (/* int */);
int GetAOutFileInfo(/* int, u_long *, u_long *, u_long *, u_long *,
u_long *, u_long *, u_long *, u_long * */);
int GetFileInfo (/* int, u_long *, u_long *, int *, u_long *, u_long *,
u_long *, u_long *, u_long *, u_long * */);
int GetAOutFileInfo(/* int, u_long *, u_long *, int *, struct segs * */);
int CheckELFFile (/* int */);
int GetELFFileInfo (/* int, u_long *, u_long *, int *, struct segs * */);
int GetFileInfo (/* int, u_long *, u_long *, int *, struct segs * */);
#else
__BEGIN_DECLS
void mopFilePutLX __P((u_char *, int, u_long, int));
@@ -56,13 +56,12 @@ u_long mopFileGetLX __P((u_char *, int, int));
u_long mopFileGetBX __P((u_char *, int, int));
void mopFileSwapX __P((u_char *, int, int));
int CheckMopFile __P((int));
int GetMopFileInfo __P((int, u_long *, u_long *));
int GetMopFileInfo __P((int, u_long *, u_long *, int *, struct segs *));
int CheckAOutFile __P((int));
int GetAOutFileInfo __P((int, u_long *, u_long *, u_long *, u_long *,
u_long *, u_long *, u_long *, u_long *, int *));
int GetFileInfo __P((int, u_long *, u_long *, int *,
u_long *, u_long *, u_long *, u_long *,
u_long *, u_long *));
int GetAOutFileInfo __P((int, u_long *, u_long *, int *, struct segs *));
int CheckELFFile __P((int));
int GetELFFileInfo __P((int, u_long *, u_long *, int *, struct segs *));
int GetFileInfo __P((int, u_long *, u_long *, int *, struct segs *));
__END_DECLS
#endif

View File

@@ -1,13 +1,14 @@
PROGS = mopchk
OBJS = mopchk.o
LIBS = ../common/libcommon.a
LIBELF = -lelf
CPPFLAGS = -I..
all: $(PROGS)
mopchk: $(OBJS) $(LIBS)
$(CC) $(CFLAGS) $(LDFLAGS) -o mopchk $(OBJS) $(LIBS)
$(CC) $(CFLAGS) $(LDFLAGS) -o mopchk $(OBJS) $(LIBS) $(LIBELF)
../common/libcommon.a:
cd ../common && $(MAKE) libcommon.a

View File

@@ -73,7 +73,7 @@ main(argc, argv)
int op, i, fd;
char *filename;
struct if_info *ii;
int err, aout;
int err;
extern int optind, opterr;
@@ -138,25 +138,31 @@ main(argc, argv)
fd = open(filename, O_RDONLY, 0);
if (fd == -1) {
printf("Unknown file.\n");
} else {
err = CheckAOutFile(fd);
if (err == 0) {
if (GetAOutFileInfo(fd, 0, 0, 0, 0,
0, 0, 0, 0, &aout) < 0) {
printf("Some failure in GetAOutFileInfo\n");
aout = -1;
}
} else {
aout = -1;
}
if (aout == -1)
err = CheckMopFile(fd);
if (aout == -1 && err == 0) {
if (GetMopFileInfo(fd, 0, 0) < 0) {
printf("Some failure in GetMopFileInfo\n");
}
};
continue;
}
err = CheckELFFile(fd);
if (err == 0) {
if (GetELFFileInfo(fd, 0, 0, 0, 0) < 0) {
printf("Some failure in GetELFFileInfo\n");
}
continue;
}
err = CheckAOutFile(fd);
if (err == 0) {
if (GetAOutFileInfo(fd, 0, 0, 0, 0) < 0) {
printf("Some failure in GetAOutFileInfo\n");
}
continue;
}
err = CheckMopFile(fd);
if (err == 0) {
if (GetMopFileInfo(fd, 0, 0, 0, 0) < 0) {
printf("Some failure in GetMopFileInfo\n");
}
};
}
return 0;
}

View File

@@ -1,13 +1,14 @@
PROGS = mopd
OBJS = mopd.o process.o
LIBS = ../common/libcommon.a
LIBELF = -lelf
CPPFLAGS = -I..
all: $(PROGS)
mopd: $(OBJS) $(LIBS)
$(CC) $(CFLAGS) $(LDFLAGS) -o mopd $(OBJS) $(LIBS)
$(CC) $(CFLAGS) $(LDFLAGS) -o mopd $(OBJS) $(LIBS) $(LIBELF)
../common/libcommon.a:
cd ../common && $(MAKE) libcommon.a

View File

@@ -266,14 +266,11 @@ mopStartLoad(dst, src, dl_rpr, trans)
GetFileInfo(dllist[slot].ldfd,
&dllist[slot].loadaddr,
&dllist[slot].xferaddr,
&dllist[slot].aout,
&dllist[slot].a_text, &dllist[slot].a_text_fill,
&dllist[slot].a_data, &dllist[slot].a_data_fill,
&dllist[slot].a_bss, &dllist[slot].a_bss_fill);
&dllist[slot].ftype,
&dllist[slot].seg);
dllist[slot].nloadaddr = dllist[slot].loadaddr;
dllist[slot].lseek = lseek(dllist[slot].ldfd,0L,SEEK_CUR);
dllist[slot].a_lseek = 0;
dllist[slot].addr = 0;
dllist[slot].count = 0;
if (dllist[slot].dl_bsz >= MAX_ETH_PAYLOAD)
@@ -375,8 +372,6 @@ mopNextLoad(dst, src, new_count, trans)
return;
}
dllist[slot].lseek = lseek(dllist[slot].ldfd,0L,SEEK_CUR);
if (dllist[slot].dl_bsz >= MAX_ETH_PAYLOAD)
dllist[slot].dl_bsz = MAX_ETH_PAYLOAD;