8bit and 16bit relocations in gold
H. Peter Anvin
hpa@zytor.com
Sun Apr 27 17:31:00 GMT 2008
Andi Kleen wrote:
> Ian,
>
> With the help of H. Peter Anvin I poked a bit more at the gold linux kernel
> boot problems.
>
> First the crash happen really in the real mode code which has 8 and 16bit
> relocations (arch/x86/boot/* in a modern linux kernel tree). This is
> generated from a custom linker script (arch/x86/boot/setup.ld)
>
> Comparing to a good kernel we already see some differences just in the header:
>
> e.g. in the setup.bin which is just the binary dump of that code
>
> -0000200 46eb 6448 5372 0207 0000 0000 1000 2900 (bfd)
> +0000200 46eb 6449 5372 0207 0000 0000 1000 2900 (gold)
>
> which is generated from this assembler code in header.S
>
> .section ".header", "a"
> .globl hdr
> hdr:
> setup_sects: .byte SETUPSECTS
> root_flags: .word ROOT_RDONLY
> syssize: .long SYSSIZE
> ram_size: .word RAMDISK
> vid_mode: .word SVGA_MODE
> root_dev: .word ROOT_DEV
> boot_flag: .word 0xAA55
>
Actually, that snippet *ends* at 0x200, the code that generates the
snipped above is:
# offset 512, entry point
.globl _start
_start:
# Explicitly enter this as bytes, or the assembler
# tries to generate a 3-byte jump here, which causes
# everything else to push off to the wrong offset.
.byte 0xeb # short (2-byte) jump
.byte start_of_setup-1f
1:
# Part 2 of the header, from the old setup.S
.ascii "HdrS" # header signature
.word 0x0208 # header version number (>= 0x0105)
# or else old loadlin-1.5 will
fail)
.globl realmode_swtch
realmode_swtch: .word 0, 0 # default_switch, SETUPSEG
start_sys_seg: .word SYSSEG
.word kernel_version-512 # pointing to kernel version
string
# above section of header is
compatible
# with loadlin-1.5 (header
v1.5). Don't
# change it.
The second .byte is what generates the R_386_PC8 relocation.
-hpa
More information about the Binutils
mailing list