Use of default.ld in linking
thomas at nexus.se
thomas at nexus.se
Tue Mar 26 21:31:51 AEST 1991
In article <1991Mar15.091211.32 at edwards-saftd-2.af.mil> elston at edwards-saftd-2.af.mil writes:
We have been struggling with an apparent memory conflict. In the process of
investigating this conflict we have tried changing the default linker loader
instructions. Our system (68020 VME running System V 2.3 with 2 Megabytes of
physical memory on the main processor and another 2 Meg on another node) came
with the following default.ld
MEMORY {
valid : org = 0x0, len = 0x200000
}
SECTIONS {
.text : {}
GROUP ALIGN(65536) : {
.data : {}
.bss : {}
}
}
When we change the alignment from 64K to something like 128 bytes or over 128K
and compile with the -g option then we get error messages like
prog: w\N(ILX^O.<UU/: cannot open
prog: _|^LB.^?x^L.^D^?xl,: not found
prog: syntax error at line 5: `(' unexpected
This implies (at least to me) that the text area is being corrupted with the
line number information, the symbol table information, or just the .data and
.bss sections. Trying to debug with sdb will allow us to see the source code
as it appears in the original but when trying to run under sdb we get
Returned from execve: Exec format error
Cannot ptrace child process; try again.: No such process
It seems to be connected with the problem of running it from the command line.
Any ideas? Why should the alignment make such a difference? Any help would be
appreciated.
--
First of all, you can't have an alignment of less than the pagesize if
you have shared text (the default). The -N flag to ld makes the text
writeable. Using this you don't have to align the sections at all.
The symtoms you are experiencing are due to the way the shell handles shell
scripts. If you have an unsupported alignment the kernel returns from
the execve with ENOEXEC. As the shell recognizes that the execve failed, it
assumes the executable to be a shell script and forkes off a shell and hands
the file to it as a script. The error messages comes from this shells fruitless
attempts to interpret the content of the file.
This is also why the behaviour is different when when running it from a shell
and running it under sdb, sdb recognizes that the file isn't executable.
As for having an alignment of 128k the problem might be that Motorola hasn't
bother fixing their braindamaged exec(). At least in V.2 they couldn't handle
any alignment other than 64k. The fix was very simple and we fixed it for our
port so it could handle any alignment greater than or equal to the page size.
Then again, one might ask why anyone would use anything aother than the default
alignment. In our case we used an alignment of 8k and had hardware that
used either 2k or 8k page size. At one moment we also wanted to execute
binaries from a Motorola system that used 64k.
Hope this clarifies some of the mystery.
Thomas
--
Real life: Thomas Tornblom Email: t_tornblom at nexus.se
Snail mail: Communicator Nexus Phone: +46 18 171814
Box 857 Fax: +46 18 696516
S - 751 08 Uppsala, Sweden
More information about the Comp.unix.programmer
mailing list