diff options
author | Jordan Rupprecht <rupprecht@google.com> | 2019-01-15 16:57:23 +0000 |
---|---|---|
committer | Jordan Rupprecht <rupprecht@google.com> | 2019-01-15 16:57:23 +0000 |
commit | a5b03966bac48b620adf31240dc07fa9e191c57f (patch) | |
tree | 95a7a36d7257d574f9f5eaff54e181981725a0c3 | |
parent | e8ac90758e40201d7e98b79ac9ea0e42538caf70 (diff) |
[llvm-objcopy] Use SHT_NOTE for added note sections.
Summary:
Fix llvm-objcopy to add .note sections as SHT_NOTEs. GNU objcopy overrides section flags for special sections. For `.note` sections (with the exception of `.note.GNU-stack`), SHT_NOTE is used.
Many other sections are special cased by libbfd, but `.note` is the only special section I can seem to find being used with objcopy --add-section.
See `.note` in context of the full list of special sections here: https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;a=blob;f=bfd/elf.c;h=eb3e1828e9c651678b95a1dcbc3b124783d1d2be;hb=HEAD#l2675
Reviewers: jhenderson, alexshap, jakehehrlich, espindola
Reviewed By: jhenderson
Subscribers: emaste, arichardson, llvm-commits
Differential Revision: https://reviews.llvm.org/D56570
-rw-r--r-- | llvm/test/tools/llvm-objcopy/ELF/add-note.test | 36 | ||||
-rw-r--r-- | llvm/test/tools/llvm-objcopy/ELF/add-section-special.test | 22 | ||||
-rw-r--r-- | llvm/tools/llvm-objcopy/ELF/ELFObjcopy.cpp | 22 |
3 files changed, 71 insertions, 9 deletions
diff --git a/llvm/test/tools/llvm-objcopy/ELF/add-note.test b/llvm/test/tools/llvm-objcopy/ELF/add-note.test new file mode 100644 index 00000000000..b4562307846 --- /dev/null +++ b/llvm/test/tools/llvm-objcopy/ELF/add-note.test @@ -0,0 +1,36 @@ +# Verify that --add-section can be used to add a note section which is +# successfully interpreted by tools that read notes. + +# Add [namesz, descsz, type, name, desc] for a build id. +# RUN: echo -e -n "\x04\x00\x00\x00" > %t-note.bin +# RUN: echo -e -n "\x10\x00\x00\x00" >> %t-note.bin +# RUN: echo -e -n "\x03\x00\x00\x00" >> %t-note.bin +# RUN: echo -e -n "GNU\x00" >> %t-note.bin +# RUN: echo -e -n "\x00\x01\x02\x03" >> %t-note.bin +# RUN: echo -e -n "\x04\x05\x06\x07" >> %t-note.bin +# RUN: echo -e -n "\x08\x09\x0a\x0b" >> %t-note.bin +# RUN: echo -e -n "\x0c\x0d\x0e\x0f" >> %t-note.bin + +# RUN: yaml2obj %s > %t.o +# RUN: llvm-objcopy --add-section=.note.gnu.build-id=%t-note.bin %t.o %t-with-note.o +# RUN: llvm-readobj --notes %t-with-note.o | FileCheck %s + +!ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 + +# CHECK: Notes [ +# CHECK-NEXT: NoteSection { +# CHECK-NEXT: Offset: +# CHECK-NEXT: Size: +# CHECK-NEXT: Note { +# CHECK-NEXT: Owner: GNU +# CHECK-NEXT: Data size: 0x10 +# CHECK-NEXT: Type: NT_GNU_BUILD_ID +# CHECK-NEXT: Build ID: 000102030405060708090a0b0c0d0e0f +# CHECK-NEXT: } +# CHECK-NEXT: } +# CHECK-NEXT: ] diff --git a/llvm/test/tools/llvm-objcopy/ELF/add-section-special.test b/llvm/test/tools/llvm-objcopy/ELF/add-section-special.test new file mode 100644 index 00000000000..e83cd51810f --- /dev/null +++ b/llvm/test/tools/llvm-objcopy/ELF/add-section-special.test @@ -0,0 +1,22 @@ +# Check the properties of added sections. +# By default, sections are SHT_PROGBITS, but .note sections (excluding +# .note.GNU-stack) are SHT_NOTE sections. + +# RUN: yaml2obj %s > %t.o +# RUN: llvm-objcopy --add-section=.foo=/dev/null %t.o %t-foo.o +# RUN: llvm-objcopy --add-section=.note.foo=/dev/null %t.o %t-regular-note.o +# RUN: llvm-objcopy --add-section=.note.GNU-stack=/dev/null %t.o %t-gnu-stack.o +# RUN: llvm-readelf --sections %t-foo.o | FileCheck %s --check-prefix=NORMAL +# RUN: llvm-readelf --sections %t-regular-note.o | FileCheck %s --check-prefix=NOTE +# RUN: llvm-readelf --sections %t-gnu-stack.o | FileCheck %s --check-prefix=GNU-STACK + +!ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 + +# NORMAL: .foo PROGBITS +# NOTE: .note.foo NOTE +# GNU-STACK: .note.GNU-stack PROGBITS diff --git a/llvm/tools/llvm-objcopy/ELF/ELFObjcopy.cpp b/llvm/tools/llvm-objcopy/ELF/ELFObjcopy.cpp index 08e37d172c3..f5ab8e70826 100644 --- a/llvm/tools/llvm-objcopy/ELF/ELFObjcopy.cpp +++ b/llvm/tools/llvm-objcopy/ELF/ELFObjcopy.cpp @@ -499,17 +499,21 @@ static void handleArgs(const CopyConfig &Config, Object &Obj, if (!Config.AddSection.empty()) { for (const auto &Flag : Config.AddSection) { - auto SecPair = Flag.split("="); - auto SecName = SecPair.first; - auto File = SecPair.second; - auto BufOrErr = MemoryBuffer::getFile(File); + std::pair<StringRef, StringRef> SecPair = Flag.split("="); + StringRef SecName = SecPair.first; + StringRef File = SecPair.second; + ErrorOr<std::unique_ptr<MemoryBuffer>> BufOrErr = + MemoryBuffer::getFile(File); if (!BufOrErr) reportError(File, BufOrErr.getError()); - auto Buf = std::move(*BufOrErr); - auto BufPtr = reinterpret_cast<const uint8_t *>(Buf->getBufferStart()); - auto BufSize = Buf->getBufferSize(); - Obj.addSection<OwnedDataSection>(SecName, - ArrayRef<uint8_t>(BufPtr, BufSize)); + std::unique_ptr<MemoryBuffer> Buf = std::move(*BufOrErr); + ArrayRef<uint8_t> Data( + reinterpret_cast<const uint8_t *>(Buf->getBufferStart()), + Buf->getBufferSize()); + OwnedDataSection &NewSection = + Obj.addSection<OwnedDataSection>(SecName, Data); + if (SecName.startswith(".note") && SecName != ".note.GNU-stack") + NewSection.Type = SHT_NOTE; } } |