Cross compiling voor Synology - Part II

Door kraades op donderdag 3 september 2015 14:44 - Reacties (7)
Categorie: Synology, Views: 4.668

In de vorige post Simon's Blog: Cross compiling voor Synology hebben we gezien hoe we een C programma kunnen cross compileren voor Synology.

Hierin staat ook aangegeven hoe je de Synology toolchain kunt installeren. Ik ga ervan uit dat je deze al hebt geinstalleerd. Net als Ubuntu zelf... :)

In deze post gaan we een programma cross compilen met behulp van het configure en make commando.

De eerste stap is om de source code te downloaden. In dit voorbeeld compileren we sysstat van Sebastien Godard.

Sysstat bevat o.a. iostat en mpstat.

iostat - Report Central Processing Unit (CPU) statistics and input/output statistics for devices and partitions.

code:
1
2
3
4
5
6
Usage: ./iostat [ options ] [ <interval> [ <count> ] ]
Options are:
[ -c ] [ -d ] [ -h ] [ -k | -m ] [ -N ] [ -t ] [ -V ] [ -x ] [ -y ] [ -z ]
[ -j { ID | LABEL | PATH | UUID | ... } ]
[ [ -T ] -g <group_name> ] [ -p [ <device> [,...] | ALL ] ]
[ <device> [...] | ALL ]


mpstat - Report processors related statistics

code:
1
2
3
4
Usage: ./mpstat [ options ] [ <interval> [ <count> ] ]
Options are:
[ -A ] [ -u ] [ -V ] [ -I { SUM | CPU | SCPU | ALL } ]
[ -P { <cpu> [,...] | ON | ALL } ]


Start voor het gemak een root sessie.
sudo su -

Download de source code en pak deze uit.
wget http://perso.orange.fr/sebastien.godard/sysstat-11.0.6.tar.xz
tar xf sysstat-11.0.6.tar.xz

Vervolgens gaan we configure en make uitvoeren.

In de DSM Developer Guide staan een aantal voorbeelden van instellingen voor verschillende Synology modellen voor CC, LD, RANLIB, CFLAGS, LDFLAGS, host, target, build etc.

Voor de DS715 die ik heb is dit:
env CC=/usr/local/arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc \
LD=/usr/local/arm-linux-gnueabihf/bin/arm-linux-gnueabihf-ld \
RANLIB=/usr/local/arm-linux-gnueabihf/bin/arm-linux-gnueabihf-ranlib \
CFLAGS="-I/usr/local/arm-linux-gnueabihf/arm-linux-gnueabihf/sysroot/usr/include -DSYNO_ANNAPURNA_ALPINE -O2 -mfloat-abi=hard -mtune=cortex-a15 -mfpu=neon-vfpv4 -mthumb -I/usr/syno/include -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -g -DSYNO_PLATFORM=ALPINE" \
LDFLAGS="-L/usr/local/arm-linux-gnueabihf/arm-linux-gnueabihf/sysroot/lib -L/usr/syno/lib" \
./configure --host=arm-linux-gnueabihf --target=arm-linux-gnueabihf --build=i686-pc-linux --prefix=/usr/local

Dit betekent dat het configure commando wordt uitgevoerd met de juiste settings voor CC etc.

Ga naar de source directory en voer het bovenstaande commando uit.
cd sysstat-11.0.6
env CC=/usr/local/arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc \
LD=/usr/local/arm-linux-gnueabihf/bin/arm-linux-gnueabihf-ld \
RANLIB=/usr/local/arm-linux-gnueabihf/bin/arm-linux-gnueabihf-ranlib \
CFLAGS="-I/usr/local/arm-linux-gnueabihf/arm-linux-gnueabihf/sysroot/usr/include -DSYNO_ANNAPURNA_ALPINE -O2 -mfloat-abi=hard -mtune=cortex-a15 -mfpu=neon-vfpv4 -mthumb -I/usr/syno/include -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -g -DSYNO_PLATFORM=ALPINE" \
LDFLAGS="-L/usr/local/arm-linux-gnueabihf/arm-linux-gnueabihf/sysroot/lib -L/usr/syno/lib" \
./configure --host=arm-linux-gnueabihf --target=arm-linux-gnueabihf --build=i686-pc-linux --prefix=/usr/local

