Mail Archives: djgpp/2002/04/12/13:45:41
CBFalconer wrote:
>
> Eli Zaretskii wrote:
> >
... snip ...
> >
> > My recommendation is to modify the algorithm to do a better
> > allocation. If you cannot do that for some reason, you can find the
> > old implementation of malloc in djlsr203.zip, file name
> > src/libc/ansi/stdlib/fmalloc.c; link it with your program, and you
> > will get the old behavior.
>
> He might also try my suggested new malloc package for DJGPP, which
> I have mounted at:
>
> <http://cbfalconer.home.att.net/download/nmalloc.zip>
>
> which, among other things, goes to some pains to minimize the
> realloc work. I have heard nothing back on it from anyone, either
> good or bad.
I just took this thing to experiment with, and get the following
anomaly:
.................
[1] c:\c\malloc>gcc -o evilalgo.o evilalgo.c
[1] c:\c\malloc>gcc -o evilalgo.exe evilalgo.o
evilalgo.o(.text+0x1f8):crt0.s: multiple definition of `__exit'
c:/djgpp/lib/crt0.o(.text+0x1f0):crt0.s: first defined here
evilalgo.o(.text+0x2da):crt0.s: multiple definition of `__sbrk'
c:/djgpp/lib/crt0.o(.text+0x2d2):crt0.s: first defined here
evilalgo.o(.text+0x4c4):crt0.s: multiple definition of
`_crt0_init_mcount'
c:/djgpp/lib/crt0.o(.text+0x4bc):crt0.s: first defined here
evilalgo.o(.text+0x2f8):crt0.s: multiple definition of `__brk'
c:/djgpp/lib/crt0.o(.text+0x2f0):crt0.s: first defined here
evilalgo.o(.text+0x8):crt0.s: multiple definition of `start'
c:/djgpp/lib/crt0.o(.text+0x0):crt0.s: first defined here
collect2: ld returned 1 exit status
...................
while "gcc evilalgo.c" works fine, generating file a. (NOTE: gcc
works through an alias here, imposing -W -Wall -ansi -pedantic
-gstabs+)
While I look for a reason, does anybody know of any? My malloc.o
is in the directory, but has not been linked (yet).
The slightly revised source follows:
> /* From djgpp mail list - an evil algorithm */
> #include <stdio.h>
> #include <stdlib.h>
>
> typedef struct {
> char af[10];
> char name[10];
> } record;
>
> record **dt, *d;
>
> int main(int argc, char ** argv)
> {
> unsigned long n = 1000; /* was 200000L */
> unsigned int count;
>
> if (argc > 1) n = strtoul(argv[1], NULL, 10);
>
> for (count = 0; count < n; count++){
> dt = (record **)realloc(dt, (count + 1) * sizeof(record *));
> d = dt[count];
> d = (record *)calloc(10, sizeof(record));
> if (!(count & 0xfff)) putc('*', stderr);
> }
> return(0);
> } /* evilalgo */
--
Chuck F (cbfalconer AT yahoo DOT com) (cbfalconer AT worldnet DOT att DOT net)
Available for consulting/temporary embedded and systems.
<http://cbfalconer.home.att.net> USE worldnet address!
- Raw text -