Index: test/tools/llvm-objcopy/ELF/add-note.test =================================================================== --- /dev/null +++ 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 -en "\x04\x00\x00\x00" > %t-note.bin +# RUN: echo -en "\x10\x00\x00\x00" >> %t-note.bin +# RUN: echo -en "\x03\x00\x00\x00" >> %t-note.bin +# RUN: echo -en "GNU\x00" >> %t-note.bin +# RUN: echo -en "\x00\x01\x02\x03" >> %t-note.bin +# RUN: echo -en "\x04\x05\x06\x07" >> %t-note.bin +# RUN: echo -en "\x08\x09\x0a\x0b" >> %t-note.bin +# RUN: echo -en "\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: ] Index: test/tools/llvm-objcopy/ELF/add-section-special.test =================================================================== --- /dev/null +++ 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 Index: tools/llvm-objcopy/ELF/ELFObjcopy.cpp =================================================================== --- tools/llvm-objcopy/ELF/ELFObjcopy.cpp +++ tools/llvm-objcopy/ELF/ELFObjcopy.cpp @@ -499,17 +499,21 @@ 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 SecPair = Flag.split("="); + StringRef SecName = SecPair.first; + StringRef File = SecPair.second; + ErrorOr> BufOrErr = + MemoryBuffer::getFile(File); if (!BufOrErr) reportError(File, BufOrErr.getError()); - auto Buf = std::move(*BufOrErr); - auto BufPtr = reinterpret_cast(Buf->getBufferStart()); - auto BufSize = Buf->getBufferSize(); - Obj.addSection(SecName, - ArrayRef(BufPtr, BufSize)); + std::unique_ptr Buf = std::move(*BufOrErr); + const auto *BufPtr = + reinterpret_cast(Buf->getBufferStart()); + size_t BufSize = Buf->getBufferSize(); + OwnedDataSection &NewSection = Obj.addSection( + SecName, ArrayRef(BufPtr, BufSize)); + if (SecName.startswith(".note") && SecName != ".note.GNU-stack") + NewSection.Type = SHT_NOTE; } }