[gcc] Kompilieren und linken eines _einzigen_ Binary von suse 8.2 bis 10.2?

Andre Heine <[email protected]>
Newsgroups gmane.linux.suse.programming
Organization none
Message-ID <[email protected]>
Hallo Liste,

mich plagt hier ein "eigentlich" alt bekanntes Problem:

Auf der Arbeit liefern wir ein C/C++ Programm
an unsere Kunden aus.

Unsere Kunden haben von Suse 8.2 bis 10.2 so ziemlich jede Version
dazwischen.

Als Compiler benutzen wir einen selbst kompilierten gcc 3.3.5...

Die einzige "statisch" hinzugelinkte Komponenten ist eine QT 3.3.8 enterprice
Version. Alles andere wird dynamisch aus der jeweiligen Distri benutzt. 
(ARRRRGGGHHH...)

Also die jeweiligen "shared object files" aus dem System. 

Bislang hatte das wohl scheinbar immer irgendwie funktioniert. 
(na ja, nicht immer. Einige Kunden klagen über undefinierbare Probleme,
welche wir hier nicht nachvollziehen können.)

Ich hatte mal gelernt, das man immer gut beraten ist ein Programm
auf __jeder__ Distri zu kompilieren, für die ich mein Programm ausliefern
möchte.
So kann ich gefahrlos gegen die dynamischen Libs aus den
jeweiligen Systemen linken...

Was natürlich den Aufwand distributionsabhängiger Pakete mit sich bringt... 

Andernfalls muss ich alle Komponenten (libs, etc) statisch dazulinken. So 
könnte ich ein einziges grosses Binary für unterschiedliche Distri's 
benutzen.

Grundsätzlich bin ich der Meinung das ich alle Komponenten mit dem selben 
Toolchain bilden bzw. Kompilieren muss.

EGAL, ob nun dynamisch oder statisch gelinkt...

Schlimm meiner Meinung auch, dass wir distccd benutzen, dieser ist wiederum 
auf Maschinen mit unterschiedlichen Distris zuhause. Klar alle benutzen den 
selben Compiler (was ja sein muss!!!), aber diverse Libs werden aus dem 
System benutzt und die sind bestimmt nicht alle mit dem selben gcc kompiliert 
worden.

Jetzt benötigen wir einen Compiler ab Version 3.4, dieser bringt nun keine 
libstdc++.so.5 sondern die Version "6" mit. Diese Version wiederum
bringt schon meine Suse 10.2 mit. 

Welche linke ich denn nun? Version der Distri oder Version  vom Compiler?

Und was ist, wenn ich gegen Libs linke die mit 'nem anderem Compiler 
compiliert worden sind. Also ich kompiliere mit dem gcc 3.4.6 gegen libs die 
mit dem gcc 4.1.2 Compiler erstellt worden sind!?

Jetzt fängt nämlich erst der ganze Mist an. Programm kompiliert und 
einwandfrei, stürzt aber unweigerlich bei allen stellen im Programm ab, 
welche std::stringstream benutzen. 

Ganz egal ob LD_LIBRARY_PATH auf die libstdc++.s0.6 von 3.4.6 zeigt oder die 
von dem gcc 4.2.1 (suse 10.2) benutzt (/usr/lib)

Kompiliere und linke ich aber nur gegen Komponenten der Distri klappt alles 
natürlich wie erwartet fehlerfrei...

Soweit sogut, liege ich Grundsätzlich richtig?

Wenn ja, wo kann ich beweise finden. Die meine Meinung unterstützen?

Habe schon auf etliche Seiten in Wikipedia (ABI etc) verwiesen, wo definitiv 
Aussagen über unterschiedliche ABI Versionen aufmerksam gemacht wird...
gcc 3.2 -> 3.4...

Als "gentoo" Lover kenne ich das nur so. Benutze ich einen neuen Compiler,
wird alles neu kompiliert...

Hat der jemand eine Idee?

Habe ich falsche Annahmen?

Viele Grüsse

Andre

-- 
"... one of the main causes of the fall of the Roman Empire was that,
lacking zero, they had no way to indicate successful termination of
their C programs."
		-- Robert Firth
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.