[PATCH] powerpc: vmlinux.lds: Drop Binutils 2.18 workarounds

Christophe Leroy christophe.leroy at c-s.fr
Tue Mar 26 19:08:13 AEDT 2019



Le 26/03/2019 à 01:55, Michael Ellerman a écrit :
> Joel Stanley <joel at jms.id.au> writes:
>> Segher added some workarounds for GCC 4.2 and bintuils 2.18. We now set
>> 4.6 and 2.20 as the minimum, so they can be dropped.
>>
>> This is mostly a revert of c69cccc95fe4 ("powerpc: Fix build bug with
>> binutils < 2.18 and GCC < 4.2").
>>
>> Signed-off-by: Joel Stanley <joel at jms.id.au>
>> ---
>>   arch/powerpc/kernel/vmlinux.lds.S | 35 ++++---------------------------
>>   1 file changed, 4 insertions(+), 31 deletions(-)
> 
> Seems this breaks some toolchains, at least the one from kernel.org:
> 
>    /opt/cross/kisskb/korg/gcc-8.1.0-nolibc/powerpc64-linux/bin/powerpc64-linux-ld: .tmp_vmlinux1: Not enough room for program headers, try linking with -N
>    /opt/cross/kisskb/korg/gcc-8.1.0-nolibc/powerpc64-linux/bin/powerpc64-linux-ld: final link failed: Bad value
>    make[1]: *** [/kisskb/src/Makefile:1024: vmlinux] Error 1
> 
> http://kisskb.ellerman.id.au/kisskb/buildresult/13743374/
> 
> Not sure why.
> 
> That's binutils 2.30.
> 

ld doc says:

6586 @cindex not enough room for program headers
6587 @cindex program headers, not enough room
6588 When producing an ELF output file, if the linker script uses the
6589 @code{SIZEOF_HEADERS} builtin function, the linker must compute the
6590 number of program headers before it has determined all the section
6591 addresses and sizes.  If the linker later discovers that it needs
6592 additional program headers, it will report an error @samp{not enough
6593 room for program headers}.  To avoid this error, you must avoid using
6594 the @code{SIZEOF_HEADERS} function, or you must rework your linker
6595 script to avoid forcing the linker to use additional program 
headers, or
6596 you must define the program headers yourself using the @code{PHDRS}
6597 command (@pxref{PHDRS}).
6598 @end table


What about just removing the dummy section, and keeping everything else ? :

diff --git a/arch/powerpc/kernel/vmlinux.lds.S 
b/arch/powerpc/kernel/vmlinux.lds.S
index 060a1acd7c6d..511bff8e4a8f 100644
--- a/arch/powerpc/kernel/vmlinux.lds.S
+++ b/arch/powerpc/kernel/vmlinux.lds.S
@@ -20,20 +20,6 @@ ENTRY(_stext)
  PHDRS {
  	kernel PT_LOAD FLAGS(7); /* RWX */
  	notes PT_NOTE FLAGS(0);
-	dummy PT_NOTE FLAGS(0);
-
-	/* binutils < 2.18 has a bug that makes it misbehave when taking an
-	   ELF file with all segments at load address 0 as input.  This
-	   happens when running "strip" on vmlinux, because of the AT() magic
-	   in this linker script.  People using GCC >= 4.2 won't run into
-	   this problem, because the "build-id" support will put some data
-	   into the "notes" segment (at a non-zero load address).
-
-	   To work around this, we force some data into both the "dummy"
-	   segment and the kernel segment, so the dummy segment will get a
-	   non-zero load address.  It's not enough to always create the
-	   "notes" segment, since if nothing gets assigned to it, its load
-	   address will be zero.  */
  }

  #ifdef CONFIG_PPC64
@@ -179,14 +165,6 @@ SECTIONS

  	NOTES :kernel :notes

-	/* The dummy segment contents for the bug workaround mentioned above
-	   near PHDRS.  */
-	.dummy : AT(ADDR(.dummy) - LOAD_OFFSET) {
-		LONG(0)
-		LONG(0)
-		LONG(0)
-	} :kernel :dummy
-
  /*
   * Init sections discarded at runtime
   */


Christophe


More information about the Linuxppc-dev mailing list