UK tech experts · info@vividrepairs.co.uk
Vivid Repairs
A Linux terminal on a modern workstation showing kernel build output and QEMU emulator window running a historical OS environment
Fix It Yourself · Troubleshooting

Linux 0.11 setup

Published 6 September 202610 min read
As an Amazon Associate, we may earn from qualifying purchases. Our ranking is independent.

Sorted one of these last week in under 25 minutes. The build fails, the emulator won't start, or you're staring at a missing tool error and have no idea where to begin. Linux 0.11 setup trips up a lot of people because the kernel is ancient and modern toolchains have absolutely no patience for it. This guide covers every common failure point, in the order you're most likely to hit them.

TL;DR

Linux 0.11 setup fails because modern GCC, missing bin86 tools, absent disk images, or a misconfigured emulator block the build. Install bin86, gcc-multilib, and QEMU or Bochs, grab hdc-0.11.img from oldlinux.org, then run make followed by make start-hd. Use a maintained linux-0.11-lab repo to skip most of the pain.

⏱️ 13 min read ✅ 85% success rate 📅 Updated August 2026

Key Takeaways

  • Linux 0.11 setup almost always fails because of GCC version mismatch or missing bin86 tools, not bad source code
  • Install bin86 first. Without as86 and ld86 the boot sector simply won't build
  • 64-bit hosts need gcc-multilib and i386 libraries before anything compiles correctly
  • The hdc-0.11.img disk image must be present in the project root before the emulator will boot
  • A maintained linux-0.11-lab repo saves hours compared to raw upstream 0.11 source
  • GDB integration via make debug-hd (QEMU) or bochsrc-gdb.bxrc (Bochs) lets you trace boot failures at the instruction level

At a Glance

  • Difficulty: Intermediate
  • Time Required: 15 to 30 mins
  • Success Rate: 85% of users

What Causes Linux 0.11 Setup to Fail?

The root problem is age. Linux 0.11 was written in 1991 for a very specific toolchain on 32-bit x86 hardware. Your modern Ubuntu or Fedora machine is running 64-bit GCC that has dropped support for half the constructs the old kernel uses. The two don't get along without some deliberate bridging.

The most common culprit is a missing or wrong compiler. Modern GCC (anything past version 4.x, really) will throw errors on inline assembly constraints, old-style function prototypes, and deprecated constructs that 0.11 uses everywhere. Some labs explicitly require GCC 3.4. Others ship patched source that works with newer GCC, but only if you're using the right fork. Mixing instructions from different forks is a fast way to waste an afternoon.

Second most common: missing bin86. The boot sector and setup code aren't compiled by GCC at all. They're assembled by as86 and linked by ld86, both of which come from the bin86 package. If bin86 isn't installed, the build dies immediately with a 'command not found' error that looks confusing if you don't know what as86 is.

After that, it's usually one of three things: no 32-bit library support on a 64-bit host, a missing or misplaced disk image (hdc-0.11.img), or a misconfigured emulator. QEMU and Bochs both need specific setup for this project. QEMU needs the i386 target binary (qemu-system-i386, not qemu-system-x86_64). Bochs needs a matching bochsrc config file. Get either of those wrong and you'll see a blank screen or an immediate crash.

There's also a header path issue that hits on newer distros. The kernel source expects /usr/include/asm to exist. On many modern systems it doesn't. The fix is a one-line symlink, but you have to know to look for it. See the kernel compile error guide if you're seeing a wall of asm-related failures.

Linux 0.11 Setup Quick Fix: Use the Right Repo First

1

Use a Maintained linux-0.11-lab Repo Easy

  1. Get the right source
    Don't start with raw upstream 0.11 source unless you enjoy pain. Use a maintained lab repo such as linux-0.11-lab which ships with working Makefiles, QEMU tooling, and patches already applied for modern hosts.
  2. Check your emulator is callable
    Run qemu-system-i386 --version in a terminal. If you get a version string, QEMU is installed. For Bochs, run bochs -h. If either command fails with 'not found', you need to install the emulator before going any further.
  3. Verify the disk image is present
    Check the project root for hdc-0.11.img. If it's missing, download it from oldlinux.org and place it exactly where the README says. The Makefile path is usually the project root directory itself.
  4. Run the build
    Run make then make start-hd. If a QEMU window opens and you see a boot prompt, your Linux 0.11 setup is working. Done.
If make start-hd opens a QEMU window with a boot prompt, your environment is sorted. No further steps needed.
This quick check works for the majority of 'nothing works, I just unpacked it' situations. If it doesn't, move to the intermediate fix below.

