Kompilieren mit Scratchbox

Aus NAS-4220

Wechseln zu: Navigation, Suche

Diese Anleitung beschreibt, wie man eine Cross-Compiler (scratchbox) auf einem normalen Linux-Rechner einrichten muss, um eigene Programme für die NAS kompilieren zu können.

Als Ausgangssystem gehen wir von einem Debian GNU/Linux aus.

Als root führen wir den folgenden Befehl aus, um das Paketrepository von scratchbox unserem lokalen System bekannt zu machen:

  delta:~# echo 'deb http://scratchbox.org/debian/ stable main' >>/etc/apt/sources.list

Als nächstes aktualisieren wir die lokalen Pakete und installieren scratchbox:

  delta:~# apt-get update && apt-get install scratchbox-core scratchbox-devkit-debian scratchbox-libs scratchbox-devkit-cputransp scratchbox-toolchain-arm-linux-ct401-2.3

Die Frage, ob die Pakete ohne Verifikation installiert werden sollen, bejahen wir.

Die Fragen nach der Scratchbox-Gruppe und ob sie angelegt werden soll beantworten wir ebenfalls mit yes. Wir verneinen die Frage, ob wir einen Benutzer für Scratchbox auswählen wollen.

Wir richten unseren Benutzer (hier: pr) für die Benutzung von Scratchbox ein:

  delta:~# /scratchbox/sbin/sbox_adduser pr

und bekommen die Ausgabe:

  Add user pr to group 'sbox'? [yes/no] (yes): yes
  Adding user `pr' to group `sbox' ...
  Adding user pr to group sbox
  Done.
  Scratchbox user account for user pr added

Nun loggen wir uns als der entsprechende Benutzer neu(!) ein und führen folgenden Befehl aus:

  pr@delta:~$ /scratchbox/login

Wir werden mit der Lebensgeschichte von Scratchbox und einem neuen Prompt begrüßt:

  You dont have active target in scratchbox chroot.
  Please create one by running "sb-menu" before continuing
  
  
  Welcome to Scratchbox, the cross-compilation toolkit!
  
  Use 'sb-menu' to change your compilation target.
  See /scratchbox/doc/ for documentation.
  
  sb-conf: No current target
  [sbox-: ~] >

Nun ist es an der Zeit, einige Einstellungen vorzunehmen:

  [sbox-: ~] > sb-menu

Wir wählen Setup, NEW und geben einen Namen für unser neues Target ein, beispielsweise NAS. Ein Target ist unter scratchbox eine Sammlung von Einstellungen, sprich eine Art Profil. Wir werden aufgefordert, einen Compiler zu wählen und nehmen arm-linux-ct401-2.3. Nun wählen wir als Devkit cputransp, dann DONE. Dies ermöglicht uns später, die kompilierten Anwendungen auf unserem Entwicklungssystem auszuführen, obwohl die Architektur des Binaries (arm) nicht mit der des Hosts (i386) übereinstimmt. Dies ist insbesondere wichtig, da größere Pakete die GNU Autotools benutzen und überprüfen, ob ein Binary erstellt und ausgeführt werden kann.

Die folgende Frage nach der CPU-transparency method beantworten wir mit qemu-arm-0.8.2-sb2. Wir wählen No im Rootstrap-Dialog, Yes und OK bei der Frage nach der Installation von Dateien. Nun selektieren wir das erstellte Target mit Yes.

Unser Prompt zeigt sich nun in einem neuen Gewand, wobei NAS der Name unseres Targets ist:

  [sbox-NAS: ~] >

Nun ist es an der Zeit, unser erstes Programm für die NAS zu kompilieren. Wir starten einen Editor:

  [sbox-NAS: ~] > nano hellonas.c

und fügen folgende Schöpfung der Programmierkunst ein:

  #include <stdio.h>
  main()
  {
      printf ("Hello NAS!\n");
  }

Mit Strg-X, Yes und Enter speichern wir das Programm und beenden den Editor.

Wir kompilieren den Source mit

  [sbox-NAS: ~] > cc hellonas.c -o hellonas

und prüfen mit

  [sbox-NAS: ~] > ./hellonas

ob die CPU-Transparency funktioniert. Wir bekommen die erwartete Ausgabe:

  Hello NAS!

Das erstellte Binary können wir nun auf die NAS verschieben und dort ausführen. In meinem Fall geschieht dies per scp und das Ausführen per ssh, was das SSH-Server-Paket auf der NAS erfordert:

  [sbox-NAS: ~] > scp hellonas root@nas1:~
  root@nas1's password:
  hellonas                                      100% 7122     7.0KB/s   00:00
  [sbox-NAS: ~] > ssh root@nas1
  root@nas1's password:
  
  
  BusyBox v1.00-rc3 (2007.08.08-11:22+0000) Built-in shell (ash)
  Enter 'help' for a list of built-in commands.
  
  nas1> ./hellonas
  Hello NAS!
  nas1>

Ich wünsche viel Erfolg beim Bauen von neuen Paketen.


Ubuntu 8.04 (Hardy Heron)

Die obige Anleitung funktioniert auch sehr gut für Ubuntu 8.04 (Hardy Heron). Es müssen jedoch zwei Dinge vor dem Ausführen von hellonas durchgeführt werden:

  echo 0 > /proc/sys/vm/vdso_enabled
  echo 4096 > /proc/sys/vm/mmap_min_addr

Das erste, um diese Meldung zu unterdrücken:

  Inconsistency detected by ld.so: rtld.c: 1192: dl_main: Assertion `(void *) ph->p_vaddr == _rtld_local._dl_sysinfo_dos' failed!

Das zweite, um diese zu verhindern:

  mmap: Permission denied

Der Default von 65535 reicht nicht!

Nicht vergessen, das auch persistent zu machen:

  vm/vdso_enabled = 0
  vm/mmap_min_addr = 4096

in

  /etc/sysctl.conf

und aktivieren mittels:

  sysctl -p

Die Hilfe zu den Fehlermeldungen kam hierher :-)

Persönliche Werkzeuge
Andere Sprachen