On Fri, Nov 18, 2016 at 1:49 AM, Carlos Chinea <carlos.chinea@xxxxxxxxx> wrote: > On 17/11/16 18:20, H.J. Lu wrote: >> >> On Thu, Nov 17, 2016 at 2:47 AM, Carlos Chinea <carlos.chinea@xxxxxxxxx> >> wrote: >>> >>> Hi, >>> >>> We have been trying to boot up a kernel (4.9-rc5, also tested with 4.4.31 >>> and 4.1.35) build with the latest binutils 2.27. >>> However, all those kernels fail to boot on qemu and no console logs can >>> be >>> seen. >>> The same kernels build with binutils 2.26.1 boot without problems. >>> >>> Here some extra info: >>> >>> We have used qemu 1.6.2 to test this, with the following command: >>> >>> qemu-system-x86_64 -nographic -nodefaults -serial stdio -append >>> "console=ttyS0,38400" -kernel bzImage >>> >>> and we have used gcc 4.9.4 and binutils 2.27 to build the kernel. >>> The kernel is configure with: >>> >>> # CONFIG_RELOCATABLE is not set >>> >>> you can see the full defconfig at the end of the email. >>> >>> After bisecting binutils, we narrowed the issue to the following commit: >>> >>> commit bae420ef26f4331415b0503141c5931318025906 >>> Author: H.J. Lu <hjl.tools@xxxxxxxxx> >>> Date: Fri Feb 26 09:38:08 2016 -0800 >>> >>> Optimize x86 GOT32X/GOTPCRELX relocations >>> >>> R_386_GOT32X, R_X86_64_GOTPCRELX and R_X86_64_REX_GOTPCRELX >>> relocations >>> retrieve the symbol address via its GOT slot. If the symbol address >>> is >>> known at the link-time, we can use it directly by changing >>> instruction >>> encoding. Indirect branch can only be converted to PC relative >>> direct >>> branch. MOV can be changed to LEA or encoded differently with >>> signed >>> address. The subset of binary operations can be encoded only with >>> signed address. >>> >>> If undefined weak symbol is resolved to zero link-time, we can use >>> it >>> as address. Zero addresss can't used with PC relative direct branch >>> when PIC is true since the current PC is unknown. In 64-bit, 32-bit >>> relocation for PC relatiave direct branch to zero may also overflow. >>> >>> If this optimization causes relocation overflow, --no-relax can be >>> used >>> to work around it. >>> >>> bfd/ >>> >>> PR ld/19609 >>> * elf32-i386.c (elf_i386_convert_load): Convert to R_386_32 >>> for >>> load with locally bound symbols if PIC is false or there is >>> no >>> base register. Optimize branch to 0 if PIC is false. >>> (elf_i386_relocate_section): Don't generate dynamic >>> relocations >>> against undefined weak symbols if PIC is false. >>> * elf64-x86-64.c (elf_x86_64_convert_load): Disable >>> optimization >>> if we can't estimate relocation overflow with --no-relax. >>> Convert to R_X86_64_32S/R_X86_64_32 for load with locally >>> bound >>> symbols if PIC is false. Optimize branch to 0 if PIC is >>> false. >>> (elf_x86_64_relocate_section): Don't generate dynamic >>> relocations >>> against undefined weak symbols if PIC is false. >>> >>> So it seems that with the latest binutils the linker does some >>> optimization >>> that breaks >>> the booting. >>> Disabling the linker relaxation with (--no-relax) fixes the issue. >>> The same happens whew linking with (-pie -z noreloc-overflow) options. >>> >> The compressed kernel is built with PIE/PIC and may be loaded at any >> address by bootloader, regardless if CONFIG_RELOCATABLE is set or >> not. Please try > > > Yep, I was wondering why the if CONFIG_RELOCATABLE was there.. > And yes it is working fine for x86_64 and 4.9-rc5 > > Do you want to take care of the patch or do you want me to do it ? > Btw, I guess the patch will qualify for stable. I sent a patch to x86 kernel mailing list. >> >> diff --git a/arch/x86/boot/compressed/Makefile >> b/arch/x86/boot/compressed/Makefile >> index 536ccfc..e598a81 100644 >> --- a/arch/x86/boot/compressed/Makefile >> +++ b/arch/x86/boot/compressed/Makefile >> @@ -40,7 +40,6 @@ GCOV_PROFILE := n >> UBSAN_SANITIZE :=n >> >> LDFLAGS := -m elf_$(UTS_MACHINE) >> -ifeq ($(CONFIG_RELOCATABLE),y) >> # If kernel is relocatable, build compressed kernel as PIE. >> ifeq ($(CONFIG_X86_32),y) >> LDFLAGS += $(call ld-option, -pie) $(call ld-option, >> --no-dynamic-linker) >> @@ -51,7 +50,6 @@ else >> LDFLAGS += $(shell $(LD) --help 2>&1 | grep -q "\-z noreloc-overflow" \ >> && echo "-z noreloc-overflow -pie --no-dynamic-linker") >> endif >> -endif >> LDFLAGS_vmlinux := -T >> >> hostprogs-y := mkpiggy >> >> > -- H.J. -- To unsubscribe from this list: send the line "unsubscribe linux-x86_64" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html