[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
- shared library linking mystery,
Ulrich Lauther <=