Well, the linker script posted worked just as well as the others, so that would be the most successful script; here's my makefile (I'm using MinGW's make tool, if you're wondering about the backwards slashes in the file paths)
Code:
L = i386-elf-ld
LF = -T link -nostdlib -nostartfiles -nodefaultlibs
A = nasm
AF = -f bin
AE = -f elf
C = i386-elf-gcc
CF = --freestanding -fstrength-reduce -fomit-frame-pointer -finline-functions -fno-builtin -nostdlib -nostartfiles -nodefaultlibs -Wall -Werror -O0 -Iinc
all: bin\image.bin
bin\image.bin: bin\boot.bin
imgtool bin\image.bin bin\boot.bin image 1440k
bin\boot.bin: bin\aboot.bin bin\cboot.bin
copy /b bin\aboot.bin + bin\cboot.bin bin\boot.bin
bin\aboot.bin: boot.asm
$(A) $(AF) -o bin\aboot.bin boot.asm
bin\cboot.bin: bin\stub.o bin\boot.o
$(L) $(LF) -o bin\cboot.bin bin\stub.o bin\boot.o
bin\stub.o: stub.asm
$(A) $(AE) -o bin\stub.o stub.asm
bin\boot.o: boot.c
$(C) $(CF) -o bin\boot.o boot.c
You know, I'm actually not sure what every one of those GCC flags does; if any are redundant or possibly problematic, let me know and I'll rebuild everything without them and see if that fixes it.
EDIT: In case you're wondering, imgtool is a utility I wrote to make disk images, and all of this is a single-stage bootloader intended to be loaded from the first few sectors of the disk.
EDIT: I looked up what each of those flags does, and removed all the optimization-related ones, and it's still giving me weird addresses for strings (even when I declare them outside of the main function). I'm thinking it's something to do with .rodata having a weird virtual address, but the linker script posted has no indication of that being done. Still don't know exactly what's messing up.