help-gplusplus
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

shared library linking mystery


From: Ulrich Lauther
Subject: shared library linking mystery
Date: Tue, 17 Apr 2007 16:21:18 +0000 (UTC)

I have these two sources,
a.C:
#include <stdio.h>
void a() {
  printf("a called \n");
}

and b.C:
#include <stdio.h>
void foo();
typedef void (*VoidVoid)();
void b() {
  foo();
  /*
  VoidVoid f = foo;
  printf("%p\n",f); // disallow optimizing f away
  */
}

and compile them into a shared lib:
g++ -c -fPIC *.C
g++ -shared -fPIC -o ab.so a.o b.o

now I write an application that uses the lib ab.so, but not the
undefined function foo():

application.C:
void a();

int main() {
  a();
  return 0;
}

now I link the application:
g++ -o app application.o -Wl,-R.  ab.so 
-Wl,--unresolved-symbols=ignore-in-shared-libs

and run it:
./app

Everything works fine.
So far, so good.

Now I activate the commented lines in b.C, i.e., I take the address of foo().
Linking still works, but when I run app,
I get:
app: relocation error: ./ab.so: undefined symbol: _Z3foov

So, what is the difference between a call to foo() and taking its address,
from the linkers point of view?
Both statements are of course not executed when running app, as b() is never 
called.

This was done with gcc version 4.1.0, GNU ld version 2.17.

Any explanation?
-- 
        -ulrich lauther

[nosave]
----------------------------------------------------------------------------
Ulrich Lauther          ph: +49 89 636 48834 fx: ... 636 42284
Siemens CT SE 6         Internet: Ulrich.Lauther@siemens.com

Siemens Aktiengesellschaft:
Vorsitzender des Aufsichtsrats: Heinrich v. Pierer;
Vorstand: Klaus Kleinfeld, Vorsitzender; Johannes Feldmayer, Joe Kaeser,
Rudi Lamprecht, Eduardo Montes, Juergen Radomski, Erich R. Reinhardt,
Hermann Requardt, Uriel J. Sharef, Klaus Wucherer
Sitz der Gesellschaft: Berlin und Muenchen
Registergericht: Berlin Charlottenburg, HRB 12300, Muenchen, HRB 6684
WEEE-Reg.-Nr. DE 23691322


reply via email to

[Prev in Thread] Current Thread [Next in Thread]