From Fedora Project Wiki
(Created page with "= AArch64 Bootstrap Stage 1 Notes == Here's what changed from f17 to get aarch64 to bootstrap (using the ARM supplied 2012Q2 cross-compiler set), in order of the steps taken i...")
 
(initial draft of the page (from existing notes elsewhere))
Line 1: Line 1:
= AArch64 Bootstrap Stage 1 Notes ==
= AArch64 Bootstrap Stage 1 Notes =
Here's what changed from f17 to get aarch64 to bootstrap (using the ARM supplied 2012Q2 cross-compiler set), in order of the steps taken in DJ's stage1 script.
Here's what changed from f17 to get aarch64 to bootstrap (using the ARM supplied 2012Q2 cross-compiler set), in order of the steps taken in DJ's stage1 script.
   
   
The current versions of all the scripts used are in git:
The current versions of all the scripts used are in git:
<pre>  
<pre>
$ git clone http://fedorapeople.org/groups/armv8/bootstrap.git  
$ git clone http://fedorapeople.org/groups/armv8/bootstrap.git  
</pre>  
</pre>  
Line 77: Line 77:
   
   
Added aarch64 to config.sub, added patch to mpfr.spec.
Added aarch64 to config.sub, added patch to mpfr.spec.
mpc
 
=== mpc ===
Source: libmpc-0.9-2.fc17.2.aarch64.src.rpm
Source: libmpc-0.9-2.fc17.2.aarch64.src.rpm
   
   
Added aarch64 to config.sub, added patch to libmpc.spec.
Added aarch64 to config.sub, added patch to libmpc.spec.
ppl
 
=== ppl ===
Source: ppl-0.11.2-8.fc17.aarch64.src.rpm
Source: ppl-0.11.2-8.fc17.aarch64.src.rpm
   
   
Added aarch64 to config.sub (two of them), added patch to ppl.spec.
Added aarch64 to config.sub (two of them), added patch to ppl.spec.
 
cloog
=== cloog ===
Source: cloog-0.15.11-3.fc17.1.aarch64.src.rpm
Source: cloog-0.15.11-3.fc17.1.aarch64.src.rpm
   
   
Added aarch64 to config.sub, added patch to cloog.spec.  Modified the build step in stage1 from:
Added aarch64 to config.sub, added patch to cloog.spec.  Modified the build step in stage1 from:
<pre>
make $J
make $J
</pre>
to:
to:
<pre>
make $J LDADD="-rpath ${ROOTFS}/lib -lcloog"
make $J LDADD="-rpath ${ROOTFS}/lib -lcloog"
</pre>
to workaround symbols/libraries not being found during build.  Unclear whether this is the right fix or not, or whether there's actually a libtool/rpath problem.
to workaround symbols/libraries not being found during build.  Unclear whether this is the right fix or not, or whether there's actually a libtool/rpath problem.
libsepol
 
=== libsepol ===
Source: libsepol-2.1.7-3.fc17.src.rpm
Source: libsepol-2.1.7-3.fc17.src.rpm
   
   
No changes needed.
No changes needed.
libselinux
 
=== libselinux ===
Source: libselinux-2.1.10-4.fc17.src.rpm
Source: libselinux-2.1.10-4.fc17.src.rpm
   
   
No changes needed to the source.  Had to modify the make step in the stage1 script to work around missing symbol/library issues found; added the following to the end of the make command:
No changes needed to the source.  Had to modify the make step in the stage1 script to work around missing symbol/library issues found; added the following to the end of the make command:
<pre>
LDFLAGS="-Wl,-rpath -Wl,${ROOTFS}/lib"
LDFLAGS="-Wl,-rpath -Wl,${ROOTFS}/lib"
zlib
</pre>
 
=== zlib ===
Source: zlib-1.2.5-7.fc17.src.rpm
Source: zlib-1.2.5-7.fc17.src.rpm
 
No changes needed.
No changes needed.
t-binutils
 
=== t-binutils ===
See binutils step.
See binutils step.
t-gcc
 
=== t-gcc ===
See gcc-host step.
See gcc-host step.
bash
 
