mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-12-04 03:44:59 +00:00
[LLD][ELF] - Do not produce an invalid dynamic relocation order with --shuffle-sections.
Normally (when not on android with android relocation packing enabled), we put IRelative relocations to ".rel[a].dyn", after other relocations, to ensure that IRelatives are processed last by the dynamic loader. To achieve that we add the `in.relaIplt` after the `part.relaDyn`: https://github.com/llvm/llvm-project/blob/master/lld/ELF/Writer.cpp#L540 The problem is that `--shuffle-sections` might break the sections order. This patch fixes it. Fixes https://bugs.llvm.org/show_bug.cgi?id=47056. Differential revision: https://reviews.llvm.org/D85651
This commit is contained in:
parent
7e6c437fb4
commit
c135a68d42
@ -1437,6 +1437,14 @@ static void sortSection(OutputSection *sec,
|
||||
if (name == ".init" || name == ".fini")
|
||||
return;
|
||||
|
||||
// IRelative relocations that usually live in the .rel[a].dyn section should
|
||||
// be proccessed last by the dynamic loader. To achieve that we add synthetic
|
||||
// sections in the required order from the begining so that the in.relaIplt
|
||||
// section is placed last in an output section. Here we just do not apply
|
||||
// sorting for an output section which holds the in.relaIplt section.
|
||||
if (in.relaIplt->getParent() == sec)
|
||||
return;
|
||||
|
||||
// Sort input sections by priority using the list provided by
|
||||
// --symbol-ordering-file or --shuffle-sections=. This is a least significant
|
||||
// digit radix sort. The sections may be sorted stably again by a more
|
||||
|
@ -77,6 +77,20 @@
|
||||
// DISASM-NEXT: 201386: pushq $0x1
|
||||
// DISASM-NEXT: 20138b: jmp 0x201340 <.plt>
|
||||
|
||||
// Test that --shuffle-sections does not affect the order of relocations and that
|
||||
// we still place IRELATIVE relocations last. Check both random seed (0) and an
|
||||
// arbitrary seed that was known to break the order of relocations previously (3).
|
||||
// RUN: ld.lld --shuffle-sections=3 %t.so %t.o -o %tout2
|
||||
// RUN: llvm-readobj --relocations %tout2 | FileCheck %s --check-prefix=SHUFFLE
|
||||
// RUN: ld.lld --shuffle-sections=0 %t.so %t.o -o %tout3
|
||||
// RUN: llvm-readobj --relocations %tout3 | FileCheck %s --check-prefix=SHUFFLE
|
||||
|
||||
// SHUFFLE: Section {{.*}} .rela.dyn {
|
||||
// SHUFFLE-NEXT: R_X86_64_GLOB_DAT
|
||||
// SHUFFLE-NEXT: R_X86_64_IRELATIVE
|
||||
// SHUFFLE-NEXT: R_X86_64_IRELATIVE
|
||||
// SHUFFLE-NEXT: }
|
||||
|
||||
.text
|
||||
.type foo STT_GNU_IFUNC
|
||||
.globl foo
|
||||
|
Loading…
Reference in New Issue
Block a user