버그를 찾기 위해 Linux 커널을 양분할 때(제 경우에는 v4.4와 v4.9 사이) 다음과 같은 빌드 오류가 발생했습니다.
RELOCS arch/x86/boot/compressed/vmlinux.relocs
Unsupported relocation type: R_X86_64_PLT32 (4)
이에 대해 우리는 무엇을 할 수 있나요?
사람들이 이 문제를 다른 곳에서 보고한 것을 발견했습니다.
답변1
최신 버전과 관련된 것 같습니다 binutils
.
2.31.1
GNU binutils 에서 이 오류가 발생하는 것을 발견했지만 버전을 사용하면 2.30
문제가 해결됩니다.
원천:
드디어 답을 찾았어요이 채팅 기록사용자는 deviosity
다음과 같이 말했습니다.
계속해서 두려운: Unsupported relocation type: R_X86_64_PLT32 (4) 오류가 발생합니다. 일반적으로 binutils를 2.30과 2.31로 다운그레이드하면 해결됩니다.
그리고이 댓글이는 또한 확인되었습니다(Ubuntu 16.04도 이전 binutils 버전을 사용합니다 2.26.1
).
답변2
위에서 다음 패치를 찾았습니다.https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=b21ebf2fb4cde1618915a97cc773e287ff49173e
패치가 실패했기 때문에 module.c를 수동으로 패치해야 했습니다.
diff --git a/arch/x86/kernel/machine_kexec_64.c b/arch/x86/kernel/machine_kexec_64.c
index 1f790cf9d38f..3b7427aa7d85 100644
--- a/arch/x86/kernel/machine_kexec_64.c
+++ b/arch/x86/kernel/machine_kexec_64.c
@@ -542,6 +542,7 @@ int arch_kexec_apply_relocations_add(const Elf64_Ehdr *ehdr,
goto overflow;
break;
case R_X86_64_PC32:
+ case R_X86_64_PLT32:
value -= (u64)address;
*(u32 *)location = value;
break;
diff --git a/arch/x86/kernel/module.c b/arch/x86/kernel/module.c
index da0c160e5589..f58336af095c 100644
--- a/arch/x86/kernel/module.c
+++ b/arch/x86/kernel/module.c
@@ -191,6 +191,7 @@ int apply_relocate_add(Elf64_Shdr *sechdrs,
goto overflow;
break;
case R_X86_64_PC32:
+ case R_X86_64_PLT32:
if (*(u32 *)loc != 0)
goto invalid_relocation;
val -= (u64)loc;
diff --git a/arch/x86/tools/relocs.c b/arch/x86/tools/relocs.c
index 5d73c443e778..220e97841e49 100644
--- a/arch/x86/tools/relocs.c
+++ b/arch/x86/tools/relocs.c
@@ -770,9 +770,12 @@ static int do_reloc64(struct section *sec, Elf_Rel *rel, ElfW(Sym) *sym,
break;
case R_X86_64_PC32:
+ case R_X86_64_PLT32:
/*
* PC relative relocations don't need to be adjusted unless
* referencing a percpu symbol.
+ *
+ * NB: R_X86_64_PLT32 can be treated as R_X86_64_PC32.
*/
if (is_percpu_sym(sym, symname))
add_reloc(&relocs32neg, offset);