// A "NUM_words" literal is the size in bytes of NUM words of memory. static size_t operator""_words(unsignedlonglong i) { return i * sizeof(void*);
}
using static_tls_layout_DeathTest = SilentDeathTest;
TEST_F(static_tls_layout_DeathTest, arm) { #if !defined(__arm__) && !defined(__aarch64__)
GTEST_SKIP() << "test only applies to arm32/arm64 targets"; #endif
auto reserve_exe = [](const AlignedSizeFlat& config) {
StaticTlsLayout layout;
TlsSegment seg = {.aligned_size = unflatten_size(config)};
layout.reserve_exe_segment_and_tcb(&seg, "prog"); return layout;
};
auto underalign_error = [](size_t align, size_t offset) { return R"(error: "prog": executable's TLS segment is underaligned: )"s
R"(alignment is )"s +
std::to_string(align) + R"( \(skew )" + std::to_string(offset) +
R"(\), needs to be at least (32 for ARM|64 for ARM64) Bionic)"s;
};
// Amount of memory needed for negative TLS slots, given a segment p_align of // 8 or 16 words. const size_t base8 = __builtin_align_up(-MIN_TLS_SLOT, 8) * sizeof(void*); const size_t base16 = __builtin_align_up(-MIN_TLS_SLOT, 16) * sizeof(void*);
StaticTlsLayout layout;
// An executable with a single word.
layout = reserve_exe({.size = 1_words, .align = 8_words});
EXPECT_EQ(base8 + MIN_TLS_SLOT * sizeof(void*), layout.offset_bionic_tcb());
EXPECT_EQ(base8, layout.offset_thread_pointer());
EXPECT_EQ(base8 + 8_words, layout.offset_exe());
EXPECT_EQ(base8 + 9_words, layout.size());
EXPECT_EQ(8_words, layout.align_);
// Skewed by 1 word is OK.
layout = reserve_exe({.size = 1_words, .align = 8_words, .skew = 1_words});
EXPECT_EQ(base8, layout.offset_thread_pointer());
EXPECT_EQ(base8 + 9_words, layout.offset_exe());
EXPECT_EQ(base8 + 10_words, layout.size());
EXPECT_EQ(8_words, layout.align_);
// Skewed by 2 words would overlap Bionic slots, regardless of the p_align // value.
EXPECT_DEATH(reserve_exe({.size = 1_words, .align = 8_words, .skew = 2_words}),
underalign_error(8_words, 2_words));
EXPECT_DEATH(reserve_exe({.size = 1_words, .align = 0x1000, .skew = 2_words}),
underalign_error(0x1000, 2_words));
// Skewed by 8 words is OK again.
layout = reserve_exe({.size = 1_words, .align = 16_words, .skew = 8_words});
EXPECT_EQ(base16, layout.offset_thread_pointer());
EXPECT_EQ(base16 + 8_words, layout.offset_exe());
EXPECT_EQ(base16 + 9_words, layout.size());
EXPECT_EQ(16_words, layout.align_);
// Skewed by 9 words is also OK. (The amount of skew doesn't need to be a // multiple of anything.)
layout = reserve_exe({.size = 1_words, .align = 16_words, .skew = 9_words});
EXPECT_EQ(base16, layout.offset_thread_pointer());
EXPECT_EQ(base16 + 9_words, layout.offset_exe());
EXPECT_EQ(base16 + 10_words, layout.size());
EXPECT_EQ(16_words, layout.align_);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.