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.
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
Use a Maintained linux-0.11-lab Repo Easy
- 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. - Check your emulator is callable
Runqemu-system-i386 --versionin a terminal. If you get a version string, QEMU is installed. For Bochs, runbochs -h. If either command fails with 'not found', you need to install the emulator before going any further. - 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. - Run the build
Runmakethenmake start-hd. If a QEMU window opens and you see a boot prompt, your Linux 0.11 setup is working. Done.
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.
Install bin86, gcc-multilib, and QEMU Intermediate
- 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 usesudo dnf groupinstall 'Development Tools'instead. - Install bin86 for as86 and ld86
Run:sudo apt-get install bin86. Verify it worked withwhich as86. You should get a path back. If you don't, the package name on your distro might differ (tryapt-cache search as86to find it). - Enable 32-bit library support
Run:sudo apt-get install gcc-multilib lib32z1. On some setups you also needsudo 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. - 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 withqemu-system-i386 --version. The QEMU i386 documentation covers the specific flags this project uses. - Rebuild
Runmakefrom 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. - Verify the run
Runmake start-hd. A QEMU window should open. If it does, Linux 0.11 setup is complete for your environment.
Fix the asm Header Symlink Easy
- 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. - 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.
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.
Pin GCC 3.4 for the Project Advanced
- 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. - 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. - Verify the build output
Watch for errors. With GCC 3.4 and bin86 installed, the build should complete cleanly. Runmake start-hdto confirm the kernel boots in QEMU.
Use a Dedicated 32-bit VM Advanced
- 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. - 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. - 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 runmakethenmake start-hd. This approach sidesteps every 64-bit compatibility issue in one move.
Debug Boot Failures with GDB Advanced
- 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.bxrcwhich enables the internal Bochs debugger. - Attach GDB
In a second terminal run:gdbthen 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. - Step through the boot sequence
Usecto continue,sito step by instruction, andx/10i $pcto 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.
Linux 0.11 setup problems, especially toolchain and emulator config issues, are exactly the kind of thing we sort via remote support. If the build is still failing after working through this guide, connect with us and we'll get it fixed.
Get remote helpPreventing 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:
makethenmake start-hd - Debug:
make debug-hdthen attach GDB on port 1234


