|
|
|
|
@@ -58,6 +58,12 @@ getSymbolError(const loader::Symbol& symbol, const loader::Symbol& expected)
|
|
|
|
|
(int)expected.binding << "`.\n";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (symbol.type != expected.type) {
|
|
|
|
|
ss << " symbols' types do not match: seen `" <<
|
|
|
|
|
(int)symbol.type << "`, expected `" <<
|
|
|
|
|
(int)expected.type << "`.\n";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (symbol.name != expected.name) {
|
|
|
|
|
ss << " symbols' names do not match: seen `" << symbol.name <<
|
|
|
|
|
"`, expected `" << expected.name << "`.\n";
|
|
|
|
|
@@ -136,7 +142,9 @@ TEST(LoaderSymtabTest, InsertSymbolNoName)
|
|
|
|
|
{
|
|
|
|
|
loader::SymbolTable symtab;
|
|
|
|
|
|
|
|
|
|
loader::Symbol symbol = {loader::Symbol::Binding::Local, "", 0x10};
|
|
|
|
|
loader::Symbol symbol = \
|
|
|
|
|
{loader::Symbol::Binding::Local, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"", 0x10};
|
|
|
|
|
ASSERT_FALSE(symtab.insert(symbol));
|
|
|
|
|
ASSERT_TRUE(checkTable(symtab, {}));
|
|
|
|
|
}
|
|
|
|
|
@@ -146,7 +154,9 @@ TEST(LoaderSymtabTest, InsertOneSymbol)
|
|
|
|
|
{
|
|
|
|
|
loader::SymbolTable symtab;
|
|
|
|
|
|
|
|
|
|
loader::Symbol symbol = {loader::Symbol::Binding::Local, "symbol", 0x10};
|
|
|
|
|
loader::Symbol symbol = \
|
|
|
|
|
{loader::Symbol::Binding::Local, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol", 0x10};
|
|
|
|
|
ASSERT_TRUE(symtab.insert(symbol));
|
|
|
|
|
|
|
|
|
|
ASSERT_FALSE(symtab.empty());
|
|
|
|
|
@@ -160,8 +170,10 @@ TEST(LoaderSymtabTest, InsertSymbolExistingName)
|
|
|
|
|
|
|
|
|
|
const std::string name = "symbol";
|
|
|
|
|
loader::Symbol symbols[] = {
|
|
|
|
|
{loader::Symbol::Binding::Local, name, 0x10},
|
|
|
|
|
{loader::Symbol::Binding::Local, name, 0x20},
|
|
|
|
|
{loader::Symbol::Binding::Local, loader::Symbol::SymbolType::Other,
|
|
|
|
|
name, 0x10},
|
|
|
|
|
{loader::Symbol::Binding::Local, loader::Symbol::SymbolType::Other,
|
|
|
|
|
name, 0x20},
|
|
|
|
|
};
|
|
|
|
|
ASSERT_TRUE(symtab.insert(symbols[0]));
|
|
|
|
|
ASSERT_FALSE(symtab.insert(symbols[1]));
|
|
|
|
|
@@ -177,8 +189,10 @@ TEST(LoaderSymtabTest, InsertSymbolExistingAddress)
|
|
|
|
|
|
|
|
|
|
const Addr addr = 0x10;
|
|
|
|
|
loader::Symbol symbols[] = {
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol", addr},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol2", addr},
|
|
|
|
|
{loader::Symbol::Binding::Local, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol", addr},
|
|
|
|
|
{loader::Symbol::Binding::Local, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol2", addr},
|
|
|
|
|
};
|
|
|
|
|
ASSERT_TRUE(symtab.insert(symbols[0]));
|
|
|
|
|
ASSERT_TRUE(symtab.insert(symbols[1]));
|
|
|
|
|
@@ -193,9 +207,12 @@ TEST(LoaderSymtabTest, InsertMultipleSymbols)
|
|
|
|
|
loader::SymbolTable symtab;
|
|
|
|
|
|
|
|
|
|
loader::Symbol symbols[] = {
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol", 0x10},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol2", 0x20},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol3", 0x30},
|
|
|
|
|
{loader::Symbol::Binding::Local, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol", 0x10},
|
|
|
|
|
{loader::Symbol::Binding::Local, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol2", 0x20},
|
|
|
|
|
{loader::Symbol::Binding::Local, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol3", 0x30},
|
|
|
|
|
};
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbols[0]));
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbols[1]));
|
|
|
|
|
@@ -212,9 +229,12 @@ TEST(LoaderSymtabTest, ClearMultiple)
|
|
|
|
|
loader::SymbolTable symtab;
|
|
|
|
|
|
|
|
|
|
loader::Symbol symbols[] = {
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol", 0x10},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol2", 0x20},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol3", 0x30},
|
|
|
|
|
{loader::Symbol::Binding::Local, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol", 0x10},
|
|
|
|
|
{loader::Symbol::Binding::Local, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol2", 0x20},
|
|
|
|
|
{loader::Symbol::Binding::Local, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol3", 0x30},
|
|
|
|
|
};
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbols[0]));
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbols[1]));
|
|
|
|
|
@@ -234,9 +254,12 @@ TEST(LoaderSymtabTest, Offset)
|
|
|
|
|
loader::SymbolTable symtab;
|
|
|
|
|
|
|
|
|
|
loader::Symbol symbols[] = {
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol", 0x10},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol2", 0x20},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol3", 0x30},
|
|
|
|
|
{loader::Symbol::Binding::Local, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol", 0x10},
|
|
|
|
|
{loader::Symbol::Binding::Local, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol2", 0x20},
|
|
|
|
|
{loader::Symbol::Binding::Local, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol3", 0x30},
|
|
|
|
|
};
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbols[0]));
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbols[1]));
|
|
|
|
|
@@ -250,9 +273,12 @@ TEST(LoaderSymtabTest, Offset)
|
|
|
|
|
|
|
|
|
|
// Check that the new table is offset
|
|
|
|
|
loader::Symbol expected_symbols[] = {
|
|
|
|
|
{symbols[0].binding, symbols[0].name, symbols[0].address + offset},
|
|
|
|
|
{symbols[1].binding, symbols[1].name, symbols[1].address + offset},
|
|
|
|
|
{symbols[2].binding, symbols[2].name, symbols[2].address + offset},
|
|
|
|
|
{symbols[0].binding, symbols[0].type, symbols[0].name,
|
|
|
|
|
symbols[0].address + offset},
|
|
|
|
|
{symbols[1].binding, symbols[1].type, symbols[1].name,
|
|
|
|
|
symbols[1].address + offset},
|
|
|
|
|
{symbols[2].binding, symbols[2].type, symbols[2].name,
|
|
|
|
|
symbols[2].address + offset},
|
|
|
|
|
};
|
|
|
|
|
ASSERT_TRUE(checkTable(*symtab_new, {expected_symbols[0],
|
|
|
|
|
expected_symbols[1], expected_symbols[2]}));
|
|
|
|
|
@@ -267,10 +293,14 @@ TEST(LoaderSymtabTest, Mask)
|
|
|
|
|
loader::SymbolTable symtab;
|
|
|
|
|
|
|
|
|
|
loader::Symbol symbols[] = {
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol", 0x1310},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol2", 0x2810},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol3", 0x2920},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol4", 0x3C20},
|
|
|
|
|
{loader::Symbol::Binding::Local, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol", 0x1310},
|
|
|
|
|
{loader::Symbol::Binding::Local, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol2", 0x2810},
|
|
|
|
|
{loader::Symbol::Binding::Local, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol3", 0x2920},
|
|
|
|
|
{loader::Symbol::Binding::Local, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol4", 0x3C20},
|
|
|
|
|
};
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbols[0]));
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbols[1]));
|
|
|
|
|
@@ -286,10 +316,14 @@ TEST(LoaderSymtabTest, Mask)
|
|
|
|
|
|
|
|
|
|
// Check that the new table is masked
|
|
|
|
|
loader::Symbol expected_symbols[] = {
|
|
|
|
|
{symbols[0].binding, symbols[0].name, symbols[0].address & mask},
|
|
|
|
|
{symbols[1].binding, symbols[1].name, symbols[1].address & mask},
|
|
|
|
|
{symbols[2].binding, symbols[2].name, symbols[2].address & mask},
|
|
|
|
|
{symbols[3].binding, symbols[3].name, symbols[3].address & mask},
|
|
|
|
|
{symbols[0].binding, symbols[0].type, symbols[0].name,
|
|
|
|
|
symbols[0].address & mask},
|
|
|
|
|
{symbols[1].binding, symbols[1].type, symbols[1].name,
|
|
|
|
|
symbols[1].address & mask},
|
|
|
|
|
{symbols[2].binding, symbols[2].type, symbols[2].name,
|
|
|
|
|
symbols[2].address & mask},
|
|
|
|
|
{symbols[3].binding, symbols[3].type, symbols[3].name,
|
|
|
|
|
symbols[3].address & mask},
|
|
|
|
|
};
|
|
|
|
|
ASSERT_TRUE(checkTable(*symtab_new, {expected_symbols[0],
|
|
|
|
|
expected_symbols[1], expected_symbols[2], expected_symbols[3]}));
|
|
|
|
|
@@ -304,10 +338,14 @@ TEST(LoaderSymtabTest, Rename)
|
|
|
|
|
loader::SymbolTable symtab;
|
|
|
|
|
|
|
|
|
|
loader::Symbol symbols[] = {
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol", 0x10},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol2", 0x20},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol3", 0x30},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol4", 0x40},
|
|
|
|
|
{loader::Symbol::Binding::Local, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol", 0x10},
|
|
|
|
|
{loader::Symbol::Binding::Local, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol2", 0x20},
|
|
|
|
|
{loader::Symbol::Binding::Local, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol3", 0x30},
|
|
|
|
|
{loader::Symbol::Binding::Local, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol4", 0x40},
|
|
|
|
|
};
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbols[0]));
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbols[1]));
|
|
|
|
|
@@ -323,10 +361,14 @@ TEST(LoaderSymtabTest, Rename)
|
|
|
|
|
|
|
|
|
|
// Check that the new table's symbols have been renamed
|
|
|
|
|
loader::Symbol expected_symbols[] = {
|
|
|
|
|
{symbols[0].binding, symbols[0].name + "_suffix", symbols[0].address},
|
|
|
|
|
{symbols[1].binding, symbols[1].name + "_suffix", symbols[1].address},
|
|
|
|
|
{symbols[2].binding, symbols[2].name + "_suffix", symbols[2].address},
|
|
|
|
|
{symbols[3].binding, symbols[3].name + "_suffix", symbols[3].address},
|
|
|
|
|
{symbols[0].binding, symbols[0].type, symbols[0].name + "_suffix",
|
|
|
|
|
symbols[0].address},
|
|
|
|
|
{symbols[1].binding, symbols[1].type, symbols[1].name + "_suffix",
|
|
|
|
|
symbols[1].address},
|
|
|
|
|
{symbols[2].binding, symbols[2].type, symbols[2].name + "_suffix",
|
|
|
|
|
symbols[2].address},
|
|
|
|
|
{symbols[3].binding, symbols[3].type, symbols[3].name + "_suffix",
|
|
|
|
|
symbols[3].address},
|
|
|
|
|
};
|
|
|
|
|
ASSERT_TRUE(checkTable(*symtab_new, {expected_symbols[0],
|
|
|
|
|
expected_symbols[1], expected_symbols[2], expected_symbols[3]}));
|
|
|
|
|
@@ -341,10 +383,14 @@ TEST(LoaderSymtabTest, RenameNonUnique)
|
|
|
|
|
loader::SymbolTable symtab;
|
|
|
|
|
|
|
|
|
|
loader::Symbol symbols[] = {
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol", 0x10},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol2", 0x20},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol3", 0x30},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol4", 0x40},
|
|
|
|
|
{loader::Symbol::Binding::Local, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol", 0x10},
|
|
|
|
|
{loader::Symbol::Binding::Local, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol2", 0x20},
|
|
|
|
|
{loader::Symbol::Binding::Local, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol3", 0x30},
|
|
|
|
|
{loader::Symbol::Binding::Local, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol4", 0x40},
|
|
|
|
|
};
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbols[0]));
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbols[1]));
|
|
|
|
|
@@ -366,9 +412,12 @@ TEST(LoaderSymtabTest, RenameNonUnique)
|
|
|
|
|
// Check that the new table's symbols have been renamed, yet it does not
|
|
|
|
|
// contain the symbols with duplicated names
|
|
|
|
|
loader::Symbol expected_symbols[] = {
|
|
|
|
|
{symbols[0].binding, "NonUniqueName", symbols[0].address},
|
|
|
|
|
{symbols[1].binding, symbols[1].name, symbols[1].address},
|
|
|
|
|
{symbols[3].binding, symbols[3].name, symbols[3].address},
|
|
|
|
|
{symbols[0].binding, symbols[0].type, "NonUniqueName",
|
|
|
|
|
symbols[0].address},
|
|
|
|
|
{symbols[1].binding, symbols[1].type, symbols[1].name,
|
|
|
|
|
symbols[1].address},
|
|
|
|
|
{symbols[3].binding, symbols[3].type, symbols[3].name,
|
|
|
|
|
symbols[3].address},
|
|
|
|
|
};
|
|
|
|
|
ASSERT_TRUE(checkTable(*symtab_new, {expected_symbols[0],
|
|
|
|
|
expected_symbols[1], expected_symbols[2]}));
|
|
|
|
|
@@ -383,11 +432,16 @@ TEST(LoaderSymtabTest, Globals)
|
|
|
|
|
loader::SymbolTable symtab;
|
|
|
|
|
|
|
|
|
|
loader::Symbol symbols[] = {
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol", 0x10},
|
|
|
|
|
{loader::Symbol::Binding::Global, "symbol2", 0x20},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol3", 0x30},
|
|
|
|
|
{loader::Symbol::Binding::Weak, "symbol4", 0x40},
|
|
|
|
|
{loader::Symbol::Binding::Weak, "symbol5", 0x50}
|
|
|
|
|
{loader::Symbol::Binding::Local, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol", 0x10},
|
|
|
|
|
{loader::Symbol::Binding::Global, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol2", 0x20},
|
|
|
|
|
{loader::Symbol::Binding::Local, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol3", 0x30},
|
|
|
|
|
{loader::Symbol::Binding::Weak, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol4", 0x40},
|
|
|
|
|
{loader::Symbol::Binding::Weak, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol5", 0x50}
|
|
|
|
|
};
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbols[0]));
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbols[1]));
|
|
|
|
|
@@ -414,11 +468,16 @@ TEST(LoaderSymtabTest, Locals)
|
|
|
|
|
loader::SymbolTable symtab;
|
|
|
|
|
|
|
|
|
|
loader::Symbol symbols[] = {
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol", 0x10},
|
|
|
|
|
{loader::Symbol::Binding::Global, "symbol2", 0x20},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol3", 0x30},
|
|
|
|
|
{loader::Symbol::Binding::Weak, "symbol4", 0x40},
|
|
|
|
|
{loader::Symbol::Binding::Weak, "symbol5", 0x50}
|
|
|
|
|
{loader::Symbol::Binding::Local, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol", 0x10},
|
|
|
|
|
{loader::Symbol::Binding::Global, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol2", 0x20},
|
|
|
|
|
{loader::Symbol::Binding::Local, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol3", 0x30},
|
|
|
|
|
{loader::Symbol::Binding::Weak, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol4", 0x40},
|
|
|
|
|
{loader::Symbol::Binding::Weak, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol5", 0x50}
|
|
|
|
|
};
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbols[0]));
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbols[1]));
|
|
|
|
|
@@ -445,11 +504,16 @@ TEST(LoaderSymtabTest, Weaks)
|
|
|
|
|
loader::SymbolTable symtab;
|
|
|
|
|
|
|
|
|
|
loader::Symbol symbols[] = {
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol", 0x10},
|
|
|
|
|
{loader::Symbol::Binding::Global, "symbol2", 0x20},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol3", 0x30},
|
|
|
|
|
{loader::Symbol::Binding::Weak, "symbol4", 0x40},
|
|
|
|
|
{loader::Symbol::Binding::Weak, "symbol5", 0x50}
|
|
|
|
|
{loader::Symbol::Binding::Local, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol", 0x10},
|
|
|
|
|
{loader::Symbol::Binding::Global, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol2", 0x20},
|
|
|
|
|
{loader::Symbol::Binding::Local, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol3", 0x30},
|
|
|
|
|
{loader::Symbol::Binding::Weak, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol4", 0x40},
|
|
|
|
|
{loader::Symbol::Binding::Weak, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol5", 0x50}
|
|
|
|
|
};
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbols[0]));
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbols[1]));
|
|
|
|
|
@@ -467,12 +531,50 @@ TEST(LoaderSymtabTest, Weaks)
|
|
|
|
|
ASSERT_TRUE(checkTable(*symtab_new, {symbols[3], symbols[4]}));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Test the creation of a new filtered table containing only function symbols
|
|
|
|
|
* of the original table. Also verifies if the original table is kept the same.
|
|
|
|
|
*/
|
|
|
|
|
TEST(LoaderSymtabTest, FunctionSymbols)
|
|
|
|
|
{
|
|
|
|
|
loader::SymbolTable symtab;
|
|
|
|
|
|
|
|
|
|
loader::Symbol symbols[] = {
|
|
|
|
|
{loader::Symbol::Binding::Global, loader::Symbol::SymbolType::NoType,
|
|
|
|
|
"symbol", 0x10},
|
|
|
|
|
{loader::Symbol::Binding::Global, loader::Symbol::SymbolType::File,
|
|
|
|
|
"symbol2", 0x20},
|
|
|
|
|
{loader::Symbol::Binding::Global, loader::Symbol::SymbolType::Function,
|
|
|
|
|
"symbol3", 0x30},
|
|
|
|
|
{loader::Symbol::Binding::Global, loader::Symbol::SymbolType::Object,
|
|
|
|
|
"symbol4", 0x40},
|
|
|
|
|
{loader::Symbol::Binding::Global, loader::Symbol::SymbolType::Function,
|
|
|
|
|
"symbol5", 0x50}
|
|
|
|
|
};
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbols[0]));
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbols[1]));
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbols[2]));
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbols[3]));
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbols[4]));
|
|
|
|
|
|
|
|
|
|
const auto symtab_new = symtab.functionSymbols();
|
|
|
|
|
|
|
|
|
|
// Check that the original table is not modified
|
|
|
|
|
ASSERT_TRUE(checkTable(symtab, {symbols[0], symbols[1], symbols[2],
|
|
|
|
|
symbols[3], symbols[4]}));
|
|
|
|
|
|
|
|
|
|
// Check that the new table only contains function symbols
|
|
|
|
|
ASSERT_TRUE(checkTable(*symtab_new, {symbols[2], symbols[4]}));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** Test searching for a non-existent address. */
|
|
|
|
|
TEST(LoaderSymtabTest, FindNonExistentAddress)
|
|
|
|
|
{
|
|
|
|
|
loader::SymbolTable symtab;
|
|
|
|
|
|
|
|
|
|
loader::Symbol symbol = {loader::Symbol::Binding::Local, "symbol", 0x10};
|
|
|
|
|
loader::Symbol symbol = \
|
|
|
|
|
{loader::Symbol::Binding::Local, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol", 0x10};
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbol));
|
|
|
|
|
|
|
|
|
|
ASSERT_EQ(symtab.find(0x0), symtab.end());
|
|
|
|
|
@@ -484,9 +586,12 @@ TEST(LoaderSymtabTest, FindUniqueAddress)
|
|
|
|
|
loader::SymbolTable symtab;
|
|
|
|
|
|
|
|
|
|
loader::Symbol symbols[] = {
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol", 0x10},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol2", 0x20},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol3", 0x30},
|
|
|
|
|
{loader::Symbol::Binding::Local, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol", 0x10},
|
|
|
|
|
{loader::Symbol::Binding::Local, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol2", 0x20},
|
|
|
|
|
{loader::Symbol::Binding::Local, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol3", 0x30},
|
|
|
|
|
};
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbols[0]));
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbols[1]));
|
|
|
|
|
@@ -506,9 +611,12 @@ TEST(LoaderSymtabTest, FindNonUniqueAddress)
|
|
|
|
|
|
|
|
|
|
const Addr addr = 0x20;
|
|
|
|
|
loader::Symbol symbols[] = {
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol", 0x10},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol2", addr},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol3", addr},
|
|
|
|
|
{loader::Symbol::Binding::Local, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol", 0x10},
|
|
|
|
|
{loader::Symbol::Binding::Local, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol2", addr},
|
|
|
|
|
{loader::Symbol::Binding::Local, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol3", addr},
|
|
|
|
|
};
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbols[0]));
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbols[1]));
|
|
|
|
|
@@ -524,7 +632,9 @@ TEST(LoaderSymtabTest, FindNonExistentName)
|
|
|
|
|
{
|
|
|
|
|
loader::SymbolTable symtab;
|
|
|
|
|
|
|
|
|
|
loader::Symbol symbol = {loader::Symbol::Binding::Local, "symbol", 0x10};
|
|
|
|
|
loader::Symbol symbol = \
|
|
|
|
|
{loader::Symbol::Binding::Local, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol", 0x10};
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbol));
|
|
|
|
|
|
|
|
|
|
const auto it = symtab.find("symbol2");
|
|
|
|
|
@@ -537,9 +647,12 @@ TEST(LoaderSymtabTest, FindExistingName)
|
|
|
|
|
loader::SymbolTable symtab;
|
|
|
|
|
|
|
|
|
|
loader::Symbol symbols[] = {
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol", 0x10},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol2", 0x20},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol3", 0x30},
|
|
|
|
|
{loader::Symbol::Binding::Local, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol", 0x10},
|
|
|
|
|
{loader::Symbol::Binding::Local, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol2", 0x20},
|
|
|
|
|
{loader::Symbol::Binding::Local, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol3", 0x30},
|
|
|
|
|
};
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbols[0]));
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbols[1]));
|
|
|
|
|
@@ -556,8 +669,10 @@ TEST(LoaderSymtabTest, FindNearestExact)
|
|
|
|
|
loader::SymbolTable symtab;
|
|
|
|
|
|
|
|
|
|
loader::Symbol symbols[] = {
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol", 0x10},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol2", 0x20},
|
|
|
|
|
{loader::Symbol::Binding::Local, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol", 0x10},
|
|
|
|
|
{loader::Symbol::Binding::Local, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol2", 0x20},
|
|
|
|
|
};
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbols[0]));
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbols[1]));
|
|
|
|
|
@@ -575,7 +690,9 @@ TEST(LoaderSymtabTest, FindNearestRound)
|
|
|
|
|
{
|
|
|
|
|
loader::SymbolTable symtab;
|
|
|
|
|
|
|
|
|
|
loader::Symbol symbol = {loader::Symbol::Binding::Local, "symbol", 0x10};
|
|
|
|
|
loader::Symbol symbol = \
|
|
|
|
|
{loader::Symbol::Binding::Local, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol", 0x10};
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbol));
|
|
|
|
|
|
|
|
|
|
const auto it = symtab.findNearest(symbol.address + 0x1);
|
|
|
|
|
@@ -593,8 +710,10 @@ TEST(LoaderSymtabTest, FindNearestRoundWithNext)
|
|
|
|
|
loader::SymbolTable symtab;
|
|
|
|
|
|
|
|
|
|
loader::Symbol symbols[] = {
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol", 0x10},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol2", 0x20},
|
|
|
|
|
{loader::Symbol::Binding::Local, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol", 0x10},
|
|
|
|
|
{loader::Symbol::Binding::Local, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol2", 0x20},
|
|
|
|
|
};
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbols[0]));
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbols[1]));
|
|
|
|
|
@@ -615,7 +734,9 @@ TEST(LoaderSymtabTest, FindNearestRoundWithNextNonExistent)
|
|
|
|
|
{
|
|
|
|
|
loader::SymbolTable symtab;
|
|
|
|
|
|
|
|
|
|
loader::Symbol symbol = {loader::Symbol::Binding::Local, "symbol", 0x10};
|
|
|
|
|
loader::Symbol symbol = \
|
|
|
|
|
{loader::Symbol::Binding::Local, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol", 0x10};
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbol));
|
|
|
|
|
|
|
|
|
|
Addr next_addr;
|
|
|
|
|
@@ -633,7 +754,9 @@ TEST(LoaderSymtabTest, FindNearestNonExistent)
|
|
|
|
|
{
|
|
|
|
|
loader::SymbolTable symtab;
|
|
|
|
|
|
|
|
|
|
loader::Symbol symbol = {loader::Symbol::Binding::Local, "symbol", 0x10};
|
|
|
|
|
loader::Symbol symbol = \
|
|
|
|
|
{loader::Symbol::Binding::Local, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol", 0x10};
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbol));
|
|
|
|
|
|
|
|
|
|
const auto it = symtab.findNearest(symbol.address - 0x1);
|
|
|
|
|
@@ -648,12 +771,17 @@ TEST(LoaderSymtabTest, InsertTableConflicting)
|
|
|
|
|
{
|
|
|
|
|
const std::string name = "symbol";
|
|
|
|
|
loader::Symbol symbols[] = {
|
|
|
|
|
{loader::Symbol::Binding::Local, name, 0x10},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol2", 0x20},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol3", 0x30},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol4", 0x40},
|
|
|
|
|
{loader::Symbol::Binding::Local, loader::Symbol::SymbolType::Other,
|
|
|
|
|
name, 0x10},
|
|
|
|
|
{loader::Symbol::Binding::Local, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol2", 0x20},
|
|
|
|
|
{loader::Symbol::Binding::Local, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol3", 0x30},
|
|
|
|
|
{loader::Symbol::Binding::Local, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol4", 0x40},
|
|
|
|
|
// Introduce name conflict
|
|
|
|
|
{loader::Symbol::Binding::Local, name, 0x50},
|
|
|
|
|
{loader::Symbol::Binding::Local, loader::Symbol::SymbolType::Other,
|
|
|
|
|
name, 0x50},
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// Populate table 1
|
|
|
|
|
@@ -682,11 +810,16 @@ TEST(LoaderSymtabTest, InsertTableConflicting)
|
|
|
|
|
TEST(LoaderSymtabTest, InsertTable)
|
|
|
|
|
{
|
|
|
|
|
loader::Symbol symbols[] = {
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol", 0x10},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol2", 0x20},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol3", 0x30},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol4", 0x40},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol5", 0x50},
|
|
|
|
|
{loader::Symbol::Binding::Local, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol", 0x10},
|
|
|
|
|
{loader::Symbol::Binding::Local, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol2", 0x20},
|
|
|
|
|
{loader::Symbol::Binding::Local, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol3", 0x30},
|
|
|
|
|
{loader::Symbol::Binding::Local, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol4", 0x40},
|
|
|
|
|
{loader::Symbol::Binding::Local, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol5", 0x50},
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// Populate table 1
|
|
|
|
|
@@ -719,9 +852,12 @@ TEST_F(LoaderSymtabSerializationFixture, Serialization)
|
|
|
|
|
// Populate the table
|
|
|
|
|
loader::SymbolTable symtab;
|
|
|
|
|
loader::Symbol symbols[] = {
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol", 0x10},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol2", 0x20},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol3", 0x30},
|
|
|
|
|
{loader::Symbol::Binding::Local, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol", 0x10},
|
|
|
|
|
{loader::Symbol::Binding::Local, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol2", 0x20},
|
|
|
|
|
{loader::Symbol::Binding::Local, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol3", 0x30},
|
|
|
|
|
};
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbols[0]));
|
|
|
|
|
EXPECT_TRUE(symtab.insert(symbols[1]));
|
|
|
|
|
@@ -735,22 +871,31 @@ TEST_F(LoaderSymtabSerializationFixture, Serialization)
|
|
|
|
|
// Verify the output
|
|
|
|
|
ASSERT_THAT(cp.str(), ::testing::StrEq("\n[Section1]\ntest.size=3\n"
|
|
|
|
|
"test.addr_0=16\ntest.symbol_0=symbol\ntest.binding_0=1\n"
|
|
|
|
|
"test.type_0=5\n"
|
|
|
|
|
"test.addr_1=32\ntest.symbol_1=symbol2\ntest.binding_1=1\n"
|
|
|
|
|
"test.addr_2=48\ntest.symbol_2=symbol3\ntest.binding_2=1\n"));
|
|
|
|
|
"test.type_1=5\n"
|
|
|
|
|
"test.addr_2=48\ntest.symbol_2=symbol3\ntest.binding_2=1\n"
|
|
|
|
|
"test.type_2=5\n"));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** Test unserialization. */
|
|
|
|
|
TEST_F(LoaderSymtabSerializationFixture, Unserialization)
|
|
|
|
|
{
|
|
|
|
|
loader::Symbol symbols[] = {
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol", 0x10},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol2", 0x20},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol3", 0x30},
|
|
|
|
|
{loader::Symbol::Binding::Local, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol", 0x10},
|
|
|
|
|
{loader::Symbol::Binding::Local, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol2", 0x20},
|
|
|
|
|
{loader::Symbol::Binding::Local, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol3", 0x30},
|
|
|
|
|
};
|
|
|
|
|
simulateSerialization("\n[Section1]\ntest.size=3\n"
|
|
|
|
|
"test.addr_0=16\ntest.symbol_0=symbol\ntest.binding_0=1\n"
|
|
|
|
|
"test.type_0=5\n"
|
|
|
|
|
"test.addr_1=32\ntest.symbol_1=symbol2\ntest.binding_1=1\n"
|
|
|
|
|
"test.addr_2=48\ntest.symbol_2=symbol3\ntest.binding_2=1\n");
|
|
|
|
|
"test.type_1=5\n"
|
|
|
|
|
"test.addr_2=48\ntest.symbol_2=symbol3\ntest.binding_2=1\n"
|
|
|
|
|
"test.type_2=5\n");
|
|
|
|
|
|
|
|
|
|
loader::SymbolTable unserialized_symtab;
|
|
|
|
|
CheckpointIn cp(getDirName());
|
|
|
|
|
@@ -771,14 +916,19 @@ TEST_F(LoaderSymtabSerializationFixture, Unserialization)
|
|
|
|
|
TEST_F(LoaderSymtabSerializationFixture, UnserializationMissingBinding)
|
|
|
|
|
{
|
|
|
|
|
loader::Symbol symbols[] = {
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol", 0x10},
|
|
|
|
|
{loader::Symbol::Binding::Global, "symbol2", 0x20},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol3", 0x30},
|
|
|
|
|
{loader::Symbol::Binding::Local, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol", 0x10},
|
|
|
|
|
{loader::Symbol::Binding::Global, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol2", 0x20},
|
|
|
|
|
{loader::Symbol::Binding::Local, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol3", 0x30},
|
|
|
|
|
};
|
|
|
|
|
simulateSerialization("\n[Section1]\ntest.size=3\n"
|
|
|
|
|
"test.addr_0=16\ntest.symbol_0=symbol\ntest.binding_0=1\n"
|
|
|
|
|
"test.addr_1=32\ntest.symbol_1=symbol2\n"
|
|
|
|
|
"test.addr_2=48\ntest.symbol_2=symbol3\ntest.binding_2=1\n");
|
|
|
|
|
"test.type_0=5\n"
|
|
|
|
|
"test.addr_1=32\ntest.symbol_1=symbol2\ntest.type_1=5\n"
|
|
|
|
|
"test.addr_2=48\ntest.symbol_2=symbol3\ntest.binding_2=1\n"
|
|
|
|
|
"test.type_2=5\n");
|
|
|
|
|
|
|
|
|
|
loader::SymbolTable unserialized_symtab;
|
|
|
|
|
CheckpointIn cp(getDirName());
|
|
|
|
|
@@ -801,14 +951,20 @@ TEST_F(LoaderSymtabSerializationFixture,
|
|
|
|
|
UnserializationMissingBindingChangeDefault)
|
|
|
|
|
{
|
|
|
|
|
loader::Symbol symbols[] = {
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol", 0x10},
|
|
|
|
|
{loader::Symbol::Binding::Weak, "symbol2", 0x20},
|
|
|
|
|
{loader::Symbol::Binding::Local, "symbol3", 0x30},
|
|
|
|
|
{loader::Symbol::Binding::Local, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol", 0x10},
|
|
|
|
|
{loader::Symbol::Binding::Weak, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol2", 0x20},
|
|
|
|
|
{loader::Symbol::Binding::Local, loader::Symbol::SymbolType::Other,
|
|
|
|
|
"symbol3", 0x30},
|
|
|
|
|
};
|
|
|
|
|
simulateSerialization("\n[Section1]\ntest.size=3\n"
|
|
|
|
|
"test.addr_0=16\ntest.symbol_0=symbol\ntest.binding_0=1\n"
|
|
|
|
|
"test.type_0=5\n"
|
|
|
|
|
"test.addr_1=32\ntest.symbol_1=symbol2\n"
|
|
|
|
|
"test.addr_2=48\ntest.symbol_2=symbol3\ntest.binding_2=1\n");
|
|
|
|
|
"test.type_1=5\n"
|
|
|
|
|
"test.addr_2=48\ntest.symbol_2=symbol3\ntest.binding_2=1\n"
|
|
|
|
|
"test.type_2=5\n");
|
|
|
|
|
|
|
|
|
|
loader::SymbolTable unserialized_symtab;
|
|
|
|
|
CheckpointIn cp(getDirName());
|
|
|
|
|
|