diff options
author | Ilya Palachev <i.palachev@samsung.com> | 2014-08-04 14:59:11 +0400 |
---|---|---|
committer | Ilya Palachev <i.palachev@samsung.com> | 2014-08-08 17:10:32 +0400 |
commit | 547faf5b968f48421e18ace9511ab407184eb4f8 (patch) | |
tree | d074475dc09c456fe5d47254aa2b953fe844159c | |
parent | e37301c081d978ae4af1f1b2b917221616d0dafe (diff) | |
download | qemu-accel-547faf5b968f48421e18ace9511ab407184eb4f8.tar.gz qemu-accel-547faf5b968f48421e18ace9511ab407184eb4f8.tar.bz2 qemu-accel-547faf5b968f48421e18ace9511ab407184eb4f8.zip |
Add Aarch64 support and support of upgraded toolchain
1. Added spec-file qemu-accel-aarch64.spec for Aarch64 architecture
of qemu-accel. It's based on modified file qemu-accel-armv7l.spec.
2. Added support of adding new cross utilities using separate macros,
instead of hardcoded list of binaries that is hard to maintain. So
now it's possible to add/remove groups of binaries using macros.
(only in qemu-accel-aarch64.spec)
3. Added optional switch between native and cross-accelerated binfmt
mode using macro "use_binfmt_binary". Depending on its value the file
baselibs.conf is modified so that to turn on native or cross binfmt
mode (binary qemu-aarch64 provides native mode, qemu-aarch64-binfmt
provides cross-accelerated mode).
(only in qemu-accel-aarch64.spec)
4. Added macros "gcc_version" and "gcc_version_dot" to control gcc
version through macros (currently they are set directly by hardcoded
version numbers).
(in qemu-accel-aarch64.spec and qemu-accel-armv7l.spec)
5. Added post-install script for qemu-accel-aarch64 package in
baselibs.conf file.
6. Generation of redundant packages "qemu-accel-armv7l-*.aarch64.rpm"
and "qemu-accel-aarch64-*.armv7l.rpm" is avoided by commands
"targettype ... block!" in file baselibs.conf.
7. Added wrapper script also for /usr/bin/g++ (currently there is a
wrapper script only for /usr/bin/gcc). This wrapper runs native
compiler instead of cross one in case when environment variable
LD_LIBRARY_PATH is set. This is done because "If LIBRARY_PATH is set,
native gcc adds the contents to its library search list, but cross
gcc does not. So switch to all native in these situations".
(in qemu-accel-aarch64.spec and qemu-accel-armv7l.spec)
8. Added two options "-B" for each call of cross compiler (gcc or
g++) using existing wrapper script. This is done because in current
configuration of toolchain directories compiler fails to find
binutils executables. Options "-B" set direct paths to these
directories.
(in qemu-accel-aarch64.spec and qemu-accel-armv7l.spec)
9. Run native linker (/usr/bin/ld) in case when cross-accelerated
linker fails. This is the only way to build current version of gcc,
because otherwise the build fails with following error:
ld: ./gcc/liblto_plugin.so: error loading plugin:
./gcc/liblto_plugin.so: cannot open shared object file:
No such file or directory
This happens because cross ld cannot use native module
liblto_plugin.so generated during the build of gcc. (It is done in
post-install script in baselibs.conf both for aarch64 and armv7l)
10. Created symlinks to files needed by native ld for the case when
we want to use it instead of cross-accelerated ld (crtbegin.o,
crtbeginS.o, crtbeginT.o, crtend.o, crtendS.o). (It is done in
post-install script in baselibs.conf both for aarch64 and armv7l)
11. Cutted off extra path (/emul/...) in the case when we want to use
native ld instead of cross-accelerated ld. It is done in post-install
script in baselibs.conf.
Change-Id: I294bc231b511c95a78cc58bcb441ac9ed56c4069
Signed-off-by: Ilya Palachev <i.palachev@samsung.com>
-rw-r--r-- | packaging/baselibs.conf | 77 | ||||
-rw-r--r-- | packaging/qemu-accel-aarch64.spec | 446 | ||||
-rw-r--r-- | packaging/qemu-accel-armv7l.spec | 51 |
3 files changed, 551 insertions, 23 deletions
diff --git a/packaging/baselibs.conf b/packaging/baselibs.conf index 845bfa6..d23f00b 100644 --- a/packaging/baselibs.conf +++ b/packaging/baselibs.conf @@ -1,7 +1,10 @@ -arch i686 targets armv7l:cross-arm +arch i686 targets armv7l:cross-arm aarch64:cross-aarch64 - -targettype cross-arm package qemu-accel-armv7l +qemu-accel-armv7l + targettype cross-arm requires "gcc" + targettype cross-aarch64 block! + targettype 32bit block! + targettype cross-arm autoreqprov off extension -cross post "set -x" @@ -40,4 +43,72 @@ targettype cross-arm package qemu-accel-armv7l post "rm -rf /usr/armv7l-tizen-linux-gnueabi/lib" post "ln -s /lib /usr/armv7l-tizen-linux-gnueabi/usr/lib" post "builtin echo 0 >/proc/sys/vm/mmap_min_addr" + post "" + post "if [ -f /usr/bin/gcc ] ; then" + post " export GCCVER=$(LANG=C gcc --version | head -1 | sed -e "s/^.*gcc[^0-9]*\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*$/\1.\2/") " + post " # Create symlinks to files needed by native ld for the case if we want to use it instead of cross ld:" + post " for f in crtbegin.o crtbeginS.o crtbeginT.o crtend.o crtendS.o ; do" + post " ln -s /usr/lib/gcc/armv7l-tizen-linux-gnueabi/${GCCVER}/$f /usr/armv7l-tizen-linux-gnueabi/bin/$f;" + post " done" + post "fi" + +/ + +qemu-accel-aarch64 + targettype cross-aarch64 requires "gcc" + targettype cross-arm block! + targettype 32bit block! + targettype cross-aarch64 + autoreqprov off + extension -cross + post "set -x" + post "builtin echo 'Starting qemu post script'" + post "if [ $(uname -m) = aarch64 ]; then" + post " builtin echo aarch64 arch" + post " ln -sf %{our_path}/lib/libnsl.so.1 /lib/libnsl.so.1 || true" + post "fi" + post "# load the binfmt_misc module" + post "if [ ! -d /proc/sys/fs/binfmt_misc ]; then" + post " builtin echo Calling modprobe" + post " /sbin/modprobe binfmt_misc" + post "fi" + post "" + post "did_mount_it=''" + post "" + post "if [ ! -f /proc/sys/fs/binfmt_misc/register ]; then" + post " builtin echo mounting binfmt_misc" + post " mount binfmt_misc -t binfmt_misc /proc/sys/fs/binfmt_misc" + post " did_mount_it='1'" + post "fi" + post "" + post "if [ -e /proc/sys/fs/binfmt_misc/aarch64 ]; then" + post " builtin echo Unregistering accelerated handler" + post " builtin echo -1 > /proc/sys/fs/binfmt_misc/aarch64" + post "fi" + post "if [ ! -e /proc/sys/fs/binfmt_misc/aarch64 ]; then" + post " builtin echo Registering right binfmt handler" + post "%if 0%{?use_binfmt_binary}" + post "builtin echo ':aarch64:M::\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xb7:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/qemu/qemu-aarch64-binfmt:P' > /proc/sys/fs/binfmt_misc/register" + post "%else" + post "builtin echo ':aarch64:M::\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xb7:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/qemu/qemu-aarch64:OC' > /proc/sys/fs/binfmt_misc/register" + post "%endif" + post "fi" + post "cat /proc/sys/fs/binfmt_misc/aarch64 | sed -e 's/mask/mask /'" + post "" + post "if [ -n $did_mount_it ]; then " + post " builtin echo "Unmounting again.";" + post " umount /proc/sys/fs/binfmt_misc" + post "fi" + post "" + post "echo All done" + post "" + post "# Fix up sysroot paths" + post "echo 0 >/proc/sys/vm/mmap_min_addr" + post "" + post "if [ -f /usr/bin/gcc ] ; then" + post " export GCCVER=$(LANG=C gcc --version | head -1 | sed -e "s/^.*gcc[^0-9]*\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*$/\1.\2/") " + post " # Create symlinks to files needed by native ld for the case if we want to use it instead of cross ld:" + post " for f in crtbegin.o crtbeginS.o crtbeginT.o crtend.o crtendS.o ; do" + post " ln -s /usr/lib/gcc/aarch64-tizen-linux/${GCCVER}/$f /usr/lib/$f;" + post " done" + post "fi" +/ diff --git a/packaging/qemu-accel-aarch64.spec b/packaging/qemu-accel-aarch64.spec new file mode 100644 index 0000000..e369d6b --- /dev/null +++ b/packaging/qemu-accel-aarch64.spec @@ -0,0 +1,446 @@ +# +# spec file for package qemu-accel-armv7l +# +# Copyright (c) 2012 SUSE LINUX Products GmbH, Nuernberg, Germany. +# +# All modifications and additions to the file contributed by third parties +# remain the property of their copyright owners, unless otherwise agreed +# upon. The license for this file, and modifications and additions to the +# file, is the same license as for the pristine package itself (unless the +# license for the pristine package is not an Open Source License, in which +# case the license is the MIT License). An "Open Source License" is a +# license that conforms to the Open Source Definition (Version 1.9) +# published by the Open Source Initiative. + +# Please submit bugfixes or comments via http://bugs.opensuse.org/ +# + +# Check whether macro "gcc_version" was defined via project config +%if 0%{?gcc_version} +%else +# If the macro was undefined, set it to this default value: +%define gcc_version 49 +%endif +%{expand:%%define gcc_version_dot %(echo "%{gcc_version}" | sed -e "s/\([0-9]\)\([0-9]\)/\1.\2/g")} + + +# Choose which gcc hijack method (if any) to use. +# Only select one of the two at a time! +%define hijack_gcc 1 + +# Set to 1 if you want to use qemu-aarch64-binfmt, not normal qemu +%define use_binfmt_binary 1 + +# Set to 1 if you want to use cross binary executables +%define use_cross_binaries 1 + +# Whether to use different cross binaries and their libraries +%define use_cross_ldso 1 +%define use_cross_nss 1 +%define use_cross_bash 1 +%define use_cross_rpm 1 +%define use_cross_archivators 1 +%define use_cross_stream_editors 1 +%define use_cross_coreutils 1 +%define use_cross_gettext_tools 1 +%define use_cross_make 1 +%define use_cross_m4 1 +%define use_cross_patch 1 +%define use_cross_binutils 1 +%define use_cross_su 0 + +%if 0%{!?use_cross_binaries} +%define hijack_gcc 0 +%endif + +Name: qemu-accel-aarch64 +Version: 0.4 +Release: 0 +VCS: platform/upstream/qemu-accel#ca50f86f943b96de45d50929495024471f0060aa +AutoReqProv: off +BuildRequires: cross-aarch64-binutils +%if %hijack_gcc +BuildRequires: cross-aarch64-gcc%{gcc_version}-icecream-backend +%endif +#BuildRequires: expect +BuildRequires: fdupes +BuildRequires: glibc-locale +BuildRequires: gcc-c++ +BuildRequires: gettext-runtime +BuildRequires: gettext-tools +BuildRequires: m4 +# required for xxd +BuildRequires: vim +BuildRequires: patchelf +BuildRequires: rpmlint-mini +BuildRequires: qemu-linux-user +Requires: coreutils +Summary: Native binaries for speeding up cross compile +License: GPL-2.0 +Group: Development/Libraries/Cross +ExclusiveArch: x86_64 %ix86 + +# default path in qemu +%define HOST_ARCH %(echo %{_host_cpu} | sed -e "s/i.86/i586/;s/ppc/powerpc/;s/sparc64.*/sparc64/;s/sparcv.*/sparc/;") +%define our_path /emul/%{HOST_ARCH}-for-aarch64 +%ifarch %ix86 +%define icecream_cross_env cross-aarch64-gcc%{gcc_version}-icecream-backend_i386 +%else +%define icecream_cross_env cross-aarch64-gcc%{gcc_version}-icecream-backend_x86_64 +%endif +%define binaries_binutils addr2line ar as elfedit gprof ld ld.bfd nm objcopy objdump ranlib readelf size strings strip +%define binaries_binutils_comma %(echo %{binaries_binutils} | sed -e "s/ /,/g") + +%description +This package is used in aarch64 architecture builds using qemu to speed up builds +with native binaries. +This should not be installed on systems, it is just intended for qemu environments. + +%prep +%setup -q -D -T -n . + +%build + +%install +%if 0%{?use_cross_binaries} +%if 0%{?use_cross_nss} +binaries="%{_libdir}/libnsl.so.1 %{_libdir}/libnss_compat.so.2 %{_libdir}/rpm-plugins/msm.so" # loaded via dlopen by glibc +%endif # use_cross_nss +%ifarch %ix86 + LD="/lib/ld-linux.so.2" +%else +%ifarch x86_64 + LD="/lib64/ld-linux-x86-64.so.2" +%else + echo "ERROR unhandled arch" + exit 1 +%endif +%endif +%endif # use_cross_binaries + +# XXX this fails with the following error: +# /opt/testing/bin/python: error while loading shared libraries: libpython2.7.so.1.0: wrong ELF class: ELFCLASS32 + +%if 0%{?use_cross_binaries} +%if 0%{?use_cross_ldso} +for executable in \ +%if 0%{?use_cross_bash} + /usr/bin/bash \ +%endif # use_cross_bash +%if 0%{?use_cross_rpm} + /usr/bin/{rpm,rpm2cpio,rpmdb,rpmkeys,rpmqpack,rpmbuild,rpmsign,rpmspec} \ + %{_libdir}/rpm-plugins/{exec.so,msm.so} \ + %{_libdir}/{libdb-4.8.so,libdb_cxx-4.8.so} \ +%endif # use_cross_rpm +%if 0%{?use_cross_archivators} + /usr/bin/{tar,gzip,bzip2,xz,xzdec} \ +%endif # use_cross_archivators +%if 0%{?use_cross_stream_editors} + /usr/bin/{grep,egrep,sed} \ +%endif # use_cross_stream_editors +%if 0%{use_cross_nss} +%ifarch %ix86 + %{_libdir}/libnssdbm3.so %{_libdir}/libsoftokn3.so %{_libdir}/libfreebl3.so \ +%else + /usr/lib64/libnssdbm3.so /usr/lib64/libsoftokn3.so /lib64/libfreebl3.so \ +%endif +%endif # use_cross_nss +%if 0%{?use_cross_coreutils} + /usr/bin/{cat,expr,mkdir,mv,rm,rmdir} \ +%endif # use_cross_coreutils +%if 0%{?use_cross_gettext_tools} + /usr/bin/{msgexec,msgfmt,msgcat,msgmerge} \ +%endif # use_cross_gettext_tools +%if 0%{use_cross_make} + /usr/bin/make \ +%endif # use_cross_make +%if 0%{?use_cross_m4} + /usr/bin/m4 \ +%endif # use_cross_m4 +%if 0%{?use_cross_patch} + /usr/bin/patch \ +%endif # use_cross_patch +%if 0%{?use_cross_binutils} + /usr/bin/aarch64-tizen-linux-{%{binaries_binutils_comma}} \ +%endif +%if 0%{?use_cross_su} + /usr/bin/su \ +%endif + $LD +do + binaries="$binaries $executable `ldd $executable | sed -n 's,.*=> \(/[^ ]*\) .*,\1,p'`" +done +%endif # use_cross_ldso +%endif # use_cross_binaries + +%if %hijack_gcc + +mkdir -p cross-compiler-tmp +for executable in $(tar -C cross-compiler-tmp -xvzf /usr/share/icecream-envs/cross-aarch64-gcc%{gcc_version}-icecream-backend_*.tar.gz); do + if [ ! -d "cross-compiler-tmp/$executable" ] ; then + binaries="$binaries cross-compiler-tmp/$executable" + fi +done +%endif + + +%if %hijack_gcc +# Install +mkdir -p %buildroot%{our_path}/usr/share/icecream-envs/%{icecream_cross_env} +cp -a /usr/share/icecream-envs/%{icecream_cross_env}.tar.gz \ + %buildroot%{our_path}/usr/share/icecream-envs +# And extract it for direct usage +tar xvz -C %buildroot%{our_path}/usr/share/icecream-envs/%{icecream_cross_env} -f /usr/share/icecream-envs/cross-aarch64-gcc%{gcc_version}-icecream-backend_*.tar.gz +# It needs a tmp working directory which is writable +install -d -m0777 %buildroot%{our_path}/usr/share/icecream-envs +%endif + +for binary in $binaries +do + outfile=%buildroot%{our_path}$(echo $binary | sed 's:cross-compiler-tmp::;s:/opt/cross/aarch64-tizen-linux:/usr:') + [ -f $outfile ] && continue + mkdir -p ${outfile%/*} + cp -aL $binary $outfile + # XXX hack alert! Only works for aarch64-on-x86_64 +%ifarch x86_64 + #[ "$(basename $outfile)" = "bash" ] && sed -i 's/x86_64/aarch64/g' "$outfile" +%endif + objdump -s -j .rodata -j .data $outfile | sed 's/^ *\([a-z0-9]*\)/\1:/' | \ + grep ': ' | grep -v 'file format' | grep -v 'Contents of section' | \ + xxd -g4 -r - $outfile.data + if grep -q "%{HOST_ARCH}"$outfile.data; then + echo "ERROR file $binary leaks host information into the guest" + exit 1 + fi + rm -f $outfile.data + [ "$binary" == "$LD" ] && continue + patchelf --debug --set-rpath "%our_path/%_lib:%our_path%_libdir" $outfile +# not all binaries have an .interp section + if patchelf --print-interpreter $outfile; then + patchelf --debug --set-interpreter %{our_path}$LD $outfile + fi +done + +%if 0%{?use_cross_binaries} +# make gconv libraries available (needed for msg*) +%if 0%{?use_cross_gettext_tools} +%ifarch x86_64 +mkdir -p %{buildroot}/usr/lib64/gconv +cp -a /usr/lib64/gconv/* "%{buildroot}/usr/lib64/gconv/" +%endif +%endif # use_cross_gettext_tools + +# create symlinks for bash +%if 0%{?use_cross_bash} +mkdir -p "%{buildroot}%{our_path}/bin/" +mkdir -p "%{buildroot}%{our_path}/usr/bin/" +ln -sf ../usr/bin/bash "%{buildroot}%{our_path}/bin/sh" +ln -sf ../../bin/bash "%{buildroot}%{our_path}/usr/bin/sh" +%endif # use_cross_bash + +# binutils needs to be exposed in /usr/bin +%if %{?use_cross_binutils} +if [ ! -d %{buildroot}%{our_path}/usr/aarch64-tizen-linux/bin ] ; then + mkdir -p %{buildroot}%{our_path}/usr/aarch64-tizen-linux/bin +fi + +for i in %{binaries_binutils} ; do + if [ -f %{buildroot}%{our_path}/%{_bindir}/aarch64-tizen-linux-$i ] ; then + mv %{buildroot}%{our_path}/%{_bindir}/aarch64-tizen-linux-$i %{buildroot}%{our_path}/usr/aarch64-tizen-linux/bin/$i + if [ -f %{buildroot}%{our_path}/%{_bindir}/$i ] ; then + rm %{buildroot}%{our_path}/%{_bindir}/$i + fi + ln -s ../aarch64-tizen-linux/bin/$i %{buildroot}%{our_path}/%{_bindir}/$i + ln -s ../aarch64-tizen-linux/bin/$i %{buildroot}%{our_path}/%{_bindir}/aarch64-tizen-linux-$i + fi +done +pushd %{buildroot}%{our_path} && ln -s usr/bin && popd +%endif # use_cross_binutils +%endif # use_cross_binaries + +%if %hijack_gcc +# create symlinks for lib64 / lib mappings (gcc!) +mkdir -p "%{buildroot}%{our_path}/usr/lib/" +# binutils secondary directories +mkdir -p %{buildroot}%{our_path}/usr/aarch64-tizen-linux/ +ln -sf ../bin %{buildroot}%{our_path}/usr/aarch64-tizen-linux/bin + +%ifarch %ix86 +ln -sf ../lib/gcc "%{buildroot}%{our_path}/usr/lib/gcc" +%else +ln -sf ../lib64/gcc "%{buildroot}%{our_path}/usr/lib/gcc" +%endif +# g++ can also be called c++ +ln -sf g++ "%{buildroot}%{our_path}/usr/bin/c++" +# gcc can also be called cc +ln -sf gcc "%{buildroot}%{our_path}/usr/bin/cc" +# gcc can also be called gcc-4.8 +ln -sf gcc "%{buildroot}%{our_path}/usr/bin/gcc-%{gcc_version_dot}" + +# nasty hack: If LIBRARY_PATH is set, native gcc adds the contents to its +# library search list, but cross gcc does not. So switch to all +# native in these situations. +for compiler in gcc g++ +do + mv %{buildroot}%{our_path}/usr/bin/${compiler}{,.real} + echo '#!/bin/bash + if [ "$LIBRARY_PATH" ]; then + mv %{our_path}{,.bkp} + exec /usr/bin/qemu-aarch64 /usr/bin/'${compiler}' "$@" + fi + exec -a /usr/bin/'${compiler}' %{our_path}/usr/bin/'${compiler}'.real "$@" -B%{our_path}/usr/aarch64-tizen-linux/bin -B%{our_path}/%{_libdir}/gcc/aarch64-tizen-linux/%{gcc_version_dot} + ' > %{buildroot}%{our_path}/usr/bin/${compiler} + chmod +x %{buildroot}%{our_path}/usr/bin/${compiler} +done +# +# as is not writing right EABI ELF header inside of aarch64 environment for unknown reason +# +#mv %{buildroot}%{our_path}/usr/bin/as{,.real} +#echo '#!/bin/bash +#exec -a /usr/bin/as %{our_path}/usr/bin/as.real -meabi=5 "$@" +#' > %{buildroot}%{our_path}/usr/bin/as +#chmod +x %{buildroot}%{our_path}/usr/bin/as + +# allow abuild to do the mv +chmod 777 %{buildroot}/emul + +# make cross ld work with emulated compilers +rm %{buildroot}%{our_path}/usr/aarch64-tizen-linux/bin/ld.bfd +ln -s ./ld %{buildroot}%{our_path}/usr/aarch64-tizen-linux/bin/ld.bfd +mv %{buildroot}%{our_path}/usr/aarch64-tizen-linux/bin/ld{,.real} +echo '#!/bin/bash +if [ -n "$LD_LIBRARY_PATH" ]; then + # arguments as file + if [ "${1:0:1}" = "@" ]; then + FILE="${1:1}" + grep -v -- "--sysroot=" "$FILE" > "$FILE.fixed" + mv "$FILE.fixed" "$FILE" + fi + + # cross ld does not work correctly using LD_LIBRARY_PATH, use aarch64 version + args=() + for i in "$@"; do + if [ "${i:0:10}" != "--sysroot=" ]; then + args=(${args[@]} "$i") + fi + done + exec /usr/bin/qemu-aarch64 /usr/bin/ld `echo "${args[@]}" | sed -e "s#%{our_path}##"` +fi +for i in "$@"; do + if [ "${i:0:10}" = "--sysroot=" ]; then + exec -a "$0" %{our_path}/usr/aarch64-tizen-linux/bin/ld.real "$@" + fi +done + +%{our_path}/usr/aarch64-tizen-linux/bin/ld.real --sysroot=/ "$@" || ( /usr/bin/qemu-aarch64 /usr/aarch64-tizen-linux/bin/ld -L/usr/lib/gcc/aarch64-tizen-linux/%{gcc_version_dot}/ `echo "$@" | sed -e "s#%{our_path}##"` ; echo "Running native ld, because cross ld has failed with the following error: " ) +' > %{buildroot}%{our_path}/usr/aarch64-tizen-linux/bin/ld +chmod +x %{buildroot}%{our_path}/usr/aarch64-tizen-linux/bin/ld + +# To support gcc sysroot +mkdir -p %{buildroot}/usr/aarch64-tizen-linux +ln -sf .. %{buildroot}/usr/aarch64-tizen-linux/usr +ln -sf ../include %{buildroot}/usr/aarch64-tizen-linux/include +%endif # hijack_gcc + +# Make QEMU available through /qemu +mkdir %buildroot/qemu +cp -L /usr/bin/qemu-aarch64 %buildroot/qemu/ +mkdir -p %buildroot/usr/bin/ + +cp /usr/bin/qemu-aarch64-binfmt %buildroot/usr/bin/qemu-arm64-binfmt +ln -sf /qemu/qemu-aarch64 %buildroot/usr/bin/qemu-arm64 +ln -sf /qemu/qemu-aarch64 %buildroot/usr/bin/qemu-aarch64 +ln -sf /qemu/qemu-aarch64 %buildroot/qemu/qemu-arm64 +ln -sf /usr/bin/qemu-arm64-binfmt %buildroot/qemu/qemu-arm64-binfmt +ln -sf /usr/bin/qemu-arm64-binfmt %buildroot/qemu/qemu-aarch64-binfmt + +%fdupes -s %{buildroot} + +export NO_BRP_CHECK_RPATH="true" + +# Fix variable in baselibs +%if 0%{?use_binfmt_binary} +sed -e '/use_binfmt_binary/s/.*/\tpost "%%if 1"/' -i %{_sourcedir}/baselibs.conf +%else +sed -e '/use_binfmt_binary/s/.*/\tpost "%%if 0"/' -i %{_sourcedir}/baselibs.conf +%endif + +rm -rf %{buildroot}/%{our_path}/bin +ln -s %{our_path}/usr/bin %{buildroot}/%{our_path}/bin +rm -rf %{buildroot}/%{our_path}/sbin +ln -s %{our_path}/usr/sbin %{buildroot}/%{our_path}/sbin + +%if 0%{?use_cross_rpm} +ln -s %{our_path}/usr/bin/rpm %{buildroot}/%{our_path}/usr/bin/rpmquery +ln -s %{our_path}/usr/bin/rpm %{buildroot}/%{our_path}/usr/bin/rpmverify +%endif # use_cross_rpm + +%post +if [ $(uname -m) = aarch64 ]; then + builtin echo "aarch64 arch" + # XXX find a way around this for cross-gcc + mkdir -p /usr/lib64/gcc /lib64 || true + ln -sf ../../lib/gcc/aarch64-tizen-linux /usr/lib64/gcc/aarch64-tizen-linux || true + ln -sf %{our_path}/lib64/libnsl.so.1 /lib64/libnsl.so.1 || true + mkdir -p /qemu + ln -sf /emul/i586-for-aarch64/lib/ld-linux.so.2 /lib + #ln -sf /usr/bin/qemu-aarch64 /qemu/qemu-aarch64-binfmt + echo '/opt/testing/lib/' >> /etc/ld.so.conf +fi +# use qemu-aarch64{,-binfmt} from a safe directory, so even overwriting +# /usr/bin/$file won't affect our ability to run aarch64 code + +# load the binfmt_misc module +if [ ! -d /proc/sys/fs/binfmt_misc ]; then + builtin echo "Calling modprobe" + /sbin/modprobe binfmt_misc +fi + +did_mount_it="" + +if [ ! -f /proc/sys/fs/binfmt_misc/register ]; then + builtin echo "mounting binfmt_misc" + mount binfmt_misc -t binfmt_misc /proc/sys/fs/binfmt_misc + did_mount_it=1 +fi + +builtin echo "Registering accelerated handler" +if [ -e /proc/sys/fs/binfmt_misc/aarch64 ]; then + builtin echo -1 > /proc/sys/fs/binfmt_misc/aarch64 +fi + +builtin echo ':aarch64:M::\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xb7:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/qemu/qemu-aarch64:OC' > /proc/sys/fs/binfmt_misc/register +cat /proc/sys/fs/binfmt_misc/aarch64 + +if [ $did_mount_it ]; then +builtin echo "Unmounting again."; +umount /proc/sys/fs/binfmt_misc +fi + +builtin echo "All done" + +# Fix up sysroot paths +rm -rf /usr/aarch64-tizen-linux/lib +ln -s /lib /usr/aarch64-tizen-linux/usr/lib + +%files +%defattr(-,root,root) +%if 0%{?use_cross_binaries} +%if 0%{?hijack_gcc} +%dir /usr/aarch64-tizen-linux +/usr/aarch64-tizen-linux/usr +/usr/aarch64-tizen-linux/include +%endif # hijack_gcc +%if 0%{?use_cross_ldso} +/emul +%endif # use_cross_ldso +%endif # use_cross_binaries +/qemu +/usr/bin/qemu-arm64-binfmt +/usr/bin/qemu-arm64 +/usr/bin/qemu-aarch64 +%ifarch x86_64 +/usr/lib64 +%endif + +%changelog diff --git a/packaging/qemu-accel-armv7l.spec b/packaging/qemu-accel-armv7l.spec index 1715101..d8b86bd 100644 --- a/packaging/qemu-accel-armv7l.spec +++ b/packaging/qemu-accel-armv7l.spec @@ -20,13 +20,21 @@ # Only select one of the two at a time! %define hijack_gcc 1 +# Check whether macro "gcc_version" was defined via project config +%if 0%{?gcc_version} +%else +# If the macro was undefined, set it to this default value: +%define gcc_version 49 +%endif +%{expand:%%define gcc_version_dot %(echo "%{gcc_version}" | sed -e "s/\([0-9]\)\([0-9]\)/\1.\2/g")} + Name: qemu-accel-armv7l Version: 0.4 Release: 0 VCS: platform/upstream/qemu-accel#submit/tizen/20131025.201555-0-g039eeafa6b52fd126f38fed9cd2fdf36a26a3065 AutoReqProv: off BuildRequires: cross-arm-binutils -BuildRequires: cross-armv7l-gcc48-icecream-backend +BuildRequires: cross-armv7l-gcc%{gcc_version}-icecream-backend #BuildRequires: expect BuildRequires: fdupes BuildRequires: glibc-locale @@ -49,9 +57,9 @@ ExclusiveArch: x86_64 %ix86 %define HOST_ARCH %(echo %{_host_cpu} | sed -e "s/i.86/i586/;s/ppc/powerpc/;s/sparc64.*/sparc64/;s/sparcv.*/sparc/;") %define our_path /emul/%{HOST_ARCH}-for-arm %ifarch %ix86 -%define icecream_cross_env cross-armv7l-gcc48-icecream-backend_i386 +%define icecream_cross_env cross-armv7l-gcc%{gcc_version}-icecream-backend_i386 %else -%define icecream_cross_env cross-armv7l-gcc48-icecream-backend_x86_64 +%define icecream_cross_env cross-armv7l-gcc%{gcc_version}-icecream-backend_x86_64 %endif %description @@ -97,7 +105,7 @@ done %if %hijack_gcc # extract cross-compiler mkdir -p cross-compiler-tmp -for executable in $(tar -C cross-compiler-tmp -xvzf /usr/share/icecream-envs/cross-armv7l-gcc48-icecream-backend_*.tar.gz); do +for executable in $(tar -C cross-compiler-tmp -xvzf /usr/share/icecream-envs/cross-armv7l-gcc%{gcc_version}-icecream-backend_*.tar.gz); do if [ ! -d "cross-compiler-tmp/$executable" ]; then binaries="$binaries cross-compiler-tmp/$executable" fi @@ -111,7 +119,7 @@ mkdir -p %buildroot%{our_path}/usr/share/icecream-envs/%{icecream_cross_env} cp -a /usr/share/icecream-envs/%{icecream_cross_env}.tar.gz \ %buildroot%{our_path}/usr/share/icecream-envs # And extract it for direct usage -tar xvz -C %buildroot%{our_path}/usr/share/icecream-envs/%{icecream_cross_env} -f /usr/share/icecream-envs/cross-armv7l-gcc48-icecream-backend_*.tar.gz +tar xvz -C %buildroot%{our_path}/usr/share/icecream-envs/%{icecream_cross_env} -f /usr/share/icecream-envs/cross-armv7l-gcc%{gcc_version}-icecream-backend_*.tar.gz # It needs a tmp working directory which is writable install -d -m0755 %buildroot%{our_path}/usr/share/icecream-envs %endif @@ -174,21 +182,24 @@ ln -sf ../lib64/gcc "%{buildroot}%{our_path}/usr/lib/gcc" ln -sf g++ "%{buildroot}%{our_path}/usr/bin/c++" # gcc can also be called cc ln -sf gcc "%{buildroot}%{our_path}/usr/bin/cc" -# gcc can also be called gcc-4.8 -ln -sf gcc "%{buildroot}%{our_path}/usr/bin/gcc-4.8" +# gcc can also be called gcc-%{gcc_version_dot} +ln -sf gcc "%{buildroot}%{our_path}/usr/bin/gcc-%{gcc_version_dot}" # nasty hack: If LIBRARY_PATH is set, native gcc adds the contents to its # library search list, but cross gcc does not. So switch to all # native in these situations. -mv %{buildroot}%{our_path}/usr/bin/gcc{,.real} -echo '#!/bin/bash -if [ "$LIBRARY_PATH" ]; then - mv %{our_path}{,.bkp} - exec /usr/bin/qemu-arm /usr/bin/gcc "$@" -fi -exec -a /usr/bin/gcc %{our_path}/usr/bin/gcc.real "$@" -' > %{buildroot}%{our_path}/usr/bin/gcc -chmod +x %{buildroot}%{our_path}/usr/bin/gcc +for compiler in gcc g++ +do + mv %{buildroot}%{our_path}/usr/bin/${compiler}{,.real} + echo '#!/bin/bash + if [ "$LIBRARY_PATH" ]; then + mv %{our_path}{,.bkp} + exec /usr/bin/qemu-arm /usr/bin/'${compiler}' "$@" + fi + exec -a /usr/bin/'${compiler}' %{our_path}/usr/bin/'${compiler}'.real "$@" -B%{our_path}/usr/armv7l-tizen-linux-gnueabi/bin -B%{our_path}/%{_libdir}/gcc/armv7l-tizen-linux-gnueabi/%{gcc_version_dot} + ' > %{buildroot}%{our_path}/usr/bin/${compiler} + chmod +x %{buildroot}%{our_path}/usr/bin/${compiler} +done # # as is not writing right EABI ELF header inside of arm environment for unknown reason # @@ -219,7 +230,7 @@ if [ -n "$LD_LIBRARY_PATH" ]; then args=(${args[@]} "$i") fi done - exec /usr/bin/qemu-arm /usr/bin/ld "${args[@]}" + exec /usr/bin/qemu-arm /usr/bin/ld `echo "${args[@]}" | sed -e "s#%{our_path}##"` fi for i in "$@"; do if [ "${i:0:10}" = "--sysroot=" ]; then @@ -227,7 +238,7 @@ for i in "$@"; do fi done -exec -a "$0" %{our_path}/usr/arm-tizen-linux-gnueabi/bin/ld.real --sysroot=/ "$@" +%{our_path}/usr/arm-tizen-linux-gnueabi/bin/ld.real --sysroot=/ "$@" || ( /usr/bin/qemu-arm /usr/armv7l-tizen-linux-gnueabi/bin/ld -L/usr/lib/gcc/armv7l-tizen-linux-gnueabi/4.9/ `echo "$@" | sed -e "s#%{our_path}##"` ; echo "Running native ld, because cross ld has failed with the following error: " ) ' > %{buildroot}%{our_path}/usr/arm-tizen-linux-gnueabi/bin/ld chmod +x %{buildroot}%{our_path}/usr/arm-tizen-linux-gnueabi/bin/ld @@ -291,7 +302,7 @@ if [ -e /proc/sys/fs/binfmt_misc/arm ]; then builtin echo ':arm:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/qemu/qemu-arm-binfmt:P' > /proc/sys/fs/binfmt_misc/register fi -if [ $did_mount_it ]; then +if [ $did_mount_it ]; then builtin echo "Unmounting again."; umount /proc/sys/fs/binfmt_misc fi @@ -303,7 +314,7 @@ rm -rf /usr/armv7l-tizen-linux-gnueabi/lib ln -s /lib /usr/armv7l-tizen-linux-gnueabi/usr/lib %files -%defattr(-,root,root) +%defattr(-,root,root) %dir /usr/armv7l-tizen-linux-gnueabi /usr/armv7l-tizen-linux-gnueabi/usr /usr/armv7l-tizen-linux-gnueabi/include |