Hauptmenü öffnen

Vu+ WIKI β

Änderungen

Cross Compiler

5.362 Bytes hinzugefügt, 18:06, 26. Feb. 2023
keine Bearbeitungszusammenfassung
Um Binaries für Mips-Boxen auf unseren ARM-Boxen zu erstellen, müssen alle drei Pakete installiert sein.
Nach dem Download der Pakete auf eine ARM-Box können die drei Pakete mit '''<code>opkg install <Paket.ipk>''' </code> wie jedes andere Paket auch installiert werden. Nach der Installation befinden sich unter '''<code>/usr/bin''' </code> diverse Programme mit dem Präfix '''<code>mipsel-oe-linux-''' </code> und unterhalb von '''<code>/usr/mipsel-oe-linux''' </code> das "Sysroot" mit Include-Dateien und Bibliotheken, um Mipsel-Binaries zu compilieren.
== Benutzung ==
=== Schritt 3: Compilieren ===
Als nächstes soll das Programm übersetzt werden; dazu wird <code>make</code> aufgerufen(ein "make" befindet sich im Paket aus dem Download "git-make.zip" in der [https://vuplus-support.org/wbb4/filebase/index.php?entry/1098-gcc-10-2-0-f%C3%BCr-boxen-mit-arm-prozessor-4k/ Database]):
<code>make</code>
Meistens dauert der Configure-Schritt genauso lange wie das eigentliche Übersetzen des Programms. Wenn beim Übersetzen keine Fehler passiert sind, kann das Programm installiert werden.
=== Schritt 4: Installation ===
Das installiert das übersetzte Programm unterhalb von <code>/media/hdd/install</code>, wo wir noch einmal schauen können, was wir mitnehmen möchten, und was nicht.
 
Zusammengefasst:
* <code>make install</code> installiert das fertig übersetzte Programm an seinen Bestimmungs-Ort.
* <code>make install-strip</code> strippt Binaries vor der Installation und installiert sie dann an ihren Bestimmungs-Ort.
* <code>make install DESTDIR=/media/hdd/install</code> installiert die Binaries in ein anderes Zielverzeichnis <code>/media/hdd/install</code> anstatt in das dafür vorgesehene Verzeichnis.
 
Weitere nützliche Aufrufe von <code>make</code>
* <code>make V=1</code> zeigt genauer an, was beim übersetzen wirklich ausgeführt wird; manchmal unterdrücken Makefiles wie das von grep die Ausgabe, wie genau der Compiler aufgerufen wird.
* <code>make CC=mipsel-oe-linux-gcc</code> "überschreibt" den Eintrag für den Compiler im Makefile; das funktioniert bei allen Variablen im Makefile, die entsprechend deklariert wurden.
=== Schritt 5: Programm einpacken und testen ===
Das Binary kann jetzt auf eine Mips-Box kopiert werden, um endgültig sicherzustellen, dass wir hier keinen Murks produziert haben.
 
== Nützliches zu objdump, ldd und Versionierung von Shared-Libraries ==
=== objdump ===
Das folgende ist eher allgemein gehalten und gilt für alle Architekturen. Damit man im Vorfeld schon weiß, ob die auf der Zielmaschine installierten Shared-Libraries neu genug sind, damit ein Programm läuft, gibt es ein paar Hilfsmittel. Eines haben wir vorhin schon kennen gelernt: <code>objdump</code>. Der interessante Teil befindet sich im Abschnitt "Version References:".
 
<pre>
Version References:
required from libc.so.6:
0x0d696914 0x00 06 GLIBC_2.4
0x0d696915 0x00 05 GLIBC_2.5
0x0d696912 0x00 04 GLIBC_2.2
0x0d696910 0x00 03 GLIBC_2.0
0x0d696913 0x00 02 GLIBC_2.3
</pre>
 
Hier erfahren wir, dass das Binary gegen eine Sharded-Library <code>libc.so.6</code> gelinkt wurde. Um nicht bei jedem Update der Libc die Versionsnummer "6" erhöhen zu müssen, werden neue Features oder geänderte Aufrufe in der Library selber versioniert. Hier sieht man, dass Features der GLIBC_2.0 bis GLIBC_2.5 benötigt werden. Ein wenig Recherche bringt zutage, dass diese Versionsnummern auch wirklich mit den Versionen der glibc übereinstimmen. Die auf unseren Boxen vorinstallierte glibc liegt in der Version 2.21 vor und benutzt deshalb für die neuen ab dieser Version integrierten Features die interne Version GLIBC_2.21. Aktuell ist übrigens die glibc-2.37. Da die glibc zweimal jährlich aktualisiert wird, liegen hier 8 Jahre (fehlende) Entwicklung dazwischen.
 
=== ldd ===
Ein anderes sehr nützliches Tool ist <code>ldd</code>. Ohne weitere Parameter werden hier einfach die benötigten Shared-Libraries angezeigt:
<pre>
root@vusolo4k:~# ldd /usr/bin/grep
libpcre.so.1 => /usr/lib/libpcre.so.1 (0xb6f20000)
libc.so.6 => /lib/libc.so.6 (0xb6db8000)
/lib/ld-linux-armhf.so.3 (0xb6f64000)
</pre>
 
Sehr nützlich ist der Aufruf mit Parameter "-v":
<pre>
root@vusolo4k:~# ldd -v /usr/bin/grep
libpcre.so.1 => /usr/lib/libpcre.so.1 (0xb6ec0000)
libc.so.6 => /lib/libc.so.6 (0xb6d58000)
/lib/ld-linux-armhf.so.3 (0xb6eff000)
 
Version information:
/usr/bin/grep:
libc.so.6 (GLIBC_2.26) => /lib/libc.so.6
libc.so.6 (GLIBC_2.5) => /lib/libc.so.6
libc.so.6 (GLIBC_2.34) => /lib/libc.so.6
libc.so.6 (GLIBC_2.4) => /lib/libc.so.6
/usr/lib/libpcre.so.1:
libc.so.6 (GLIBC_2.4) => /lib/libc.so.6
/lib/libc.so.6:
ld-linux-armhf.so.3 (GLIBC_2.4) => /lib/ld-linux-armhf.so.3
ld-linux-armhf.so.3 (GLIBC_PRIVATE) => /lib/ld-linux-armhf.so.3
</pre>
 
Ähnlich wie bei <code>objdump</code> werden auch hier die benötigten Versionen der Shared-Libraries angezeigt.
 
Weitere Bekannte Libraries, die versioniert sind, sind unter anderem folgende:
* libstdc++ - GLIBCXX_3.4.21 gehört z.B. zur libstdc++-6.0.21 (GCC-5.1), CXXABI_1.3.12 genauso wie GLIBCXX_3.4.26 zur libstdc++-6.26 (GCC-9.1). Die Versionen können der Dokumentation von gcc entnommen werden: https://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html
* libssl und libcrypto von OpenSSL: die benötigten Versionen steht direkt in der Symboltabelle, z.B. als OPENSSL_1.0.2g
* zlib: die benötigten Versionen stehen ebenfalls direkt in der Symboltabelle der libz.so, z.B. ZLIB_1.2.12
 
=== c++filt ===
Ein letztes nützliches Tool in Zusammenhang mit Dumps und wenn man mehr über die Symbol-Tabelle eines Binaries erfahren möchte, ist <code>c++filt</code>. Mit diesem Tool können "gemanglte" Symbole wieder lesbar gemacht werden. Schauen wir z.B. in die Symbol-Tabelle von enigma2 mit <code>objdump -R /usr/bin/enigma2</code>, sehen wir viele c++-Symbolnamen, wie z.B. <code>_ZNSt3tr18__detail12__prime_listE@GLIBCXX_3.4.10</code>
 
<code>c++filt</code> kann uns das wieder lesbarer machen: <code>c++filt _ZNSt3tr18__detail12__prime_listE</code> spuckt dafür aus: <code>std::tr1::__detail::__prime_list</code>.
 
Oder:
 
<pre>root@vusolo4k:~# c++filt _ZNSt14basic_ifstreamIcSt11char_traitsIcEEC1EPKcSt13_Ios_Openmode
std::basic_ifstream<char, std::char_traits<char> >::basic_ifstream(char const*, std::_Ios_Openmode)
</pre>
<pre>root@vusolo4k:~# c++filt _ZN19CaProgramMapSectionC1EPK17ProgramMapSectionhhRKSt6vectorItSaItEE
CaProgramMapSection::CaProgramMapSection(ProgramMapSection const*, unsigned char, unsigned char, std::vector<unsigned short, std::allocator<unsigned short> > const&)
</pre>
75
Bearbeitungen