More Linux 0.11 Setup Solutions: Toolchain and Dependencies

This is where most people actually get stuck. The build environment needs four things in place before a single line of 0.11 code will compile: a compatible GCC, the bin86 package, 32-bit library support, and a working emulator. Miss any one of them and you'll get a different error each time, which makes it feel like the problem is moving around when really it's just a queue of missing dependencies.

2

Install bin86, gcc-multilib, and QEMU Intermediate

  1. Update and install build essentials
    Run: sudo apt-get update && sudo apt-get install build-essential. This gives you GCC, make, and the standard C library headers. On Fedora/RHEL use sudo dnf groupinstall 'Development Tools' instead.
  2. Install bin86 for as86 and ld86
    Run: sudo apt-get install bin86. Verify it worked with which as86. You should get a path back. If you don't, the package name on your distro might differ (try apt-cache search as86 to find it).
  3. Enable 32-bit library support
    Run: sudo apt-get install gcc-multilib lib32z1. On some setups you also need sudo apt-get install linux-libc-dev:i386. Without this, GCC on a 64-bit host will refuse to produce 32-bit output and you'll see errors about incompatible target.
  4. Install QEMU with i386 support
    Run: sudo apt-get install qemu-system-x86 gdb binutils. The key binary is qemu-system-i386, not the generic qemu package. Confirm with qemu-system-i386 --version. The QEMU i386 documentation covers the specific flags this project uses.
  5. Rebuild
    Run make from the project root. Watch the output. Errors about 'implicit declaration' or 'incompatible pointer type' usually mean you need a patched fork or GCC 3.4 (see the advanced section). Errors about missing files usually mean the disk image is still absent.
  6. Verify the run
    Run make start-hd. A QEMU window should open. If it does, Linux 0.11 setup is complete for your environment.
QEMU window opens with a shell prompt. Build output shows no errors. You're good.
3

Fix the asm Header Symlink Easy

  1. Check if the path exists
    Run: ls /usr/include/asm. If you get 'No such file or directory', you need the symlink. If the directory exists, skip this fix entirely.
  2. Create the symlink
    Run: sudo ln -s /usr/include/asm-generic /usr/include/asm. This tells the compiler where to find the asm headers the 0.11 source expects. Retry the build immediately after.
Only create this symlink if /usr/include/asm genuinely doesn't exist. If it exists but points somewhere wrong, fix the target rather than adding a second symlink.

For Bochs users the process is similar but the emulator setup is different. You need a bochsrc-gdb.bxrc config file in the project root. Most maintained repos include one. If yours doesn't, the Bochs emulator setup guide covers the config file format in detail. Run the emulator with bochs -f bochsrc-gdb.bxrc rather than a make target.

Advanced Linux 0.11 Setup Fixes

If you've done everything above and the build still fails, you're almost certainly hitting a compiler version problem. Modern GCC simply won't accept some of the code in the original 0.11 source without patches. There are two clean ways to handle this: pin an old GCC just for this project, or use a pre-packaged environment that already has everything sorted.

4

Pin GCC 3.4 for the Project Advanced

  1. Install GCC 3.4 from old repositories
    On older Ubuntu releases GCC 3.4 is available via the standard repos. On newer ones you'll need to add an old Ubuntu mirror or build from source. The OSDev GCC cross-compiler guide explains how to build a specific GCC version cleanly without touching your system compiler.
  2. Invoke the old compiler explicitly
    Run: CC=gcc-3.4 make. This tells make to use gcc-3.4 for this project only. Your system GCC stays untouched. If gcc-3.4 isn't in your PATH, provide the full path: CC=/opt/gcc-3.4/bin/gcc make.
  3. Verify the build output
    Watch for errors. With GCC 3.4 and bin86 installed, the build should complete cleanly. Run make start-hd to confirm the kernel boots in QEMU.
Some labs ship a complete oslab.zip archive containing 0.11 source, Bochs, and GCC 3.4 all pre-configured. If you can find one matched to your lab manual, that's faster than building GCC 3.4 yourself.
5

Use a Dedicated 32-bit VM Advanced

  1. Set up a clean 32-bit Ubuntu VM
    Download a 32-bit Ubuntu LTS ISO (18.04 is a good choice, still has bin86 in repos and GCC 3.4 is reachable). Install it in VirtualBox or VMware with at least 1GB RAM and 20GB disk.
  2. Install all dependencies inside the VM
    Run the full intermediate fix sequence inside the VM: build-essential, bin86, gdb, qemu-system-x86. You don't need gcc-multilib here because the VM is already 32-bit.
  3. Clone the lab repo and build
    Clone your linux-0.11-lab repo into the VM, place hdc-0.11.img in the project root, and run make then make start-hd. This approach sidesteps every 64-bit compatibility issue in one move.
