ld(1) "local symbol botch" bug fix
Dave borman
borman at decvax.UUCP
Tue Jul 3 01:44:37 AEST 1984
Subject: V7 ld bug
Newsgroups: net.bugs.2bsd net.bugs.v7
Have you seen the annoying message "local symbol botch" coming from ld?
We recently ran into a program that was consistent in producing this
error, so I was able to track down this instance of it. Seems the
problem is in ld.c where it declares what an a.out header looks like.
About 100 lines down in ld.c we have:
struct {
int fmagic;
int tsize;
int dsize;
int bsize;
int ssize;
int entry;
int pad;
int relflg;
}
This should be changed to:
struct {
int fmagic;
unsigned tsize;
unsigned dsize;
unsigned bsize;
unsigned ssize;
unsigned entry;
unsigned pad;
unsigned relflg;
}
which is how it is declared in a.out.h. The problem occures
when an individual module has a text or data size that wraps
around and goes negative. In load2() we have the line
dseek(&text, loc + filhdr.tsize + filhdr.dsize, filhdr.ssize);
Well, if filhdr.dsize or filhdr.tsize is negative, it will get sign
extended before being added, dseek then gets the wrong value and
eventually you wind up with the "local symbol botch" message.
This problem is known to exist in V7, 2.9BSD (and probably 2.8BSD).
I have no idea if it is in SYSIII or SYSV, I don't have online sources
to look at.
-Dave Borman, Digital UNIX Engineering Group
decvax!borman
More information about the Comp.bugs.2bsd
mailing list