;;;;;
title: Installing HLA on Archlinux
tags: hla, archlinux, vagrant
date: 2014-12-27 21:43
format: md
;;;;;

I recently started reading
[The Art of Assembly Language, 2nd Edition](http://www.nostarch.com/assembly2.htm).
It uses High-Level Assembly language in its code examples and this
requires a special compiler, or assembler, to turn your code into
machine code.

## Fixing the PKGBUILD

The compiler, `hla`, is available on the Archlinux User Repository
[here](https://aur.archlinux.org/packages/hla/). At the time of
writing, though, that `PKGBUILD` doesn't work entirely. By default
pacman removes all static libraries from the created packages, which
took me a while to find out. Adding the following line to the
`PKGBUILD` fixes it:

    options=(staticlibs)

I also placed a comment on the AUR page, but there has been no sign
of acknowledgment so far.

## Running on x86_64

After having installed the compiler I got a lot of errors compiling
my very simple hello world application, as typed over from the
book. The gist of them was that it couldn't create 64-bit
executables, which isn't very surprising as HLA seems to be only
for x86 (32-bit) architecture. Another comment on the AUR page
helped that though. One should add the `-lmelf_i386` switch to the
`hla` command-line. So I put in my `~/.zshrc`:

    alias hla="hla -lmelf_i386"

This discovery only came after a few other attempts to install HLA.

## Alternative: Using Vagrant

Before I'd read about the `-lmelf_i386` command-line switch I was
looking at ways to run a 32-bit operating system inside my
Archlinux installation. There are a few options I'm familiar with:
lxc, Docker and Vagrant.

At first I tried to create a 32-bit Archlinux container, but the
installation script failed, so I couldn't get that started. Then I
went on to Vagrant, which worked pretty quickly.

I used the `ubuntu/trusty32` box, which can be downloaded by calling:

    vagrant box add ubuntu/trusty32

A very short `Vagrantfile`:

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

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

and then the provision in `vagrant.sh`:

    wget http://www.plantation-productions.com/Webster/HighLevelAsm/HLAv2.16/linux.hla.tar.gz
    tar --directory / --extract --file linux.hla.tar.gz

    cat > /etc/profile.d/hla.sh <<EOF
    #!/usr/bin/bash

    export hlalib=/usr/hla/hlalib
    export hlainc=/usr/hla/include
    export hlatemp=/tmp
    export PATH="${PATH}:/usr/hla"
    EOF

After that you can just call `vagrant up`, wait a while and then have
fun playing around with HLA in an Ubuntu 14.04 environment.

