gllvm/examples/linux-kernel
2018-05-07 11:34:36 -07:00
..
bash_profile Beter build from tarballs. 2018-05-07 09:41:38 -07:00
bootstrap.sh Beter build from tarballs. 2018-05-07 09:41:38 -07:00
build_linux_gllvm_git.sh Comparison... 2018-05-07 11:34:36 -07:00
build_linux_gllvm_tarball.sh Beter build from tarballs. 2018-05-07 09:41:38 -07:00
build_linux_wllvm_git.sh Comparison... 2018-05-07 11:34:36 -07:00
build_linux_wllvm_tarball.sh Beter build from tarballs. 2018-05-07 09:41:38 -07:00
README.md Comparison... 2018-05-07 11:34:36 -07:00
tinyconfig64 Birthing some examples. Starting with a biggie. 2018-04-30 09:58:19 -07:00
Vagrantfile Birthing some examples. Starting with a biggie. 2018-04-30 09:58:19 -07:00

Building a recent Linux Kernel.

In this directory we include all the necessary files needed to build the kernel in a Ubuntu 16.04 vagrant box. We will guide the reader through the relatively simple task. We assume familiarity with Vagrant.

Vagrantfile

# -*- mode: ruby -*-
# vi: set ft=ruby :


Vagrant.configure("2") do |config|
  
  config.vm.box = "ubuntu/xenial64"
  config.vm.provision :shell, path: "bootstrap.sh"

  config.vm.provider "virtualbox" do |vb|
    vb.memory = "4096"
    vb.customize ["modifyvm", :id, "--ioapic", "on"]
    vb.customize ["modifyvm", :id, "--memory", "4096"]
    vb.customize ["modifyvm", :id, "--cpus", "4"]
   end

end

Bootstrapping

#!/usr/bin/env bash

# vagrant bootstrapping file

sudo apt-get update

sudo apt-get install -y emacs24 dbus-x11 
sudo apt-get install -y git
sudo apt-get install -y llvm-5.0 libclang-5.0-dev clang-5.0
sudo apt-get install -y python-pip golang-go
sudo apt-get install -y flex bison bc libncurses5-dev
sudo apt-get install -y libelf-dev libssl-dev

echo ". /vagrant/bash_profile" >> /home/vagrant/.bashrc

Shell Settings

#### /vagrant/bash_profile

####  llvm
export LLVM_HOME=/usr/lib/llvm-5.0
export GOPATH=/vagrant/go

######## gllvm/wllvm configuration #############

export LLVM_COMPILER=clang
export WLLVM_OUTPUT_LEVEL=WARNING
export WLLVM_OUTPUT_FILE=/vagrant/wrapper.log
export PATH=${GOPATH}/bin:${LLVM_HOME}/bin:${PATH}

Configuration stuff.

The file tinyconfig64 is generated by make tinyconfig and then using make menuconfig to specialize the build to 64 bits.

The Tarball Build with gllvm

The build process is carried out by running the build_linux_gllvm.sh script.

#!/usr/bin/env bash

### building from a tarball with gllvm

go get github.com/SRI-CSL/gllvm/cmd/...

cd ${HOME}
wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.14.39.tar.xz
tar xvf linux-4.14.39.tar.xz
cd linux-4.14.39

cp /vagrant/tinyconfig64 .config

make CC=gclang HOSTCC=gclang

get-bc -m -b built-in.o
get-bc -m vmlinux

The Tarball Build with wllvm

The build process is carried out by running the build_linux_wllvm.sh script.

#!/usr/bin/env bash

### building from a tarball with wllvm

sudo pip install wllvm

cd ${HOME}
wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.14.39.tar.xz
tar xvf linux-4.14.39.tar.xz
cd linux-4.14.39

cp /vagrant/tinyconfig64 .config


make CC=wllvm HOSTCC=wllvm

extract-bc -m -b built-in.o
extract-bc -m vmlinux

Comparing the two

gclang build:

real	2m55.689s
user	4m10.036s
sys     0m34.780s

wllvm build:

real	6m52.443s
user	4m32.124s
sys  	0m44.072s

Building from a git clone

You can also build from a git clone using gllvm, or build from a git clone using wllvm. Though using a tarball is faster, and seemingly more reliable.