forked from OSchip/llvm-project
[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 llvm-svn: 351204
This commit is contained in:
parent
b8f08c8d7b
commit
17dd4a2c5e
|
@ -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: ]
|
|
@ -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
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue