Skip to contentSkip to conversation

x86, vdso: Fix vdso-layout linker script

PATCH In review Markus Trippelsdorf 3 participants 4 messages Apr 3, 2014

Subsystems (3)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 x86, vdso: Fix vdso-layout linker script

Commit 26f5ef2e3c3 added a /DISCARD/ section to the vdso-layout.lds.S linker script. This broke the build when using the gold linker:

ld: error: arch/x86/vdso/vdso.lds:79:12: syntax error, unexpected ':'
ld: fatal error: unable to parse script file arch/x86/vdso/vdso.lds

As Cary Coutant pointed out on the sourceware bugzilla:
https://sourceware.org/bugzilla/show_bug.cgi?id=16804
the problem is that the .text section directly above the /DISCARD/ section should be terminated with an comma.

arch/x86/vdso/vdso-layout.lds.S +1 -1
index 2e263f367b13..313bca59ddea 100644
@@ -61,7 +61,7 @@ SECTIONS
 	 */
 	. = ALIGN(0x100);
 
-	.text		: { *(.text*) }			:text	=0x90909090
+	.text		: { *(.text*) }			:text	=0x90909090,
 
 	/DISCARD/ : {
 		*(.discard)
Signature · 1 line
Markus
#1 lore raw
Quoted 6 lines · Markus Trippelsdorf

Commit 26f5ef2e3c3 added a /DISCARD/ section to the vdso-layout.lds.S linker script. This broke the build when using the gold linker:

ld: error: arch/x86/vdso/vdso.lds:79:12: syntax error, unexpected ':'
ld: fatal error: unable to parse script file arch/x86/vdso/vdso.lds

Quoted 6 lines

As Cary Coutant pointed out on the sourceware bugzilla:
https://sourceware.org/bugzilla/show_bug.cgi?id=16804
the problem is that the .text section directly above the /DISCARD/ section should be terminated with an comma.

This patch triggers an internal error in whatever version of gold I'm using. I'll send a variant of the patch when I finish testing it.

Quoted 16 lines
arch/x86/vdso/vdso-layout.lds.S +1 -2
index 2e263f367b13..313bca59ddea 100644
@@ -61,7 +61,7 @@ SECTIONS
         */
        . = ALIGN(0x100);
 
-       .text           : { *(.text*) }                 :text   =0x90909090
+       .text           : { *(.text*) }                 :text   =0x90909090,
 
        /DISCARD/ : {
                *(.discard)
--

Markus

Signature · 2 lines
Andy Lutomirski
AMA Capital Management, LLC
#2 lore raw

PATCH 1/1 x86, vdso: Make the vdso linker script compatible with Gold

In reply to Markus Trippelsdorf

Gold can't parse the script due to:
https://sourceware.org/bugzilla/show_bug.cgi?id=16804

With a workaround in place for that issue, Gold 2.23 crashes due to:
https://sourceware.org/bugzilla/show_bug.cgi?id=15355

This works around the former bug and avoids the second by removing the unnecessary vvar and hpet sections and segments. The vdso and hpet symbols are still there, and nothing needed the sections or segments.

---
 arch/x86/vdso/vdso-layout.lds.S | 19 ++++++++-----------
 1 file changed, 8 insertions(+), 11 deletions(-)
arch/x86/vdso/vdso-layout.lds.S +8 -11
index 2e263f3..9df017a 100644
@@ -9,12 +9,9 @@ SECTIONS
 #ifdef BUILD_VDSO32
 #include <asm/vdso32.h>
 
-	.hpet_sect : {
-		hpet_page = . - VDSO_OFFSET(VDSO_HPET_PAGE);
-	} :text :hpet_sect
+	hpet_page = . - VDSO_OFFSET(VDSO_HPET_PAGE);
 
-	.vvar_sect : {
-		vvar = . - VDSO_OFFSET(VDSO_VVAR_PAGE);
+	vvar = . - VDSO_OFFSET(VDSO_VVAR_PAGE);
 
 	/* Place all vvars at the offsets in asm/vvar.h. */
 #define EMIT_VVAR(name, offset) vvar_ ## name = vvar + offset;
@@ -22,7 +19,6 @@ SECTIONS
 #include <asm/vvar.h>
 #undef __VVAR_KERNEL_LDS
 #undef EMIT_VVAR
-	} :text :vvar_sect
 #endif
 	. = SIZEOF_HEADERS;
 
@@ -61,7 +57,12 @@ SECTIONS
 	 */
 	. = ALIGN(0x100);
 
-	.text		: { *(.text*) }			:text	=0x90909090
+	.text		: { *(.text*) }			:text	=0x90909090,
+
+	/*
+	 * The comma above works around a bug in gold:
+	 * https://sourceware.org/bugzilla/show_bug.cgi?id=16804
+	 */
 
 	/DISCARD/ : {
 		*(.discard)
@@ -84,8 +85,4 @@ PHDRS
 	dynamic		PT_DYNAMIC	FLAGS(4);		/* PF_R */
 	note		PT_NOTE		FLAGS(4);		/* PF_R */
 	eh_frame_hdr	PT_GNU_EH_FRAME;
-#ifdef BUILD_VDSO32
-	vvar_sect	PT_NULL		FLAGS(4);		/* PF_R */
-	hpet_sect	PT_NULL		FLAGS(4);		/* PF_R */
-#endif
 }
Signature · 1 line
1.9.0
#3 lore raw

[tip:x86/vdso] x86, vdso: Make the vdso linker script compatible with Gold

x86, vdso: Make the vdso linker script compatible with Gold
Commit-ID:  378ed3ccd2a0404d031e771b65aa3af221ea8aea
Gitweb:     http://git.kernel.org/tip/378ed3ccd2a0404d031e771b65aa3af221ea8aea
Author:     Andy Lutomirski <[email protected]>
AuthorDate: Thu, 3 Apr 2014 10:53:43 -0700
Committer:  H. Peter Anvin <[email protected]>
CommitDate: Thu, 3 Apr 2014 12:03:59 -0700

x86, vdso: Make the vdso linker script compatible with Gold

Gold can't parse the script due to:
https://sourceware.org/bugzilla/show_bug.cgi?id=16804

With a workaround in place for that issue, Gold 2.23 crashes due to:
https://sourceware.org/bugzilla/show_bug.cgi?id=15355

This works around the former bug and avoids the second by removing the unnecessary vvar and hpet sections and segments. The vdso and hpet symbols are still there, and nothing needed the sections or segments.

---
 arch/x86/vdso/vdso-layout.lds.S | 19 ++++++++-----------
 1 file changed, 8 insertions(+), 11 deletions(-)
arch/x86/vdso/vdso-layout.lds.S +8 -11
index 2e263f3..9df017a 100644
@@ -9,12 +9,9 @@ SECTIONS
 #ifdef BUILD_VDSO32
 #include <asm/vdso32.h>
 
-	.hpet_sect : {
-		hpet_page = . - VDSO_OFFSET(VDSO_HPET_PAGE);
-	} :text :hpet_sect
+	hpet_page = . - VDSO_OFFSET(VDSO_HPET_PAGE);
 
-	.vvar_sect : {
-		vvar = . - VDSO_OFFSET(VDSO_VVAR_PAGE);
+	vvar = . - VDSO_OFFSET(VDSO_VVAR_PAGE);
 
 	/* Place all vvars at the offsets in asm/vvar.h. */
 #define EMIT_VVAR(name, offset) vvar_ ## name = vvar + offset;
@@ -22,7 +19,6 @@ SECTIONS
 #include <asm/vvar.h>
 #undef __VVAR_KERNEL_LDS
 #undef EMIT_VVAR
-	} :text :vvar_sect
 #endif
 	. = SIZEOF_HEADERS;
 
@@ -61,7 +57,12 @@ SECTIONS
 	 */
 	. = ALIGN(0x100);
 
-	.text		: { *(.text*) }			:text	=0x90909090
+	.text		: { *(.text*) }			:text	=0x90909090,
+
+	/*
+	 * The comma above works around a bug in gold:
+	 * https://sourceware.org/bugzilla/show_bug.cgi?id=16804
+	 */
 
 	/DISCARD/ : {
 		*(.discard)
@@ -84,8 +85,4 @@ PHDRS
 	dynamic		PT_DYNAMIC	FLAGS(4);		/* PF_R */
 	note		PT_NOTE		FLAGS(4);		/* PF_R */
 	eh_frame_hdr	PT_GNU_EH_FRAME;
-#ifdef BUILD_VDSO32
-	vvar_sect	PT_NULL		FLAGS(4);		/* PF_R */
-	hpet_sect	PT_NULL		FLAGS(4);		/* PF_R */
-#endif
 }