🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: comp.unix
Article #353

a.out and "ld -r"

#353
From: 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
Technical Details
Message-ID: <2301@megadon.UUCP>
Path: arc1-ca.pugleaf.net!utzoo!utgpu!news-server.csri.toronto.edu!rutgers!cs.utexas.edu!uunet!lll-winken!sun-barr!apple!altos!megadon!clp

Show Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!utzoo!utgpu!news-server.csri.toronto.edu!rutgers!cs.utexas.edu!uunet!lll-winken!sun-barr!apple!altos!megadon!clp
From: polar@top.cis.syr.edu (Polar Humenn)
Newsgroups: comp.unix
Subject: a.out and "ld -r"
Keywords: compiler linker loader assembler
Message-ID: <2301@megadon.UUCP>
Date: 27 Dec 90 00:27:37 GMT
Sender: clp@megadon.UUCP
Reply-To: uunet!top.cis.syr.edu!polar (Polar Humenn)
Organization: CIS Dept., Syracuse University
Lines: 92
Approved: clp@megadon.UUCP