From: clu@malihh.hanse.de (Carsten Lutz)
Subject: ld - problems
Organization: malihh, Hamburg, Germany
Date: Sat, 10 Oct 1992 19:54:57 GMT

Moin !

Ich hatte heute mit ein paar Merkwuerdigkeiten des ld zu kaempfen ( unter
NeXTstep 3.0 ) :

1. Ich hatte das Problem, dass ein paar Funktionen sowohl in einer Userlibrary
   als auch in der Standard-C-Library vorhanden waren. Benutzen wollte ich
   die Funktionen der Userlib, die der stdlib sollten ignoriert werden. Ohne
   weitere flags bricht der ld ja einfach mit der Fehlermeldung "multiply
   defined symbols" ab.

   Das einzige, was mir dazu einfaellt, ist das -m flag: 

     -m   Only print a warning for multiply defined symbols and
          don't treat them as a hard error.  The first symbol is
          used for linking and is the value of the symbol in the
          symbol table.  The other symbols by the same name may
          be used in the resulting output file through local
          references.  This can still produce a resulting output
          file that is in error.  This flag's use is strongly
          discouraged.

   Damit erreiche ich im Prinzip das, was ich will. Allerdings ist das
   Flag ja "strongly discouraged". Gibt es einen eleganteren Weg ?

   So ganz funktioniert das ganze aber trotzdem nicht. Laut manpage
   (s.o.) bekommt -m kein weiteres Argument. Aber irgendwie beeintraechtigt
   es nachfolgende Argumente: (test.c ist ein einfaches hello world)

   /usr/users/clu/c (59) > make test
   cc   test.c  -o test					# OK
   /usr/users/clu/c (60) > cc -c test.c			# auch OK
   /usr/users/clu/c (61) > cc -o test test.o		# funktioniert auch
   /usr/users/clu/c (62) > rm test
   /usr/users/clu/c (63) > cc -m -o test test.o		# jetzt mit -m
   /bin/ld: Can't open: test (No such file or directory, errno = 2)

   aber:

   /usr/users/clu/c (64) > cc -o test test.o -m
   /usr/users/clu/c (65) > 

   Tja, das scheint mir ein bug zu sein. Oder uebersehe ich was ?
   ( Kann mal jemand kontrollieren, ob das unter 2.1 genauso ist ? )

2. Mir ist etwas schleierhaft, wann man Executables im object-Format linken
   kann und wann man zwingend das execute-Format benutzen muss, weil das
   Symbol _mh_execute_header benoetigt wird. Dieses Symbol wird vom ld
   erzeugt, wenn ein Programm im execute-Format ( default ) gelinkt wird.
   Beim object-Format kann das Symbol ( naeheres siehe ld-man ) nicht erzeugt
   werden.

   Es ist kein Problem, ein einfaches helloworld mit -object zu linken. ( BTW:
   unter NS3.0 ist das binary dann immernoch 30K gross, unter 2.1 waren es
   nur ca. 2K !!! ). Als ich jedoch den elm2.4 mit -object linken wollte,
   beschwerte sich ld, dass _mh_execute_header als Symbol fehlt ( wird ja
   auch nur bei -execute erzeugt ). Stellte sich nur die Frage, wieso in aller
   Welt dieses Symbol benoetigt wird. Es ist ja sehr Mach-spezifisch, was
   man vom elm wohl nicht sagen kann. Eine Compilation mit 
   -y__mh_execute_header bringt folgendes Resultat:

   [...]
   /lib/libsys_s.a(getsecbyname.o) reference to undefined __mh_execute_header
   /lib/libsys_s.a(getmachhead.o) reference to undefined __mh_execute_header
   /lib/libsys_s.a(getsegbyname.o) reference to undefined __mh_execute_header
   [...]

   Aha, also mal mit nm in sys_s nachgesehen, welche Funktionen sich in diesen
   Files verstecken:

getsecbyname.o:
050026f6 A _getsectbyname 
050026fc A _getsectbynamefromheader ( memory_funcs.o )
05002702 A _getsectdata
05002708 A _getsectdatafromheader ( objc-class.o objc-runtime.o objc-load.o
					Protocol.o )
0500270e A _getsectdatafromlib 

getmachhead.o:
0500264e A _getmachheaders ( objc-runtime.o Protocol.o )

getsegbyname.o:
05002714 A _getsegbyname ( librld.o )

   Dazu gibt's manpages, die zwar die Funktion beschreiben, mir aber nicht
   weiterhelfen. Die Angaben in Klammern sind die Objectfiles in sys_s, in
   denen Funktionen enthalten sind, die die vorstehenden Funktionen
   benoetigen ( wieder mittels -yXXX rausgefunden ).

   An dieser Stelle hatte ich keine Lust mehr zur Detektivarbeit. Hat jemand
   eine Ahnunh, wann mb_execute_header benoetigt wird ? Wie kommen eigentlich
   die objc-Dinger in meinen elm ? Sehr merkwuerdig. Ich sollte auch noch
   erwaehnen, dass in der elm-Doku fuer NS2.1 ein Linking mit -object 
   empfohlen wird, es scheint also an 3.0 zu liegen.

verwirrt,
		Carsten


   

-- 
* Carsten Lutz, Rellingen, FRG / clu@malihh.hanse.de ( NeXTmail accepted )  *
*   Voice : +49 4101 512493  Fax: +49 4101 27757  Traily : +49 4101 22306   *
*   "Geh mir ein bischen aus der Sonne" - Diogenes                          *