[ELF] Explicitly write null bytes in string tables

Following r309829, if a string table appears in an executable segment, the strings
will not be null terminated. This is a problem, for example, for the .dynstr
section when using -no-rosegment. The strings end up being terminated with 0xcc
because prior to this patch, LLD did not explicitly write the null terminators.
This change fixes that by always writing the null terminators.

Reviewers: rafael

Differential Revision: https://reviews.llvm.org/D36267

llvm-svn: 310042
This commit is contained in:
James Henderson 2017-08-04 09:07:55 +00:00
parent 9c0f79663e
commit a5bc09a86f
2 changed files with 13 additions and 0 deletions

View File

@ -990,6 +990,7 @@ unsigned StringTableSection::addString(StringRef S, bool HashIt) {
void StringTableSection::writeTo(uint8_t *Buf) {
for (StringRef S : Strings) {
memcpy(Buf, S.data(), S.size());
Buf[S.size()] = '\0';
Buf += S.size() + 1;
}
}

View File

@ -0,0 +1,12 @@
# Verify that a .dynstr in the .text segment has null byte terminators
# REQUIRES: x86
# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o
# RUN: ld.lld %t.o -no-rosegment -o %t.so -shared
# RUN: llvm-objdump %t.so -s -j .dynstr | FileCheck %s
# CHECK: 00666f6f 00 .foo.
.globl foo
foo:
ret