Code: Select all
a (main calls c and d)
|
+-----------+-----------+
| |
libc.so (c calls b) libd.so (d calls b)
| |
| |
libb1.a libb2.a
Ich habe erwartet, dass, wenn die Funktionen {c,d} in lib{c,d}.so b aufrufen, sie jeweils die Version aufrufen würden, die statisch mit sich selbst verknüpft war.
Das Ergebnis war jedoch unerwartet: Zur Laufzeit verhält es sich immer so, als ob nur eine einzige Version von b existiert.
Meine Frage lautet:
Ist dieses Verhalten deterministisch?
Unabhängig davon, wie viele doppelte Definitionen mit demselben Namen existieren und unabhängig von der verwendeten Verknüpfungsmethode (dynamisch, statisch usw.), wird zur Laufzeit immer nur eine davon ausgewählt?
Gewährleisten der Linker und der Loader immer dieses Verhalten?
(Ich entschuldige mich für meinen Mangel an Wissen über diese Low-Level-Details.)
Unten finden Sie den prägnanten Testcode:
- Header:
Code: Select all
// b.h #include std::string b(const std::string& s);Code: Select all
// c.h #include std::string c();Code: Select all
// d.h #include std::string d(); - Quellen:
Code: Select all
// a.cpp #include #include "c.h" #include "d.h" int main() {std::cout
Mobile version