blob: be39795d590d23cf11aaf9c2acd80db425a0925a [file] [log] [blame]
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "crazy_linker_gnu_hash_table.h"
#include <gtest/gtest.h>
#include "crazy_linker_gnu_hash_table_test_data.h"
#include <stdint.h>
namespace crazy {
namespace testing {
TEST(GnuHashTable, LookupByName) {
GnuHashTable table;
table.Init(reinterpret_cast<uintptr_t>(&kTestGnuHashTable));
EXPECT_TRUE(table.IsValid());
const ELF::Sym* sym;
#define CHECK_SYMBOL(name, offset, address, size) \
sym = table.LookupByName(name, kTestGnuSymbolTable, kTestGnuStringTable); \
EXPECT_TRUE(sym) << name; \
EXPECT_EQ((address), sym->st_value) << name; \
EXPECT_EQ((size), sym->st_size) << name;
LIST_ELF_SYMBOLS_TestGnu(CHECK_SYMBOL);
#undef CHECK_SYMBOL
// Check a few undefined symbols.
EXPECT_FALSE(table.LookupByName("ahahahahah", kTestGnuSymbolTable,
kTestGnuStringTable));
EXPECT_FALSE(
table.LookupByName("strsign", kTestGnuSymbolTable, kTestGnuStringTable));
}
TEST(GnuHashTable, DynSymbols) {
GnuHashTable table;
table.Init(reinterpret_cast<uintptr_t>(&kTestGnuHashTable));
EXPECT_TRUE(table.IsValid());
const size_t kExpectedOffset = kTestGnuHashTable[1];
const size_t kExpectedCount =
(sizeof(kTestGnuSymbolTable) / sizeof(kTestGnuSymbolTable[0])) -
kExpectedOffset;
EXPECT_EQ(kExpectedOffset, table.dyn_symbols_offset());
EXPECT_EQ(kExpectedCount, table.dyn_symbols_count());
}
} // namespace testing
} // namespace crazy