Instruktaż/Tutorial Kompilowanie oprogramowania dla QNAP używając Cross Compiler Toolchain

Silas Mariusz

rm -rf /
Help us, GOD!
5 Kwiecień 2008
10 168
31
2 248
153
39
Nowy Sącz
forum.qnap.net.pl
QNAP
TS-x77
Ethernet
1 GbE
QNAP for Professionals & Developers
Cross Compiler na maszynie wirtualnej

cross toolchain Kompilator skrośny (ang.cross compiler) – kompilator zdolny do generowania kodu maszynowego dla platformy procesora innej niż ta, na której wykonuje się kompilator skrośny. Jest on niezbędny do kompilowania kodu na platformę, do której nie ma bezpośredniego dostępu lub dostęp jest znacznie utrudniony. Ma to miejsce szczególnie w przypadku programowania dla systemów wbudowanych.

cross compiler Kompilacja skrośnakompilacja wykonywana na innej architekturze procesora niż docelowa (np. program komputerowy dla docelowej architektury ARM kompilowany na architekturze x86).

Istnieje także rodzaj kompilacji skrośnej (skrótowo nazwany „Canadian Cross”), polegający na wykorzystaniu trzech architektur: na architekturze A kompilowany skrośnie jest kompilator dla architektury B i za jego pomocą kompilowany jest skrośnie program na docelową architekturę C.

[Wymagane]
  • VMware Workstation lub Virtualization Station uruchomione na serwerze QNAP
  • Znajomość systemu Linux

[How-To]
  1. Pobierz maszynę wirtualną: http://pool.qnapclub.pl/development/toolchains/cross/x86/ova/Build Server Ubuntu 7.10.ova

  2. Zaimportuj maszynę do VMware lub Virtualization Station.

  3. Upewnij się, że karta sieciowa w maszynie wirtualnej przełączona jest do połączenia mostkowego (Bridge).
    upload_2016-3-10_22-59-54.png


  4. Uruchom maszynę.
    upload_2016-3-10_23-0-24.png


  5. Zaloguj się jako:
    login: qnap
    password: qnapqnap

  6. Wykonaj:
    Bash:
    sudo passwd root
    ... aby ustalić hasło roota.

  7. Następnie zaloguj się na roota używając wcześniej wprowadzone hasło:
    Bash:
    su root

  8. Wyedytuj plik /etc/network/interfaces, aby wprowadzić ustawienia adresu IP maszyny wirtualnej.

    W tym celu wykonaj polecenie:
    Bash:
    vi /etc/network/interfaces

    upload_2016-3-10_23-4-22.png


  9. Wyedytuj plik według opisanego poniżej schematu:
    upload_2016-3-10_23-7-36.png
    • address podaj statyczny adres IP maszyny wirtualnej, która będzie dostępna w Twojej sieci
    • netmask podaj maskę swojej sieci
    • network określ sieć lan używając adresu .0 dla Twojej sieci. W przypadku maski przykład:
      • 255.255.255.0 podaj ip.ip.ip.0
      • 255.255.0.0 podaj ip.ip.0.0
      • 255.0.0.0 podaj ip.0.0.0
      • ...
    • gateway zdefiniuj bramę wychodzącą "na świat"
    • dns-nameservers podaj adres IP serwera DNS. Jeśli Twój router pełni funkcje serwera DNS, podaj jego adres IP. Jeśli nie wiesz, to podaj DNS TPSA 194.204.159.1 lub Google 8.8.8.8
    • dns-search określ swoją lokalną domenę. Jeśli nie wiesz, to wpisz local.ulubiona_swoja_nazwa.ltd
  10. Aby zapisać zmiany w edytowanym pliku, naciśnij ESC, następnie : , wpisz: wq i potwierdź przyciskiem Enter

  11. Edytuj plik /etc/resolv.conf, aby określić serwery DNS. W tym celu wydaj polecenie:
    Bash:
    vi /etc/resolv.conf

  12. Wprowadź adres serwera DNS:
    Kod:
    nameserver 10.100.200.1
    upload_2016-3-10_23-16-6.png


    Może to być wspominany powyżej adres routera, adres DNS TPSA oraz Google. Możesz podać kilka serwerów DNS. W tym celu wpisz:
    Kod:
    nameserver 194.204.159.1
    nameserver 194.204.152.34
    nameserver 8.8.8.8
    nameserver 8.8.4.4

  13. Aby zapisać zmiany w edytowanym pliku, naciśnij ESC, następnie : , wpisz: wq i potwierdź przyciskiem Enter

  14. Następnie zastosuj ustawienia restartując usługę sieci i interfejsu. Jednak najprościej, to będzie wykonując polecenie restartu całej maszyny:
    Bash:
    reboot
    upload_2016-3-10_23-20-27.png


  15. Odczekaj na ponowne uruchomienie maszyny. Od teraz będziesz mógł się połączyć do wirtualnej maszyny za pośrednictwem ulubionego klienta SSH.
    upload_2016-3-10_23-22-40.png

