bud17-402: virtual perspectives on cross-compilation

44
Virtual perspectives on cross- compiling Alex Bennée Linaro Connect BUD17-402 1

Upload: linaro

Post on 12-Apr-2017

218 views

Category:

Technology


1 download

TRANSCRIPT

Page 1: BUD17-402: Virtual Perspectives on Cross-compilation

Virtual perspectives on cross-compilingAlex Bennée

Linaro Connect BUD17-402

1

Page 2: BUD17-402: Virtual Perspectives on Cross-compilation

Budapest 2017

Who Am IAlex BennéeSenior VirtualisationEngineer@ Linaro since 2013Mostly work on QEMU's TCG

2 . 1

Page 3: BUD17-402: Virtual Perspectives on Cross-compilation

Budapest 2017

Virtualisation Solves Everything!

2 . 2

Page 4: BUD17-402: Virtual Perspectives on Cross-compilation

Budapest 2017

Talk Structure

2 . 3

Page 5: BUD17-402: Virtual Perspectives on Cross-compilation

Budapest 2017

Use Case - Kernel Compile

3 . 1

Page 6: BUD17-402: Virtual Perspectives on Cross-compilation

Budapest 2017

The Kernel Compile

Running:

Gives:

export PATH=${HOME}/${COMPILER}/bin:$PATH export ARCH=arm export CONFIG_CROSS_COMPILE=arm-linux-gnueabihf- make -j9 | tail -n 3

LD arch/arm/boot/compressed/vmlinux OBJCOPY arch/arm/boot/zImage Kernel: arch/arm/boot/zImage is ready

3 . 2

Page 7: BUD17-402: Virtual Perspectives on Cross-compilation

Budapest 2017

Kernel Compiles Are Easy!

Self ContainedNo external librariesso

no headersno shared objectsno static archivesno pkg-con�g

3 . 3

Page 8: BUD17-402: Virtual Perspectives on Cross-compilation

Budapest 2017

Use Case - Simple Test Case

4 . 1

Page 9: BUD17-402: Virtual Perspectives on Cross-compilation

Budapest 2017

The Code#include <stdio.h>

int main(int argc, char **argv) { printf("Hello World\n"); }

4 . 2

Page 10: BUD17-402: Virtual Perspectives on Cross-compilation

Budapest 2017

The Compile

Running:

Gives:

aarch64-linux-gnu-gcc --static simple-hello.c -o simple-hello file simple-hello

simple-hello: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), statically linked, for GNU/Linux 3.7.0, BuildID[sha1]=4712144fd1986c295641da66f7f5d40d35a2b1fb, not stripped

4 . 3

Page 11: BUD17-402: Virtual Perspectives on Cross-compilation

Budapest 2017

Use Case - Using other libraries

5 . 1

Page 12: BUD17-402: Virtual Perspectives on Cross-compilation

Budapest 2017

The Code#include <stdio.h> #include <glib.h>

int main(int argc, char **argv) { g_message("Hello World\n"); }

5 . 2

Page 13: BUD17-402: Virtual Perspectives on Cross-compilation

Budapest 2017

A Native Compile

Getting include paths:

Compiling:

Gives:

pkg-config glib-2.0 --cflags --libs

-I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -lglib-2.0

gcc glib-hello.c ${FLAGS} -o glib-hello-native file glib-hello-native

glib-hello-native: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=1a4db3259cd31f564d2ec60654ef478d372b20d2, not stripped

5 . 3

Page 14: BUD17-402: Virtual Perspectives on Cross-compilation

Budapest 2017

A Cross Compile

Running:

Gives:

FLAGS="$(pkg-config glib-2.0 --cflags --libs)" aarch64-linux-gnu-gcc glib-hello.c ${FLAGS} -o glib-hello-arm64

/usr/lib/gcc-cross/aarch64-linux-gnu/5/../../../../aarch64-linux-gnu/bin/ld: cannot find -lglib-2.0 collect2: error: ld returned 1 exit status

5 . 4

Page 15: BUD17-402: Virtual Perspectives on Cross-compilation

Budapest 2017

Use Case - Multi-arch user-space build

6 . 1

Page 16: BUD17-402: Virtual Perspectives on Cross-compilation

Budapest 2017

Enabling ARM64 on Debiandpkg --add-architecture arm64 apt-get update -qq apt-get install -yy libglib2.0-dev:arm64 apt-get build-dep -a arm64 qemu

6 . 2

Page 17: BUD17-402: Virtual Perspectives on Cross-compilation

Budapest 2017

Compile Flags

Call:

For:

aarch64-linux-gnu-pkg-config glib-2.0 --cflags --libs

-I/usr/include/glib-2.0 -I/usr/lib/aarch64-linux-gnu/glib-2.0/include -L/usr/lib/aarch64-linux-gnu -lglib-2.0

6 . 3

Page 18: BUD17-402: Virtual Perspectives on Cross-compilation

