Help needed to track down bug: linking Linux kernel with gold creates unbootable kernel
Török Edwin
edwintorok@gmail.com
Sat Apr 10 12:52:00 GMT 2010
On 04/10/2010 01:24 AM, Ian Lance Taylor wrote:
> Török Edwin<edwintorok@gmail.com> writes:
>
>> I tried to link the Linux kernel with gold.
>> Everything went fine with linking, however after rebooting the kernel
>> wasn't working: it instantly rebooted as soon as I selected it from
>> grub.
>
>> How can I track down what the problem is with gold here?
>> Has anyone encountered a similar issue before (has anyone got a
>> working kernel with gold)?
>
> People have gotten working kernels with gold. The kernel and gold
> move in and out of working together. The kernel uses several
> extremely obscure and undocumented linker script features. As they
> change the linker scripts, the build sometimes stops working.
>
> The usual approach to fixing the bug is to compare the kernel
> generated by GNU ld with the one generated by gold. The problem is
> invariably one of the output files generated by a linker script. So
> look at those files. Look for significant differences in size.
Here you go, looks like gold dropped 1/3 of the kernel:
-rwxr-xr-x 1 edwin edwin 11M Apr 10 15:38 vmlinux.gold
-rwxr-xr-x 1 edwin edwin 17M Apr 10 15:37 vmlinux.bfd
> Look
> at the section headers and look for differences in alignment. If that
> doesn't help you may need to figure out what is crashing, but I can't
> help with that.
I found an easier way to test than rebooting the real system:
kvm -kernel arch/x86/boot/bzImage
If I take the linker command used to create vmlinux, and use the usual
LD linker to create it, then the kernel starts booting in qemu/kvm.
With gold it instantly reboots.
I diffed the readelf output, and attached it (without the actual symbol
address diffs, those are huge):
Here are some highlights (- is gold/bad, + is bfd/good):
offset differences:
[Nr] Name Type Addr Off Size
ES Flags Lk Inf A
-[ 1] .text PROGBITS ffffffff81000000 00001000
003d1c55 0 AX 0 0 4096
+[ 1] .text PROGBITS ffffffff81000000 00200000
003d1c55 0 AX 0 0 4096
alignment differences:
Program Headers:
Type Offset VirtAddr PhysAddr
FileSiz MemSiz Flg Align
- LOAD 0x001000 0xffffffff81000000 0x0000000001000000
0x5f2000 0x5f2000 R E 0x1000
- LOAD 0x5f3000 0xffffffff81600000 0x0000000001600000
0x183220 0x183220 RWE 0x1000
- LOAD 0x777000 0xffffffffff600000 0x0000000001784000
0x000888 0x000888 R E 0x1000
- LOAD 0x778000 0x0000000000000000 0x0000000001785000
0x014628 0x014628 RW 0x1000
- LOAD 0x78d000 0xffffffff8179a000 0x000000000179a000
0x071000 0x456d000 RWE 0x1000
- NOTE 0x3d2c58 0xffffffff813d1c58 0x00000000013d1c58
0x00003c 0x00003c 0x4
+ LOAD 0x200000 0xffffffff81000000 0x0000000001000000
0x5ef000 0x5ef000 R E 0x200000
+ LOAD 0x800000 0xffffffff81600000 0x0000000001600000
0x183220 0x183220 RWE 0x200000
+ LOAD 0xa00000 0xffffffffff600000 0x0000000001784000
0x000888 0x000888 R E 0x200000
+ LOAD 0xc00000 0x0000000000000000 0x0000000001785000
0x014628 0x014628 RW 0x200000
+ LOAD 0xd9a000 0xffffffff8179a000 0x000000000179a000
0x071000 0x456d000 RWE 0x200000
+ NOTE 0x5d1c58 0xffffffff813d1c58 0x00000000013d1c58
0x000024 0x000024 0x4
Do these ring any bells?
>
>
>> This is the gold version I am using:
>> GNU gold (GNU Binutils for Debian 2.20.1-system.20100303) 1.9
>
> Use mainline instead. There have been quite a few bug fixes since the
> 2.20 release. The 2.20 release is fine for most uses, but not for the
> kernel.
Thanks, I tried the latest CVS. It is still rebooting :(
Here is the link command for vmlinux:
ld -m elf_x86_64 --build-id -o vmlinux -T arch/x86/kernel/vmlinux.lds
arch/x86/kernel/head_64.o arch/x86/kernel/head64.o
arch/x86/kernel/head.o arch/x86/kernel/init_task.o init/built-in.o
--start-group usr/built-in.o arch/x86/built-in.o kernel/built-in.o
mm/built-in.o fs/built-in.o ipc/built-in.o security/built-in.o
crypto/built-in.o block/built-in.o lib/lib.a arch/x86/lib/lib.a
lib/built-in.o arch/x86/lib/built-in.o drivers/built-in.o
sound/built-in.o firmware/built-in.o arch/x86/pci/built-in.o
arch/x86/power/built-in.o arch/x86/video/built-in.o net/built-in.o
--end-group .tmp_kallsyms2.o
I run that with gold vs system linker to reproduce the bug, then run
make bzImage to create the vmlinuz out of it.
I have attached the vmlinux.lds script, but I don't know what I should
be looking at there.
Should I open a bug and attach all these .o files too?
Best regards,
--Edwin
-------------- next part --------------
A non-text attachment was scrubbed...
Name: readelf.diff.gz
Type: application/x-gzip
Size: 2206 bytes
Desc: not available
URL: <https://sourceware.org/pipermail/binutils/attachments/20100410/dbd21881/attachment.bin>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: vmlinux.lds.gz
Type: application/x-gzip
Size: 8612 bytes
Desc: not available
URL: <https://sourceware.org/pipermail/binutils/attachments/20100410/dbd21881/attachment-0001.bin>
More information about the Binutils
mailing list