[Pomocne narzędzia]
Bash:
apt-get update
apt-get install mc


[Kompilowanie]
  1. Załaduj zmienne środowiskowe niezbędne do określenia cross compiler toola:
    Bash:
    source /opt/cross-project/x86-glibc-2.6.env
    . /opt/cross-project/x86-glibc-2.6.env
    upload_2016-3-10_23-27-14.png


  2. Aby rozpocząć kompilacje biblioteki lub aplikacji, zamiast standardowych:
    Bash:
    ./configure --prefix=/opt/build/qnap/x86
    make
    make install

    Wykonaj:
    Bash:
    CC=${CROSS_COMPILE}gcc AR=${CROSS_COMPILE}ar RANLIB=${CROSS_COMPILE}ranlib CPPFLAGS="-DQNAPNAS -I${TARGET_PREFIX}/include -I${TARGET_PREFIX}/usr/include" LDFLAGS="-L${TARGET_PREFIX}/lib -L${TARGET_PREFIX}/usr/lib" ./configure --prefix=${TARGET_PREFIX} --host=${TARGET}
    make
    make install

[Przykład]
(Uwaga! Na przykładzie OpenSSL, którego kompilacja jest inna niż standardowo.)
Bash:
export cross=/opt/cross-project/x86/sys-root/usr/bin/

./Configure linux-elf 386 no-threads --prefix=/opt/compiled/openssl $ARGS --openssldir=/opt/compiled/openssl no-asm

make CC="${cross}gcc" AR="${cross}ar r" RANLIB="${cross}ranlib"
make install

upload_2016-3-10_23-34-12.png


upload_2016-3-10_23-34-34.png


upload_2016-3-10_23-37-28.png
 
Powyższa instrukcja obecnie jest nieaktualna od oprogramowania QNAP QTS 4.3, który bazuje na Ubuntu 14.04 x64.
A więc aby skompilować cokolwiek na QNAP z oprogramowaniem 4.3 wystarczy przygotować środowisko na wirtualnej maszynie z oprogramowaniem Ubuntu 14.04 x64 a na nim kompilować oprogramowanie z prefixem naszej lokalizacji na QNAP.

Np. kompilując mc
Bash:
./configure --prefix=/opt/myApp
make
make install

Następnie skompilowaną aplikacje mc w tą lokalizacje wystarczy przekopiować do systemu QNAP do dokładnie tej samej ścieżki podanej w prefixie.
Jeśli pojawi się problem podczas uruchomienia z brakiem bibliotek, które są wymagane do jej uruchomienia pozostaje oczywiście kłopot w kwestii skompilowania mc do wersji statycznej. Ale!!! W większości przypadkó wymagane biblioteki zawsze możemy spróbować przekopiować z Ubuntu do naszego QNAP'a w lokalizację podanego wcześniej prefixu/lib: /opt/myApp/lib.

Czy teraz mając lib'y w w prefixie uruchomimy mc?
Nie
Przed uruchomieniem należy wyeksortować dodatkową zmienną środowiskową określającą położenie dodatkowych bibliotek w naszym systemie LD_LIBRARY_PATH, a tzn.:
Bash:
export LD_LIBRARY_PATH=/opt/myApp/lib
a następnie uruchomić ./mc będąc w katalogu /opt/myApp

Jeśli natomiast pozostają jeszcze jakiekolwiek brakujące biblioteki to wystarczy je znaleźć sprawdzając do czego mc się odnosi wpisując komende w QNAP:
Bash:
ldd -r /opt/myApp/bin/mc
 
  • Lubię to
Reakcje: killjoy
Hey!

I wanted to compile some modules but I'm facing an issue.

Kod:
# insmod ch341.ko
insmod: can't insert 'ch341.ko': invalid module format

According to the advice of this thread, I have installed Ubuntu 14.04 x64 server VM

I'm using QNAP GPL 4.3.6 and latest Crosstool x86 from sourceforge.

What I need is only compling drivers for a QNAP TS-x70 Pro under QTS 4.3.6.

What I have done

Kod:
export CROSS=/to/crosstools/folder/cross-prefix

export CXX=${CROSS}-g++                 
export LD=${CROSS}-ld                 
export AS=${CROSS}-as               
export AR=${CROSS}-ar                 
export CC=${CROSS}-gcc

cp -af /to/qnap/gpl/kernel_cfg/model/linux-4.2-x86_64.config /to/qnap/gpl/src/linux-4.2.8/.config

cd /to/qnap/gpl/src/linux-4.2

make ARCH=x86_64 CROSS_COMPILE=${CROSS}- prepare
make ARCH=x86_64 CROSS_COMPILE=${CROSS}- scripts

make M=drivers/usb/serial ARCH=x86_64 \
CROSS_COMPILE=${HOST}- \
CONFIG_USB_SERIAL=m \
CONFIG_USB_SERIAL_CH341=m \
modules

I think I am almost at my goal but I do have missing a little things...

Thanks for your help.