Patchwork Work around ld bug in older binutils

login
register
mail settings
Submitter Paul Mackerras
Date Oct. 23, 2008, 4:43 a.m.
Message ID <18688.257.812926.680480@drongo.ozlabs.ibm.com>
Download mbox | patch
Permalink /patch/5416/
State Accepted, archived
Commit 2a4b9c5af82035c591adca951a9af1665ad1a2b0
Delegated to: Benjamin Herrenschmidt
Headers show

Comments

Paul Mackerras - Oct. 23, 2008, 4:43 a.m.
Commit 549e8152de8039506f69c677a4546e5427aa6ae7 ("powerpc: Make the
64-bit kernel as a position-independent executable") added lines to
vmlinux.lds.S to add the extra sections needed to implement a
relocatable kernel.  However, those lines seem to trigger a bug in
older versions of GNU ld (such as 2.16.1) when building a
non-relocatable kernel.  Since ld 2.16.1 is still a popular choice for
cross-toolchains, this adds an #ifdef to vmlinux.lds.S so the added
lines are only included when building a relocatable kernel.

Signed-off-by: Paul Mackerras <paulus@samba.org>
---
Sean MacLennan - Oct. 28, 2008, 12:58 a.m.
On Thu, 23 Oct 2008 15:43:45 +1100
Paul Mackerras <paulus@samba.org> wrote:

> Commit 549e8152de8039506f69c677a4546e5427aa6ae7 ("powerpc: Make the
> 64-bit kernel as a position-independent executable") added lines to
> vmlinux.lds.S to add the extra sections needed to implement a
> relocatable kernel.  However, those lines seem to trigger a bug in
> older versions of GNU ld (such as 2.16.1) when building a
> non-relocatable kernel.  Since ld 2.16.1 is still a popular choice for
> cross-toolchains, this adds an #ifdef to vmlinux.lds.S so the added
> lines are only included when building a relocatable kernel.

I'd like to try this. I did a git revert to back out the aforementioned
commit. How do I get it back? Do I git revert again?

Cheers,
   Sean
Paul Mackerras - Oct. 28, 2008, 3:05 a.m.
Sean MacLennan writes:

> I'd like to try this. I did a git revert to back out the aforementioned
> commit. How do I get it back? Do I git revert again?

You could revert the reversion, or else rebase any patches you have on
top of the reversion onto the commit before the reversion.

Paul.

Patch

diff --git a/arch/powerpc/kernel/vmlinux.lds.S b/arch/powerpc/kernel/vmlinux.lds.S
index b39c27e..384dca5 100644
--- a/arch/powerpc/kernel/vmlinux.lds.S
+++ b/arch/powerpc/kernel/vmlinux.lds.S
@@ -187,6 +187,7 @@  SECTIONS
 		*(.machine.desc)
 		__machine_desc_end = . ;
 	}
+#ifdef CONFIG_RELOCATABLE
 	. = ALIGN(8);
 	.dynsym : AT(ADDR(.dynsym) - LOAD_OFFSET) { *(.dynsym) }
 	.dynstr : AT(ADDR(.dynstr) - LOAD_OFFSET) { *(.dynstr) }
@@ -202,6 +203,7 @@  SECTIONS
 		__rela_dyn_start = .;
 		*(.rela*)
 	}
+#endif
 
 	/* Fake ELF header containing RPA note; for addnote */
 	.fakeelf : AT(ADDR(.fakeelf) - LOAD_OFFSET) { *(.fakeelf) }