Voer dan make uit zodat de programma's worden gecompileerd.
make

Een make install kun je beter niet uitvoeren omdat de binaries niet compatible zijn met je Linux platform (hier: Ubuntu) en alleen draaien op de betreffende Synology.

Kopieer de binaries iostat en mpstat naar de Synology en kijk of ze werken.
DS715> ./iostat
Linux 3.2.40 (DS715)    09/03/2015      _armv7l_        (4 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.23    0.10    0.30    1.38    0.00   97.99

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda               2.91       809.03       218.10  962115216  259363756
sdb               2.76       733.01       218.10  871700275  259363756
mtdblock0         0.00         0.00         0.00         15          0
mtdblock1         0.00         0.00         0.00         15          0
mtdblock2         0.00         0.00         0.00         15          0
mtdblock3         0.00         0.00         0.00         15          0
mtdblock4         0.00         0.00         0.00         15          0
mtdblock5         0.00         0.00         0.00         15          0
md0               0.12         1.15         0.22    1362306     262760
md1               0.00         0.00         0.00       2160         32
sdq               0.00         0.02         0.03      23485      31300
sdr              11.61         0.70      1364.81     834969 1623050143
md2               6.68      1540.88       217.81 1832436940  259022736
dm-0              0.00         0.00         0.00       2127          0
dm-1              6.68      1540.88       217.81 1832430957  259022736

DS715> ./mpstat -P ALL
Linux 3.2.40 (DS715)    09/03/2015      _armv7l_        (4 CPU)

02:33:48 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
02:33:48 PM  all    0.23    0.10    0.25    1.38    0.00    0.05    0.00    0.00    0.00   97.99
02:33:48 PM    0    0.24    0.36    0.49    2.47    0.00    0.08    0.00    0.00    0.00   96.36
02:33:48 PM    1    0.26    0.01    0.20    1.12    0.00    0.04    0.00    0.00    0.00   98.36
02:33:48 PM    2    0.21    0.01    0.17    0.98    0.00    0.03    0.00    0.00    0.00   98.59
02:33:48 PM    3    0.21    0.01    0.16    0.95    0.00    0.03    0.00    0.00    0.00   98.63
DS715>

In de volgende post gaan we kijken hoe de Synology Package Toolkit werkt.

Cross compiling voor Synology

Door kraades op woensdag 12 augustus 2015 09:05 - Reacties (6)
Categorie: Synology, Views: 5.392

In deze post gaan we een C programma compileren op Ubuntu waarvan de output geschikt is om op je Synology te draaien.

Uit de DSM developer guide:
To compile an application for the Synology DiskStation, a compiler that runs on Linux PC is required in order to generate an executable file for the Synology DiskStation. This compiling procedure is called "cross compiling" and the set of compiling tools (compiler, linker, etc.) used to compile the application is called a "tool chain".

We maken gebruik van Ubuntu 14.04.3 LTS 64-bit te downloaden van http://www.ubuntu.com/download/desktop.

Installeer Ubuntu met default instellingen. Je kunt Ubuntu fysiek of virtueel installeren. Of als live cd/usb. Dat maakt voor dit niet zoveel uit.

Installeer hierna de volgende packages:
sudo apt-get install lib32z1 lib32ncurses5 lib32bz2-1.0 lib32stdc++6

Dit is niet nodig als je voor Ubuntu 32-bit kiest.

Download de juiste tool chain voor je Synology van http://sourceforge.net/projects/dsgpl/files/.

Controleer op de Synology welk model je hebt.
DS715> uname -a
Linux DS715 3.2.40 #5592 SMP Wed Jul 29 14:39:17 CST 2015 armv7l GNU/Linux synology_alpine_ds715
DS715>

Ik draai DSM 5.2 en heb een "synology_alpine_ds715" en kies dus de volgende tool chain:
  • DSM 5.2 Tool Chains
  • Annapurna Alpine Linux 3.2.40
  • alpine-gcc472_glibc215_alpine-GPL.txz
Start een root sessie.
sudo su -

Pak de toolchain uit en zet deze in /usr/local.
tar -Jxf alpine-gcc472_glibc215_alpine-GPL.txz -C /usr/local

Hierna zijn de volgende tools beschikbaar:
root@ubuntu:~# /usr/local/arm-linux-gnueabihf/bin/arm-linux-gnueabihf-
arm-linux-gnueabihf-addr2line        arm-linux-gnueabihf-gprof
arm-linux-gnueabihf-ar               arm-linux-gnueabihf-ld
arm-linux-gnueabihf-as               arm-linux-gnueabihf-ld.bfd
arm-linux-gnueabihf-c++              arm-linux-gnueabihf-ldd
arm-linux-gnueabihf-c++filt          arm-linux-gnueabihf-ld.gold
arm-linux-gnueabihf-cpp              arm-linux-gnueabihf-nm
arm-linux-gnueabihf-elfedit          arm-linux-gnueabihf-objcopy
arm-linux-gnueabihf-g++              arm-linux-gnueabihf-objdump
arm-linux-gnueabihf-gcc              arm-linux-gnueabihf-pkg-config
arm-linux-gnueabihf-gcc-4.7.2        arm-linux-gnueabihf-pkg-config-real
arm-linux-gnueabihf-gcc-ar           arm-linux-gnueabihf-ranlib
arm-linux-gnueabihf-gcc-nm           arm-linux-gnueabihf-readelf
arm-linux-gnueabihf-gcc-ranlib       arm-linux-gnueabihf-size
arm-linux-gnueabihf-gcov             arm-linux-gnueabihf-strings
arm-linux-gnueabihf-gdb              arm-linux-gnueabihf-strip
arm-linux-gnueabihf-gfortran
root@ubuntu:~#

(de output en paden kunnen/zullen afwijken per Synology model)

De volgende stap is het compileren van een testprogramma bijvoorbeeld:

C:
1
2
3
4
5
#include <stdio.h>
main()
{
  printf("Hello World");
}


Compileer als volgt:
root@ubuntu:~# /usr/local/arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc helloworld.c -o helloworld
root@ubuntu:~#

We zien dat er een executable voor ARM wordt aangemaakt die (uiteraard) niet kan worden uitgevoerd op deze Ubuntu installatie.
root@ubuntu:~# file helloworld
helloworld: ELF 32-bit LSB  executable, ARM, EABI5 version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.31, BuildID[sha1]=7369bffdeabe1e55d9e113baf44aefd042e2d8c5, not stripped
root@ubuntu:~# ./helloworld
-su: ./helloworld: cannot execute binary file: Exec format error
root@ubuntu:~#

Kopieer de executable naar de Synology en probeer opnieuw.
DS715> ./helloworld
Hello World
DS715>


Op deze manier kun je dus programma's compileren zonder dat je hiervoor iets op de Synology hoeft te installeren en/of uit te voeren.

Later meer over make/install en Synology packages...

N.B.

Als je via een terminal emulator zoals PuTTY verbinding wil maken dan kun je op Ubuntu de volgende package installeren:
sudo apt-get install openssh-server

Kopieren naar de Synology kan eenvoudig door gebruik te maken van scp.
root@ubuntu:~# scp helloworld admin@DS715:/tmp
admin@DS715's password:
helloworld                                    100% 5351     5.2KB/s   00:00
root@ubuntu:~#