* [PATCH x86/tip] x86: ignore R_386_NONE in kernel relocation entries
@ 2009-05-26 5:42 Tejun Heo
2009-05-26 6:09 ` [tip:x86/urgent] x86, relocs: " tip-bot for Tejun Heo
0 siblings, 1 reply; 2+ messages in thread
From: Tejun Heo @ 2009-05-26 5:42 UTC (permalink / raw)
To: Linux Kernel, Ingo Molnar, the arch/x86 maintainers,
Thomas Gleixner, H. Peter Anvin
For relocatable 32bit kernels, boot/compressed/relocs.c processes
relocation entries in the kernel image and appends it to the kernel
image such that boot/compressed/head_32.S can relocate the kernel.
The kernel image is one statically linked object and only uses two
relocation types - R_386_PC32 and R_386_32, of the two only the latter
needs massaging during kernel relocation and thus handled by relocs.
R_386_PC32 is ignored and all other relocation types are considered
error.
When the target of a relocation resides in a discarded section,
binutils doesn't throw away the relocation record but nullifies it by
changing it to R_386_NONE, which unfortunately makes relocs fail.
The problem was triggered by yet out-of-tree x86 stack unwind patches
but given the binutils behavior, ignoring R_386_NONE is the right
thing to do.
The problem has been tracke down to binutils behavior by Jan Beulich.
[ Impact: relocs now ignores R_386_NONE ]
Signed-off-by: Tejun Heo <tj@kernel.org>
Cc: Jan Beulich <JBeulich@novell.com>
Cc: Ingo Molnar <mingo@elte.hu>
---
arch/x86/boot/compressed/relocs.c | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/arch/x86/boot/compressed/relocs.c b/arch/x86/boot/compressed/relocs.c
index 857e492..bbeb0c3 100644
--- a/arch/x86/boot/compressed/relocs.c
+++ b/arch/x86/boot/compressed/relocs.c
@@ -504,8 +504,11 @@ static void walk_relocs(void (*visit)(Elf32_Rel *rel, Elf32_Sym *sym))
if (sym->st_shndx == SHN_ABS) {
continue;
}
- if (r_type == R_386_PC32) {
- /* PC relative relocations don't need to be adjusted */
+ if (r_type == R_386_NONE || r_type == R_386_PC32) {
+ /*
+ * NONE can be ignored and and PC relative
+ * relocations don't need to be adjusted.
+ */
}
else if (r_type == R_386_32) {
/* Visit relocations that need to be adjusted */
^ permalink raw reply related [flat|nested] 2+ messages in thread* [tip:x86/urgent] x86, relocs: ignore R_386_NONE in kernel relocation entries
2009-05-26 5:42 [PATCH x86/tip] x86: ignore R_386_NONE in kernel relocation entries Tejun Heo
@ 2009-05-26 6:09 ` tip-bot for Tejun Heo
0 siblings, 0 replies; 2+ messages in thread
From: tip-bot for Tejun Heo @ 2009-05-26 6:09 UTC (permalink / raw)
To: linux-tip-commits; +Cc: linux-kernel, hpa, mingo, JBeulich, tj, tglx, mingo
Commit-ID: 46176b4f6bac19454b7b5c35f68594b85850a600
Gitweb: http://git.kernel.org/tip/46176b4f6bac19454b7b5c35f68594b85850a600
Author: Tejun Heo <tj@kernel.org>
AuthorDate: Tue, 26 May 2009 14:42:40 +0900
Committer: H. Peter Anvin <hpa@zytor.com>
CommitDate: Mon, 25 May 2009 22:52:49 -0700
x86, relocs: ignore R_386_NONE in kernel relocation entries
For relocatable 32bit kernels, boot/compressed/relocs.c processes
relocation entries in the kernel image and appends it to the kernel
image such that boot/compressed/head_32.S can relocate the kernel.
The kernel image is one statically linked object and only uses two
relocation types - R_386_PC32 and R_386_32, of the two only the latter
needs massaging during kernel relocation and thus handled by relocs.
R_386_PC32 is ignored and all other relocation types are considered
error.
When the target of a relocation resides in a discarded section,
binutils doesn't throw away the relocation record but nullifies it by
changing it to R_386_NONE, which unfortunately makes relocs fail.
The problem was triggered by yet out-of-tree x86 stack unwind patches
but given the binutils behavior, ignoring R_386_NONE is the right
thing to do.
The problem has been tracked down to binutils behavior by Jan Beulich.
[ Impact: fix build with certain binutils by ignoring R_386_NONE ]
Signed-off-by: Tejun Heo <tj@kernel.org>
Cc: Jan Beulich <JBeulich@novell.com>
Cc: Ingo Molnar <mingo@elte.hu>
LKML-Reference: <4A1B8150.40702@kernel.org>
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
---
arch/x86/boot/compressed/relocs.c | 7 +++++--
1 files changed, 5 insertions(+), 2 deletions(-)
diff --git a/arch/x86/boot/compressed/relocs.c b/arch/x86/boot/compressed/relocs.c
index 857e492..bbeb0c3 100644
--- a/arch/x86/boot/compressed/relocs.c
+++ b/arch/x86/boot/compressed/relocs.c
@@ -504,8 +504,11 @@ static void walk_relocs(void (*visit)(Elf32_Rel *rel, Elf32_Sym *sym))
if (sym->st_shndx == SHN_ABS) {
continue;
}
- if (r_type == R_386_PC32) {
- /* PC relative relocations don't need to be adjusted */
+ if (r_type == R_386_NONE || r_type == R_386_PC32) {
+ /*
+ * NONE can be ignored and and PC relative
+ * relocations don't need to be adjusted.
+ */
}
else if (r_type == R_386_32) {
/* Visit relocations that need to be adjusted */
^ permalink raw reply related [flat|nested] 2+ messages in thread
end of thread, other threads:[~2009-05-26 6:11 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-05-26 5:42 [PATCH x86/tip] x86: ignore R_386_NONE in kernel relocation entries Tejun Heo
2009-05-26 6:09 ` [tip:x86/urgent] x86, relocs: " tip-bot for Tejun Heo
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.