gcc with newlib - osdev-jp/osdev-jp.github.io GitHub Wiki
newlibãšã¯
gcc with newlibã§äœãã§ããã®
æšæºé¢æ°(printfãšã)ã䜿ããããã«ãªããŸãã g++ãªããSTLã䜿ããŸãã
ãã®èšäºã«ã€ããŠ
newlibãçµã¿èŸŒãã gccã³ã³ãã€ã©ãäœæããŸããã¡ãªã¿ã«ããã®èšäºã¯ä»¥åLivaãæžããããã°èšäºïŒãã¡ã€ã³ããšç Žæ£æžã¿ïŒãæãèµ·ããããã®ã§ããæŽæ°æ¥ã2010-12-09ãªã®ã§ãããããããããããéã£ãŠãããããå°ã楜ã«ã§ããããããããããŸãããåèãŸã§ã«ã
ã§ã¯ããããïŒå¹Žåã®èšäºã«ãªããŸãã
ç°å¢ïŒ
WindowsXP 32bit
ïŒUNIX,Linux,MacOSXã§ãæ®ã©åãæé ã§è¡ãããšæããŸãããããCygwinã®å°å ¥ãCygwinåºæã®åé¡ããªãã®ã§æ¥œãããããŸãããããšãMacOSXã§ã¯MacPortsã«i386-elf with newlibãããã®ã§ãããã䜿ãã°ããã«æ§ç¯ã§ããŸãïŒ
ã³ã³ãã€ã«ã«å¿ èŠãªãã®ïŒ
â»è¿œå ããã±ãŒãžã®ã€ã³ã¹ããŒã«ãå¿ èŠãªã®ã§ãæ¢ã«Cygwinãã€ã³ã¹ããŒã«ããŠããæ¹ã説æãèªãã§äžããã
â»GCCã¯gcc-coreãšgcc-g++ã®äºã€ã®ãã¡ã€ã«ãããŠã³ããŒãããåããã©ã«ãã«å±é(ããã§ã¯C:\build)ããŠãããšãœãŒã¹ãµã€ãºãå°ãããªããŸãã
åèãµã€ãïŒ
http://www.sixnine.net/cygwin/translation/devel/cygwin-to-newlib-cross-howto.html â»2016幎æç¹ã§ãªã³ã¯åãã§ãããã£ãã·ã¥ãšãæ®ã£ãŠããããããªãã®ã§ãäžå¿æžããŠãããŸãã
GCCã®ã³ã³ãã€ã«ã¯ããªãæéããããã®ã§ãäžæ¥æœ°ãããããã®äœè£ãããæ¥ã«ãã£ãŠãã ããã â»2016幎æç¹ã§ã¯ãã«ãã³ã¢ã®åã§ã¶ã殎ãã°å²ãšã³ã³ãã€ã«ã¯ããçµããããã«ãªããŸãããjãªãã·ã§ã³ãå¿ããªãã§ã
ããšãäžé£ã®ã¹ããããå šãŠçµãããããŸã§ãbashã·ã§ã«ã¯éããªãæ¹ããããšæããŸãã
ããããããè¡ããŸããããã
Step1:Cygwinã®ã€ã³ã¹ããŒã«
ã€ã³ã¹ããŒã«èªäœã¯è³ã£ãŠç°¡åã§ããGoogleã§ãCygwinãã€ã³ã¹ããŒã«ããšæ€çŽ¢ããããã°äžç¬ã§ãã
ããããã±ãŒãžéžæã®æã ãã¯æ³šæããŠãã ãããDevelã«ããŽãªå ã®automakeãbinutilsãbisonãflexãgcc-coreãgcc-g++ãmakeã«ãã§ãã¯ãä»ããå¿ èŠããããŸããïŒbinutilsã«ã¯ãã§ãã¯ãä»ããèŠãããªãã®ã§ããã確èªãããã€ã³ã¹ããŒã«ãããŠããã®ã§ãäžå¿ãã§ãã¯ãã€ããŠãããŠäžããããã¶ãgcc-coreãšäžç·ã«èªåã§ãã§ãã¯ãä»ããšã¯ããããŸãããåŸãC++ã䜿ããªã人ã¯gcc-g++ã®ãã§ãã¯ãã¯ãããŠãçµæ§ã§ãïŒ
åŸãMacPortsã§ã€ã³ã¹ããŒã«ãããi386-elf-gccã§ã¯gettextã䜿ã£ãŠããããã§ãã®ã§ãäžå¿gettextã«ããã§ãã¯ãã€ããŠãããŠãã ãããïŒã¡ãªã¿ã«ããã®èšäºéãã«è©ŠããŠããMacPortsçãšåäžã«ãªãããã§ã¯ãªããããããã®èšäºã§ç޹ä»ããŠããMacPortsçã§ãªãi386-elf-gccãšã»ãŒåäžã«ãªããŸãïŒ
ã€ã³ã¹ããŒã«ã¯ããããæéãããããŸãã®ã§ãå°ãæã€ã¶ããããŠããŠäžããã
ã€ã³ã¹ããŒã«ãçµããæ¬¡ç¬¬ãCygwinã®bashã·ã§ã«(Cygnusã ã£ãïŒå¿ãããã©)ãéããŸãããã
Step2ïŒãã¡ã€ã«ã®å±é
GCCãbinutilsãGMPãMPFRãMPCã®ãœãŒã¹ã¯å šãŠããŠã³ããŒãæžã¿ã ãšæãã®ã§ãã©ããã®ãã£ã¬ã¯ããªã«å±éããŠãã ããã
ããã§ã¯C:\buildã«å±éãããã®ãšããŸãã
Step3ïŒbinutilsã®ã³ã³ãã€ã«
binutilsãã³ã³ãã€ã«ããŠãããŸãã
ããããbashã§äœæ¥ãããŸãã
以äžã®æ§ã«å ¥åããŠãã ãããïŒïŒã¯bashãå ¥ååŸ ã¡ã®æã«è¡šç€ºããããã€ïŒ
$ cd C:/build
$ export TARGET=i386-elf
$ export PREFIX=/usr/local/gcc
$ mkdir build-binutils
$ cd build-binutils
$ ../binutils-2.10.1(âããŠã³ããŒãããããŒãžã§ã³ã«çœ®ãæããŠäžãã)/configure --target=$TARGET --prefix=$PREFIX --disable-nls
$ make all
$ make install
ããã§çµäºã§ããã¡ãã£ãšæéãããããŸãããç°¡åã§ãã
次ã®ã¹ãããã«é²ãåã«ãå°ããã£ãŠãããªããšãããªãäºãããã®ã§ããããæžãŸããŠããŸããŸãããã
$ export PATH=$PATH:/usr/local/oasis/bin
$ i586-elf-ld --version
$ i586-elf-ld --versionã§ãã¡ããšldã®ããŒãžã§ã³æ å ±ã衚瀺ãããã°æåã§ãã
command not foundãšãèšãããããã©ãããééã£ãŠããã®ã§ãæ€èšŒããŠã¿ãŠãã ããã
ã¡ãªã¿ã«ãæåŸã®ã¹ããããŸã§çµããããåã«bashã·ã§ã«ãéããŠããŸã£ãå Žåã¯ã次ã®bashã®èµ·åæã«äžã®äºè¡ãããäžåºŠæã¡çŽãããã¹ãéããŠäžããã
Step4:åçš®ã©ã€ãã©ãªã®ã€ã³ã¹ããŒã«
GCCã®4.3以éã®ã³ã³ãã€ã«ã«ã¯GMP,MPFRã®äºã€ã®ã©ã€ãã©ãªãå¿ èŠã§ãããŸããGCC4.5以éã®ã³ã³ãã€ã«ã«ã¯MPCãå¿ èŠã«ãªããŸãã
Cygwinã®ããã±ãŒãžããã€ã³ã¹ããŒã«ããããšãã§ããŸãããããŒãžã§ã³ãå€ãããã°ãå«ãŸããŠãããããªã®ã§ãããã§äžæ°ã«ã³ã³ãã€ã«ãã¡ãããŸãã(â»GMPãMPFRãMPCã®ã³ã³ãã€ã«ã®é çªã¯å€ããªãã§äžããïŒ
$ cd ../ (ããã§C:/buildã«æ»ãã¯ã)
$ mkdir build-gmp build-mpfr build-mpc
$ cd build-gmp
$ ../gmp-"gmpã®ããŒãžã§ã³"/configure --prefix=/usr
$ make
$ make install
$ cd ../build-mpfr
$ ../mpfr-"mpfrã®ããŒãžã§ã³"/configure --prefix=/usr
$ make
$ make install
$ ../mpc-"mpcã®ããŒãžã§ã³"/configure --prefix=/usr
$ make
$ make install
ããã§çµããã
Step5:GCCã®ã³ã³ãã€ã«
ããããå°ã鬌éã§ãã
èœãšããŠæ¥ããœãŒã¹ã³ãŒãã®ãã¡ã€ã«åãäžéšåŽ©å£ããŠããïŒãã¶ãè§£åã«å€±æããïŒããããããä¿®æ£ããŠãããªããŠã¯ãããŸããã
ããã«ãèšå®ãå°ãçã£ãŠãããããªã®ã§ããœãŒã¹ã³ãŒããäžéšããã£ãŠããå¿ èŠããããŸãã
ãšãããããããã¯çœ®ããŠããã詊ãã«ã³ã³ãã€ã«ããŠã¿ãŸãããã
$ cd ../
$ ln -s ../newlib-"newlibã®ããŒãžã§ã³"/newlib ../gcc-"gccã®ããŒãžã§ã³"
$ mkdir build-gcc
$ cd build-gcc
$ ../gcc-"gccã®ããŒãžã§ã³"/configure --enable-languages=c,c++ --disbale-nls --target=$TARGET --without-included-gettext --enable-obsolete --with-newlib --disable-libgfortran --with-gxx-include-dir=$PREFIX/$TARGET/include/c++/"gccã®ããŒãžã§ã³"/
$ make
$ make install
ãã¶ããäžçºã§ã¯ã³ã³ãã€ã«ãéããŸããã
ãšã©ãŒãçºçããããGoogleã§æ€çŽ¢ããããŠæè»ã«å¯Ÿå¿ããŠããå¿ èŠããããŸãã
åãçºèŠãããšã©ãŒã¯ãã®äºã€ã
checking for shl_load... configure: error: Link tests are not allowed after GCC_NO_EXECUTABLES.
error:ext/pb_ds/detail/resize_policy/hash_load_check_resize_trigger_size_base.hpp: No such file or directory
åè ã¯æ£çŽæ¥èšã«è§£æ±ºçãèŒã£ãŠããŸããã
ãã ããautoconfã¯GCCã®ãœãŒã¹ã®ã«ãŒããã£ã¬ã¯ããªã ãã§ã¯ãªããlibstdc++-v3ã§ãããŠãã ãããïŒã«ãŒããã£ã¬ã¯ããªã¯å¿ èŠãªããããããŸãããæªæ€èšŒïŒ
ããšãautoconfãäžåããããšãautoconfã®ãã®ããŒãžã§ã³ã䜿ãïŒã¿ãããªãšã©ãŒãã§ãã®ã§ã察å¿ããautoconfãã€ã³ã¹ããŒã«ããããã§ã³ã³ãã€ã«ããŠããå¿ èŠããããŸãã
ã¡ãªã¿ã«ãGCC4.5.1ã§ã¯autoconfã®ããŒãžã§ã³ã¯2.64ã§ããã
$ ../autoconf-"autoconfã®ããŒãžã§ã³"/configure --prefix=/usr
$ make
$ make install
åŸè ã¯ããã¡ã€ã«ã®è§£åãã¹ã§ãã
ãã¶ããã¡ã€ã«åãé·ããããã§ãããããïŒã¡ãªã¿ã«ãLhaplusã§è§£åããŸããïŒ
仿¹ããªãã®ã§ããªããšèšããããã¡ã€ã«ãéããŠã¿ãŠãã ããã
ext/pb_ds/detail/resize_policy/hash_load_check_resize_trigger_size_base.hppããªãããšèšãããå Žåã
C:\build\build-gcc\i386-elf\libstdc++-v3\include\ext\pb_ds\detail\resize_policy\hash_load_check_resize_trigger_size_base.hppãéããŸãããã
ã¡ã¢åž³ã§éããšã
ã°¡ç¥³æ±æ¹©ã¹«ï»¿/cygdrive/c/build/gcc-4.5.1/libstdc++-v3/include/ext/pb_ds/detail/resize_policy/hash_load_check_resize_trigger_imp.hpp
ã¿ãããªæãã«ãªããŸãã
ããã§ãC:\build\gcc-4.5.1\libstdc++-v3\include\ext\pb_ds\detail\resize_policyã«ç§»åããŸãããããšãå ã®ãã¡ã€ã«åãhash_load_check_resize_trigger_imp.hppã ãšèŸãããŠããããããªæ®éªžç¶æ ã®ãã¡ã€ã«ãããã®ã§ããªããŒã ããŠæ£ãããã¡ã€ã«åã«çŽããŠãããŸãã
å ·äœçã«ã¯cc_hash_max_collision_check_resize_trigger_imp.hppãcc_hash_max_collision_check_resize_tri0000644ã«ãªã£ãŠãããããŸãã
ãã¡ã€ã«åããããããªã£ãŠããã®ã¯detailãã©ã«ãå ã«æ£åšããŠããã®ã§ãC:\build\build-gcc\i386-elf\libstdc++-v3\include\ext\pb_ds\detailãšC:\build\gcc-4.5.1\libstdc++-v3\include\ext\pb_ds\detailãExplorerã§åæã«éããååã®ãããããã¡ã€ã«ãäžã€äžã€ä¿®æ£ããŠãã£ãŠãã ãããã³ããæŽãããšãçµæ§æ©ãäœæ¥ãçµãããšæããŸãã
ãã¶ããã®äºã€ã®ãšã©ãŒã解決ãããšãã³ã³ãã€ã«ãéããšæããŸããã³ã³ãã€ã«ãæ¢ãŸã£ãæããããçŽããŠã¿ãŠãã ãããïŒäŸãã°ãmakeã®éäžã§æ¢ãŸã£ãå Žåããšã©ãŒç®æãä¿®æ£ããåŸã§ããäžåºŠmakeãšæã€ïŒ
æçµçã«150MBãããã®i386-elf-gccã宿ãããšæããŸããããã£ãšæžéããäºãã§ããã®ã§ãããããã£ãŠãããŸãããããŸãã¯C:\Cygwin\usr\local\gcc\binãžç§»åã
ãã®ãã©ã«ãå ã®EXEã«ã¯äœ¿ãããªããŽãããŒã¿ãæžãããŸããŠããã®ã§ãC:\Cygwin\bin\strip.exeã§ãããèœãšããŠãããŸããC:\Cygwin\usr\local\gcc\binå ã®ãã¡ã€ã«ãå šéžæããïŒEXE以å€ã®ãã¡ã€ã«ã¯Unknown file formatãšèšã£ãŠç¡èŠããŠãããã®ã§åé¡ãããŸããïŒstrip.exeã®ã¢ã€ã³ã³ã«ãã©ãã°ïŒããããããŠãããšãããªãEXEãã¡ã€ã«ãå°ãããªããŸããïŒç¢ºãi386-elf-ld.exeãªããã¯ïŒMBããããã£ãã®ãã700KBãŸã§æžéãããæ°ãããŸãïŒ
åãäºãC:\Cygwin\usr\local\gcc\i386-elf\binãšC:\Cygwin\usr\local\gcc\libexec\gcc\i386-elf"GCCã®ããŒãžã§ã³"ã§ãå®è¡ã
ããŠãC:\Cygwin\usr\local\gcc\binã«æ»ããGCCã®EXEãã¡ã€ã«ã®èµ·åã«å¿ èŠãªDLLãã¡ã€ã«ãã³ããŒããŠãããŸãã
Cygwinã§äœã£ãEXEã¯C:\Cygwin\binå ã«ããDLLããªããšåäœããªãã®ã§ãããã³ã³ãã€ã«ããšããæã«ãšã©ãŒã«ãªããªããããäºã察çãããŠããããã§ãã
ãšããããã§ãi386-elf-gcc.exeãããã«ã¯ãªãã¯ãâã³ã³ããŒãã³ããååšããŸããâãšã©ãŒãåºãã®ã§ãããã«æžããŠããDLLãã¡ã€ã«ãC:\Cygwin\binããC:\Cygwin\usr\local\gcc\binãžã³ããŒããŠãããŸãã
ãç²ãããŸã§ãããããã§å šãŠã®äœæ¥ãçµäºã§ãã
ã¡ãªã¿ã«ããã®ã¯ãã¹ã³ã³ãã€ã©ã¯ããªã貧匱ã§ããå ·äœçã«ã¯ä»¥äžã®äºãã§ããŸããã
ã»ãªã³ã¯åŸã®åºåãã©ãŒãããã«i386-elf以å€ãæå®ãããšLDããšã©ãŒãåããŸãã â»2016幎å çïŒnewlibã®ã©ã€ãã©ãªãã¡ã€ã«ãi386-elfã§ã³ã³ãã€ã«ãããã ããããããããã ãã
ã»Cygnusäžããå®è¡ããªããšãå ±æã©ã€ãã©ãªããªããšãèšãããŸãã â»2016幎å çïŒPATHãéã£ãŠãªãããããïŒ
åå ã¯äžæããåç¥ã®æ¹ããææé¡ããŸãã
以äžã2016幎å ç
å®éã«newlibããªã³ã¯ããŠã³ã³ãã€ã«ããã«ã¯Porting Newlibãåèã«ããŠé¢æ°ãå®è£ ããŠãã ããã