libc(3) Frage

D

das.chaos

Guest
Weil es mir geradeeben (erst) aufgefallen ist, dass es das existiert. :)

Was ist lib/libc_nonshared???

Was ist der use-case fuer diese Komponente, wofuer braucht man das?!?!
 
Es geht um das leidige Thema Symbole und Runtime Linker. Unter FreeBSD wurde dieser Mechanismus eingeführt, als die von POSIX geforderten iconv()-Funktionen irgendwann in 10-CURRENT aus den Ports (GNU Iconv) ins Basissystem (Citrus Iconv) gewandert sind. Dadurch ergaben sich einige Probleme: Einmal kann der Fall auftreten, dass eine Bibliothek gegen GNU Iconv gelinkt ist und die Binary selbst gegen Citrus Iconv. Oder natürlich auch umgekehrt. Der Runtime Linker mag sowas nicht besonders, da zwei Bibliotheken die gleichen Symbole bereitstellen und es zu Kollisionen kommt. Und wie immer im Leben sind GNU Iconv und Citrus Iconv leicht inkompatibel. Welches Verhalten das richtige ist, ergibt sich aus dem Kontext und kann nicht generell entschieden werden.

Man greift nun auf einen Trick zurück. In libc haben die Symbole nicht kollidierende Namen. Also zum Beispiel __bsd_iconv() anstellte von einfach iconv(). libc_nonshared.a enthält Wrapper um die internen Symbole. Der Linker linkt implizit gegen /usr/lib/libc.so, dabei handelt es sich um ein Linkerscript:

Code:
# cat /usr/lib/libc.so 
/* $FreeBSD: releng/10.2/lib/libc/libc.ldscript 258398 2013-11-20 20:24:59Z peter $ */
GROUP ( /lib/libc.so.7 /usr/lib/libc_nonshared.a /usr/lib/libssp_nonshared.a

Jede dynamische Binary oder Bibliothek wird also gegen 3 Blibliotheken gelinkt, wenn sie gegen libc gelinkt wird:
  • /lib/libc.so.7
  • /usr/lib/libc_nonshared.a
  • /usr/lib/libssp_nonshared.a
Dadurch sind die iconv() Symbole statisch in die Binary oder Bibliothek eingebunden, der Runtime Linker hat mit ihnen nichts mehr zu kriegen. Gleichzeitg hat libc.so.8 nur die Symbole unter nicht-kollidierenden Namen, wodurch es keine Konflikte mit GNU Iconv gibt. Natürlich kann man den Mechanismus auch für andere Fälle nutzen. Zusammen mit Symbol Versioning lassen sich damit relativ elegante Hacks bauen. FreeBSD hat die Idee übrigens von der glibc des GNU-Projektes übernommen.
 
Zurück
Oben