=== bash ===
Source: bash-4.2.37-2.fc17.aarch64.src.rpm
Source: bash-4.2.37-2.fc17.aarch64.src.rpm
   
   
Added aarch64 to config.sub, added patch to bash.spec.
Added aarch64 to config.sub, added patch to bash.spec.
make
 
=== make ===
Source: make-3.82-13.fc17.aarch64.src.rpm
Source: make-3.82-13.fc17.aarch64.src.rpm
   
   
Added aarch64 to config.sub, added patch to make.spec.
Added aarch64 to config.sub, added patch to make.spec.
sed
 
=== sed ===
Source: sed-4.2.1-10.fc17.aarch64.src.rpm
Source: sed-4.2.1-10.fc17.aarch64.src.rpm
   
   
Added aarch64 to config.sub, added patch to sed.spec.  It was also necessary to modify the make step in the stage1 script to work around symbols/libraries not being found;  that step went from:
Added aarch64 to config.sub, added patch to sed.spec.  It was also necessary to modify the make step in the stage1 script to work around symbols/libraries not being found;  that step went from:
<pre>
make $J V=1
make $J V=1
</pre>
to:
to:
<pre>
make $J V=1 CFLAGS="-lselinux -Wl,-rpath -Wl,${ROOTFS}/lib"
make $J V=1 CFLAGS="-lselinux -Wl,-rpath -Wl,${ROOTFS}/lib"
coreutils
</pre>
 
=== coreutils ===
Source: coreutils-8.15-7.fc17.aarch64.src.rpm
Source: coreutils-8.15-7.fc17.aarch64.src.rpm
   
   
Added aarch64 to config.sub, added patch to coreutils.spec.  It was also necessary to modify the make step in the stage1 script to work around symbols/libraries not being found;  that step went from:
Added aarch64 to config.sub, added patch to coreutils.spec.  It was also necessary to modify the make step in the stage1 script to work around symbols/libraries not being found;  that step went from:
<pre>
make $J V=1
make $J V=1
</pre>
to:
to:
<pre>
make $J V=1 CFLAGS="-lselinux -Wl,-rpath -Wl,${ROOTFS}/lib"
make $J V=1 CFLAGS="-lselinux -Wl,-rpath -Wl,${ROOTFS}/lib"
</pre>
And finally, since glibc is now a 2.16, use of gets() is deprecated, and the version of gnulib source being used still referenced it, so removed those uses of gets().
And finally, since glibc is now at 2.16, use of <code>gets()</code> is deprecated, and the version of gnulib source being used still referenced it, so removed those uses of gets().
util-linux
 
=== util-linux ===
Source: util-linux-2.21.2-2.fc17.aarch64.src.rpm
Source: util-linux-2.21.2-2.fc17.aarch64.src.rpm
   
   
Line 151: Line 166:
   
   
Also had to add aarch64 as a recognized architecture in the fdisk code for disk labels.
Also had to add aarch64 as a recognized architecture in the fdisk code for disk labels.
tar
 
=== tar ===
Source: tar-1.26-7.fc17.aarch64.src.rpm
Source: tar-1.26-7.fc17.aarch64.src.rpm
   
   
Line 157: Line 173:
   
   
Since glibc is now at 2.16, use of gets() is deprecated, but the version of gnulib source being used still referenced it, so removed those uses of gets().
Since glibc is now at 2.16, use of gets() is deprecated, but the version of gnulib source being used still referenced it, so removed those uses of gets().
gzip
 
=== gzip ===
Source: gzip-1.4-6.fc17.aarch64.src.rpm
Source: gzip-1.4-6.fc17.aarch64.src.rpm
   
   
Line 163: Line 180:
   
   
Since glibc is now at 2.16, use of gets() is deprecated, but the version of gnulib source being used still referenced it, so removed those uses of gets().
Since glibc is now at 2.16, use of gets() is deprecated, but the version of gnulib source being used still referenced it, so removed those uses of gets().
bzip2
 
=== bzip2 ===
Source: bzip2-1.0.6-4.fc17.src.rpm
Source: bzip2-1.0.6-4.fc17.src.rpm
   
   
No changes needed.
No changes needed.
diffutils
 