Budapest 2017

Compile

Running this:

Gives:

aarch64-linux-gnu-gcc glib-hello.c ${FLAGS} -o glib-hello-arm64-pkgconfig file glib-hello-arm64-pkgconfig

glib-hello-arm64-pkgconfig: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, for GNU/Linux 3.7.0, BuildID[sha1]=cf29dbefb15b5c9936760e765f313e0ba4c3399a, not stripped

6 . 4

Page 19: BUD17-402: Virtual Perspectives on Cross-compilation

Budapest 2017

Multi-Arch Pros/Cons

7 . 1

Page 20: BUD17-402: Virtual Perspectives on Cross-compilation

Budapest 2017

Sing Debian's Praises

10 supportedarchitecturesMany additional "ports"Excellent maintainers ;-)

7 . 2

Page 21: BUD17-402: Virtual Perspectives on Cross-compilation

Budapest 2017

Caveats

Secondary architecture must matchversions

even minor di�erence will failNot all packages are multi-arch "clean"

ARM is pretty good, but not completeVery Debian

Even Ubuntu needs portsNot portable to other

7 . 3

Page 22: BUD17-402: Virtual Perspectives on Cross-compilation

Budapest 2017

Other OptionsChrootCross-buildsystem

BuildrootOpenEmedded

8 . 1

Page 23: BUD17-402: Virtual Perspectives on Cross-compilation

Budapest 2017

Chroot Issues

Often project speci�cUnknownprovenienceCan be �ddly to set-up

8 . 2

Page 24: BUD17-402: Virtual Perspectives on Cross-compilation

Budapest 2017

Build Systems

Builds full-stackToolchainLibrariesProject Manifest

Designed as DistrobuildersMassive overkill

8 . 3

Page 25: BUD17-402: Virtual Perspectives on Cross-compilation

Budapest 2017

Our Wishlist

Concisely de�ned build-environmentWidely available across distrosFully buzzword compliant

8 . 4

Page 26: BUD17-402: Virtual Perspectives on Cross-compilation

Budapest 2017

Docker

9 . 1

Page 27: BUD17-402: Virtual Perspectives on Cross-compilation

Budapest 2017

De�nitionFROM debian:stable-slim # Setup Emdebian RUN echo "deb http://emdebian.org/tools/debian/ jessie main" >> /etc/apt/sources.list RUN curl http://emdebian.org/tools/debian/emdebian-toolchain-archive.key | apt-key add - # Duplicate deb line as deb-src RUN cat /etc/apt/sources.list | sed "s/deb/deb-src/" >> /etc/apt/sources.list # Add arm64 multiarch RUN dpkg --add-architecture arm64 # Install what we need RUN apt update RUN apt install -yy crossbuild-essential-arm64 RUN apt-get build-dep -yy -a arm64 qemu

9 . 2

Page 28: BUD17-402: Virtual Perspectives on Cross-compilation

Budapest 2017

Docker guest notes

Defaults toroot

Self-contained �le-system

RUN id alex 2>/dev/null || useradd -u 1000 -U alex

9 . 3

Page 29: BUD17-402: Virtual Perspectives on Cross-compilation

Budapest 2017

Invocation

Running:

Gives:

docker run --rm \ --user=$(id -un) -v $(pwd):$(pwd) -w $(pwd) \ qemu:debian-arm64-cross \ aarch64-linux-gnu-gcc glib-hello.c \ -I/usr/include/glib-2.0 \ -I/usr/lib/aarch64-linux-gnu/glib-2.0/include \ -L/usr/lib/aarch64-linux-gnu -lglib-2.0 \ -o glib-hello-arm64-docker

glib-hello-arm64-docker: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, for GNU/Linux 3.7.0, BuildID[sha1]=cf29dbefb15b5c9936760e765f313e0ba4c3399a, not stripped

9 . 4

Page 30: BUD17-402: Virtual Perspectives on Cross-compilation

Budapest 2017

Use Case - When Multi-Arch doesn'twork

Multi-Arch might be brokenDevelopment OS may not beDebian

10 . 1

Page 31: BUD17-402: Virtual Perspectives on Cross-compilation

Budapest 2017

If only

10 . 2

Page 32: BUD17-402: Virtual Perspectives on Cross-compilation

Budapest 2017

linux-user in Docker

Guest thinks it is an ARM system, with completeARM rootfs

docker run --rm -i \ --user=$(id -un) -v $(pwd):$(pwd) -w $(pwd) \ qemu:debian-armhf-user \ uname -a

Linux 52fb9e5738b4 4.4.0-64-generic #85-Ubuntu SMP Mon Feb 20 11:50:30 UTC 2017 armv7l GNU/Linux

10 . 3

Page 33: BUD17-402: Virtual Perspectives on Cross-compilation

Budapest 2017

Caveats

binfmt_misc notcontainerisedstatic QEMU saferslower than native cross

