{"id":191,"date":"2013-06-02T23:01:07","date_gmt":"2013-06-02T21:01:07","guid":{"rendered":"http:\/\/www.dlabi.cz\/?p=191"},"modified":"2013-11-08T23:51:01","modified_gmt":"2013-11-08T22:51:01","slug":"navod-jak-na-android-cross-compiling","status":"publish","type":"post","link":"https:\/\/dlabi.cz\/en\/navod-jak-na-android-cross-compiling\/","title":{"rendered":"N\u00e1vod jak na Android cross-compiling"},"content":{"rendered":"<p>Pokus\u00edm se zde vyjevit z\u00e1kladn\u00ed postup jak kompilovat (nejen) moduly pro Android. Pochopiteln\u011b tento postup nen\u00ed jedin\u00fd mo\u017en\u00fd a existuje mnoho variant t\u00e9ho\u017e. N\u00ed\u017ee popsan\u00fd postup jsem pou\u017eil j\u00e1 a dos\u00e1hl jsem usp\u011b\u0161n\u00e9ho zaveden\u00ed modul\u016f na c\u00edlov\u00e9 platform\u011b.<\/p>\n<h2><!--more--><\/h2>\n<h2><span style=\"color: #40a5e5;\">1. TOOLCHAIN<\/span><\/h2>\n<p>Nu\u017ee, nejprve budeme pot\u0159ebovat takzvan\u00fd toolchain. Je to sada v\u00fdvojov\u00fdch n\u00e1stroj\u016f, kter\u00e9 doka\u017e\u00ed kompilovat zdrojov\u00fd k\u00f3d pro c\u00edlov\u00fd procesor na PC. Proto n\u00e1zev cross ( k\u0159\u00ed\u017eov\u00e1) compiling (kompilace). Jak zjist\u00edm jak\u00fd toolchain pot\u0159ebuji? Bud pou\u017eijte Google t\u0159eba u\u017e to n\u011bkdo \u0159e\u0161il a usp\u011bl nebo zap\u00e1tr\u00e1te sami. Je t\u0159eba zjistit jak\u00fd procesor pou\u017eiv\u00e1 Va\u0161e za\u0159\u00edzen\u00ed a jak\u00fdm kompilerem bylo j\u00e1dro zkompilov\u00e1no. Tady p\u0159edpokl\u00e1d\u00e1m \u017ee m\u00e1te k dispozici linuxovou konzoli a \u017ee m\u00e1te alespo\u0148 z\u00e1kladn\u00ed znalost linuxu. Spust\u0165e na tabletu p\u0159ikaz cat \/proc\/version. Dostanete n\u011bco takov\u00e9ho:<\/p>\n<blockquote><p><strong>Linux version 3.0.8+ (weny@Ingen-cross) (gcc version 4.5.1 (Sourcery G++ Lite 200.09-50 )\u00a0 ) #47 PREEMPT Thu May 3 10:04:10 CST 2012<\/strong><\/p><\/blockquote>\n<p>Co z toho vy\u010dteme? M\u00e1me j\u00e1dro 3.0.8+, kompilov\u00e1n byl pomoc\u00ed gcc 4.5.1 . Pro ARM embedded syst\u00e9my a to je v\u011bt\u0161ina tablet\u016f s Androidem se pou\u017e\u00edv\u00e1 tzv. ARM GNU EABI kompiler. To bude kl\u00ed\u010dov\u00e9 p\u0159i hled\u00e1n\u00ed spr\u00e1vn\u00e9ho toolchainu. Op\u011bt pou\u017eijme V\u0161ezn\u00e1lka pana Googla. Kl\u00ed\u010dov\u00e1 slova budou: &#8222;gcc 4.5&#8220; &#8222;gnu eabi&#8220; &#8222;linux&#8220; &#8222;arm&#8220; je\u0161t\u011b m\u016f\u017eete p\u0159idat distribuci linuxu kter\u00fd pou\u017e\u00edv\u00e1te na PC. To by spolehliv\u011b m\u011blo odk\u00e1zat na n\u011bkter\u00fd bal\u00ed\u010dek. Nainstalujte podle konkr\u00e9tn\u00edho n\u00e1vodu.<\/p>\n<p>Pokud pou\u017e\u00edv\u00e1te Debian m\u016f\u017eete ho sehnat zde: <a href=\"http:\/\/emdebian.org\/crosstools.html\" target=\"_blank\">http:\/\/emdebian.org\/crosstools.html<\/a> nebo instalovat p\u0159\u00edmo z linuxu<\/p>\n<blockquote><p>apt-get install gcc-4.5-arm-linux-gnueabi (p\u0159\u00edpadn\u011b gcc-4.3 nebo 4.4)<\/p>\n<p>apt-get install build-essential git<\/p>\n<p>apt-get install u-boot-tools (pokud nenajde u-boot-tools zkuste uboot-mkimage)<\/p><\/blockquote>\n<h2><\/h2>\n<h2><span style=\"color: #40a5e5;\">2. KERNEL SOURCE TREE<\/span><\/h2>\n<p>Dal\u0161\u00edm krokem je sehnat zdroj\u00e1k k va\u0161emu kernelu (source kernel tree). V\u00edme tedy \u017ee sh\u00e1n\u00edme kernel 3.0.8+, podle konkr\u00e9tn\u00edho tabletu najd\u011bte na internetu jak\u00fd SoC (system on chip) pou\u017e\u00edv\u00e1 (nap\u0159. Allwinner A10-A13, Rockchip, MediaTek atd&#8230;) seznam t\u011bch nejzn\u00e1mej\u0161\u00edch t\u0159eba <a href=\"http:\/\/en.wikipedia.org\/wiki\/List_of_system-on-a-chip_suppliers\" target=\"_blank\">here<\/a>. Hled\u00e1n\u00ed bych za\u010dal v repozit\u00e1\u0159i <a href=\"https:\/\/github.com\/\" target=\"_blank\">github<\/a>. Jako kl\u00ed\u010dov\u00e9 slovo ned\u00e1vejte celou verzi j\u00e1dra, v\u011bt\u0161\u00ednou se stejn\u011b do n\u00e1zvu d\u00e1v\u00e1 jen 3.0 apod.<\/p>\n<p>Pokud naleznete kernel na Gitu v linuxu ho st\u00e1hnete:<\/p>\n<blockquote><p>git clone https:\/\/github.com\/n\u00e1zev_kernelu.git<\/p>\n<p>cd n\u00e1zev_kernelu<\/p>\n<p>git checkout n\u00e1zev v\u011btve (branch) oby\u010dejn\u011b to b\u00fdv\u00e1 Master<\/p><\/blockquote>\n<p>&nbsp;<\/p>\n<h2><span style=\"color: #40a5e5;\">3. BUILD<\/span><\/h2>\n<p>Porozhl\u00eddn\u011bte se v tomto adres\u00e1\u0159i p\u0159\u00edpadn\u011b v adres\u00e1\u0159i <em>scripts<\/em> po scriptech naz\u00edvaj\u00edc\u00ed se n\u011bco jako <strong>build.sh<\/strong>. N\u011bkdy tam m\u016f\u017ee b\u00fdt <strong>build_n\u00e1zev_za\u0159\u00edzen\u00ed.sh<\/strong> . Naleznete-li n\u011bco takov\u00e9ho spust\u0165e to. Tehle skript\u00edk za\u0159\u00edd\u00ed zpravidla v\u0161e od A-Z. Pokud chcete m\u00edt nad kompilac\u00ed kontrolu \u010dt\u011bte d\u00e1l.<\/p>\n<p>Je\u0161t\u011b ne\u017e budeme pokra\u010dovat d\u00e1l, chci zm\u00ednit jednu v\u011bc. Pokud pl\u00e1nujete experimentovat s r\u016fzn\u00fdmy konfiguracemi, nap\u0159\u00edklad kompilovat moduly pro v\u00edce tablet\u016f, existuje parametr kter\u00fd zp\u016fsob\u00ed, \u017ee se v\u0161echny generovan\u00e9 soubory vytv\u00e1\u0159\u00ed pod jeden V\u00e1mi ur\u010den\u00fd adres\u00e1\u0159 a z\u00e1rove\u0148 se z tohoto adres\u00e1\u0159e na\u010d\u00edt\u00e1 vlastn\u00ed nastaven\u00ed. Takto m\u016f\u017eete vytvo\u0159it mnoho nez\u00e1visl\u00fdch variant z\u00e1rove\u0148. P\u0159i tomto zp\u016fsobu kompilace mus\u00ed z\u016fstat z\u00e1kladn\u00ed adres\u00e1\u0159ov\u00e1 struktura sta\u017een\u00e9ho kernelu \u010dist\u00e1, jinak se kompilace nezda\u0159\u00ed. Naproti tomu pokud chcete kompilovat jen jednu variantu nemus\u00edte tento parametr uv\u00e1d\u011bt a ve\u0161ker\u00e1 kompilace bude prob\u00edhat do z\u00e1kladn\u00ed struktury. J\u00e1 preferuji 1. variantu a proto u v\u0161ech p\u0159\u00edkaz\u016f <em><strong>make<\/strong><\/em><strong>\u00a0<\/strong>bude parametr O=adres\u00e1\u0159.\u00a0(tedy krom\u011b t\u011bch kter\u00e9 maj\u00ed pro\u010distit z\u00e1kladn\u00ed adres\u00e1\u0159ovou strukturu). Proto v\u0161echny konfigura\u010dn\u00ed soubory d\u00e1vejte pr\u00e1v\u011b do adres\u00e1\u0159e za parametrem O. Ti ostatn\u00ed d\u00e1vejte d\u00e1vejte soubory p\u0159\u00edmo do adres\u00e1\u0159e &#8222;n\u00e1zev_kernelu&#8220; nebo-li src tree.<\/p>\n<p>Vytvo\u0159te adres\u00e1\u0159 kam kompiler bude ukl\u00e1dat v\u00fdsledky, tedy ten co uvedete za parametr O. J\u00e1 vyberu t\u0159eba n\u00e1zev TABLET_A.<\/p>\n<p>&nbsp;<\/p>\n<h2><span style=\"color: #40a5e5;\">4. CONFIG<\/span><\/h2>\n<p>Pokud jste nena\u0161li skript al\u00e1 build.sh bude t\u0159eba konfigurovat kernel jinak. Nejprve se pod\u00edvejte do adres\u00e1\u0159e .\/arch\/arm\/configs, bude tam pravd\u011bpodobn\u011b spousta soubor\u016f n\u011bco_defconfig. Pokuste se nal\u00e9zt n\u011bjak\u00fd nesouc\u00ed n\u00e1zev Va\u0161eho za\u0159\u00edzen\u00ed. Na\u0161li jste-li ho,\u00a0 zkop\u00edrujte ho do adres\u00e1\u0159e TABLET_A a zm\u011bnte mu jm\u00e9no na .config . Pokud jste nic takov\u00e9ho nena\u0161li vyberete n\u011bjak\u00fd generick\u00fd config a uprav\u00edme si ho pozd\u011bji. Je\u0161t\u011b existuje zp\u016fsob jak p\u0159e\u010d\u00edst config z Va\u0161eho tabletu, ale n\u00e9 v\u017edy to jde. V\u00edce v \u010dl\u00e1nku <a href=\"https:\/\/dlabi.cz\/en\/extrahujeme-module-symvers-a-config\/\">Extrahujeme Module.symvers a config<\/a>.\u00a0 Abychom kernel spr\u00e1vn\u011b nakonfigurovali pot\u0159ebujeme zjistit p\u00e1r informac\u00ed. Najd\u011bte na tabletu jak\u00fdkoliv modul, u m\u011b jsou v adres\u00e1\u0159i <strong>\/system\/vendor\/modules<\/strong> a spust\u0165e p\u0159\u00edkaz<\/p>\n<blockquote><p>modinfo modul.ko | grep vermagic<\/p><\/blockquote>\n<p>dostanete n\u011bco jako:<\/p>\n<blockquote><p>vermagic: 3.0.8+ SMP preempt mod_unload modversion ARMv7<\/p><\/blockquote>\n<p>a p\u0159esn\u011b tohle mus\u00ed vypisovat v\u00e1mi zkompilovan\u00e9 moduly, jinak je kernel odm\u00edtne na\u010d\u00edst. Pro tuto chv\u00edli toto sta\u010d\u00ed vr\u00e1t\u00edme se k vermagicu v n\u00e1sleduj\u00edc\u00ed kapitole.<\/p>\n<h2><span style=\"color: #40a5e5;\">5. MAKE<\/span><\/h2>\n<p>Nastav\u00edme\u00a0 n\u011bkolik prom\u011bn\u00fdch kter\u00e9 nastav\u00ed kompiler na n\u00e1\u0161 toolchain a architekturu. P\u0159izp\u016fsobte Va\u0161im pot\u0159eb\u00e1m. J\u00e1 u sebe m\u00e1m.<\/p>\n<pre class=\"lang:sh decode:true\">export CROSS_COMPILER=arm-linux-gnueabi-\r\nexport ARCH=arm\r\nexport KERNELRELEASE='3.0.8+' #to co ukazoval vermagic\r\nexport INSTALL_MOD_PATH=modules_out #do tohoto adresare se moduly po kompilaci nakopiruji<\/pre>\n<p>Nejprve pro jistotu vy\u010dist\u00edme z\u00e1kladn\u00ed src tree. Ujist\u011bte se, \u017ee jste v z\u00e1kladn\u00edm adres\u00e1\u0159i src tree a spus\u0165te:<\/p>\n<blockquote><p>make mrproper<\/p><\/blockquote>\n<p><em>pozn\u00e1mka: od te\u010f u\u017e mus\u00edte v\u017edy uv\u00e1d\u011bt u p\u0159\u00edkazu make parametr O.<\/em><\/p>\n<p>pokud pot\u0159ebujete upravit konfiguraci kernelu pokra\u010dujte p\u0159\u00edkazem. Ostatn\u00ed mohou p\u0159esko\u010dit.<\/p>\n<blockquote><p>make O=TABLET_A menuconfig<\/p><\/blockquote>\n<p>Objev\u00ed se dialog kde m\u016f\u017eete pozm\u011b\u0148ovat konfiguraci. Zm\u00edn\u00edm se jen o p\u00e1r dule\u017eit\u00fdch nastaven\u00edch a to t\u011bch kter\u00e9 men\u00ed vermagic (viz. kapitola 4) a nastaven\u00ed modul\u016f.<\/p>\n<p>Pokud m\u00e1te v vermagicu<\/p>\n<p><span style=\"color: #ffffff;\"><strong>SMP<\/strong><\/span> nastavte <em>Kernel Features\u00a0 &#8212;&gt;Symmetric Multi-Processing<\/em><\/p>\n<p><span style=\"color: #ffffff;\"><strong>preempt<\/strong><\/span> nastavte <em>Kernel Features\u00a0 &#8212;&gt;Preemption Model&#8212;&gt;Preemptible Kernel (Low-Latency Desktop)<\/em><\/p>\n<p><span style=\"color: #ffffff;\"><strong>mod_unload<\/strong><\/span> nastavte <em>Enable loadable module support\u00a0 &#8212;&gt;Module unloading<\/em><\/p>\n<p><span style=\"color: #ffffff;\"><strong>modversion<\/strong><\/span> nastavte\u00a0 <em>Enable loadable module support\u00a0 &#8212;&gt;Module versioning support<\/em><\/p>\n<p>a pak samoz\u0159ejm\u011b z\u00e1le\u017e\u00ed na V\u00e1s co v\u0161echno chcete nastavit, je\u0161t\u011b zm\u00edn\u00edm menu kde se povol\u00ed kompilov\u00e1n\u00ed modul\u016f pro dvb tunery<\/p>\n<p><em>Device Drivers\u00a0 &#8212;&gt; Multimedia support\u00a0 &#8212;&gt;DVB for Linux &#8212;&gt;DVB\/ATSC adapters\u00a0 &#8212;&gt;<\/em><\/p>\n<p>&nbsp;<\/p>\n<p>N\u011bkolik slov k souboru Module.symvers. Pokud hodl\u00e1te kompilovat moduly, budete pot\u0159ebovat spr\u00e1vn\u00fd Module.symvers. Ten vznik\u00e1 p\u0159i kompilaci kernelu a zjednodu\u0161en\u011b \u0159e\u010deno &#8222;napov\u00edd\u00e1&#8220; kompil\u00e1toru jak spr\u00e1vn\u011b propojit kernel a moduly. Pokud byste tedy kompilovali kernel a z\u00e1rove\u0148 moduly, kter\u00e9 byste n\u00e1sledn\u011b nahr\u00e1li do tabletu, nemus\u00edte nic \u0159e\u0161it. Co ale d\u011blat, kdy\u017e do tabletu chcete p\u0159idat jen moduly? Kde vz\u00edt spr\u00e1vn\u00fd Module.symvers? No n\u011bkte\u0159\u00ed v\u00fdrobci tablet\u016f tento soubor nech\u00e1vaj\u00ed ve stejn\u00e9m adres\u00e1\u0159i s modulama. Koukn\u011bte se tam, pokud ho tam najdete m\u00e1te o starost m\u00e9n\u011b. Jen ho nakop\u00edrujte do adres\u00e1\u0159e TABLET_A a m\u016f\u017eete za\u010d\u00edt vesele kompilovat moduly. Ti ostatn\u00ed m\u016f\u017eou pou\u017e\u00edt n\u00e1vod <a href=\"https:\/\/dlabi.cz\/en\/extrahujeme-module-symvers-a-config\/\">Extrahujeme Module.symvers a config<\/a>. Pokud Module.symvers nedod\u00e1te kompileru nebo bude \u0161patn\u00fd, kernel nena\u010dte moduly.<\/p>\n<p>Zaz\u00e1lohujte si n\u011bkam soubor .config a\u00a0 Module.symvers. M\u016f\u017ee se st\u00e1t \u017ee ho n\u011bjak\u00fd proces p\u0159ep\u00ed\u0161e nebo vyma\u017ee, t\u0159ebas<em><strong> make O=TABLET_A clean<\/strong><\/em> to ur\u010dit\u011b ud\u011bl\u00e1.<\/p>\n<p>Pokud jste u\u017e d\u0159\u00edve kompilovali prove\u010fte pr\u00e1v\u011b <em><strong>make O=TABLET_A clean<\/strong><\/em> a obnovte .config a Module.symvers ze z\u00e1lohy<\/p>\n<p>za\u010dn\u011bte t\u00edmto p\u0159\u00edkazem, p\u0159ichyst\u00e1 v\u0161e pot\u0159ebn\u00e9 pro kompilaci<\/p>\n<blockquote><p>make O=TABLET_A\u00a0 oldconfig prepare modules_prepare headers_install scripts<\/p><\/blockquote>\n<p>t\u00edmto p\u0159\u00edkazem zkompilujete moduly pod kernelem, kter\u00e9 jste si povolili v configu, parametr M nen\u00ed nutn\u00fd, chcete-li p\u0159elo\u017eit jenom ur\u010dit\u00e9 moduly v n\u011bjak\u00e9m adres\u00e1\u0159i, pou\u017eijte ho<\/p>\n<blockquote><p>make O=TABLET_A M=\/cesta_k_modulum modules<\/p><\/blockquote>\n<p>t\u00edmto p\u0159\u00edkazem nakop\u00edrujete zkompilovan\u00e9 moduly do adres\u00e1\u0159e definovan\u00e9ho prom\u011bnou INSTALL_MOD_PATH<\/p>\n<blockquote><p>make O=TABLET_A modules_install<\/p><\/blockquote>\n<p>t\u00edmto p\u0159\u00edkazem zkompilujete kernel image<\/p>\n<blockquote><p>make O=TABLET_A zImage uImage bzImage<\/p><\/blockquote>\n<p>t\u00edmto p\u0159\u00edkazem zjist\u00edte dal\u0161\u00ed mo\u017enosti p\u0159\u00edkazu make<\/p>\n<blockquote><p>make O=TABLET_A help<\/p><\/blockquote>\n<p>&nbsp;<\/p>\n<h2><\/h2>\n<h2>\u00a0<span style=\"color: #40a5e5;\">6. Z\u00c1V\u011aR<\/span><\/h2>\n<p>P\u0159ed nahr\u00e1n\u00edm modul\u016f do tabletu zjist\u011bte p\u0159\u00edkazem <em><strong>modinfo n\u00e1zevmodulu.ko<\/strong><\/em> zda-li maj\u00ed shodn\u00fd vermagic s kernelem. Pokud ne, n\u011bco jste m\u011bli \u0161patn\u011b nastaven\u00e9 a mus\u00edte nastaven\u00ed opravit a zkompilovat moduly znovu.<\/p>\n<p>&nbsp;<\/p>\n<h3>P\u0159eji \u00fasp\u011b\u0161nou kompilaci.<\/h3>\n<p>&nbsp;<\/p>\n<p>Z t\u011bhto zdroj\u016f jsem \u010derpal:<\/p>\n<p><a href=\"http:\/\/rhombus-tech.net\/allwinner_a10\/kernel_compile\/\" target=\"_blank\">http:\/\/rhombus-tech.net\/allwinner_a10\/kernel_compile\/<\/a><\/p>\n<p><a href=\"http:\/\/glandium.org\/blog\/?p=2664\" target=\"_blank\">\u00a0http:\/\/glandium.org\/blog\/?p=2664<\/a><\/p>\n<p><a href=\"https:\/\/www.kernel.org\/doc\/Documentation\/kbuild\/modules.txt\" target=\"_blank\">https:\/\/www.kernel.org\/doc\/Documentation\/kbuild\/modules.txt<\/a><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>","protected":false},"excerpt":{"rendered":"<p>Pokus\u00edm se zde vyjevit z\u00e1kladn\u00ed postup jak kompilovat (nejen) moduly pro Android. Pochopiteln\u011b tento postup nen\u00ed jedin\u00fd mo\u017en\u00fd a existuje mnoho variant t\u00e9ho\u017e. N\u00ed\u017ee popsan\u00fd postup jsem pou\u017eil j\u00e1 a dos\u00e1hl jsem usp\u011b\u0161n\u00e9ho zaveden\u00ed modul\u016f na c\u00edlov\u00e9 platform\u011b&#8230;. <\/p>\n<div class=\"read-more navbutton\"><a href=\"https:\/\/dlabi.cz\/en\/navod-jak-na-android-cross-compiling\/\">Read More<i class=\"fa fa-angle-double-right\"><\/i><\/a><\/div>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[3],"tags":[16,32,31,33,27,28,34,25,37,36,35,29,5,26,30],"class_list":["post-191","post","type-post","status-publish","format-standard","hentry","category-android","tag-android-2","tag-arm","tag-build-sh","tag-cross_compiler","tag-crosscompiling","tag-kernel","tag-kompilace","tag-module","tag-module-symvers","tag-navod","tag-postup","tag-src","tag-tablet","tag-toolchain","tag-tree"],"_links":{"self":[{"href":"https:\/\/dlabi.cz\/en\/wp-json\/wp\/v2\/posts\/191","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dlabi.cz\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dlabi.cz\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dlabi.cz\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/dlabi.cz\/en\/wp-json\/wp\/v2\/comments?post=191"}],"version-history":[{"count":39,"href":"https:\/\/dlabi.cz\/en\/wp-json\/wp\/v2\/posts\/191\/revisions"}],"predecessor-version":[{"id":279,"href":"https:\/\/dlabi.cz\/en\/wp-json\/wp\/v2\/posts\/191\/revisions\/279"}],"wp:attachment":[{"href":"https:\/\/dlabi.cz\/en\/wp-json\/wp\/v2\/media?parent=191"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dlabi.cz\/en\/wp-json\/wp\/v2\/categories?post=191"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dlabi.cz\/en\/wp-json\/wp\/v2\/tags?post=191"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}