=== diffutils ===
Source: diffutils-3.2-6.fc17.aarch64.src.rpm
Source: diffutils-3.2-6.fc17.aarch64.src.rpm
   
   
Line 173: Line 192:
   
   
Since glibc is now at 2.16, use of gets() is deprecated, but the version of gnulib source being used still referenced it, so removed those uses of gets().
Since glibc is now at 2.16, use of gets() is deprecated, but the version of gnulib source being used still referenced it, so removed those uses of gets().
findutils
 
=== findutils ===
Source: findutils-4.5.10-4.fc17.aarch64.src.rpm
Source: findutils-4.5.10-4.fc17.aarch64.src.rpm
   
   
Line 179: Line 199:
   
   
Since glibc is now at 2.16, use of gets() is deprecated, but the version of gnulib source being used still referenced it, so removed those uses of gets().
Since glibc is now at 2.16, use of gets() is deprecated, but the version of gnulib source being used still referenced it, so removed those uses of gets().
gawk
 
=== gawk ===
Source: gawk-4.0.1-1.fc17.aarch64.src.rpm
Source: gawk-4.0.1-1.fc17.aarch64.src.rpm
   
   
Added aarch64 to config.sub, added patch to gawk.spec.
Added aarch64 to config.sub, added patch to gawk.spec.
patch
 
=== patch ===
Source: patch-2.6.1-12.fc17.aarch64.src.rpm
Source: patch-2.6.1-12.fc17.aarch64.src.rpm
   
   
Added aarch64 to config.sub, added patch to patch.spec.  Added -ldl to the LIBS variable in Makefile.in.
Added aarch64 to config.sub, added patch to patch.spec.  Added -ldl to the LIBS variable in Makefile.in.
unzip
 
=== unzip ===
Source: unzip-6.0-5.fc17.src.rpm
Source: unzip-6.0-5.fc17.src.rpm
   
   
No changes needed.
No changes needed.
which
 
=== which ===
Source: which-2.20-3.fc17.src.rpm
Source: which-2.20-3.fc17.src.rpm
   
   
No changes needed.
No changes needed.
xz
 
=== xz ===
Source: xz-5.1.2-1alpha.fc17.aarch64.src.rpm
Source: xz-5.1.2-1alpha.fc17.aarch64.src.rpm
   
   
Added aarch64 to config.sub, added patch to xz.spec.
Added aarch64 to config.sub, added patch to xz.spec.
grep
 
=== grep ===
Source: grep-2.14-1.fc17.src.rpm
Source: grep-2.14-1.fc17.src.rpm
   
   
No changes needed.
No changes needed.
distcc
 
=== distcc ===
Source: distcc-3.1-5.fc17.aarch64.src.rpm
Source: distcc-3.1-5.fc17.aarch64.src.rpm
   
   
Added aarch64 to config.sub, added patch to distcc.spec.
Added aarch64 to config.sub, added patch to distcc.spec.
ccache
 
=== ccache ===
Source: ccache-3.1.7-1.fc17.src.rpm
Source: ccache-3.1.7-1.fc17.src.rpm
   
   
No changes needed.
No changes needed.
stage2
 