10 . 4

Page 34: BUD17-402: Virtual Perspectives on Cross-compilation

Budapest 2017

Use Case - QEMU Build System

11 . 1

Page 35: BUD17-402: Virtual Perspectives on Cross-compilation

Budapest 2017

Why?

Portable build recipesused by

Building guest testcases

Patchew

11 . 2

Page 36: BUD17-402: Virtual Perspectives on Cross-compilation

Budapest 2017Help

make docker

Build QEMU and run tests inside Docker containers

Available targets:

docker: Print this help. docker-test: Run all image/test combinations. docker-clean: Kill and remove residual docker testing containers. docker-TEST@IMAGE: Run "TEST" in container "IMAGE". Note: "TEST" is one of the listed test name, or a script name under $QEMU_SRC/tests/docker/; "IMAGE" is one of the listed container name." docker-image: Build all images. docker-image-IMAGE: Build image "IMAGE". docker-run: For manually running a "TEST" with "IMAGE"

Available container images: gentoo travis fedora min-glib debian-s390x-cross centos6 ubuntu debian-bootstrap debian-arm64-cross debian debian-armhf-

Page 37: BUD17-402: Virtual Perspectives on Cross-compilation

cross

Available tests: test-clang test-mingw test-build test-quick test-full

Available tools: travis

Special variables: TARGET_LIST=a,b,c Override target list in builds. EXTRA_CONFIGURE_OPTS="..." Extra configure options. IMAGES="a b c ..": Filters which images to build or run. TESTS="x y z .." Filters which tests to run (for docker-test). J=[0..9]* Overrides the -jN parameter for make commands (default is 1) DEBUG=1 Stop and drop to shell in the created container before running the command. NOUSER Define to disable adding current user to containers passwd. NOCACHE=1 Ignore cache when build images. EXECUTABLE=<path> Include executable in image.

11 . 3

Page 38: BUD17-402: Virtual Perspectives on Cross-compilation

Budapest 2017

Examplesmake docker-test-build@centos6 J=9

make docker-test-quick@travis J=9

make docker-test-build@debian-arm64-cross TARGET_LIST="arm-softmmu,arm-linux-user" J=9

make docker-test-build@debian-ppc-user TARGET_LIST="ppc-softmmu" J=9

11 . 4

Page 39: BUD17-402: Virtual Perspectives on Cross-compilation

Budapest 2017

SummaryKernel compiles are the simple caseUser-space adds complexityMulti-Arch helps with cross-compilingDocker allows us to paper over the cracksCombine Docker with QEMU for double thefun

12 . 1

Page 40: BUD17-402: Virtual Perspectives on Cross-compilation

Budapest 2017

Questions?

13 . 1

Page 41: BUD17-402: Virtual Perspectives on Cross-compilation

Thank You#BUD17

For further information: www.linaro.org

BUD17 keynotes and videos on: connect.linaro.org

14 . 1

Page 42: BUD17-402: Virtual Perspectives on Cross-compilation

Budapest 2017

Extra Slides

15 . 1

Page 43: BUD17-402: Virtual Perspectives on Cross-compilation

Budapest 2017Debian Bootstrap#!/bin/sh # Simple wrapper for debootstrap, run in the docker build context FAKEROOT=`which fakeroot 2> /dev/null` # debootstrap < 1.0.67 generates empty sources.list, see Debian#732255 MIN_DEBOOTSTRAP_VERSION=1.0.67 if [ -z $FAKEROOT ]; then... if [ -z "${DEB_ARCH}" ]; then ... if [ -z "${DEB_TYPE}" ]; then ... # Check for debootstrap or checkout debootstrap from its # upstream SCM and run it from there. ... # Finally check to see binfmt_misc is setup BINFMT_DIR=/proc/sys/fs/binfmt_misc if [ ! -e $BINFMT_DIR ]; then ... ${FAKEROOT} ${DEBOOTSTRAP} --variant=buildd --foreign --arch=$DEB_ARCH $DEB_TYPE . http://httpredir.debian.org/debian || exit 1 exit 0

15 . 2

Page 44: BUD17-402: Virtual Perspectives on Cross-compilation

Budapest 2017Debian User Docker�le# Create Debian Bootstrap Image # # This is intended to be pre-poluated by: # - a first stage debootstrap (see debian-bootstrap.pre) # - a native qemu-$arch that binfmt_misc will run FROM scratch

# Add everything from the context into the container ADD . /

# Patch all mounts as docker already has stuff set up RUN sed -i 's/in_target mount/echo not for docker in_target mount/g' /debootstrap/functions

# Run stage 2 RUN /debootstrap/debootstrap --second-stage

# At this point we can install additional packages if we want # Duplicate deb line as deb-src RUN cat /etc/apt/sources.list | sed "s/deb/deb-src/" >> /etc/apt/sources.list RUN apt-get update RUN apt-get -y build-dep qemu

15 . 3