Wie erstellt man rückwärtskompatible dynamische Verknüpfungen?

8

Es scheint, dass glibc 2.14 eine neue Version von memcpy eingeführt hat (um Fehler 12518 zu beheben) . Programme, die gegen glibc 2.14+ kompiliert wurden, enthalten dann eine dynamische Verbindung zu memcpy@GLIBC_2.14 , was in älteren Versionen von glibc eindeutig nicht verfügbar ist.

Allerdings enthält glibc 2.14+ offensichtlich immer noch das alte memcpy@GLIBC_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 bemerkt, ich muss zugeben, dass ich nicht viel über versionierte Symbole weiß, z. B. wie man sie herstellt und wie man sie verwendet oder ob sie ELF-spezifisch sind oder als Standardbestandteil betrachtet werden sollten moderne ABIs und ich habe keine Dokumentation darüber gefunden. Gibt es gute Informationsquellen zu diesem Thema?)

    
Dolda2000 29.01.2014, 01:58
quelle

1 Antwort

3

Das kanonische Dokument zu Shared Libraries, Symbolversionierung und verwandten Themen ist Ulrich Dreppers Ссылка .

Um einen Verweis auf ein älteres Symbol zu erstellen, müssen Sie einen Header finden, der es deklariert, und dann eine Assembler-Anweisung verwenden:

%Vor%

Beachten Sie, dass sich das "nm" der kompilierten ausführbaren Datei auf die erwartete vorherige ABI-Implementierung von nftw@GLIBC_2.3.3 bezieht. (Versuchen Sie nicht, dieses Programm auszuführen - die tatsächliche nftw (3) -Funktionssignatur ist anders.)

    
fche 29.01.2014 03:20
quelle