{"id":9,"date":"2006-05-18T21:44:06","date_gmt":"2006-05-18T11:07:52","guid":{"rendered":""},"modified":"2016-11-26T07:49:56","modified_gmt":"2016-11-26T07:49:56","slug":"cross_compile_madness","status":"publish","type":"post","link":"https:\/\/blogs.gentoo.org\/solar\/2006\/05\/18\/cross_compile_madness\/","title":{"rendered":"Cross Compile Madness."},"content":{"rendered":"<p>So I pushed that pax-utils.<\/p>\n<ul>\n<li>Improved Makefile handling. <strong>(vapier)<\/strong><\/li>\n<li>QA_TEXTREL\/QA_EXECSTACK\/QA_WX_LOAD exempt filtering flags. <strong>(kevquinn)<\/strong><\/li>\n<li>Handle versioned symbols correctly on unstripped ELF files when using the -s flag.<\/li>\n<li> Do not assume it is ok to read from stdin if the -l -p flags were given. <strong>(solar)<\/strong>\n<\/li>\n<\/ul>\n<p>Now it&#8217;s time to get back to some cross compiling goodness. Well one thing I know about myself is anything I do I tend todo in excess. So I figure why build 1 cross compiler when you can build them all. Why merge into 1 place when you can reasonable test cross compiling for all arches.. Well that&#8217;s just what I did and am doing. <\/p>\n<p>Little script I&#8217;m using for just this task..<\/p>\n<pre>\r\n#!\/bin\/sh\r\n# Copyright 2006 Gentoo Foundation\r\n# Distributed under the terms of the GNU General Public License v2\r\n# $Header: &lt;solar@gentoo.org&gt;\r\n\r\nCFLAGS=\"-Os -pipe\"\r\nCBUILD=$(portageq envvar CHOST)\r\nCXXFLAGS=\"${CFLAGS}\"\r\n\r\nexport PYTHON_DONTCOMPILE=1\r\n\r\nUSE_SAVE=\"${USE}\"\r\nif [ ! -x \/usr\/bin\/qlist ]; then\r\n        echo \"please emerge portage-utils\"\r\n        exit 1\r\nfi\r\n\r\ngcc_executables=$(qlist -oeCI gcc| sort -u | grep ^cross- | sed s\/cross-\/\/g | tr \/ -)\r\n\r\nopts=\"$@\"\r\nfor x in \"$@\"; do\r\n        if [[ $x == \"--libc\" ]]; then\r\n                opts=\"${opts\/${x}\/}\"\r\n                DO_LIBC=1\r\n                do_libc=1\r\n        fi\r\n        if [[ \"${lastopt}\" == \"--target\" ]]; then\r\n                ctarget_only=\"${x}\"\r\n                opts=\"${opts\/${x}\/}\"\r\n                opts=\"${opts\/${lastopt}\/}\"\r\n        fi\r\n        lastopt=${x}\r\ndone\r\n\r\nfunction cross_env_update() {\r\n        mkdir -p ${ROOT}\/etc\r\n        for lpath in \/usr\/local\/lib \/usr\/${CTARGET}\/lib \/usr\/lib\/gcc\/${CTARGET}\/$(${CTARGET}-gcc -dumpversion) \/usr\/lib\/libstdc++-v3\/; do\r\n                echo \"${lpath}\" >> ${ROOT}\/etc\/ld.so.conf\r\n        done\r\n}\r\n\r\nfunction cmerge() {\r\n        CHOST=${1}\r\n        shift\r\n\r\n        export CTARGET=${CHOST}\r\n        ARCH=$(echo ${CTARGET} | cut -d '-' -f 1)\r\n        CC=${CTARGET}-gcc\r\n        CXX=${CTARGET}-g++\r\n        PKGDIR=${HOME}\/packages\/${CHOST}\r\n        ROOT=\"${HOME}\/ROOT\/${CHOST}\"\r\n        LDFLAGS=\"-L${ROOT}\/lib -L${ROOT}\/usr\/lib\"\r\n\r\n        do_libc=${DO_LIBC}\r\n        unset ELIBC\r\n        case ${CTARGET} in\r\n                *-linux-gnu)    ELIBC=glibc;;\r\n                *-linux-uclibc) ELIBC=uclibc;;\r\n                avr) ELIBC=avr-libc;;\r\n        esac\r\n        export ELIBC\r\n        [[ $ELIBC == \"\" ]] &amp;&amp; do_libc=0\r\n\r\n        USE=\"${ARCH} ${USE_SAVE}\"\r\n        case ${ARCH} in\r\n                armeb) ARCH=arm;;\r\n                s390x) ARCH=s390;;\r\n                mips*) ARCH=mips;;\r\n                powerpc64) ARCH=ppc64;;\r\n                sparc*) ARCH=sparc;;\r\n                powerpc) ARCH=ppc;;\r\n                hppa*) ARCH=hppa;;\r\n                sh4*|sheb) ARCH=sh;;\r\n                x86_64) ARCH=amd64;;\r\n                avr|ee|iop|cris) ARCH=\"x86\";;\r\n                i?86) ARCH=x86;;\r\n        esac\r\n        ACCEPT_KEYWORDS=\"${ARCH}\"\r\n        [[ \"${unstable}\" != \"\" ]] &amp;&amp; ACCEPT_KEYWORDS=\"${ACCEPT_KEYWORDS}  ~${ARCH}\"\r\n\r\n        USE=\"-* ${ARCH} ${USE} elibc_${ELIBC} multicall make-symlinks\"\r\n\r\n        export ARCH ACCEPT_KEYWORDS CFLAGS CXXFLAGS LDFLAGS ROOT CBUILD CHOST CTARGET CC CXX PKGDIR USE\r\n\r\n        mkdir -p ${ROOT}\/etc\r\n        if [[ $ELIBC != \"\" ]]; then\r\n                if [ -e ${ROOT}\/etc\/ld.so.conf ]; then\r\n                        if [ \"$(md5sum ${ROOT}\/etc\/ld.so.conf|awk '{print $1}')\" == \"b18efa8c9f95b6aecc0974c0f54d8bb9\" ]; then\r\n                                touch ${ROOT}\/etc\/ld.so.conf\r\n                                cross_env_update\r\n                        fi\r\n                else\r\n                        cross_env_update\r\n                fi\r\n        fi\r\n\r\n        if [[ \"$do_libc\" == 1 ]]; then\r\n                emerge -b cross-${CHOST}\/${ELIBC} ${opts}\r\n        else\r\n                emerge -b ${opts}\r\n        fi\r\n\r\n        unset ARCH ACCEPT_KEYWORDS LDFLAGS ROOT CHOST CTARGET CC CXX PKGDIR USE ELIBC\r\n}\r\n\r\nif [[ \"$1\" == \"\" ]]; then\r\n        echo \"$0: &lt;opts&gt; &lt;emerge opts&gt;\"\r\n        echo \"   --libc\"\r\n        echo \"   --target &lt;chost&gt;\"\r\n        echo \"   --libc  --target i386-gentoo-linux-uclibc busybox -pv\"\r\n        exit 1\r\nfi\r\n\r\nfor gnugcc in ${gcc_executables}; do\r\n        [ -e \/usr\/bin\/${gnugcc} ] || { echo bummer $gnugcc ; continue; }\r\n        # include=$($gnugcc -print-file-name=)\r\n        [[ $ctarget_only != \"\" ]] &amp;&amp; [[ ${gnugcc\/-gcc\/} != $ctarget_only ]] &amp;&amp; continue\r\n        cmerge \"${gnugcc\/-gcc\/}\" \"$@\"\r\ndone\r\n<\/pre>\n<p>A blind run at building busybox and libc for just about every chost combo yields the following results. Anything marked <strong>N<\/strong> is something that failed. <strong>R<\/strong> means it installed of course.<\/p>\n<pre>\r\ntinderbox ~ # .\/cmerge -qpv busybox\r\n[ebuild  N    ] sys-apps\/busybox-1.1.0 to \/root\/ROOT\/alpha-gentoo-linux-uclibc\/ \r\n[ebuild   R   ] sys-apps\/busybox-1.1.0 to \/root\/ROOT\/alpha-unknown-linux-gnu\/ \r\n[ebuild   R   ] sys-apps\/busybox-1.1.0 to \/root\/ROOT\/arm-gentoo-linux-uclibc\/ \r\n[ebuild   R   ] sys-apps\/busybox-1.1.0 to \/root\/ROOT\/arm-softfloat-linux-gnu\/ \r\n[ebuild   R   ] sys-apps\/busybox-1.1.0 to \/root\/ROOT\/arm-softfloat-linux-uclibc\/ \r\n[ebuild   R   ] sys-apps\/busybox-1.1.0 to \/root\/ROOT\/arm-unknown-linux-gnu\/ \r\n[ebuild   R   ] sys-apps\/busybox-1.1.0 to \/root\/ROOT\/armeb-gentoo-linux-uclibc\/ \r\n[ebuild   R   ] sys-apps\/busybox-1.1.0 to \/root\/ROOT\/armeb-softfloat-linux-gnu\/ \r\n[ebuild   R   ] sys-apps\/busybox-1.1.0 to \/root\/ROOT\/armeb-softfloat-linux-uclibc\/ \r\n[ebuild   R   ] sys-apps\/busybox-1.1.0 to \/root\/ROOT\/armeb-unknown-linux-gnu\/ \r\n[ebuild  N    ] sys-apps\/busybox-1.1.0 to \/root\/ROOT\/avr\/ \r\n[ebuild  N    ] sys-apps\/busybox-1.1.0 to \/root\/ROOT\/cris-gentoo-linux-uclibc\/ \r\n[ebuild  N    ] sys-apps\/busybox-1.1.0 to \/root\/ROOT\/ee\/ \r\n[ebuild  N    ] sys-apps\/busybox-1.1.0 to \/root\/ROOT\/hppa-unknown-linux-gnu\/ \r\n[ebuild  N    ] sys-apps\/busybox-1.1.0 to \/root\/ROOT\/hppa1.1-unknown-linux-gnu\/ \r\n[ebuild  N    ] sys-apps\/busybox-1.1.0 to \/root\/ROOT\/hppa2.0-unknown-linux-gnu\/ \r\n[ebuild  N    ] sys-apps\/busybox-1.1.0 to \/root\/ROOT\/hppa64-unknown-linux-gnu\/ \r\n[ebuild   R   ] sys-apps\/busybox-1.1.0 to \/root\/ROOT\/i386-gentoo-linux-uclibc\/ \r\n[ebuild   R   ] sys-apps\/busybox-1.1.0 to \/root\/ROOT\/i386-pc-linux-gnu\/ \r\n[ebuild   R   ] sys-apps\/busybox-1.1.0 to \/root\/ROOT\/i686-gentoo-linux-uclibc\/ \r\n[ebuild  N    ] sys-apps\/busybox-1.1.0 to \/root\/ROOT\/ia64-unknown-linux-gnu\/ \r\n[ebuild  N    ] sys-apps\/busybox-1.1.0 to \/root\/ROOT\/iop\/ \r\n[ebuild  N    ] sys-apps\/busybox-1.1.0 to \/root\/ROOT\/m68k-gentoo-linux-uclibc\/ \r\n[ebuild  N    ] sys-apps\/busybox-1.1.0 to \/root\/ROOT\/m68k-unknown-linux-gnu\/ \r\n[ebuild   R   ] sys-apps\/busybox-1.1.0 to \/root\/ROOT\/mips-gentoo-linux-uclibc\/ \r\n[ebuild   R   ] sys-apps\/busybox-1.1.0 to \/root\/ROOT\/mips-unknown-linux-gnu\/ \r\n[ebuild  N    ] sys-apps\/busybox-1.1.0 to \/root\/ROOT\/mips64-unknown-linux-gnu\/ \r\n[ebuild  N    ] sys-apps\/busybox-1.1.0 to \/root\/ROOT\/mips64el-unknown-linux-gnu\/ \r\n[ebuild   R   ] sys-apps\/busybox-1.1.0 to \/root\/ROOT\/mipsel-gentoo-linux-uclibc\/ \r\n[ebuild   R   ] sys-apps\/busybox-1.1.0 to \/root\/ROOT\/mipsel-unknown-linux-gnu\/ \r\n[ebuild   R   ] sys-apps\/busybox-1.1.0 to \/root\/ROOT\/powerpc-gentoo-linux-uclibc\/ \r\n[ebuild  N    ] sys-apps\/busybox-1.1.0 to \/root\/ROOT\/powerpc-softfloat-linux-gnu\/ \r\n[ebuild   R   ] sys-apps\/busybox-1.1.0 to \/root\/ROOT\/powerpc-softfloat-linux-uclibc\/ \r\n[ebuild   R   ] sys-apps\/busybox-1.1.0 to \/root\/ROOT\/powerpc-unknown-linux-gnu\/ \r\n[ebuild  N    ] sys-apps\/busybox-1.1.0 to \/root\/ROOT\/powerpc64-unknown-linux-gnu\/ \r\n[ebuild   R   ] sys-apps\/busybox-1.1.0 to \/root\/ROOT\/s390-ibm-linux-gnu\/ \r\n[ebuild   R   ] sys-apps\/busybox-1.1.0 to \/root\/ROOT\/s390x-ibm-linux-gnu\/ \r\n[ebuild  N    ] sys-apps\/busybox-1.1.0 to \/root\/ROOT\/sh-gentoo-linux-uclibc\/ \r\n[ebuild  N    ] sys-apps\/busybox-1.1.0 to \/root\/ROOT\/sh-unknown-linux-gnu\/ \r\n[ebuild   R   ] sys-apps\/busybox-1.1.0 to \/root\/ROOT\/sh4-gentoo-linux-uclibc\/ \r\n[ebuild   R   ] sys-apps\/busybox-1.1.0 to \/root\/ROOT\/sh4-unknown-linux-gnu\/ \r\n[ebuild  N    ] sys-apps\/busybox-1.1.0 to \/root\/ROOT\/sh4eb-gentoo-linux-uclibc\/ \r\n[ebuild  N    ] sys-apps\/busybox-1.1.0 to \/root\/ROOT\/sh4eb-unknown-linux-gnu\/ \r\n[ebuild  N    ] sys-apps\/busybox-1.1.0 to \/root\/ROOT\/sheb-gentoo-linux-uclibc\/ \r\n[ebuild  N    ] sys-apps\/busybox-1.1.0 to \/root\/ROOT\/sheb-unknown-linux-gnu\/ \r\n[ebuild  N    ] sys-apps\/busybox-1.1.0 to \/root\/ROOT\/sparc-gentoo-linux-uclibc\/ \r\n[ebuild   R   ] sys-apps\/busybox-1.1.0 to \/root\/ROOT\/sparc-unknown-linux-gnu\/ \r\n[ebuild   R   ] sys-apps\/busybox-1.1.0 to \/root\/ROOT\/sparc64-unknown-linux-gnu\/ \r\n[ebuild  N    ] sys-apps\/busybox-1.1.0 to \/root\/ROOT\/x86_64-gentoo-linux-uclibc\/ \r\n[ebuild   R   ] sys-apps\/busybox-1.1.0 to \/root\/ROOT\/x86_64-pc-linux-gnu\/ \r\n<\/pre>\n<p>Well that&#8217;s cool and all. But how to test stuff? Thats where qemu comes to the rescue.. Few mins of hacking and poof we come up with a little something something like so.<\/p>\n<pre>\r\n#!\/bin\/sh\r\n\r\npkg_genext2fs() {\r\n\r\n        if ! type -p genext2fs > \/dev\/null; then\r\n                echo \"no genext2fs\"\r\n                return 1\r\n        fi\r\n\r\n        cd $1 || return 1\r\n\r\nrom=\/rom\r\n\r\n        mkdir -p {usr\/,}{s,}bin etc\/init.d proc\/self dev\/shm root tmp .\/${rom}\r\n\r\n        chmod 700 root\r\n        chmod 1777 tmp\r\n\r\n################\r\ncat &lt;&lt;EOF &gt; etc\/init.d\/rcS \r\n#!\/bin\/sh\r\nrom=$rom\r\nmount -a\r\nmount tmpfs \\$rom -t tmpfs\r\nmkdir -p \\$rom\/proc \\$rom\/dev \\$rom\/ro \\$rom\/tmp\r\nmount -o bind \/dev \\$rom\/dev\r\nmount -o bind \/proc \\$rom\/proc\r\nbusybox cp -a bin etc lib root sbin usr \\$rom\/\r\nchmod 1777 \\$rom\/tmp\r\npivot_root \\$rom\/ \\$rom\/ro\r\nEOF\r\n################\r\n\r\n        chmod +x etc\/init.d\/rcS\r\n\r\n        if [ ! -L proc\/self\/exe ]; then\r\n                cd proc\/self\r\n                ln -s \/bin\/busybox exe\r\n\r\n                if [ -e \/proc\/self\/fd ] ; then\r\n                        ln -fs \/proc\/self\/fd fd 2> \/dev\/null\r\n                        ln -fs fd\/0 stdin\r\n                        ln -fs fd\/1 stdout\r\n                        ln -fs fd\/2 stderr\r\n                fi\r\n                cd ..\/..\/\r\n        fi\r\n        cd etc\r\n        ln -sf ..\/proc\/mounts mtab\r\n        grep -v ^# \/etc\/protocols > protocols\r\n\r\n        cd ..\r\n\r\n        cd dev\r\n        ln -sf \/proc\/kcore core\r\n\r\n        # ttys\r\n        for i in `seq 0 9`; do\r\n                [ ! -e tty$i ] &amp;&amp; mknod tty$i c 4 $i\r\n        done\r\n        [ ! -e tty ] &amp;&amp; (mknod -m 666 tty c 5 0 2> \/dev\/null || echo cant mknod for tty)\r\n\r\n        [ ! -e null ] &amp;&amp;  (mknod -m 666 null c 1 3 2> \/dev\/null || echo cant mknod for null)\r\n        [ ! -e zero ] &amp;&amp; (mknod -m 666 zero c 1 5 2> \/dev\/null || echo cant mknod for zero)\r\n        [ ! -e urandom ] &amp;&amp; (mknod -m 644 urandom c 1 9 2> \/dev\/null || echo cant mknod for urandom)\r\n        [ ! -e random ] &amp;&amp; mknod random c 1 8\r\n        [ ! -e console ] &amp;&amp; mknod console c 5 1\r\n        [ ! -e full ] &amp;&amp; mknod full c 1 7\r\n        [ ! -e kmem ] &amp;&amp; mknod kmem c 1 2\r\n        [ ! -e mem ] &amp;&amp; mknod mem c 1 1\r\n        [ ! -e port ] &amp;&amp; mknod port c 1 4\r\n\r\n        # IDE devs\r\n                [ ! -e hda ] &amp;&amp; mknod hda b 3 0\r\n        [ ! -e hdb ] &amp;&amp; mknod hdb b 3 64\r\n        [ ! -e hdc ] &amp;&amp; mknod hdc b 22 0\r\n        [ ! -e hdd ] &amp;&amp; mknod hdd b 22 64\r\n\r\n        # loop devs\r\n        for i in `seq 0 7`; do [ ! -e loop$i ] &amp;&amp; mknod loop$i b 7 $i; done\r\n\r\n        # ram devs\r\n        for i in `seq 0 9`; do [ ! -e  ram$i ] &amp;&amp; mknod ram$i b 1 $i ; done\r\n        [ ! -L ram ] &amp;&amp; ln -s ram1 ram\r\n\r\n        # virtual console screen devs\r\n        for i in `seq 0 9`; do [ ! -e vcs$i ] &amp;&amp; mknod vcs$i b 7 $i; done\r\n\r\n        chown root:tty tty 2> \/dev\/null\r\n        chown root:sys null zero 2> \/dev\/null\r\n        cd -\r\n\r\n################\r\n## \/etc\/fstab ##\r\n################\r\ncat &lt;&lt;EOF &gt; etc\/fstab\r\n#\/dev\/root      \/               ro,defaults  defaults 0 0\r\nproc            \/proc           proc    defaults 0 0\r\n#none           \/dev            devfs   defaults 0 0\r\ndevpts          \/dev\/pts        devpts  defaults,gid=5,mode=620  0 0\r\ntmpfs           \/tmp            tmpfs   defaults 0 0\r\ntmpfs           $rom            tmpfs   defaults 0 0\r\ntmpfs           \/dev\/shm        tmpfs   defaults 0 0\r\nEOF\r\n################\r\n\r\n        cd ${TOPDIR} || return 1\r\n        cd $1 || return 1\r\n\r\n        scanelf -qnBR . | grep libgcc\r\n        REALSIZE=$(LANG=C du .\/ -s -c -k | grep total | awk '{print $1}')\r\n        ADDTOROOTSIZE=$([ $REALSIZE -ge 20000 ] &amp;&amp; echo 16384 || echo 16)\r\n        SIZE=$(( $REALSIZE + $ADDTOROOTSIZE ))\r\n        INODES=$(($(find ${DESTDIR} | wc -l) + 400))\r\n        genext2fs -i ${INODES} -b ${SIZE} -q -d . $2\r\n        cd $TOPDIR\r\n}\r\n\r\nTOPDIR=$PWD\r\n\r\ntarballs=\"$@\"\r\n[[ $1 == \"\" ]] &amp;&amp; tarballs=\"$(ls *.tar.bz2)\"\r\n\r\nfor x in ${tarballs} ; do\r\n        d=$(basename $x .tar.bz2)\r\n        cd $TOPDIR\r\n        pkg_genext2fs ${d} $TOPDIR\/${d}.ext2\r\n        [ $? != 0 ] &amp;&amp; echo WTF $?\r\ndone\r\n\r\n<\/pre>\n<p>End result..<br \/>\narm-gentoo-linux-uclibc.ext2     armeb-softfloat-linux-uclibc.ext2  mips-gentoo-linux-uclibc.ext2     powerpc-softfloat-linux-uclibc.ext2<br \/>\narm-softfloat-linux-uclibc.ext2  i386-gentoo-linux-uclibc.ext2      mipsel-gentoo-linux-uclibc.ext2   sh4-gentoo-linux-uclibc.ext2<br \/>\narmeb-gentoo-linux-uclibc.ext2   i686-gentoo-linux-uclibc.ext2      powerpc-gentoo-linux-uclibc.ext2<\/p>\n<p>As we can see uClibc is clearly better at everything. In this case being cross compiled and producing all the parts needed in order to be booted..<\/p>\n<p>wget http:\/\/tinderbox.x86.dev.gentoo.org\/portage\/local\/misc\/i386-gentoo-linux-uclibc.ext2<\/p>\n<p>qemu -kernel \/boot\/bzImage -append &#8220;root=\/dev\/hda init=\/sbin\/init rootfstype=ext2 ro&#8221; i386-gentoo-linux-uclibc.ext2<\/p>\n<p>Sweet worked like a charm..<br \/>\nNext task is to mass x-compile some kernels for other arches and see what qemu can do for us..<\/p>\n","protected":false},"excerpt":{"rendered":"<p>So I pushed that pax-utils. Improved Makefile handling. (vapier) QA_TEXTREL\/QA_EXECSTACK\/QA_WX_LOAD exempt filtering flags. (kevquinn) Handle versioned symbols correctly on unstripped ELF files when using the -s flag. Do not assume it is ok to read from stdin if the -l -p flags were given. (solar) Now it&#8217;s time to get back to some cross compiling &hellip; <a href=\"https:\/\/blogs.gentoo.org\/solar\/2006\/05\/18\/cross_compile_madness\/\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">Cross Compile Madness.<\/span><\/a><\/p>\n","protected":false},"author":36,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[3],"tags":[],"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/blogs.gentoo.org\/solar\/wp-json\/wp\/v2\/posts\/9"}],"collection":[{"href":"https:\/\/blogs.gentoo.org\/solar\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.gentoo.org\/solar\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.gentoo.org\/solar\/wp-json\/wp\/v2\/users\/36"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.gentoo.org\/solar\/wp-json\/wp\/v2\/comments?post=9"}],"version-history":[{"count":1,"href":"https:\/\/blogs.gentoo.org\/solar\/wp-json\/wp\/v2\/posts\/9\/revisions"}],"predecessor-version":[{"id":39,"href":"https:\/\/blogs.gentoo.org\/solar\/wp-json\/wp\/v2\/posts\/9\/revisions\/39"}],"wp:attachment":[{"href":"https:\/\/blogs.gentoo.org\/solar\/wp-json\/wp\/v2\/media?parent=9"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.gentoo.org\/solar\/wp-json\/wp\/v2\/categories?post=9"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.gentoo.org\/solar\/wp-json\/wp\/v2\/tags?post=9"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}