The values "--with-arch=armv8 --with-fp=neon-armv8" were being passed vi TCONFIGARGS to the various build steps in stage2.  It turns out that nspr really dislikes that in its configure step, and so far no other packages care.  So, removed these from the part of this step that generates local.conf for stage2.
=== stage2 ===
The values "--with-arch=armv8 --with-fp=neon-armv8" were being passed via TCONFIGARGS to the various build steps in stage2.  It turns out that nspr really dislikes that in its configure step, and so far no other packages care.  So, removed these from the part of this step that generates local.conf for stage2.
I often disable distcc by hand; I'm investigating why, but it appears that the FAST model networking when using the APM kernel will sometimes go awry.  If you're using distcc -- which will quite often work -- I'd recommend adding --log-file and --log-level info to the distccd.script and look for fun things like this:
   
   
I often disable distcc by hand; I'm investigating why, but it appears that the ARM FAST model networking when using the APM kernel will sometimes go awry.  If you're using distcc -- which will quite often work -- I'd recommend adding --log-file and --log-level info to the distccd.script and look for fun things like this:
<pre>
distccd[2087] (dcc_check_client) connection from 172.17.100.2:56109
distccd[2087] (dcc_check_client) connection from 172.17.100.2:56109
distccd[2087] compile from chkconfig.c to chkconfig.o
distccd[2087] compile from chkconfig.c to chkconfig.o
Line 221: Line 250:
distccd[2087] (dcc_r_token_int) ERROR: read failed while waiting for token "DOTI"
distccd[2087] (dcc_r_token_int) ERROR: read failed while waiting for token "DOTI"
distccd[2087] (dcc_job_summary) client: 172.17.100.2:56109 OTHER exit:0 sig:0 core:0 ret:108 time:675ms
distccd[2087] (dcc_job_summary) client: 172.17.100.2:56109 OTHER exit:0 sig:0 core:0 ret:108 time:675ms
</pre>
It is not clear what the root cause of the error is, and it does not always occur, nor does it necessarily occur in the same compile.
It is not clear what the root cause of the error is, and it does not always occur, nor does it necessarily occur in the same compile.
   
   
Line 227: Line 256:
   
   
Note that "disabling" distcc implies setting these values:
Note that "disabling" distcc implies setting these values:
<pre>
J=-j1
J=-j1
DISTCC_HOSTS=localhost
DISTCC_HOSTS=localhost
</pre>
in the file stage2/local.conf in the rootfs.
in the file stage2/local.conf in the rootfs.
   
   
There is a strangeness with the stage2 building of local.conf where it will not always generate the DISTCC_HOSTS line properly.  For example, because of VPNs and bridging my hostname ends up having the address 127.0.0.1 which is completely useless for distcc.  It's not clear there's a good way to fix this, though, since desktop environments could vary wildly.
There is a strangeness with the stage2 building of local.conf where it will not always generate the DISTCC_HOSTS line properly.  For example, because of VPNs and bridging my hostname ends up having the address 127.0.0.1 which is completely useless for distcc.  It's not clear there's a good way to fix this, though, since desktop environments could vary wildly.
busybox
 
=== busybox ===
Source: busybox-1.19.4-4.fc17.aarch64.src.rpm
Source: busybox-1.19.4-4.fc17.aarch64.src.rpm
   
   

Revision as of 00:07, 15 November 2012

AArch64 Bootstrap Stage 1 Notes

Here's what changed from f17 to get aarch64 to bootstrap (using the ARM supplied 2012Q2 cross-compiler set), in order of the steps taken in DJ's stage1 script.

The current versions of all the scripts used are in git:

$ git clone http://fedorapeople.org/groups/armv8/bootstrap.git 

Patches/improvements are always welcome.

A copy of all of stage1 (as part of a root file system) can be found here:

http://fedorapeople.org/groups/armv8/rootfs.git

A git clone of the repository will get you a copy of everything in its current state.

Most importantly, all of the modified SRPMs used are in changed/ under http://fedorapeople.org/groups/armv8/SRPMs/f17, and the unchanged SRPMs are in the unchanged/ directory also under the above location. It is unclear at this time whether these changes will be committed back into f17 itself; it's more likely they'll end up in f18 or f19.

