🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

1 total messages Started by Polar Humenn Thu, 27 Dec 1990 00:27
a.out and "ld -r"
#353
Author: Polar Humenn
Date: Thu, 27 Dec 1990 00:27
92 lines
4120 bytes
exuse me if this has already been posted..  I didn't see it come through.
--------
I have a question about the SUN-4 Unix loader (ld).
I am writing an assembler for a certain research project of mine,
the details are unimportant here.

My problem is trying to make Internal symbol references when I construct
the "a.out" file so that "ld" understands them.

This is a very simplistic attempt.  I use only symbols and 32 bit relocation
addresses, no fancy pc relative or address relative offsets and the hoard
of other options outlined in "man 5 a.out".

Let us say I have,

main:	push_structure    whammy
        push_closure     foo
        execute          fine
whammy:	push_constant    12
        push_constant    13
        enter_structure   2

Let us say that all instructions and operands each take 1 word, 32 bits.

let me define a couple of functions for clarity

unsigned addto_nlist( name, type, other , desc, value )
	This function adds a symbol to the nlist. and assigns the corresponding
	structure fields.  Only type and value are really important here.
	(I think!) It returns the index into the symbol string.
	
void     addto_reloc_text( addr, index, r_extern, type, addend )
	This function adds relocation information.  I only relocate by symbols
	so the index is always the index of the symbol.
	
So, I assemble in this order

-- main : push_structure whammy
(void) addto_nlist( "main", N_TEXT | N_EXT, 0, 0, 0x00000000 )

idx = addto_nlist( "whammy", N_UNDF | N_EXT, 0, 0, 0)
      addto_reloc_text( 0x00000004, idx, N_EXT, RELOC_32, 0 )

-- push_closure foo
idx = addto_nlist("foo", N_UNDF | N_EXT, 0, 0, 0)
	  addto_reloc_text( 0x0000000c, idx, N_EXT, RELOC_32, 0 )

-- execute fine
idx = addto_nlist("fine", N_UNDF | N_EXT, 0, 0, 0)
      addto_reloc_text( 0x00000010, idx, N_EXT, RELOC_32, 0)
	  
-- whammy: push_constant 12
(void) addto_nlist("whammy", N_TEXT | NEXT, 0, 0, 0x00000018 )

As you may be able to tell from this gobitly gook is that I end up
with an a.out file such that "nm" looks like:
00000000 T main
         U whammy
         U foo
         U fine
00000018 T whammy

Then I run "ld -r" on the a.out file and the symbols get resolved, 
and I end up with:
00000000 T main
         U foo
         U fine
00000018 T whammy

This is fine and great.  Now, what I would like to do is make "whammy" an 
internal (local) symbol that will disappear.  The documentation states that 
if I prefix the name with a 'L' it will dissapear after being resolved.  
However, I tried this and I get error messages relating to not being able 
to find the symbol.  I have tried all sorts of combinations of specifying 
and not specifying N_EXT in the nlist and relocation information.  However, 
no luck.  It appears the only way to get these symbols to resolve is to 
declare them all N_EXT, the way I should you above.

That is unless, I am not understanding something.  I don't have the code 
for the linker, so I can't analyze what it is doing internally.

Basically, I want the loader "ld -r" to resolve my predesignated local symbols 
and then strip them from the exported nlist.  It appears to me right now, that
the only way I can do this is to reslove them in my assembler first, which would
really suck since *I know* "ld" has much quicker and streamlined algorithms for 
doing such things (many years of improvements). i.e. Much better than I 
would care to spend the time to write myself.

Can anyone help me into understanding the loader?
Please email me directly.
Thanks!!!
-Polar    polar@top.cis.syr.edu
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads