Wie werden externe Symbole aufgelöst?

10

Ich habe zwei Dateien 37064544_p1.cpp & amp; 37064544_p2.cpp mit dem gleichen Inhalt wie unten gezeigt:

%Vor%

Ich habe sie mit

kompiliert %Vor%

und fügte sie mit

zu einem Archiv hinzu %Vor%

Und

%Vor%

gibt mir:

%Vor%

und

%Vor%

gibt mir

%Vor%

Ich habe einen Treiber, der die Funktion _Z3addii aufruft, die mit

kompiliert wird %Vor%

Ergebnis ist

%Vor%

Fragen

  1. Wie ist das Symbol% ​​co_de% aufgelöst?

    • Ist es nach Archivindex?
    • Entspricht es der Reihenfolge, in der wir das Archiv mit _Z3addii ?
    • füllen?
  2. Wie kann ich diese Reihenfolge ändern?

  3. Wie kann ich verhindern, dass ar doppelte Symbole hat?

Compiler: g ++ 4.6.3

    
sjsam 06.05.2016, 06:29
quelle

1 Antwort

2
  

Wie wird das Symbol _Z3addii aufgelöst?

Die Implementierung ist frei, zu tun, was immer Sie wollen, Sie verletzen die eine Definitionsregel .

Realistisch gesehen hört es nach der ersten Übereinstimmung auf, nach einem bestimmten Symbol zu suchen, das vermutlich der Reihenfolge folgt, in der die Dateien in das Archiv eingefügt wurden.

  

Wie kann ich diese Reihenfolge ändern?

Mit ar können Sie die Modifizierer a (after) und b (before) verwenden, um Objektdateien im Archiv zu positionieren, wenn Sie sie einfügen. Trotzdem verletzen Sie das ODR.

  

Wie kann ich verhindern, dass ar doppelte Symbole hat?

Soweit ich weiß, ist ar relativ dumm und aus gutem Grund, da einige Sprachen identische Symbole zulassen, weshalb Sie beim Verknüpfen mit dem Archiv keine Fehler haben (keine Diagnose ist für ODR-Verstöße erforderlich).

Sie können ld entweder zwingen, das gesamte Archiv zu lesen

%Vor%

Oder Sie können eine Teilverknüpfung anstelle eines herkömmlichen Archivs ausführen, die Ihnen einen Fehler anzeigt, wenn Duplikate vorhanden sind

%Vor%     
user657267 06.05.2016 07:36
quelle

Tags und Links