blob: 626ad44175920e68deeb7b86f0cb7885ce35c893 [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_elf_symbols.h"
#include <gtest/gtest.h>
#include <memory>
#include "crazy_linker_elf_hash_table_test_data.h"
#include "crazy_linker_gnu_hash_table_test_data.h"
namespace crazy {
namespace testing {
class ElfSymbolsTest : public ::testing::Test {
protected:
ElfSymbolsTest(const ELF::Sym* symbol_table,
const char* string_table,
uintptr_t dt_elf_hash,
uintptr_t dt_gnu_hash)
: symbols_(symbol_table, string_table, dt_elf_hash, dt_gnu_hash) {}
ElfSymbols symbols_;
};
class ElfSymbolsElfHashTest : public ElfSymbolsTest {
public:
ElfSymbolsElfHashTest()
: ElfSymbolsTest(kTestElfSymbolTable,
kTestElfStringTable,
reinterpret_cast<uintptr_t>(kTestElfHashTable),
0) {}
};
class ElfSymbolsGnuHashTest : public ElfSymbolsTest {
public:
ElfSymbolsGnuHashTest()
: ElfSymbolsTest(kTestGnuSymbolTable,
kTestGnuStringTable,
0,
reinterpret_cast<uintptr_t>(kTestGnuHashTable)) {}
};
#define CHECK_SYMBOL_BY_NAME(name, offset, address, size) \
sym = symbols_.LookupByName(name); \
EXPECT_TRUE(sym) << name; \
EXPECT_EQ((address), sym->st_value) << name; \
EXPECT_EQ((size), sym->st_size) << name;
#define CHECK_SYMBOL_BY_ADDRESS(name, offset, address, size) \
sym = symbols_.LookupByAddress(reinterpret_cast<void*>(address), 0); \
EXPECT_TRUE(sym) << name; \
EXPECT_STREQ((name), symbols_.string_table() + sym->st_name) << name; \
EXPECT_EQ((address), sym->st_value) << name;
#define CHECK_SYMBOL_BY_NEAREST_ADDRESS(name, offset, address, size) \
EXPECT_TRUE( \
symbols_.LookupNearestByAddress(reinterpret_cast<void*>((address)-2), 0, \
&sym_name, &sym_addr, &sym_size)) \
<< name; \
EXPECT_STREQ((name), sym_name) << name; \
EXPECT_EQ((address), reinterpret_cast<uintptr_t>(sym_addr)) << name; \
EXPECT_EQ((size), sym_size) << name;
TEST_F(ElfSymbolsElfHashTest, LookupByName) {
const ELF::Sym* sym;
LIST_ELF_SYMBOLS_TestElf(CHECK_SYMBOL_BY_NAME);
}
TEST_F(ElfSymbolsElfHashTest, LookupByAddress) {
const ELF::Sym* sym;
LIST_ELF_SYMBOLS_TestElf(CHECK_SYMBOL_BY_ADDRESS);
}
TEST_F(ElfSymbolsElfHashTest, LookupNearestByAddress) {
const char* sym_name;
void* sym_addr;
size_t sym_size;
LIST_ELF_SYMBOLS_TestElf(CHECK_SYMBOL_BY_NEAREST_ADDRESS);
}
TEST_F(ElfSymbolsGnuHashTest, LookupByName) {
const ELF::Sym* sym;
LIST_ELF_SYMBOLS_TestGnu(CHECK_SYMBOL_BY_NAME);
}
TEST_F(ElfSymbolsGnuHashTest, LookupByAddress) {
const ELF::Sym* sym;
LIST_ELF_SYMBOLS_TestGnu(CHECK_SYMBOL_BY_ADDRESS);
}
TEST_F(ElfSymbolsGnuHashTest, LookupNearestByAddress) {
const char* sym_name;
void* sym_addr;
size_t sym_size;
LIST_ELF_SYMBOLS_TestGnu(CHECK_SYMBOL_BY_NEAREST_ADDRESS);
}
} // namespace testing
} // namespace crazy