summaryrefslogtreecommitdiffstats
path: root/llvm/tools/llvm-objcopy/Object.cpp
diff options
context:
space:
mode:
authorPetr Hosek <phosek@chromium.org>2017-08-04 23:18:18 +0000
committerPetr Hosek <phosek@chromium.org>2017-08-04 23:18:18 +0000
commitd53951d2ef7e3883a51680958b95d35a360c6562 (patch)
treefc8adaa5620e095e7e583facdbf9cdbef36ab3cf /llvm/tools/llvm-objcopy/Object.cpp
parentbe7a35769dbc850961818c405ef82189bda7225e (diff)
downloadbcm5719-llvm-d53951d2ef7e3883a51680958b95d35a360c6562.tar.gz
bcm5719-llvm-d53951d2ef7e3883a51680958b95d35a360c6562.zip
[llvm][llvm-objcopy] When outputting to binary don't output segments that cover no sections
Sometimes LLD will produce a PT_LOAD segment that only covers the headers (and covers no sections). GNU objcopy does not output the segment contents for these sections. In particular this is an issue in building magenta because the final link step for the kernel would produce just such a PT_LOAD segment. This change is to support this case and to match what GNU objcopy does in this case. Patch by Jake Ehrlich Differential Revision: https://reviews.llvm.org/D36196 llvm-svn: 310149
Diffstat (limited to 'llvm/tools/llvm-objcopy/Object.cpp')
-rw-r--r--llvm/tools/llvm-objcopy/Object.cpp8
1 files changed, 6 insertions, 2 deletions
diff --git a/llvm/tools/llvm-objcopy/Object.cpp b/llvm/tools/llvm-objcopy/Object.cpp
index 576f660bd98..adb25435a5b 100644
--- a/llvm/tools/llvm-objcopy/Object.cpp
+++ b/llvm/tools/llvm-objcopy/Object.cpp
@@ -354,7 +354,10 @@ template <class ELFT> size_t BinaryObject<ELFT>::totalSize() const {
template <class ELFT>
void BinaryObject<ELFT>::write(FileOutputBuffer &Out) const {
for (auto &Segment : this->Segments) {
- if (Segment->Type == llvm::ELF::PT_LOAD) {
+ // GNU objcopy does not output segments that do not cover a section. Such
+ // segments can sometimes be produced by LLD due to how LLD handles PT_PHDR.
+ if (Segment->Type == llvm::ELF::PT_LOAD &&
+ Segment->firstSection() != nullptr) {
Segment->writeSegment(Out);
}
}
@@ -373,7 +376,8 @@ template <class ELFT> void BinaryObject<ELFT>::finalize() {
uint64_t Offset = 0;
for (auto &Segment : this->Segments) {
- if (Segment->Type == llvm::ELF::PT_LOAD) {
+ if (Segment->Type == llvm::ELF::PT_LOAD &&
+ Segment->firstSection() != nullptr) {
Offset = alignTo(Offset, Segment->Align);
Segment->Offset = Offset;
Offset += Segment->FileSize;
OpenPOWER on IntegriCloud