2014-01-29 22 views
8

Es scheint, dass glibc 2.14 eine neue Version von memcpy eingeführt hat (um bug 12518 zu beheben). Programme, die gegen glibc 2.14+ kompiliert werden, enthalten dann eine dynamische Verbindung zu [email protected]_2.14, die in älteren Versionen von glibc eindeutig nicht verfügbar ist.Wie erstellt man rückwärtskompatible dynamische Verknüpfungen?

Allerdings enthält Glibc 2.14+ offensichtlich immer noch das alte [email protected]_2.2.5 Symbol für die Abwärtskompatibilität. Ich möchte in der Lage sein, einige Programme so zu kompilieren, dass sie mit älteren glibc-Versionen binär kompatibel sind. Wie würde man ein Programm auf einem System mit glibc 2.14+ kompilieren, so dass es diese alte Symbolversion verwendet? Wenn das Verfahren notwendigerweise Compiler-spezifisch ist, verwende ich GCC (aber es wäre schön zu wissen, wie man es auch auf anderen Compilern macht).

(Nebenbei, ich muss zugeben, weiß nicht viel über versionierte Symbole, wie sie zu produzieren und wie sie zu verwenden sind oder ob sie ELF-spezifisch sind oder als Standard-Teil betrachtet werden sollten von modernen ABIs, und ich habe es nicht geschafft, eine Dokumentation darüber zu finden.Es gibt gute Quellen für Informationen zu diesem Thema?)

Antwort

3

Das kanonische Dokument über gemeinsam genutzte Bibliotheken, Symbol-Versionierung und verwandte Probleme ist Ulrich Drepper http://www.akkadia.org/drepper/dsohowto.pdf .

extern void nftw_old (int) ; 
asm (".symver nftw_old,[email protected]_2.3.3"); 
void main() 
{ 
    nftw_old(0); 
} 

Beachten Sie, dass die „nm“ der kompilierte ausführbare Datei auf das bezieht:

Um einen Verweis auf ein älteres Symbol zu machen, müssten Sie einen Header finden, die es erklärt, dann eine Assembler-Direktive erwartete vorherige ABI [email protected]_2.3.3 Implementierung. (Versuchen Sie nicht, dieses Programm auszuführen - die tatsächliche nftw (3) -Funktionssignatur ist anders.)

+0

Ist das der einzige Weg, es zu tun? Es wäre schön, den Quellcode nicht ändern zu müssen, nur um die Verknüpfung zu ändern. Gibt es keine Möglichkeit, dem Linker mitzuteilen, dass er eine Symbolversion auswählen soll, wenn er die endgültige ausführbare Datei erstellt, anstatt dies auf Quellcodeebene zu tun? – Dolda2000

+0

Danke für den Link, übrigens! – Dolda2000

+0

Das ist ein Weg, um es manuell zu machen, auf der Ebene der Symbolversionierung, was ich dachte, dass Sie danach waren. Der einfachste Weg besteht darin, eine ältere Softwareinstallation mit den alten .a/.so/.h-Dateien zu erhalten und sie zu kompilieren/zu verlinken. – fche