2009-07-01 2 views
0

Ich versuche, gemeinsam genutzte Bibliothek auf solaris 2.7 mit gcc 3.4.6 und zu kompilieren, die zu einer statisch verknüpften c .a und .o Dateien verbindet. Bitte beachten Sie, dass es Sun ld aus Pfad „/ usr/ccs/bin/ld“Wie man Optionen ändert, die an ld übergeben werden, ohne gcc neu zu kompilieren

Bei Verknüpfung Zeit wird mit i eine lange Liste von Symbolen bekam und folgende Fehler

ld: fatal: relocations remain against allocatable but non-writable sections 

collect2: ld returned 1 exit status 

Dann habe ich versucht zu bauen es übergibt -z textoff-Option an ld. aber ich bin immer follwing Fehler

ld: fatal: option -ztextoff and -ztext are incompatible 

ld: fatal: Flags processing errors 

Gibt es eine andere Art und Weise, wo ich brauche nicht gcc neu zu kompilieren und ändern noch die Optionen ld übergeben zu werden.

+1

Ich denke, ich habe gerade jetzt einen Weg. gcc verwendet normalerweise die Datei "specs", um Optionen, die an die generische gcc-Schnittstelle übergeben werden, an die Option für den zugrunde liegenden Assembler und Linker zu konvertieren. in gcc 3.4.6 gibt es eine Option, die wir unsere eigene "specs" Datei übergeben können. Also was ich getan habe ist, kopierte ich die Originaldatei und änderte es, um Option -ztext an sun linker nicht zu übergeben. Ich bezweifle, dass dies der richtige Weg ist, aber es hat den Zweck für jetzt gelöst, und ich kann mit meiner Arbeit fortfahren, bis ich das richtig konfigurierte gcc bekam. Abfrage ist noch offen für die bessere oder richtige Lösung. – nurxb01

Antwort

3

Die Fehler sind das Ergebnis der Verknüpfung von positionsabhängigem Code in einer gemeinsam genutzten Bibliothek. Ein solcher Code führt dazu, dass die Bibliothek nicht gemeinsam genutzt werden kann und somit RAM verschwendet wird.

Wenn Sie alle Objekte, die Sie versuchen, in die gemeinsam genutzte Bibliothek zu verknüpfen, neu erstellen können, ist die einfachste (und korrekteste) Lösung, sie alle mit Flag neu zu erstellen.

Manchmal müssen Sie jedoch wirklich Nicht-PIC-Objektcode verknüpfen, den Sie nicht in eine gemeinsam genutzte Bibliothek umwandeln können. Daher müssen Sie die Option loswerden. Fügen Sie hierzu die Option zu Ihrer Verbindungslinie hinzu.

+0

Danke !! Ja, ich bin in einer solchen Situation, und ich muss diesen statisch verknüpften Code innerhalb eines gemeinsamen Objekts verwenden. Ja "-Mimple-Text" -Option funktionierte für mich. Ich überprüfte und fand heraus, dass ich selbst in der Spec-Datei diesen Parameter geändert habe, aber die Verwendung von -mimpure-text ist der richtige Weg. Danke nochmal, es löst eines meiner langen ausstehenden Probleme. – nurxb01

0

Führen Sie die ld ausführbare Datei über die Befehlszeile (nicht über gcc) - Sie können dann übergeben, welche Parameter Sie wollen. Ich glaube nicht, dass das die zugrundeliegenden Probleme lösen wird - vielleicht möchtest du eine Frage zu ihnen stellen.

+0

@Neil: Danke, ich werde es versuchen. könnte etwas schwierig sein, da das Projekt keine Dateien hat. Also gibt es eine Möglichkeit, die von gcc übergebenen Optionen zu ändern, so dass ich ld nicht manuell aufrufen muss.(natürlich ohne es neu zu kompilieren) Sorry, aber ich habe nicht Ihren Punkt "zugrunde liegenden Problem" – nurxb01

+1

Das ist eine schreckliche Idee, und fast nie das Richtige zu tun. –

0

Verwenden Sie make oder ein anderes Build-System, um den Compiler aufzurufen?

Wenn Sie die Optionen im Build-System ändern, um den Linker während der Linkphase zu verwenden, anstatt den Compiler zu verwenden.

Schritt 1: Flaggen von gcc finden

die Option -v hinzufügen. Es macht GCC ausführlich.

CXXFLAGS + = -v

Schritt 2: Ändern der Verknüpfungsstufe explizit um das Werkzeug zu verwenden, die gcc wurde aufruft.

+0

Wir verwenden gnu make. Meinst du in der Makefile ich sollte ld und übergeben Objektdateien direkt mit entsprechenden Linker-Optionen? Kann gemacht werden, aber ich muss vorbereiten, dass die Optionsliste sehr sorgfältig an ld übergeben werden muss. Gibt es einen einfachen Weg, auf dem ich herausfinden kann, welche Optionen von gcc an ld übergeben werden. So, wenn ich ld manuell aufrufen, kann ich alle von ihnen übergeben entfernen -ztext Option. Ich versuche mit -V-Option, aber das druckt Argumente an Collect2 Dienstprogramm übergeben. Wie ich in den Kommentaren zu meiner Frage erwähnt habe, scheint die Änderung der Spezifikationsdatei in diesem speziellen Fall einfacher zu sein. – nurxb01

+0

@Martin wie in meinem Kommentar erwähnt Ich habe das gleiche übergeben -V-Flag zu GCC, und es gibt mir Argumente übergeben collect2 Dienstprogramm und nicht zu den zugrunde liegenden Sun Linker. Was ist Ihre Meinung bezüglich der Verwendung der speziellen Specs-Datei, um dies zu erreichen? – nurxb01

+0

Ich wäre eher geneigt, das Dienstprogramm coolect2 zu verwenden, anstatt eigene Spezifikationsdateien zu erstellen. –

Verwandte Themen