Article View: de.comp.sys.next
Article #342ld - problems
From: Carsten Lutz
Date: Sat, 10 Oct 1992 19:54
Date: Sat, 10 Oct 1992 19:54
105 lines
4930 bytes
4930 bytes
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 *
Technical Details
Message-ID:
<Bvx8nM.M83@malihh.hanse.de>Path:
arc1-ca.pugleaf.net!sparky!uunet!gatech!darwin.sura.net!Sirius.dfn.de!dct.zrz.tu-berlin.de!news.netmbx.de!news.Hamburg.Germany.EU.net!malihh!cluShow Full Headers
Complete Article Headers
Newsgroups: de.comp.sys.next Path: arc1-ca.pugleaf.net!sparky!uunet!gatech!darwin.sura.net!Sirius.dfn.de!dct.zrz.tu-berlin.de!news.netmbx.de!news.Hamburg.Germany.EU.net!malihh!clu From: clu@malihh.hanse.de (Carsten Lutz) Subject: ld - problems Message-ID: <Bvx8nM.M83@malihh.hanse.de> Organization: malihh, Hamburg, Germany Date: Sat, 10 Oct 1992 19:54:57 GMT Lines: 105