mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-03-05 17:08:17 +00:00
[ELF] Remove unused synthetic sections from script commands
Script commands are processed before unused synthetic sections are removed. Therefore, if a linker script matches one of these sections it'll get emitted as an empty output section because the logic for removing unused synthetic sections ignores script commands which could have already matched and captured one of these sections. This patch fixes that by also removing the unused synthetic sections from the script commands. Differential Revision: https://reviews.llvm.org/D34800 llvm-svn: 307037
This commit is contained in:
parent
d7a1c334ce
commit
52db9a4fe6
@ -1149,8 +1149,17 @@ static void removeUnusedSyntheticSections(std::vector<OutputSection *> &V) {
|
||||
SS->Live = false;
|
||||
// If there are no other sections in the output section, remove it from the
|
||||
// output.
|
||||
if (OS->Sections.empty())
|
||||
if (OS->Sections.empty()) {
|
||||
V.erase(std::find(V.begin(), V.end(), OS));
|
||||
// Also remove script commands matching the output section.
|
||||
auto &Cmds = Script->Opt.Commands;
|
||||
auto I = std::remove_if(Cmds.begin(), Cmds.end(), [&](BaseCommand *Cmd) {
|
||||
if (auto *OSCmd = dyn_cast<OutputSectionCommand>(Cmd))
|
||||
return OSCmd->Sec == OS;
|
||||
return false;
|
||||
});
|
||||
Cmds.erase(I, Cmds.end());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
18
lld/test/ELF/linkerscript/unused-synthetic.s
Normal file
18
lld/test/ELF/linkerscript/unused-synthetic.s
Normal file
@ -0,0 +1,18 @@
|
||||
# REQUIRES: x86
|
||||
# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o
|
||||
# RUN: echo "SECTIONS { \
|
||||
# RUN: .got : { *(.got) } \
|
||||
# RUN: .plt : { *(.plt) } \
|
||||
# RUN: .text : { *(.text) } \
|
||||
# RUN: }" > %t.script
|
||||
# RUN: ld.lld -shared -o %t.so --script %t.script %t.o
|
||||
|
||||
# RUN: llvm-objdump -section-headers %t.so | FileCheck %s
|
||||
# CHECK-NOT: .got
|
||||
# CHECK-NOT: .plt
|
||||
# CHECK: .text
|
||||
# CHECK-NEXT: .dynsym
|
||||
|
||||
.global _start
|
||||
_start:
|
||||
nop
|
Loading…
x
Reference in New Issue
Block a user