Re: Undefinded symbol

From: J Wunsch <j(at)uriah.heep.sax.de>
Date: Thu, 11 Nov 1999 20:25:21 +0100

As Alexander Langer wrote:

> HU?
> Das war bei mir bis jetzt immer voellig egal:

Dann hast Du's nur noch nie bemerkt.

> alex:~ $ cc --shared -o libtestlib.a testlib.c

Die hättest Du besser .so nennen sollen...

> alex:~ $ cc -o testlibuse libtestlib.a testlibuse.c

Beim Linken einer shared lib wird lediglich diese Tatsache im
Executable vermerkt, die eigentliche Symbolauflösung geschieht erst
zur Laufzeit (teilweise jedenfalls, ein prinzipieller Test auf gar
nicht aufgelöste Symbole erfolgt bereits am Ende des Linkvorganges).

Wäre libtestlib.a statisch gewesen, hätte es geknallt:

$ cc -o testlibuse -L. -ltestlib testlibuse.c
/tmp/ccw52450.o: In function `main':
/tmp/ccw52450.o(.text+0x4): undefined reference to `bla'

Man sollte also besser nochmal mit statischem Linken gegentesten...

> > Die Libs müssen immer als letztes stehen.
> > cc -o testpg -I... -L... testpq.c -lpq
>
> Wo steht das?
> SYNOPSIS
> gcc [ option | filename ]...

Man pages sind, gerade bei so einem Werk wie gcc, nicht ein und alles.

Erste Antwort: es war (in Unix) schon immer so. :-)

Zweite Antwort: Posix sagt, daß das so sein soll. :-))
(Wobei das ganz sicher mit der ersten Antwort verknüpft ist, Posix
hat ja an vielen Stellen den `state of the art' aufgeschrieben.)

 A.1 c89 - Compile Standard C programs

 A.1.1 Synopsis

 c89 [-c] [-D name[=value]] ... [-E] [-g] [-I directory] ...
      [-L directory] ... [-o outfile] [-O] [-s] [-U name] ... operand
      ...

[...]
     - The -l library operands have the format of options, but their
       position within a list of operands affects the order in which
       libraries are searched.
[...]
    -l library (The letter ell.) Search the library named:

                      liblibrary.a

                A library shall be searched when its name is encountered,
                so the placement of a -l operand is significant. Several
                standard libraries can be specified in this manner, as
                described in A.1.7. Implementations may recognize
                implementation-defined suffixes other than .a as denoting
 

Dritte Antwort: RTFInfopages (``info gcc'')

`-lLIBRARY'
     Search the library named LIBRARY when linking.

     It makes a difference where in the command you write this option;
     the linker searches processes libraries and object files in the
     order they are specified. Thus, `foo.o -lz bar.o' searches
     library `z' after file `foo.o' but before `bar.o'. If `bar.o'
     refers to functions in `z', those functions may not be loaded.

-- 
cheers, J"org
joerg_wunsch@uriah.heep.sax.de -- http://www.sax.de/~joerg/ -- NIC: JW11-RIPE
Never trust an operating system you don't have sources for. ;-)
To Unsubscribe: send mail to majordomo(at)de.FreeBSD.org
with "unsubscribe de-bsd-questions" in the body of the message
Received on Thu 11 Nov 1999 - 20:50:17 CET

search this site