ld and the -A option

Chris Torek chris at mimsy.UUCP
Mon Dec 8 19:41:39 AEST 1986


In article <591 at rdin.UUCP> perl at rdin.UUCP (Robert Perlberg) writes:
>...  Just how do you load the code into a running process and how do
>you know where to load it and where the various functions within it
>start?

Every one of those questions has an answer.  The answer is different
on every machine.

On a Vax running 4BSD, load the code by reading it into a data area
that is aligned on a `page' (1K byte, or getpagesize()) boundary.
The function entry points may be found by using nlist(3) on the
ld- generated symbol table.  `ld' should be invoked with the -T
option to set the text address for the new code to start at the
address into which you will read it.  There is one small problem
here: to run ld, you need the address; to get the address, you need
the size of the code before you can call valloc(3).  One solution
is to use sbrk() directly:

		int page_size, page_offset;
		long addr;
		char txtaddr[30];
		...
		page_size = getpagesize();
		page_offset = page_size - 1;
		addr = (long) sbrk(0);
		/* align to a page boundary */
		(void) sbrk((page_size - addr) & page_offset);
		addr = (long) sbrk(0);
		sprintf(txtaddr, "%x", addr);
		...			/* run ld "-T" txtaddr ... */
		/* read a.out header, obtaining `size' */
		if (sbrk(size) != addr)
			/* trouble */
		/* seek to code */
		if (read(fd, (char *) addr, size) != size)
			/* more trouble */
-- 
In-Real-Life: Chris Torek, Univ of MD Comp Sci Dept (+1 301 454 7690)
UUCP:	seismo!mimsy!chris	ARPA/CSNet:	chris at mimsy.umd.edu



More information about the Comp.unix.wizards mailing list