If you have access to cross-compilers for ARMv8 in your PATH, and those cross-compilers are named aarch64-redhat-linux-gnu-*, you should be able to recreate all of stage1 with the following:

 
$ git clone http://fedorapeople.org/groups/armv8/bootstrap.git
$ cd bootstrap
$ mkdir f17-local
$ scp username@fedorapeople.org:/project/armv8/SRPMs/f17/changed/* f17-local
$ ln -s f17-local SRPMlocal
$ mkdir f17-sources
$ scp username@fedorapeople.org:/project/armv8/SRPMs/f17/unchanged/* f17-sources
$ ln -s f17-sources SRPMs
$ ./stage1

If you do not have cross-compilers with names of the form given above, you will need to edit the stage1 script to point at the right places.

usrlinks

Had to add in 'cd /; ln -s usr/libexec libexec' for use by the ARM compilers during stage2; this was a change to the stage1 script.

kernel-headers

Used the APM provided kernel tree -- jcm or dmarlin may have more details.

binutils

Source: binutils-2.22.52.0.1-13.fc17.aarch64_1.src.rpm

Used version from jcm; I believe this started from the upstream patch originally submitted and was then beat into submission.

gcc-host

Source: gcc-4.7.1-1.fc17.0.aarch64.src.rpm

The f17 version of GCC was not usable; dmarlin started from the upstream created patch, but then found it was necessary to move to GCC 4.7.2 to get the patch to apply in any reasonable fashion.

glibc-headers

Source: glibc-2.16-17.fc17.aarch64_0.src.rpm

Started from the f18 source tree, and applied the upstream glibc patch; this applies pretty cleanly with this version, but not so much with f17.

Further, this path cleared up a problem where fdopen() would segfault when opening a pipe (e.g., stdin or stdout). At the same time, though, this version of glibc deprecates gets() which causes additional changes in some other packages.

gcc-glibc

See gcc-host step.

glibc

See glibc-headers step.

gcc

See gcc-host step.

dev

No changes needed. Make sure you are present when this step is run since it does invoke sudo.

kernel

N/A. This step was ignored for now and a vendor provided kernel was used for expediency's sake.

gmp

Source: gmp-5.0.2-6.fc17.aarch64.src.rpm

Added aarch64 to config.sub, added patch to gmp.spec.

mpfr

Source: mpfr-3.1.0-2.fc17.aarch64.src.rpm

Added aarch64 to config.sub, added patch to mpfr.spec.

mpc

Source: libmpc-0.9-2.fc17.2.aarch64.src.rpm

Added aarch64 to config.sub, added patch to libmpc.spec.

ppl

Source: ppl-0.11.2-8.fc17.aarch64.src.rpm

Added aarch64 to config.sub (two of them), added patch to ppl.spec.

cloog

Source: cloog-0.15.11-3.fc17.1.aarch64.src.rpm

Added aarch64 to config.sub, added patch to cloog.spec. Modified the build step in stage1 from:

make $J

to:

make $J LDADD="-rpath ${ROOTFS}/lib -lcloog"

to workaround symbols/libraries not being found during build. Unclear whether this is the right fix or not, or whether there's actually a libtool/rpath problem.

libsepol

Source: libsepol-2.1.7-3.fc17.src.rpm

No changes needed.

libselinux

Source: libselinux-2.1.10-4.fc17.src.rpm

No changes needed to the source. Had to modify the make step in the stage1 script to work around missing symbol/library issues found; added the following to the end of the make command:

LDFLAGS="-Wl,-rpath -Wl,${ROOTFS}/lib"

zlib

Source: zlib-1.2.5-7.fc17.src.rpm

No changes needed.

t-binutils

See binutils step.

t-gcc

See gcc-host step.

bash

Source: bash-4.2.37-2.fc17.aarch64.src.rpm

Added aarch64 to config.sub, added patch to bash.spec.

make

Source: make-3.82-13.fc17.aarch64.src.rpm

Added aarch64 to config.sub, added patch to make.spec.

sed

Source: sed-4.2.1-10.fc17.aarch64.src.rpm

Added aarch64 to config.sub, added patch to sed.spec. It was also necessary to modify the make step in the stage1 script to work around symbols/libraries not being found; that step went from:

make $J V=1

to:

make $J V=1 CFLAGS="-lselinux -Wl,-rpath -Wl,${ROOTFS}/lib"

coreutils

Source: coreutils-8.15-7.fc17.aarch64.src.rpm

Added aarch64 to config.sub, added patch to coreutils.spec. It was also necessary to modify the make step in the stage1 script to work around symbols/libraries not being found; that step went from:

make $J V=1

to:

make $J V=1 CFLAGS="-lselinux -Wl,-rpath -Wl,${ROOTFS}/lib"

And finally, since glibc is now at 2.16, use of gets() is deprecated, and the version of gnulib source being used still referenced it, so removed those uses of gets().

util-linux

Source: util-linux-2.21.2-2.fc17.aarch64.src.rpm

Added aarch64 to config.sub(s), added patch to util-linux.spec.

Also had to add aarch64 as a recognized architecture in the fdisk code for disk labels.

tar

Source: tar-1.26-7.fc17.aarch64.src.rpm

Added aarch64 to config.sub, added patch to tar.spec.

Since glibc is now at 2.16, use of gets() is deprecated, but the version of gnulib source being used still referenced it, so removed those uses of gets().

gzip

Source: gzip-1.4-6.fc17.aarch64.src.rpm

Added aarch64 to config.sub, added patch to gzip.spec.

Since glibc is now at 2.16, use of gets() is deprecated, but the version of gnulib source being used still referenced it, so removed those uses of gets().

bzip2

Source: bzip2-1.0.6-4.fc17.src.rpm

No changes needed.

diffutils

Source: diffutils-3.2-6.fc17.aarch64.src.rpm

Added aarch64 to config.sub, added patch to diffutils.spec.

Since glibc is now at 2.16, use of gets() is deprecated, but the version of gnulib source being used still referenced it, so removed those uses of gets().

findutils

Source: findutils-4.5.10-4.fc17.aarch64.src.rpm

Added aarch64 to config.sub, added patch to findutils.spec.

Since glibc is now at 2.16, use of gets() is deprecated, but the version of gnulib source being used still referenced it, so removed those uses of gets().

gawk

Source: gawk-4.0.1-1.fc17.aarch64.src.rpm

Added aarch64 to config.sub, added patch to gawk.spec.

patch

Source: patch-2.6.1-12.fc17.aarch64.src.rpm

Added aarch64 to config.sub, added patch to patch.spec. Added -ldl to the LIBS variable in Makefile.in.

unzip

Source: unzip-6.0-5.fc17.src.rpm

No changes needed.

which

Source: which-2.20-3.fc17.src.rpm

No changes needed.

xz

Source: xz-5.1.2-1alpha.fc17.aarch64.src.rpm

Added aarch64 to config.sub, added patch to xz.spec.

grep

Source: grep-2.14-1.fc17.src.rpm

No changes needed.

distcc

Source: distcc-3.1-5.fc17.aarch64.src.rpm

Added aarch64 to config.sub, added patch to distcc.spec.

ccache

Source: ccache-3.1.7-1.fc17.src.rpm

No changes needed.

stage2

The values "--with-arch=armv8 --with-fp=neon-armv8" were being passed via TCONFIGARGS to the various build steps in stage2. It turns out that nspr really dislikes that in its configure step, and so far no other packages care. So, removed these from the part of this step that generates local.conf for stage2.

I often disable distcc by hand; I'm investigating why, but it appears that the ARM FAST model networking when using the APM kernel will sometimes go awry. If you're using distcc -- which will quite often work -- I'd recommend adding --log-file and --log-level info to the distccd.script and look for fun things like this:

distccd[2087] (dcc_check_client) connection from 172.17.100.2:56109
distccd[2087] compile from chkconfig.c to chkconfig.o
distccd[2087] (dcc_readx) ERROR: unexpected eof on fd5
distccd[2087] (dcc_r_token_int) ERROR: read failed while waiting for token "DOTI"
distccd[2087] (dcc_job_summary) client: 172.17.100.2:56109 OTHER exit:0 sig:0 core:0 ret:108 time:675ms

It is not clear what the root cause of the error is, and it does not always occur, nor does it necessarily occur in the same compile.

Despite that, distcc seems to work just fine.

Note that "disabling" distcc implies setting these values:

J=-j1
DISTCC_HOSTS=localhost

in the file stage2/local.conf in the rootfs.

There is a strangeness with the stage2 building of local.conf where it will not always generate the DISTCC_HOSTS line properly. For example, because of VPNs and bridging my hostname ends up having the address 127.0.0.1 which is completely useless for distcc. It's not clear there's a good way to fix this, though, since desktop environments could vary wildly.

busybox

Source: busybox-1.19.4-4.fc17.aarch64.src.rpm

Added in BusyBox to make the user experience quite a bit nicer. It's not a full version (no NFS mounts or getty yet) but it provides a fairly rich toolset. An /etc/fstab file is also written into the stage2 rootfs that adds in /proc and /sys, and /etc/init.d/rcS is written so that it will mount them (mount -a).

For busybox itself, a patch was added (busybox-aarch64.patch) that adds in the config we use for the rootfs, and another patch that adds an include for <sys/resource.h> for several files that were missing it. The spec file was also updated to include the new patches.