A dedicated VM is the most reliable approach if you're hitting multiple overlapping errors and don't want to spend time diagnosing each one individually.
6

Debug Boot Failures with GDB Advanced

  1. Start the emulator in debug mode
    For QEMU labs run: make debug-hd. This starts QEMU with a GDB stub listening on a local port. For Bochs run: bochs -f bochsrc-gdb.bxrc which enables the internal Bochs debugger.
  2. Attach GDB
    In a second terminal run: gdb then at the GDB prompt: target remote :1234 (adjust the port if your lab uses a different one). Most lab repos include a .gdbinit file that sets up symbol loading automatically.
  3. Step through the boot sequence
    Use c to continue, si to step by instruction, and x/10i $pc to inspect instructions at the current program counter. Boot failures usually show up as a hang at a specific address, which you can then cross-reference against the 0.11 source. The kernel.org archives have the original 0.11 source for reference.

Preventing Linux 0.11 Setup Problems

Most of the pain here is avoidable. The number one rule: pick one fork and follow its README exactly. Don't mix instructions from different tutorials or different 0.11 repos. The toolchain assumptions vary between forks and combining them produces errors that look random but aren't.

Install everything up front before you touch the source code. That means build-essential, bin86, gcc-multilib, gdb, and your chosen emulator (QEMU or Bochs, not both unless your lab specifically needs both). Doing it in one go takes five minutes. Discovering missing packages one at a time during the build takes much longer and is genuinely annoying.

Keep a clean copy of hdc-0.11.img somewhere safe. The image is easy to corrupt if you accidentally write to it or mount it wrong. Having a backup means you can restore a known-good disk state in seconds rather than re-downloading or rebuilding it. Same goes for your emulator config file (bochsrc-gdb.bxrc or equivalent). These are small files. Put them in a separate folder and don't touch them.

Use version control for your changes. Commit the pristine upstream lab code first, then make your changes in separate commits. If something breaks, git diff shows you exactly what changed. And if you ever want to start fresh, git checkout . gets you back to a known-good state instantly. See the Linux development environment setup guide for tips on organising a clean workspace for kernel projects like this one.

Document your working environment. Write down the distro version, GCC version (gcc --version), bin86 version (dpkg -l bin86), and QEMU version. When something breaks after a system update, that list tells you what changed. It sounds tedious but it takes two minutes and has saved hours on more than one occasion.

Linux 0.11 Setup Summary

Linux 0.11 setup fails for predictable reasons every time: wrong GCC, missing bin86, no 32-bit library support, absent disk image, or misconfigured emulator. Work through them in order. Start with a maintained linux-0.11-lab repo. Install bin86 and gcc-multilib. Grab hdc-0.11.img from oldlinux.org. Get QEMU or Bochs running with the right config. If the build still fails after all that, pin GCC 3.4 or move to a clean 32-bit VM. The kernel itself is fine. The environment just needs to match what it was written for.

Quick Reference

  • bin86: sudo apt-get install bin86
  • 32-bit support: sudo apt-get install gcc-multilib lib32z1
  • QEMU: sudo apt-get install qemu-system-x86 gdb binutils
  • asm symlink: sudo ln -s /usr/include/asm-generic /usr/include/asm
  • Build: make then make start-hd
  • Debug: make debug-hd then attach GDB on port 1234

Frequently Asked Questions

Original 0.11 assumes an early GCC and a 32-bit environment, so modern 64-bit GCC fails without patches. Use GCC 3.4 or a patched lab fork, and install gcc-multilib for 32-bit support.

The boot sector and setup code are built with 16-bit tools as86 and ld86, which are supplied by the bin86 package. Install it with: sudo apt-get install bin86

Labs typically require a hardware or root image such as hdc-0.11.img downloaded from oldlinux.org or mirrors, placed in the project root where the Makefile expects it.

Use whichever your specific lab repo documents. QEMU labs provide targets like make start-hd and make debug-hd, while Bochs labs use a config file such as bochsrc-gdb.bxrc.

On some distros /usr/include/asm does not exist. If the lab expects it, create a symlink with: sudo ln -s /usr/include/asm-generic /usr/include/asm