March 28, 2011

ld: not enough room for program headers ...

Okay, this isn't really software, it's virtual firmware, but I find this is a common problem...

I receive this error with LD (and it's quite annoying):

root@##-systems$ ld link.ld -o vfirmA01.bin setup.o _globl.o panic.o stage1.o vga.o loader.o
ld: vfirmA02.bin: not enough room for program headers (allocated 2, need 3)
ld: final link failed: Bad value

That error makes no sense (I know exactly what it means, I've done my research. You'll see why in just a second).

Here's my linker script (link.ld):

OUTPUT_FORMAT("binary") /* Binary, not elf */
ENTRY(_start)
phys = 0x00100000;

SECTIONS
{
.text phys : AT(phys) {
code = .;
*(.text)
*(.rodata)
. = ALIGN(4096);
}
data = .; /* This is here because of some buggy versions of ld */
.data : AT(phys + (data - code))
{
*(.data)
. = ALIGN(4096);
}
.bss : AT(phys + (bss - code))
{
bss = .;
*(.bss)
. = ALIGN(4096);
}
end = .;
}

The output("binary") is why I don't understand the error, as that error is with the elf linker script! Please help, I've begun to eat myself over this.

[edit]
When I say 'binary' I mean a flat binary (aout) without the elf formatting.